2

スピーカーから通常モードへのiPhoneオーディオルートを非常に迅速にトリガーする必要があります。このサイトに似たオーディオ セッションを作成しました。

http://atastypixel.com/blog/using-remoteio-audio-unit/

VOIPができるアプリを作っています。

それでは、私が抱えている簡単な問題を説明しましょう。次のように、スピーカーから通常モードに切り替えるボタンがあります。

if(speakerState){
        値 = kAudioSessionOverrideAudioRoute_None;
        エラー = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(値), &value);
        スピーカー状態 = false;
}
そうしないと {
        値 = kAudioSessionOverrideAudioRoute_Speaker;
        エラー = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(値), &value);
        スピーカー状態 = 真;
}

...スピーカーのオンとオフを切り替えるだけでアイデアが得られます。

問題は次のとおりです。エンド ユーザーがボタンをすばやく押してスピーカーを切り替えると、約 10 回押した後、アプリケーションが何かを解放したかのようにしばらくフリーズし、30 秒後に元に戻ります。エンドユーザーがこのボタンを必要なだけオン/オフできるようにする必要があります。

更新:バックグラウンドスレッドでスピーカーを呼び出してみましたが、スピーカーを何度も押しすぎるとフリーズするか、オーディオが失われます。コードは次のとおりです。

-(void) manageSpeakerState{

OSStatus error;
UInt32 value;

if(speakerState){
    value = kAudioSessionOverrideAudioRoute_None;
    error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(value), &value);

    speakerBtn.selected = false;
    speakerState = false;
}
else {

    value = kAudioSessionOverrideAudioRoute_Speaker;
    error = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(value), &value);

    speakerBtn.selected = true;
    speakerState = true;
}

}

// これは、スピーカー ボタンが押されるたびに呼び出されます..スピーカーのオン/オフを切り替えます -(IBAction) speaker {

[self performSelectorInBackground:@selector(manageSpeakerState) withObject:nil ]; 


}

更新: 私のオーディオ セッションは、pthread と .c ファイルを使用して別のスレッドで実行されています。メインスレッドが拘束されたときにこの問題が発生するように見えるため、同時実行の問題である可能性があります。オーディオ セッションが実行されているスレッドのオーディオ ルートを更新するにはどうすればよいですか?

更新: 私はこれと同じ問題を抱えています: http://lists.apple.com/archives/coreaudio-api/2012/Jul/msg00129.html

ルート (つまり、スピーカーまたはヘッドフォン) を変更するたびに、audioUnits が一時停止されるため、空のものをバッファーに読み込んでいます。ハードウェアメーカーの問題に似ています。どうすればこれを回避できますか? コールバックはまだ呼び出されていますが、ルートの切り替え中にオーディオユニットはありません。

4

2 に答える 2

0

ボタンをクリックすると、ボタンの背景画像とタグを変更するだけです。背景スレッドのオーディオセッションプロパティを変更します。

于 2012-11-10T06:43:31.007 に答える
0

アプリケーションデリゲートに、このコードを追加するだけです。うまく機能することを願っています。

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
[[AVAudioSession sharedInstance] setActive: YES error: nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];
于 2012-11-20T14:08:18.070 に答える