2

拿到一個帶有棒棒糖的Android設備後,我注意到我們爲Kitkat(和以前的版本)工作的AudioTrack代碼停止工作,完全相同的代碼適用於之前的棒棒糖設備,所以我想知道我在做什麼錯誤的新版本。 這裏是如何的AudioTrack(由mTrack財產簡稱),被初始化:AudioTrack在Android 5.0上停止工作

protected void onCreate(Bundle savedInstanceState) { 
    int bufferSize = AudioTrack.getMinBufferSize(AUDIO_SAMPLE_RATE, AudioFormat.CHANNEL_CONFIGURATION_STEREO, AudioFormat.ENCODING_PCM_16BIT); 

    mTrack = new AudioTrack(AudioManager.STREAM_MUSIC, AUDIO_SAMPLE_RATE, 
        AudioFormat.CHANNEL_CONFIGURATION_STEREO, 
        AudioFormat.ENCODING_PCM_16BIT, bufferSize, 
        AudioTrack.MODE_STREAM); 
} 

而這裏的緩衝如何得到填補:

public void onPlayAudio(byte[] audioBuffer) { 
    if (mTrack.getPlayState() != AudioTrack.PLAYSTATE_PLAYING) { 
     mTrack.play(); 
    } 

    if (audioBuffer != null) { 
     mTrack.write(audioBuffer, 0, audioBuffer.length); 
    } 
} 

同樣,這與棒棒糖現有裝置運行良好。 Logcat上沒有錯誤,一切似乎都很正常,但聲音不出來(是的,我檢查了音量,它一直在上升)。所以我想知道是否有更新,我錯過了,或者是我做錯了。

我注意到AudioFormat.CHANNEL_CONFIGURATION_STEREO已被棄用,但嘗試建議AudioFormat.CHANNEL_OUT_STEREO似乎並沒有辦法。

任何幫助將不勝感激。

+0

沒有人有這方面的線索嗎? Kitkat和以前版本的代碼完全相同。任何需要應用於棒棒糖的變化? – dorbsz

回答

0

Google更改API。 試試這個:

val audioTrack: AudioTrack 
     get() = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
      AudioTrack(
        AudioAttributes.Builder() 
          .setUsage(AudioAttributes.USAGE_MEDIA) 
          .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) 
          .build(), 
        AudioFormat.Builder() 
          .setSampleRate(FREQUENCY) 
          .setEncoding(AudioFormat.ENCODING_PCM_16BIT) 
          .setChannelMask(AudioFormat.CHANNEL_OUT_MONO).build(), 
        SOUND_BUFFER_SIZE, 
        AudioTrack.MODE_STREAM, 
        AudioManager.AUDIO_SESSION_ID_GENERATE) 
     } else { 
      //support for Android KitKat 
      AudioTrack(AudioManager.STREAM_MUSIC, 
        FREQUENCY, 
        AudioFormat.CHANNEL_OUT_MONO, 
        AudioFormat.ENCODING_PCM_16BIT, 
        SOUND_BUFFER_SIZE, 
        AudioTrack.MODE_STREAM) 
     }