Frage

Ich bin mit OpenAL auf dem iPhone gleichzeitig mehrere Audio-Samples zu spielen.

Kann ich OpenAL mich zu benachrichtigen, wenn eine einzige Probe spielen wird getan?

Ich möchte hartzucodieren die Probenlänge vermeiden und eine Timer-Einstellung.

War es hilfreich?

Lösung

Wenn Sie die OpenAL Quelle in eine Klasse abstrahiert haben, ich denke, man einfach performSelector:afterDelay: anrufen können, wenn Sie den Ton zu starten:

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

(Wenn Sie den Ton manuell in der Zwischenzeit stoppen, kann der Rückruf gelöscht werden, finden Sie in der NSObject Klassenreferenz ) Oder Sie können die AL_SOURCE_STATE abfragen.

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

Ich weiß nicht, wie OpenAL Sie haben rufen Sie zurück. Was genau wollen Sie den Rückruf für? Manche Dinge können ohne Rückruf besser gelöst werden.

Andere Tipps

Ich hatte nicht viel Glück mit Rückrufe in OpenAL. In meinem Zustand Maschinen abfragen ich einfach die Quelle und verzögern den Übergang, bis es fertig ist.


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

// ... //

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

Wenn dies nicht das, was Sie brauchen, dann sind Sie die beste Wahl ist wahrscheinlich ein Timer. Sie sollten keine Werte codieren müssen. Sie können die Wiedergabezeit bestimmen, wann Sie Ihre Puffer sind bevölkern.

Ein wenig Einblick in das „Warum“ der Frage könnte einige zusätzliche Möglichkeiten bieten.

Diese OpenAL Führung eine mögliche Lösung schlägt vor:

  

Die ‚Stream‘ Funktion sagt uns auch, wenn der Strom zu spielen ist abgeschlossen.

... und liefert Beispielquellcode die Verwendung zu veranschaulichen.

Bitte warten, reden Sie beendet hat eine Probe (zum Beispiel 1/44100 Sekunde für 44,1 kHz Audio)? Oder reden Sie zu wissen, dass eine Quelle durch seinen Puffer gespielt hat, und hat nicht mehr Audio zu spielen?

Für letztere habe ich für die AL_BUFFERS_PROCESSED Eigenschaft eine Quelle gute Ergebnisse Polling hatte, als ich Puffer zu einer Quelle strömen; es könnte für den Einzelpuffer Fall arbeitet für einen Nicht-Null-Wert dieser Eigenschaft zu suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top