2012-09-07 22 views
7

Sto utilizzando la traccia audio per riprodurre suoni diversi, in modalità streaming. Mi piacerebbe sapere se c'è un modo per sapere quando ogni suono/finisce.AudioTrack - come sapere quando un suono inizia/finisce?

ho creare la traccia audio in questo modo:

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

e avviarlo in un thread in background:

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

scrivo ogni suono come questo all'interno del eseguibile:

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

È possibile utilizzare qualsiasi API AudioTrack come setNotificationMarkerPosition o setLoopPoints o se tPositionNotificationPeriod per realizzare questo? e come funzionano?

Ogni suono può avere una durata diversa. Penso che questa sia la chiave.

Non capisco completamente la documentazione di queste API. Ogni fotogramma è uguale a un campione? Come faccio a specificare un indicatore per dove ogni suono inizia/finisce?

Grazie,

+0

Almeno qualcuno conosce la differenza tra setNotificationMarkerPosition e setPositionNotificationPeriod? – mikemeli

risposta

12

Questo è quello che ho scoperto.

Per me i frame sono campioni. Questa è la durata del suono moltiplicata per la frequenza di campionamento.

Per utilizzare AudioTrack setPositionNotificationPeriod, si passa una quantità di campioni. Significato se si passano 200 campioni, il callback sarà chiamato ogni 200 campioni, ricorrenti.

tmpAudioTrack.setPositionNotificationPeriod(duration * sampleRate); 

Per utilizzare setNotificationMarkerPosition, si passa anche una quantità di campioni. Tuttavia, questo è assoluto e non relativo per il periodo API. Quindi, se si desidera determinare quando termina un suono, si passa la quantità di campione (durata totale della traccia sonora * sampleRate).

tmpAudioTrack.setNotificationMarkerPosition(duration * sampleRate); 

Ma, se si sta già giocando, nel bel mezzo della colonna sonora, e si desidera aggiungere un marker in modo da ottenere richiamato diciamo 3 secondi da oggi, allora si avrebbe bisogno di aggiungere la corrente indicatore di riproduzione della traccia audio, in questo modo: (dove il vostro durata è di 3 secondi)

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

e questo è come ottenere la registrazione per le notifiche d'epoca e marcatori.

tmpAudioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener(){ 

    @Override 
    public void onMarkerReached(AudioTrack arg0) { 

    } 

    @Override 
    public void onPeriodicNotification(AudioTrack arg0) { 

    } 

});