AudioTrack中的播放结束检测无效

时间:2014-12-22 12:11:23

标签: java android audio audiotrack

这是我正在使用的代码:

void playSound(){
    final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
            sampleRate, AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
            AudioTrack.MODE_STATIC);
    // audioTrack.setNotificationMarkerPosition(generatedSnd.length/2);
    audioTrack.setNotificationMarkerPosition(1);
    audioTrack.setPlaybackPositionUpdateListener(new AudioTrack.OnPlaybackPositionUpdateListener() {
        @Override
        public void onPeriodicNotification(AudioTrack track) {
            // nothing to do
        }

        @Override
        public void onMarkerReached(AudioTrack track) {
            // Log.d(LOG_TAG, "Audio track end of file reached...");
            // messageHandler.sendMessage(messageHandler.obtainMessage(PLAYBACK_END_REACHED));
            Log.d("MY LOG", "Audio track end of file reached...");
            bitPatternValTextView.setText("End of play");
        }
    });
    audioTrack.write(generatedSnd, 0, generatedSnd.length);
    audioTrack.play();
}  

playSound()函数在

中定义
  

公共类InSituActivity扩展了ActionBarActivity {...}

我的假设是,当AudioTrack的播放到达第N个音频样本(每个N为短或2个字节)时,audioTrack.setNotificationMarkerPosition(N);将导致onMarkerReached(AudioTrack track)被调用。但是,如我的示例代码所示,我已经尝试了generatedSnd.length/2(generatedSnd []是一个包含我想要播放的音频样本的字节数组)以及使用小的常量值,如1,10或20,以及在任何这种情况下似乎都没有调用onMarkerReached()。这里有什么问题,我该如何解决?我希望能够在当前的AudioTrack完成播放时播放另一种声音。 playSound()函数本身将在一个线程中调用(与UI线程分开)。

以下是我从中获取代码的地方:
How to tell when AudioTrack object has finished playing?

其他参考文献:
AudioTrack: how to detect end of sound?
Confusion about Thread life and AudioTrack in android java

1 个答案:

答案 0 :(得分:0)

回答可能为时已晚,但这对我有用。我也没有得到onMarkerReached()回调。 我只是将静态流大小增加了很多。可能不适用于MODE_STREAM或不同的缓冲区大小。适用于我需要的所有缓冲区大小,对于我的用例,最多几十秒。 尝试在代码中更改此行,看看会发生什么:

int magic_number = 1000; // try with different values. Maybe make it 10% of generatedSnd.length?
final AudioTrack audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC,
        sampleRate, AudioFormat.CHANNEL_OUT_MONO,
        AudioFormat.ENCODING_PCM_16BIT, generatedSnd.length,
        AudioTrack.MODE_STATIC + magic_number);