2012-09-07 20 views
7

Używam ścieżki dźwiękowej do odtwarzania różnych dźwięków w trybie strumieniowym. Chciałbym wiedzieć, czy istnieje sposób, aby wiedzieć, kiedy każdy dźwięk/kończy grę.AudioTrack - jak sprawdzić, kiedy dźwięk się zaczyna/kończy?

utworzyć ścieżkę dźwiękową tak:

AudioTrack tmpAudioTrack = new AudioTrack(
     STREAM_TYPE, 
     SAMPLE_RATE, 
     CHANNEL_CONFIG_TYPE, 
      AUDIO_FORMAT_TYPE, 
     getOptimalBufferSize(), 
     AUDIO_TRACK_MODE);' 

i uruchomić go w wątku tła:

backround_thread = new Thread(new MyRunnable(aTrack)); 
    backround_thread.start(); 

piszę każdy dźwięk tak wewnątrz runnable:

byte generatedSnd[] = new byte[2 * beepSamples]; 
<code for filling the buffer with sound here> 
int bytesWritten = track.write(generatedSnd, 0, generatedSnd.length); 

Możliwe jest użycie dowolnego z interfejsów API AudioTrack, takich jak setNotificationMarkerPosition lub setLoopPoints lub se tPositionNotificationPeriod, aby to osiągnąć? i jak działają?

Każdy dźwięk może mieć różny czas trwania. Myślę, że to jest kluczowe.

Nie w pełni rozumiem dokumentację tych interfejsów API. Czy każda klatka jest taka sama jak próbka? Jak określić znacznik miejsca rozpoczęcia/zakończenia dźwięku?

Dzięki,

+0

Przynajmniej ktoś wie różnicę między setNotificationMarkerPosition a setPositionNotificationPeriod? – mikemeli

Odpowiedz

12

To, co odkryli.

Dla mnie ramki to próbki. Jest to czas trwania dźwięku pomnożony razy częstotliwość próbkowania.

Aby użyć funkcji AudioTrack setPositionNotificationPeriod, należy podać liczbę próbek. Znaczenie: jeśli przekażesz 200 próbek, wywołanie zwrotne będzie wywoływane co 200 próbek, powtarzające się.

tmpAudioTrack.setPositionNotificationPeriod(duration * sampleRate); 

Aby użyć metody setNotificationMarkerPosition, należy również podać liczbę próbek. Jest to jednak wartość bezwzględna i nie jest względna jak w przypadku interfejsu API okresu. Jeśli chcesz ustalić, kiedy dźwięk dobiegnie końca, przekazujesz próbkę (całkowity czas trwania ścieżki dźwiękowej * sampleRate).

tmpAudioTrack.setNotificationMarkerPosition(duration * sampleRate); 

Ale jeśli już gra, w środku swojej ścieżki dźwiękowej, a chcesz dodać znacznik tak dostaniesz oddzwonienie powiedzmy 3 sekundy od teraz, to musiałby dodać prąd głowica ścieżki dźwiękowej, na przykład: (gdzie czas trwania wynosi 3 sekundy)

tmpAudioTrack.setNotificationMarkerPosition(tmpAudioTrack.getPlaybackHeadPosition() + (duration * sampleRate)); 

i to jak Ci zarejestrowany dla powiadomień epoki i markerów.

tmpAudioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener(){ 

    @Override 
    public void onMarkerReached(AudioTrack arg0) { 

    } 

    @Override 
    public void onPeriodicNotification(AudioTrack arg0) { 

    } 

});