我的iPhone应用程序要求我知道用户何时/尚未插入耳机。这很简单。 AudioSessionAddPropertyListener,其回调侦听kAudioSessionProperty_AudioRouteChange。
当事情发生时,我用NSLog写日志。用户插入耳机?在gdb控制台中获取通知和一行。用户拔下耳机?同上。
同时我通过启动录音音频队列来感知环境的噪音水平。这也很有效:我可以获得麦克风噪音水平并听取音频路线变化就好了。
我发现在中断后,我重新激活音频会话并将音频类别恢复为kAudioSessionCategory_RecordAudio,音频路由通知有点乱。
当我插入耳机时,我看不到任何通知。当我拔下耳机时,我会快速连续看到“插入”通知和“拔掉的”通知。
这就像“插入”通知的延迟一样,当“未插入”通知到达时,将刷新待处理通知的队列。
我做错了什么?如何正确恢复音频会话以获得及时的通知?
编辑:iPhone OS 3.1.2,在iPhone 3G上运行。我正在运行使用3.0 SDK编译的程序(来自XCode 3.1.2)。答案 0 :(得分:0)
我有同样的问题,但有更多的信息,因此对你有疑问。 您是否像我一样使用OpenAL。 你也支持像我这样的iPod音乐吗? 我在石英菜单屏幕中可以很好地断开耳机,但是在glView游戏画面中,它大多会像你一样失败。有时第一次断开工作,然后失败。有时重新连接也无法触发,所以当我切换到石英屏幕时,我得到一个半打断的对话框,我必须点击它。这是OpenAL声音。 使用iPod音乐,我切换到NSNotificationCenter MPMusicPlayerControllerPlaybackStateDidChangeNotification通知,但是只有在播放iPod音乐时才有效。 OS 3.1.3,在iPhone和iTouch上构建到OS 3.1.0。 从AudioSessionInitialize()看你的返回错误代码,这是我的问题,它没有被首先调用,并且失败了。 编辑:修复失败,这是一个间歇/随机问题,似乎是由高CPU负载引起的。