我需要非常快速地从扬声器到正常模式来回触发 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 都会暂停,因此我将空的东西读入缓冲区。它几乎就像硬件制造商的问题。我怎样才能解决这个问题?回叫仍在被调用,但在切换路由时没有音频单元。