我正在基于 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");
答案 0 :(得分:1)
经过进一步调查,我现在意识到我基本上在这里问了两个问题。到目前为止我已经解决了一个问题。
有时,当播放中断时,它会“暂停”而不是“停止”。我刚刚删除了执行此“暂停”操作的代码中的任何元素,并将其替换为“停止”音频并调回其队列。
至于从扬声器而不是耳机发出的音频,我仍在调查那个。
答案 1 :(得分:0)
您是否尝试过实施AVAudioSessionDelegate协议,该协议应在拔下耳机等触发器时触发中断委托方法。 Documentation here.