【问题标题】:Can't control the Speaker on iPad无法在 iPad 上控制扬声器
【发布时间】:2013-04-26 07:19:47
【问题描述】:

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

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
                             , 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

还是不行。

【问题讨论】:

  • AudioSessionSetProperty有返回值,你检查了吗?
  • 是的,只返回OSStatus=0
  • setCategory 调用的返回值是多少?并且,如果为 NO,则相对误差
  • setCategory 返回YES,没有错误
  • "什么都没有发生" ...您的意思是 - 扬声器始终处于启用状态?还是...?

标签: ios ipad avaudiosession


【解决方案1】:

我想你误解了这个属性的使用。您希望启用/禁用扬声器。这不是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 不希望您的应用在这里与用户期望发生冲突。

如果媒体上下文正确(并且可以使用 Airplay),则可以使用 MPVolumeViewrouteButton 选择 Airplay。蓝牙可以通过OverrideCategoryEnableBluetoothInput(which controls both input and output)进行引导

请特别注意,kAudioSessionOutputRoute_BuiltInReceiver 是 iPhone 上的低音量扬声器,您在拨打电话时可以放在耳边。如果没有插入外部设备(例如耳机),这是 iPhone 的默认音频输出路径。kAudioSessionOutputRoute_BuiltInSpeaker 是手机底部的“免提”扬声器。

您可以通过设置以下覆盖属性之一从当前默认值重新路由到此BuiltInSpeaker

key: kAudioSessionProperty_OverrideAudioRoute
values:   kAudioSessionOverrideAudioRoute_Speaker
      :   kAudioSessionOverrideAudioRoute_None

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

key: kAudioSessionProperty_OverrideCategoryDefaultToSpeaker
values:   TRUE
      :   FALSE

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

这两个都只设计用于kAudioSessionCategory_PlayAndRecord Audio Session 类别。

请注意,在这两种情况下,您都没有在任何输出路由中进行选择,您只是覆盖了“默认路由”以支持内置(大声)扬声器。

没有电话的 iPad 没有BuiltInReceiver 类型的扬声器。在没有连接的小工具或播放器的情况下,它的默认路由是相同的BuiltInSpeaker。因此,覆盖没有任何效果。

假设您真的想在您的应用程序中静音,您如何实现这一点取决于您的应用程序设计的许多其他方面。如果您想使设备静音,Apple 宁愿用户通过响铃/静音开关来控制它。看来他们不会有任何其他方式:

我收到了 Apple 对此的回复。 他们说他们没有也从未提供过检测硬件静音开关的方法,也不打算这样做。 https://stackoverflow.com/a/8009073/1375695

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

【讨论】:

  • 感谢您“清除”我的想法。我不是 iOS 大师 :) 你的描述很清楚。无论如何,如果这种方式在 iPad 上不起作用,我可以使用解决方法来至少将扬声器静音,例如设置音量 0,反之亦然 100% 点击?
  • @MaximShoustin,这取决于您的设计 - 例如,如果使用 AVAudioPlayer,您可以将 volume 属性设置为 0
  • 我使用 SIP 协议并显示来自其他设备的视频/音频(x264 编解码器)
  • @MaximShoustin 那么您将需要提供更多关于您的应用程序设计的详细信息,例如您正在使用哪些库/框架?您想在什么用户/应用程序/设备条件下静音?你真的应该打开一个新问题来做到这一点,否则我们会偏离你原来的问题太远(你可以在这里链接到它)。
  • 在 iPhone 上,上述代码的 sn-ps 工作正常:静音开/关。在调试模式下的 iPad 上,我运行相同的流程,但没有任何反应。现在我不在 xCode 上,不能给你更多我到目前为止使用的信息
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多