音频路由不变时耳机插件插件事件 - iOS

时间:2012-05-03 07:51:05

标签: objective-c ios audiosession headphones

我在iPad上工作。 我想检测用户何时拔出耳机。首先,我在属性kAudioSessionProperty_AudioRouteChange上使用了一个监听器。所以一切顺利,直到我决定在耳机仍然插入时添加一个按钮切换到扬声器。所以我现在面临一个问题,也许有人会有想法来解决它。

以下是该方案:

  • 我插了一个耳机 - >我的音频路由更改回调称为
  • 然后我将声音切换到扬声器(不拔掉我的耳机) - >音频路由更改回调称为
  • 然后我拔掉我的耳机(当声音仍在输出到扬声器时) - >不调用音频路由更改回调,这似乎是合乎逻辑的。

但这是我的问题!所以我的问题是:你是否看到了一种方法来检测出最后一种情况下拔掉了耳机?

感谢您的帮助

编辑:

好的,我找到了解决方法:

为了检测是否插入耳机,我总是执行一个测试功能,我需要知道它(而不是使用布尔值),这可能对性能不太好但是它有效,这是我的代码谁可能需要它:

//set back the default audio route
UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None;
AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRouteOverride), &audioRouteOverride);

//check if this default audio route is Heaphone or Speaker
CFStringRef newAudioRoute;
UInt32 newAudioRouteSize = sizeof(newAudioRoute);
AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &newAudioRouteSize, &newAudioRoute);

NSString *newAudioRouteString = (__bridge NSString *)newAudioRoute;

CFRelease(newAudioRoute);

//if this default audio route is not Headphone, it means no headphone is plugged
if ([newAudioRouteString rangeOfString:@"Headphones"].location != NSNotFound){
    NSLog(@"Earphone available");
    return true;
}
else {
    NSLog(@"No Earphone available");
    return false;
}

希望它会帮助别人!

2 个答案:

答案 0 :(得分:0)

我想象一下它的解决方案如下: 你在AppDelegate中为扬声器创建一个布尔值,让我们说: BOOL isSpeakerOn。每次调用音频路由回调时,您必须验证扬声器的当前情况以及您想要执行的操作。

答案 1 :(得分:0)