web-dev-qa-db-ja.com

再生のためにAUGraphStartを呼び出すときにkAUGraphErr_CannotDoInCurrentContextを受信する

AUGraphとAudioUnits 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を返すことができます。この結果は、レンダーコールバックからAUGraphAPIを呼び出した場合にのみ生成されます。 必要なロックがその時点で別のスレッドによって保持されていたことを意味します。この結果コードが表示された場合は、通常、アクションを再試行できます。通常は、次のレンダリングサイクル(その間にロックをクリアできます)、またはその呼び出しをアプリ内の別のスレッドに委任できます。レンダースレッドをスピンしたり、スリープ状態にしたりしないでください。

この結果コードは一時的な状態にすぎず、他のスレッドによるAUGraph(ロックを含む)の呼び出しが完了するとすぐに渡されます。

私の場合、AUGraphを開始するだけです。これは新しく、作成されたばかりです。ケースをデバッグするにはどうすればよいですか?ここで潜在的な問題は何でしょうか?

113
Alexey Strakh

CSSまたはSQLiteから何かを作ることができます。これが理由です

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

return playing;

}

このコードを操作してみてください。コードのブール値に問題があります...

1
user12180230