Pregunta

Estoy usando OpenAL en iPhone para reproducir múltiples muestras de audio simultáneamente.

¿Puedo hacer que OpenAL me notifique cuando se termina de reproducir una sola muestra?

Me gustaría evitar codificar la longitud de la muestra y configurar un temporizador.

¿Fue útil?

Solución

Si tiene la fuente OpenAL abstraída en una clase, supongo que puede simplemente llamar a performSelector:afterDelay: cuando comience el sonido:

- (void) play
{
    [delegate performSelector:@selector(soundHasFinishedPlaying)
        afterDelay:self.length];
    …
}

(Si detiene el sonido manualmente mientras tanto, la devolución de llamada se puede cancelar, consulte NSObject Class Reference .) O puede sondear el AL_SOURCE_STATE:

- (void) checkStatus
{
    ALint state;
    alGetSourcei(source, AL_SOURCE_STATE, &state);
    if (state == AL_PLAYING)
        return;
    [timer invalidate];
    [delegate soundHasFinishedPlaying];
}

¡No & # 8217; no sé cómo hacer que OpenAL le devuelva la llamada. ¿Para qué quieres exactamente la devolución de llamada? Algunas cosas se pueden resolver mejor sin una devolución de llamada.

Otros consejos

No tuve mucha suerte con las devoluciones de llamada en OpenAL. En mis máquinas de estado, simplemente sondeo la fuente y retrasar la transición hasta que se haga.


    - (BOOL)playing {
        ALint sourceState;
        alGetSourcei(sourceID, AL_SOURCE_STATE, &sourceState);
        return sourceState == AL_PLAYING;
    }

// ... //

    case QSTATE_DYING:
        if (![audioSource playing])
            [self transitionTo:QSTATE_DEAD];

Si esto no es lo que necesitas, entonces lo mejor es que probablemente sea un temporizador. No debería necesitar codificar ningún valor. Puedes determinar el tiempo de reproducción cuando llenes tus buffers.

Un poco de información sobre el " por qué " de la pregunta podría ofrecer algunas opciones adicionales.

Esta guía OpenAL sugiere una posible solución:

  

La función 'stream' también nos dice si la transmisión ha terminado de reproducirse.

... y proporciona un código fuente de muestra para ilustrar el uso.

Espera, ¿estás hablando de haber terminado una muestra (por ejemplo, 1/44100 segundos para audio de 44,1 KHz)? ¿O estás hablando de saber que una fuente se ha reproducido a través de su búfer y no tiene más audio para reproducir?

Para este último, he tenido buenos resultados al sondear una fuente para la propiedad AL_BUFFERS_PROCESSED cuando transmito buffers a una fuente; podría funcionar para el caso de un solo búfer buscar un valor distinto de cero de esta propiedad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top