这是我正在使用的代码:
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
答案 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);