我有一个音频程序,它使用以下代码调用 AudioConverterFillComplexBuffer:
OSStatus error = AudioConverterFillComplexBuffer(recorderObj->audioConverter,
MyAudioConverterCallback,
(__bridge void *)playerLocal,
&ioOutputDataPackets,
convertedData,
&streamDesc);
Run Code Online (Sandbox Code Playgroud)
当此代码在 10.6-10.11 上运行时,它工作正常。当代码在 10.12 上运行时,它会崩溃并显示以下消息
Crashed Thread: 16 com.apple.audio.IOThread.client
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Signal: Illegal instruction: 4
Termination Reason: Namespace SIGNAL, Code 0x4
Terminating Process: exc handler [0]
Run Code Online (Sandbox Code Playgroud)
调用堆栈以 CrashIfClientProvidedBogusAudioBufferList 结束。
大多数文章、文档和邮件列表都会说我有一个糟糕的输出缓冲区,但在我的一生中,我不知道我会做错什么,但我的代码仍然可以在所有版本的 MacOS 上运行,但最新版本。这是我设置缓冲区的方式:
AudioBufferList *convertedData = (AudioBufferList*)malloc(sizeof(AudioBufferList) * 2);
convertedData->mNumberBuffers = 1;
convertedData->mBuffers[0].mNumberChannels = 2;
convertedData->mBuffers[0].mDataByteSize = 64 * 1024;
convertedData->mBuffers[0].mData = (UInt8 *)malloc(sizeof(UInt8) * 64 * 1024); …Run Code Online (Sandbox Code Playgroud)