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


113

私は働いているAUGraphし、再生し、私のiOSアプリのレコードのオーディオへのAudio Units API。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ますか?最初にグラフをAUGraphInitializeしましたか?
cvu

6
はい、setupAudioForGraphはグラフを作成して初期化します。ほとんどの場合、問題なく動作します。ここでの問題は、並列アクセスまたはそのようなものです。一度だけ起動して、一度停止すると、すべてが完全に機能します。
Alexey Strakh、2015年

1
mutexロックが存在するかどうかを確認する方法を探します。存在する場合は、AUGraphを生成しない場合はループを続行します。
テイラーベランド

回答:


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.