2014-12-22 5 views
0

Это код, я использую:Конец обнаружения воспроизведения в 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

+0

Вы должны использовать длину файла в количестве кадров с setNotificationMarkerPosition вместо 1. BTW это должно быть большое количество. – Karioki

+0

1 это просто тестовый номер, если он работал, я должен был увидеть какое-то уведомление в logcat – user13267

+0

Если вы используете отдельный поток, попробуйте MODE_STREAM и подайте AudioTrack в цикле до конца данных – pskink

ответ

0

может быть слишком поздно для ответа, но это работает для меня. Я тоже не получал callbackMarkerReached(). Я просто увеличил размер статического потока на большое количество. Может не работать для MODE_STREAM или для разных размеров буфера. Работает для всех размеров буфера, в которых я нуждаюсь, что составляет не более 10 секунд для моих случаев использования. Попробуйте изменить эту строку в код и посмотреть, что происходит:

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); 
Смежные вопросы