Question

J'utilise OpenAL sur iPhone pour lire plusieurs échantillons audio simultanément.

Puis-je demander à OpenAL de m'avertir lorsqu'un échantillon est joué?

J'aimerais éviter de coder en dur la longueur de l'échantillon et de définir un minuteur.

Était-ce utile?

La solution

Si vous avez la source OpenAL abstraite dans une classe, vous pouvez simplement appeler performSelector:afterDelay: lorsque vous démarrez le son:

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

(Si vous arrêtez le son manuellement pendant ce temps, le rappel peut être annulé, voir le Référence de la classe NSObject .) Ou vous pouvez interroger le AL_SOURCE_STATE:

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

Je ne & # 8217; je ne sais pas comment vous faire rappeler par OpenAL. Qu'est-ce que vous voulez exactement le rappel? Certaines choses peuvent être mieux résolues sans rappel.

Autres conseils

Je n’ai pas eu beaucoup de chance avec les rappels dans OpenAL. Dans mes machines d'état, je simplement interroge la source et retarde la transition jusqu'à la fin.


    - (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 ce n’est pas ce dont vous avez besoin, alors vous feriez mieux de choisir un minuteur. Vous ne devriez pas avoir besoin de coder en dur les valeurs. Vous pouvez déterminer le temps de lecture lorsque vous remplissez vos tampons.

Quelques informations sur le " pourquoi " de la question pourrait offrir quelques choix supplémentaires.

Ce guide OpenAL suggère une solution possible:

  

La fonction 'stream' nous indique également si la lecture du flux est terminée.

... et fournit un exemple de code source pour illustrer l'utilisation.

Attendez, parlez-vous d'avoir terminé un échantillon (par exemple, 1/44100 seconde pour l'audio à 44,1 KHz)? Ou parlez-vous de savoir qu’une source a joué par le biais de sa mémoire tampon et n’a plus d’audio à jouer?

Pour ce dernier, j'ai obtenu de bons résultats en interrogeant une source pour la propriété AL_BUFFERS_PROCESSED lorsque je transmettais des tampons à une source; Dans le cas d'un seul tampon, il pourrait être utile de rechercher une valeur non nulle de cette propriété.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top