4

我想實現AudioTrack來檢索我的android設備中來自IAX的傳入呼叫的​​音頻,但在一段時間後面臨異常。無法檢索用於寫入()的AudioTrack指針

private void writeBuff(short[] buf) { 

    try { 

     if (this.track == null) { 
      Log.w("IAX2Audio", "write() without an AudioTrack"); 
      return; 
     } 

     int written = 0; 
     while (written < buf.length) { 


      if (this.track != null) { 
       int res; 

       res = this.track.write(buf, written, buf.length - written);  
       switch (res) { 
       case AudioTrack.ERROR_INVALID_OPERATION: 
        Log.e("IAX2Audio", "Invalid write()"); 
        return; 
       case AudioTrack.ERROR_BAD_VALUE: 
        Log.e("IAX2Audio", "Bad arguments to write()"); 
        return; 
       } 

       written += res; 
      } 

     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

和異常放在這裏

04-27 18:26:15.865: W/System.err(12681): java.lang.IllegalStateException: Unable to retrieve AudioTrack pointer for write() 
04-27 18:26:15.890: W/System.err(12681): at android.media.AudioTrack.native_write_short(Native Method) 
04-27 18:26:15.895: W/System.err(12681): at android.media.AudioTrack.write(AudioTrack.java:1023) 
04-27 18:26:15.900: W/System.err(12681): at org.androvoip.iax2.AndroidAudioInterface.writeBuff(AndroidAudioInterface.java:322) 
04-27 18:26:15.900: W/System.err(12681): at org.androvoip.iax2.AndroidAudioInterface.playbackTime(AndroidAudioInterface.java:350) 
04-27 18:26:15.905: W/System.err(12681): at org.androvoip.iax2.AndroidAudioInterface.playTick(AndroidAudioInterface.java:413) 
04-27 18:26:15.905: W/System.err(12681): at org.androvoip.iax2.AndroidAudioInterface.access$2(AndroidAudioInterface.java:406) 
04-27 18:26:15.910: W/System.err(12681): at org.androvoip.iax2.AndroidAudioInterface$3.run(AndroidAudioInterface.java:560) 
04-27 18:26:15.910: W/System.err(12681): at java.lang.Thread.run(Thread.java:856) 

這是行接受適當的音頻,當我試圖再次啓動它,以便有例外res = this.track.write(buf, written, buf.length - written);

爲間或而這之後創建異常是我如何走向並釋放我的軌跡

public void stopPlay() { 
    Log.d("IAX2Audio", "stopPlay()"); 

    if (this.track == null) 
     return; 

    if (this.track != null) { 
     //this.track.stop(); 
     //this.track.release(); 

     if (this.track != null 
       && this.track.getState() != AudioTrack.STATE_UNINITIALIZED) { 
      if (track.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) { 
       track.stop(); 
       track.release(); 
      } 
     } 
    } 

    try { 
     if (this.playThread != null) { 
      final Thread t = this.playThread; 
      /* Setting this to null is the signal to the thread to exit. */ 
      this.playThread = null; 
      t.join(); 
     } 
    } catch (final InterruptedException e) { 
     e.printStackTrace(); 
    } 

} 

請爲AndroidAudioInterface.java找到更新的固定解決方案。 AndroidAudioInterface.java

+0

如果您的目標是*檢索*音頻,爲什麼使用write()和回放功能? –

+0

其實我正在製作VOIP應用程序,因爲我使用AudioTrack編寫和回放回鈴音功能,讓我添加我的Java類的完整源代碼,這會給整個Android音頻驅動程序帶來問題,甚至在發佈評論後仍然沒有完成修復。 – user366584

回答

4

這是一個簡單的修復,但可能是一個Android問題,請參考我的修正下方

if (track != null && track.getState() != AudioTrack.STATE_UNINITIALIZED) { 
    if (track.getPlayState() != AudioTrack.PLAYSTATE_STOPPED) { 

     try{ 
      track.stop(); 
     }catch (IllegalStateException e) 
     { 
      e.printStackTrace(); 
     } 

    } 

    track.release();  
    am.setMode(AudioManager.MODE_NORMAL); 

    //track.release(); 
    //track = null; 
} 

,並在OnCreate

private AudioManager am; 

am = (AudioManager)this.context.getSystemService(Context.AUDIO_SERVICE); 
am.setMode(AudioManager.MODE_NORMAL); 
setVolumeControlStream(AudioManager.STREAM_VOICE_CALL); 

而且總是在線程中使用AudioTrack爲主線也將手動您的應用程序