Core audio 仅当耳机插孔插入时,RemoteIO回调上的\u访问错误

Core audio 仅当耳机插孔插入时,RemoteIO回调上的\u访问错误,core-audio,audiounit,remoteio,Core Audio,Audiounit,Remoteio,我有以下针对remoteIO音频单元的渲染回调。只需访问ioData参数的第0个元素就会导致崩溃。非常简单地说,这在没有耳机插孔连接的情况下工作,但只要我将插孔插入iphone6+,访问缓冲区时就会出现严重的访问错误 如果我在应用程序运行时插入它,它会崩溃。如果我先插入它,然后构建并运行应用程序,它仍然会崩溃。我检查了NumberFrames中的inNumberFrames是否根据线路输出连接而改变,但始终保持在512帧 OSStatus playbackCallback(void * inRe

我有以下针对remoteIO音频单元的渲染回调。只需访问
ioData
参数的第0个元素就会导致崩溃。非常简单地说,这在没有耳机插孔连接的情况下工作,但只要我将插孔插入iphone6+,访问缓冲区时就会出现严重的访问错误

如果我在应用程序运行时插入它,它会崩溃。如果我先插入它,然后构建并运行应用程序,它仍然会崩溃。我检查了NumberFrames中的
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)


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

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

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