2012-09-07 20 views
7

Estoy usando la pista de audio para reproducir sonidos diferentes, en modo transmisión. Me gustaría saber si hay una manera de saber cuándo cada sonido se activa/termina de reproducirse.AudioTrack: cómo saber cuándo comienza/finaliza un sonido.

puedo crear la pista de audio como esto:

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

y ponerlo en marcha en un subproceso de fondo:

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

escribo cada sonido como esto dentro del ejecutable:

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

Es posible usar cualquiera de las API de AudioTrack como setNotificationMarkerPosition, o setLoopPoints, o se tPositionNotificationPeriod para lograr esto? y cómo funcionan?

Cada sonido puede tener una duración de tiempo diferente. Creo que esto es clave.

No entiendo completamente la documentación de estas API. ¿Cada marco es lo mismo que una muestra? ¿Cómo especifico un marcador para el inicio/finalización de cada sonido?

Gracias,

+0

Al menos, ¿alguien sabe la diferencia entre setNotificationMarkerPosition y setPositionNotificationPeriod? – mikemeli

Respuesta

12

Esto es lo que he descubierto.

Para mí, los marcos son muestras. Esta es la duración del sonido multiplicado por la frecuencia de muestreo.

Para utilizar AudioTrack setPositionNotificationPeriod, se pasa una cantidad de muestras. Es decir, si pasa 200 muestras, se llamará a la devolución de llamada cada 200 muestras, recurrentes.

tmpAudioTrack.setPositionNotificationPeriod(duration * sampleRate); 

Para usar setNotificationMarkerPosition, también puede pasar una cantidad de muestras. Sin embargo, esto es absoluto y no relativo como para el período API. Entonces, si desea determinar cuándo termina un sonido, pase la cantidad de muestra (duración total de la pista de sonido * sampleRate).

tmpAudioTrack.setNotificationMarkerPosition(duration * sampleRate); 

Pero, si ya está jugando, en medio de la pista de sonido, y desea añadir un marcador para que se llamará de vuelta digamos 3 segundos a partir de ahora, entonces usted tendría que añadir la corriente barra de reproducción de la pista de audio, así: (donde la duración es de 3 segundos)

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

y esto es cómo se le ha abonado a las notificaciones de época y marcadores.

tmpAudioTrack.setPlaybackPositionUpdateListener(new OnPlaybackPositionUpdateListener(){ 

    @Override 
    public void onMarkerReached(AudioTrack arg0) { 

    } 

    @Override 
    public void onPeriodicNotification(AudioTrack arg0) { 

    } 

});

Cuestiones relacionadas