Если у вас исходный код 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 перезвонить вам. Для чего именно вам нужен обратный звонок? Некоторые вещи могут быть решены лучше без обратного вызова.