Получение уведомлений о завершении воспроизведения звука в OpenAL - PullRequest
6 голосов
/ 26 июня 2009

Я использую OpenAL на iPhone для одновременного воспроизведения нескольких аудиосэмплов.

Могу ли я получить OpenAL, чтобы уведомить меня о завершении воспроизведения сэмпла?

Я бы хотел избежать жесткого кодирования длины семпла и установки таймера.

Ответы [ 4 ]

4 голосов
/ 10 декабря 2009

Мне не очень повезло с обратными вызовами в OpenAL. В моих конечных автоматах я просто опрашиваю источник и задерживаю переход, пока он не будет сделан.


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

// ... //

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

Если это не то, что вам нужно, то вам лучше всего выбрать таймер. Вам не нужно жестко кодировать какие-либо значения. Вы можете определить время воспроизведения при заполнении ваших буферов.

Небольшое понимание "почему" вопроса может предложить некоторые дополнительные варианты.

3 голосов
/ 06 июля 2009

Если у вас исходный код OpenAL, абстрагированный от класса, я думаю, вы можете просто вызвать performSelector:afterDelay: при запуске звука:

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

(Если вы тем временем остановите звук вручную, обратный вызов может быть отменен, см. Ссылка на класс NSObject .) Или вы можете опросить AL_SOURCE_STATE:

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

Я не знаю, как заставить OpenAL перезвонить вам. Для чего именно вам нужен обратный звонок? Некоторые вещи могут быть решены лучше без обратного вызова.

1 голос
/ 06 июля 2009

Подождите, вы говорите о завершении одного семпла (например, 1/44100 секунды для звука 44,1 кГц)? Или вы говорите о том, что источник воспроизводил через свой буфер и у него больше нет звука для воспроизведения?

Для последнего у меня были хорошие результаты, опрашивая источник для свойства AL_BUFFERS_PROCESSED, когда я направляю буферы в источник; для случая с одним буфером может работать ненулевое значение этого свойства.

1 голос
/ 26 июня 2009

В этом руководстве по OpenAL предлагается возможное решение:

Функция 'stream' также сообщает нам о завершении воспроизведения потока.

... и предоставляет пример исходного кода для иллюстрации использования.

...