Это код, который я использую:
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() будет вызываться в потоке (отдельно от потока пользовательского интерфейса).
Вот откуда я взял код:
Как сказать, когда закончилось воспроизведение объекта AudioTrack?
Другие ссылки:
AudioTrack: как определить конец звука?
Путаница по поводу жизни потока и AudioTrack в android java< /а>
setPlaybackPositionUpdateListener()
быть причиной разницы? - person user13267   schedule 22.12.2014