我有一个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)
答案 0 :(得分:0)
如果音频单元回调中的ioData为nil,则需要分配自己的AudioBufferList和缓冲区数据存储器(* mData),然后使用该内存。某些音频路由可能有自己的缓冲区,但这不能保证。因此,您的代码需要考虑nil ioData的情况。
nil ioData参数的另一个可能原因是你的回调是输入回调,而不是输出回调,因为设置正确RemoteIO总线的回调存在错误。
-10849错误可能意味着您正在尝试启动已启动且尚未停止的音频设备(在任何音频停止命令后需要一段时间)。