Это код, я использую:Конец обнаружения воспроизведения в 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
(сгенерированныйSnd [] - это массив байтов, содержащий звуковые сэмплы, которые я хочу воспроизвести), а также использование небольших постоянных значений, таких как 1, 10 или 20, и onMarkerReached()
не кажется для вызова в любой из этих ситуаций. Что здесь не так и как я могу это исправить? Я хочу, чтобы иметь возможность воспроизводить другой звук, когда текущий AudioTrack заканчивает воспроизведение. Сама функция playSound() будет вызываться в потоке (отдельно от потока пользовательского интерфейса).
Вот где я получил код от:
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
Вы должны использовать длину файла в количестве кадров с setNotificationMarkerPosition вместо 1. BTW это должно быть большое количество. – Karioki
1 это просто тестовый номер, если он работал, я должен был увидеть какое-то уведомление в logcat – user13267
Если вы используете отдельный поток, попробуйте MODE_STREAM и подайте AudioTrack в цикле до конца данных – pskink