仅当插入耳机插孔时远程IO回调上的BAD_ACCESS

Posted

技术标签:

【中文标题】仅当插入耳机插孔时远程IO回调上的BAD_ACCESS【英文标题】:BAD_ACCESS on RemoteIO callback only when headphone jack plugged in 【发布时间】:2016-02-25 00:21:51 【问题描述】:

我为 remoteIO 音频单元提供了以下渲染回调。简单地访问 ioData 参数的第 0 个元素会导致崩溃。简单地说,这可以在没有耳机插孔连接的情况下使用,但是一旦我将插孔插入我的 iphone6+,访问缓冲区时就会出现错误的访问错误。

如果我在应用程序运行时插入它,它会崩溃。如果我先插入它,然后构建并运行应用程序,它仍然会崩溃。我检查了inNumberFrames 是否会根据线路输出连接发生变化,但它始终保持在 512 帧。

OSStatus playbackCallback(void * inRefCon,
                          AudioUnitRenderActionFlags * ioActionFlags,
                          const AudioTimeStamp * inTimeStamp,
                          UInt32 inBusNumber,
                          UInt32 inNumberFrames,
                          AudioBufferList * ioData) 

   float * output = (float*)ioData->mBuffers[0].mData;
   output[0] = 1;

   return noErr;

显然,即使在应用启动之前插入耳机,也会调用 AVAudiosession 路由更改回调。我尝试的其中一件事是将 remoteIO 启动延迟到那时。但是,以下代码会产生错误:

- (void)handleRouteChange:(NSNotification *)notification    
   OSStatus err = AudioOutputUnitStart(remoteIOUnit);

错误:

错误:应该分配 (-10849)

【问题讨论】:

【参考方案1】:

如果音频单元回调中的 ioData 为 nil,则您需要分配自己的 AudioBufferList 和缓冲区数据内存 (* mData),并使用该内存。一些音频路由可能有自己的缓冲区,但这不能保证。所以你的代码需要考虑到 nil ioData 的情况。

另一个可能导致 nil ioData 参数的原因是您的回调是输入回调,而不是输出回调,这是因为在为正确的 RemoteIO 总线设置回调时存在错误。

-10849 错误可能意味着您正在尝试启动一个已经启动但尚未停止的音频单元(在任何音频停止命令之后需要一段时间)。

【讨论】:

以上是关于仅当插入耳机插孔时远程IO回调上的BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

当我的应用程序处于后台模式时,检测从 iPhone 插入或拔出耳机插孔

MPMoviePlayerController - 插入耳机时自动恢复

如何使用 python 检测到某些东西已插入 linux 上的音频插孔?

耳机/麦克风插孔的带宽

通过板载耳机插孔使用 ALSA + Jackd2 时,Raspberry Pi 3 A+ 音频失真/尖叫

插入/拔出耳机时如何获得通知?苹果