AudioSession.h
enum { kAudioSessionOverrideAudioRoute_None = 0,kAudioSessionOverrideAudioRoute_Speaker = 'spkr' };
我的课
@synthesize speakerEnabled; ... - (void)setSpeakerEnabled:(BOOL)enable { speakerEnabled = enable; if(enable) { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,sizeof (audioRouteOverride),&audioRouteOverride); } else { UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_None; AudioSessionSetProperty (kAudioSessionProperty_OverrideAudioRoute,&audioRouteOverride); } }
然而它只适用于iPhone,对于iPad – 没有任何反应.
>当我按下按钮时:扬声器开启,我输入if(启用)并且AudioSessionSetProperty接收kAudioSessionOverrideAudioRoute_Speaker;
>当我按下按钮时:扬声器关闭,我输入到else,AudioSessionSetProperty接收kAudioSessionOverrideAudioRoute_None;
我开始调试,但没有找到设备之间的差异.
我有iPad2 iOS 6.1.
我错过了什么?
请帮我
编辑
正如LombaX所说,我在启动应用程序AVAudioSession类别中添加了:
NSError *err = nil; BOOL success = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:&err]; if(!success){ [MyLogger logc:MyLoggerLog format:"%@",[err localizedDescription]]; }
成功=是
仍然无法正常工作.
解决方法
这些是可用于iPhone的各种可能的输出路线
extern const CFStringRef kAudioSessionOutputRoute_LineOut extern const CFStringRef kAudioSessionOutputRoute_Headphones extern const CFStringRef kAudioSessionOutputRoute_BluetoothHFP extern const CFStringRef kAudioSessionOutputRoute_BluetoothA2DP extern const CFStringRef kAudioSessionOutputRoute_BuiltInReceiver extern const CFStringRef kAudioSessionOutputRoute_BuiltInSpeaker extern const CFStringRef kAudioSessionOutputRoute_USBAudio extern const CFStringRef kAudioSessionOutputRoute_HDMI extern const CFStringRef kAudioSessionOutputRoute_AirPlay
这些只是可能的路线 – 实际可用的是与上下文相关的. Apple严格限制您在应用程序中确定这些路由的能力,因为它是用户需要以设备一致的方式控制的.其中大多数是由用户插拔硬件(耳机,USB,HDMI,线路输出)隐式确定的,Apple不希望你的应用在这里弄乱用户的期望.
如果媒体上下文正确(并且播放可用),则可以使用MPVolumeView的routeButton选择Airplay.可以通过OverrideCategoryEnableBluetoothInput(which controls both input and output)引导蓝牙
特别要注意的是,kAudioSessionOutputRoute_BuiltInReceiver是iPhone上的低级扬声器,在您打电话时可以听到.如果没有插入外部设备(例如耳机),这是iPhone的默认音频输出路径.kAudioSessionOutputRoute_BuiltInSpeaker是手机底部的“免提”大声扬声器.
您可以通过设置以下覆盖属性之一,从当前默认设置重新路由到此BuiltInSpeaker:
key: kAudioSessionProperty_OverrideAudioRoute values: kAudioSessionOverrideAudioRoute_Speaker : kAudioSessionOverrideAudioRoute_None
Specifies whether or not to override the audio session category’s normal audio route.
key: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker values: TRUE : FALSE
Specifies whether or not to route audio to the speaker (instead of to the receiver) when no other audio route,such as a headset,is connected.
这两个仅设计用于kAudioSessionCategory_PlayAndRecord音频会话类别.
请注意,在这两种情况下,您都没有在任何输出路径中进行选择,您只是覆盖了“默认路径”,而选择了内置(响亮)扬声器.
没有手机的iPad没有BuiltInReceiver类型的扬声器.这是默认路线,在没有连接小工具或播放的情况下,就是那个相同的BuiltInSpeaker.因此,覆盖没有任何影响.
假设您真的想要在应用程序中静音音频,那么您的实现方式取决于应用程序设计的许多其他方面.如果您想要静音设备,Apple宁愿用户通过响铃/静音开关控制它.看来他们不会有任何其他方式:
I’ve had a response from Apple on this.
They’ve said they don’t and never have provided a method for detecting hardware mute switch and don’t intend to do so. 07001
“扬声器设置是设备的上方,而不是给定的声音”
http://lists.apple.com/archives/coreaudio-api/2009/Mar/msg00300.html