문제

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이 아닌 값을 찾는 것이 효과가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top