2012-07-02 11 views
8

Eksperymentuję z klasą AudioTrack. Zasadniczo moja aplikacja musi wygenerować dźwięk, gdy użytkownik dotknie określonego obiektu na ekranie. Użyłem jako przewodnika this example.
Moja aplikacja wydaje się działać tak jak powinien, ale zazwyczaj po dotknięciu ekranu przez około minutę to wywala:
Funkcja AudioTrack: funkcja play() uruchomiona na niezainicjowanej ścieżce audioTrack

07-02 20:40:53.459: E/AndroidRuntime(11973): FATAL EXCEPTION: Thread-10 
07-02 20:40:53.459: E/AndroidRuntime(11973): java.lang.IllegalStateException: play() called on uninitialized AudioTrack. 
07-02 20:40:53.459: E/AndroidRuntime(11973): at android.media.AudioTrack.play(AudioTrack.java:824) 
07-02 20:40:53.459: E/AndroidRuntime(11973): at com.mysounds_experimental.SoundThread.playSound(SoundThread.java:108) 
07-02 20:40:53.459: E/AndroidRuntime(11973): at com.mysounds_experimental.SoundThread.run(SoundThread.java:69) 

metod z klasy, który generuje dźwięki

public void initAudioTrack() { 
     int bufferSize = AudioTrack.getMinBufferSize(sampleRate 
       , AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT); 

     audioTrack = new AudioTrack(
       AudioManager.STREAM_MUSIC 
       , sampleRate 
       , AudioFormat.CHANNEL_CONFIGURATION_MONO 
       , AudioFormat.ENCODING_PCM_16BIT 
       , bufferSize 
       , AudioTrack.MODE_STREAM); 
    } 

    private void playSound(){ 
      audioTrack.write(generatedSnd, 0, numSamples); 
      audioTrack.play(); 
     } 

public void stopPlaying() { 
    audioTrack.flush(); 
    audioTrack.stop(); 
    audioTrack.release(); 
} 

@Override 
    public void run() { 
     while (mRun) { 
      try{ 
       Thread.sleep(200); 
       while(soundCycle){ 
        if(freqOfTone != -1f) { 
         generateTone(); 
         playSound(); 
         Thread.sleep(200); 
        } 
       } 
      } catch(InterruptedException e){ 
       //    soundCycle = false; 
       //    soundPool.stop(BEEP); 
      } 
     } 
    } 

Jest to metoda z niestandardowy widok używany jest mój wątek:

@Override 
    public boolean onTouchEvent(final MotionEvent ev) { 
     int currentXPosition = (int) ev.getX(); 
     int currentYPosition = (int) ev.getY(); 

     if(ev.getX() < smBitmap.getWidth()) 
      if(ev.getY() < smBitmap.getHeight()){ 
       tempCol = smBitmap.getPixel(currentXPosition, currentYPosition); 
      } 

     final int action = ev.getAction(); 

     switch (action & MotionEvent.ACTION_MASK) { 

     case MotionEvent.ACTION_DOWN: { 

      sThread.freqOfTone = getFreqPreset(tempCol); 
      if(col != tempCol){ 
//    sThread.initAudioTrack(); 
       sThread.interrupt(); 
       if(shouldInit) { 
        shouldInit = false; 
        sThread.initAudioTrack(); 
       } 
       sThread.soundCycle = true; 
       col = tempCol; 
       invalidate(); 
      } 
      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 
      sThread.freqOfTone = getFreqPreset(tempCol); 

      if (tempCol == -1 || tempCol == 0) { 
       sThread.soundCycle = false; 
       shouldInit = true; 
//    sThread.stopPlaying(); 
       sThread.interrupt(); 
       invalidate(); 
      } else { 
       if(col != tempCol){ 
        sThread.interrupt(); 
        col = tempCol; 
        invalidate(); 
       }else { 
        sThread.soundCycle = true; 
        col = tempCol; 
        invalidate(); 
       } 
      } 
      break; 
     }// case ACTION_MOVE 

     case MotionEvent.ACTION_UP: { 
      sThread.soundCycle = false; 
      shouldInit = true; 
//   sThread.stopPlaying(); 
      sThread.interrupt(); 
      col = -1; 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     }// case ACTION_UP 

     } 

     return true; 
    } 

Wszelkie pomysły w hy to się dzieje?

+0

'// sThread.initAudioTrack();" Odkomentuj to –

+0

Powiedziałem odkomentować, a nie usunąć –

+0

Przepraszam, chciałem powiedzieć odkomentować. – droid8421

Odpowiedz

0

Myślę, że musisz zadzwonić pod numer play(), zanim zadzwonisz pod numer write().

Ale zauważyłem również, że gdy tworzysz wiele instancji AudioTrack, nawet jeśli myślisz, że wszystko spiszesz, czasami nie działa play(), a ścieżka jest niezainicjowana.

Będziesz chciał spróbować ... złapać to IllegalStateException i unikać wywoływania write() do play() działa bez rzucania wyjątku.

1

Dlaczego skomentowałeś swoją metodę stopPlaying()?

Można utworzyć tylko 32 ścieżki dźwiękowe. Jeśli chcesz więcej, powinieneś zadzwonić do metody release().

Powiązane problemy