Domanda

Sto usando OpenAL su iPhone per riprodurre simultaneamente più campioni audio.

Posso richiedere a OpenAL di avvisarmi quando viene riprodotto un singolo campione?

Vorrei evitare di codificare la lunghezza del campione e impostare un timer.

È stato utile?

Soluzione

Se hai la sorgente OpenAL astratta in una classe, immagino che puoi semplicemente chiamare performSelector:afterDelay: quando avvii il suono:

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

(Se nel frattempo si interrompe l'audio manualmente, è possibile annullare la richiamata, vedere Riferimento classe NSObject .) Oppure puoi eseguire il polling del AL_SOURCE_STATE:

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

I don & # 8217; t so come fare in modo che OpenAL ti richiami. Per cosa vuoi esattamente il callback? Alcune cose possono essere risolte meglio senza una richiamata.

Altri suggerimenti

Non ho avuto molta fortuna con i callback in OpenAL. Nelle mie macchine a stati, eseguo semplicemente il polling della fonte e ritardo la transizione fino al termine.


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

// ... //

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

Se questo non è ciò di cui hai bisogno, allora la scommessa migliore è probabilmente un timer. Non è necessario codificare alcun valore. Puoi determinare il tempo di riproduzione quando stai popolando i tuoi buffer.

Un po 'di informazioni sulla quot &, perché " della domanda potrebbe offrire alcune opzioni aggiuntive.

Questa guida OpenAL suggerisce una possibile soluzione:

  

La funzione 'stream' ci dice anche se la riproduzione dello stream è terminata.

... e fornisce un codice sorgente di esempio per illustrare l'utilizzo.

Aspetta, stai parlando di aver terminato un campione (ad es. 1/44100 di secondo per l'audio a 44,1 KHz)? O stai parlando di sapere che una sorgente ha riprodotto il suo buffer e non ha più audio da riprodurre?

Per quest'ultimo, ho avuto buoni risultati nel polling di una sorgente per la proprietà AL_BUFFERS_PROCESSED quando eseguo lo streaming dei buffer su una sorgente; potrebbe funzionare per il caso a buffer singolo cercare un valore diverso da zero di questa proprietà.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top