无法在iPad上控制扬声器

时间:2013-04-26 07:19:47

标签: ios ipad avaudiosession

我遵循了关注扬声器状态的方法:

AudioSession.h

enum {
    kAudioSessionOverrideAudioRoute_None    = 0,
    kAudioSessionOverrideAudioRoute_Speaker = 'spkr'
};

MyClass的

@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
                             , sizeof (audioRouteOverride)
                             , &audioRouteOverride);
 }
}

然而仅适用于iPhone ,对于iPad而言 - 没有任何反应。

  • 当我按下按钮时:Speaker On,我转到if(enable)AudioSessionSetProperty收到kAudioSessionOverrideAudioRoute_Speaker;

  • 当我按下按钮时:Speaker Off,我转到elseAudioSessionSetProperty收到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]];
    }

success = YES

仍然无效。

2 个答案:

答案 0 :(得分:9)

我认为你误解了这个属性的使用。您希望启用/禁用您的扬声器。这不是kAudioSessionProperty_OverrideAudioRoute的意图。相反,它以相当有限的方式影响输出声音路由

这些是可用于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。蓝牙可以由OverrideCategoryEnableBluetoothInputwhich controls both input and output

指导

特别要注意的是,kAudioSessionOutputRoute_BuiltInReceiver是您拨打电话时耳机上的低级扬声器。如果没有插入外部设备(例如耳机),这是iPhone的默认音频输出路径。kAudioSessionOutputRoute_BuiltInSpeaker是免提的'手机底部响亮的扬声器。

您可以通过设置其中一个覆盖属性,从当前默认设置重新路由到此BuiltInSpeaker

key: kAudioSessionProperty_OverrideAudioRoute
values:   kAudioSessionOverrideAudioRoute_Speaker
      :   kAudioSessionOverrideAudioRoute_None
  

指定是否覆盖音频会话类别的正常音频路由。

key: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker
values:   TRUE
      :   FALSE
  

指定在没有连接其他音频路径(如耳机)时是否将音频路由到扬声器(而不是接收器)。

这两个版本仅用于kAudioSessionCategory_PlayAndRecord音频会话类别。

请注意,在这两种情况下,您都不是在任何输出路径中进行选择,而是仅覆盖"默认路由"支持内置(响亮)扬声器。

没有手机的iPad没有BuiltInReceiver类型的扬声器。在没有连接小工具或播放的情况下,它的默认路线是非常相同的BuiltInSpeaker。因此,重写不会产生任何影响。

假设您正在尝试将应用中的音频静音,那么您的实现方式取决于应用设计的许多其他方面。如果您想静音设备,Apple宁愿用户通过响铃/静音开关控制它。似乎他们不会以任何其他方式拥有它:

  

我对Apple有这样的回应。   他们已经说过他们没有提供过检测硬件静音开关的方法,也没有打算这样做。 https://stackoverflow.com/a/8009073/1375695

" 扬声器设置是设备的上方,而不是给定的声音"
http://lists.apple.com/archives/coreaudio-api/2009/Mar/msg00300.html

答案 1 :(得分:2)

您是否尝试过播放之前设置音频类别? 我记得我前一段时间遇到过同样的问题,并找到了这个解决方案(调整类别)

[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];

我没有在文档上找到任何内容,我认为在iPad上你必须设置类别,因为iPhone和iPad的细节不同:在iPhone上,左侧硬件开关可以使扬声器静音。在iPad上,相同的开关用于锁定旋转。

试着让我知道

编辑:

有用的链接:

http://developer.apple.com/library/ios/#documentation/Audio/Conceptual/AudioSessionProgrammingGuide/Cookbook/Cookbook.html