Openal에서 소리가 연주 될 때 알림 받기
-
20-08-2019 - |
문제
iPhone에서 Openal을 사용하여 여러 오디오 샘플을 동시에 재생하고 있습니다.
단일 샘플이 재생 될 때 나에게 알리기 위해 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에서 콜백에 많은 운이 없었습니다. 내 주 머신에서는 단순히 소스를 폴링하고 완료 될 때까지 전환을 지연시킵니다.
- (BOOL)playing {
ALint sourceState;
alGetSourcei(sourceID, AL_SOURCE_STATE, &sourceState);
return sourceState == AL_PLAYING;
}
// ... //
case QSTATE_DYING:
if (![audioSource playing])
[self transitionTo:QSTATE_DEAD];
이것이 당신이 필요로하지 않는다면, 당신은 아마도 최선의 방법은 아마도 타이머 일 것입니다. 값을 하드 코딩 할 필요는 없습니다. 버퍼를 채울 때 재생 시간을 결정할 수 있습니다.
질문의 "왜"에 대한 약간의 통찰력은 몇 가지 추가 선택을 제공 할 수 있습니다.
잠깐, 당신은 끝났다는 것에 대해 이야기하고 있습니까? 하나의 샘플 (예 : 44.1 kHz 오디오의 경우 1/44100 초)? 아니면 소스가 버퍼를 통해 재생되었고 더 이상 오디오가 없다는 것을 아는 것에 대해 이야기하고 있습니까?
후자의 경우, 나는 버퍼를 소스로 스트리밍 할 때 AL_BUFFERS_PROCESSED 속성의 소스를 폴링하는 좋은 결과를 얻었습니다. 단일 부처 케이스 가이 속성의 0이 아닌 값을 찾는 것이 효과가있을 수 있습니다.