仅当插入耳机插孔时,才能在RemoteIO回调时进行BAD_ACCESS

时间:2016-02-25 00:21:51

标签: core-audio audiounit remoteio

我有一个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 个答案:

答案 0 :(得分:0)

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

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

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