播放过程中拔下的耳机会导致iPhone应用程序出错

时间:2011-03-12 18:14:58

标签: iphone ios core-audio

我正在基于 Speak Here示例应用创建应用。我希望通过耳机播放音频,如果它们已插入或默认为扬声器。

我已经使用了最底层的代码来实现这一点,除非在播放过程中拔下耳机,否则它会正常工作。此时播放结束,这没关系。问题是当我再次点击播放时播放出来很奇怪,停止按钮停止工作。它也会从它停止的位置开始播放,而不是像通常按下停止按钮时那样从头开始重置。

同样,如果在应用程序打开之前插入了耳机,这也会导致奇怪的行为。

也许我需要抓住'耳机已拔下'事件并让它'按下停止按钮'?因为现在这样做是不正确的。

以简单的形式提出我的问题:如何在iPhone上正确设置核心音频,以便通过扬声器和耳机播放。

任何可以解决此问题的代码都会有很大的帮助。谢谢!

 OSStatus error = AudioSessionInitialize(NULL, NULL, NULL, NULL);

if (error) printf("ERROR INITIALIZING AUDIO SESSION! %d\n", error);
else 
{
    UInt32 category = kAudioSessionCategory_PlayAndRecord;  
    // UInt32 category = kAudioSessionCategory_MediaPlayback;   

    error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
    if (error) printf("couldn't set audio category!");


    // It is bugs when I unplug the headphones! 
    UInt32 doChangeDefaultRoute = 1;        
    AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryDefaultToSpeaker, sizeof (doChangeDefaultRoute), &doChangeDefaultRoute);




    error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioRouteChange, propListener, self);
    if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error);
    UInt32 inputAvailable = 0;
    UInt32 size = sizeof(inputAvailable);

    // we do not want to allow recording if input is not available
    error = AudioSessionGetProperty(kAudioSessionProperty_AudioInputAvailable, &size, &inputAvailable);
    if (error) printf("ERROR GETTING INPUT AVAILABILITY! %d\n", error);
    btn_record.enabled = (inputAvailable) ? YES : NO;

    // we also need to listen to see if input availability changes
    error = AudioSessionAddPropertyListener(kAudioSessionProperty_AudioInputAvailable, propListener, self);
    if (error) printf("ERROR ADDING AUDIO SESSION PROP LISTENER! %d\n", error);

    error = AudioSessionSetActive(true); 
    if (error) printf("AudioSessionSetActive (true) failed");

2 个答案:

答案 0 :(得分:1)

经过进一步调查,我现在意识到我基本上在这里问了两个问题。到目前为止我已经解决了一个问题。

有时,当播放中断时,它会“暂停”而不是“停止”。我刚刚删除了执行此“暂停”操作的代码中的任何元素,并将其替换为“停止”音频并调回其队列。

至于从扬声器而不是耳机发出的音频,我仍在调查那个。

答案 1 :(得分:0)

您是否尝试过实施AVAudioSessionDelegate协议,该协议应在拔下耳机等触发器时触发中断委托方法。 Documentation here.