재생을 위해 AUGraphStart를 호출 할 때 kAUGraphErr_CannotDoInCurrentContext 수신


113

내가 함께 일하고 있어요 AUGraph및 오디오 장치 API는 재생 내 iOS 앱에서 오디오를 녹음 할 수 있습니다. 이제 AUGraph다음 오류로 시작할 수없는 드문 문제 가 있습니다.

결과 = kAUGraphErr_CannotDoInCurrentContext (-10863)

전화를 시도 할 때 예기치 않게 오류가 발생했습니다. AUGraphStart오디오 재생을 위해 설정된 을 .

(BOOL)startRendering
{
    if (playing) {
        return YES;
    }

    playing = YES;

    if (NO == [self setupAudioForGraph:&au_play_graph playout:YES]) {
        print_error("Failed to create play AUGraph",0);
        playing = NO;
        return NO;
    }

    //result = kAUGraphErr_CannotDoInCurrentContext (-10863)
    OSStatus result = AUGraphStart(au_play_graph);
    if (noErr != result) {
        print_error("AUGraphStart", result);
        playing = NO;
    }

    return playing;
}

문서에서 얻은 정보는 다음과 같습니다.

렌더 스레드에서 회전하거나 대기하는 것을 방지하기 위해 (나쁜 생각입니다!) AUGraph에 대한 많은 호출은 kAUGraphErr_CannotDoInCurrentContext를 반환 할 수 있습니다. 이 결과는 렌더링 콜백에서 AUGraph API를 호출 할 때만 생성됩니다.이는 필요한 잠금이 당시 다른 스레드에 의해 보유되었음을 의미합니다 . 이 결과 코드가 표시되면 일반적으로 작업을 다시 시도하거나 (일반적으로 NEXT 렌더링주기 (따라서 그 동안 잠금을 지울 수 있음)) 또는 해당 호출을 앱의 다른 스레드에 위임 할 수 있습니다. 렌더 스레드를 회전하거나 절전 모드로 전환해서는 안됩니다.

이 결과 코드는 일시적인 상태 일 뿐이며 잠금이있는 AUGraph에 대한 다른 스레드의 호출이 완료되는 즉시 전달됩니다.

제 경우에는, 방금 시작하고 AUGraph새롭고 방금 생성되었습니다. 케이스를 어떻게 디버깅 할 수 있으며 여기서 잠재적 인 문제는 무엇일까요?


무엇을 setupAudioForGraph합니까? 먼저 그래프를 초기화 했습니까?
cvu

6
예, setupAudioForGraph는 그래프를 만들고 초기화합니다. 대부분의 경우 잘 작동합니다. 병렬 액세스 또는 이와 비슷한 문제입니다. 한 번만 시작하고 한 번 중지하면 모든 것이 완벽하게 작동합니다.
Alexey Strakh

1
뮤텍스 잠금이 있는지 확인하는 방법을 찾고, 존재하는 경우 AUGraph를 생성하지 않으면 루프를 계속합니다.
Taylor Belland

답변:


1

CSS 또는 SQLite로 무언가를 만들 수 있습니다. 이는 이유

OSStatus result = AUGraphStart(au_play_graph);
if (noErr != result) {
    print_error("AUGraphStart", result);
    playing = NO;
}

return playing;

}

이 코드를 조작 해보십시오. 코드에 부울에 문제가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.