2

我需要非常快速地从扬声器到正常模式来回触发 iphone 音频路由。我创建了一个类似于此站点的音频会话:

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

我正在创建一个可以进行 VOIP 的应用程序。

所以让我解释一下我遇到的简单问题。我有一个按钮可以从扬声器切换到正常模式,如下所示:

如果(扬声器状态){
        值 = kAudioSessionOverrideAudioRoute_None;
        错误 = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(value), &value);
        扬声器状态 = 假;
}
别的 {
        值 = kAudioSessionOverrideAudioRoute_Speaker;
        错误 = AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(value), &value);
        扬声器状态 = 真;
}

...您只需打开和关闭扬声器即可获得想法。

这是问题所在:当最终用户在大约 10 次按下后快速按下按钮以切换扬声器时,应用程序会冻结一段时间,好像它释放了什么东西一样,30 秒后又回来了。我需要最终用户能够根据需要不断地打开/关闭此按钮。

更新:我尝试在后台线程中调用扬声器,但如果我按扬声器太多次它会冻结或我失去音频这里是代码:

-(无效)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

在您的应用程序委托中添加这段代码..我希望它工作正常。

[[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 回答
0

在按钮上单击只需更改按钮的背景图像和标签。在后台线程中更改音频会话属性。

于 2012-11-10T06:43:31.007 回答