0

我对 remoteIO 音频单元有以下渲染回调。简单地访问参数的第 0 个元素会ioData导致崩溃。很简单地说,这可以在没有耳机插孔连接的情况下使用,但是一旦我将插孔插入我的 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)

4

1 回答 1

0

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

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

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

于 2016-02-25T18:34:08.783 回答