gpt4 book ai didi

objective-c - CoreAudio 不填充在设备上运行的缓冲区(但在模拟器中)

转载 作者:行者123 更新时间:2023-11-28 20:31:12 25 4
gpt4 key购买 nike

我正在构建一个 CoreAudio 应用程序,我需要在其中处理来自麦克风的原始输入样本。我使用两个线程,其中一个线程从麦克风输入中生成样本,另一个线程使用样本。这些线程共享一个(工作良好的)循环缓冲区,我有它的实现 taken from Github (一个很好的例子可以在 the author's blog 上找到)。

作为我的问题的一个最小示例,我将 a small XCode project on Github 放在一起,所以你可以看到完整的代码。该应用程序将麦克风样本放入循环缓冲区,然后从另一个线程读取缓冲区。消费线程计算 average rectified value (ARV) 的 500 个样本并在控制台上输出 ARV。

当我在 iOS 模拟器 (5.1) 中运行该应用程序时,一切正常,我得到了所需的输出:

2012-08-21 20:58:31.882 BufferedSamples[23505:6003] 88
2012-08-21 20:58:31.890 BufferedSamples[23505:6003] 108
2012-08-21 20:58:31.890 BufferedSamples[23505:6003] 137
2012-08-21 20:58:31.891 BufferedSamples[23505:6003] 137
2012-08-21 20:58:31.892 BufferedSamples[23505:6003] 106
2012-08-21 20:58:31.901 BufferedSamples[23505:6003] 140
...

当我尝试在设备(我试过 iPhone 3/3GS/4)上运行该应用程序时,由于 NULL,我在运行时收到了 EXC_BAD_ACCESS 错误指针。因此,我在 CoreAudio 回调函数(在文件 DummyRecorder.m 中)中添加了对 NULL 指针的检查:

// render samples into buffer
AudioBufferList bufferList;
bufferList.mNumberBuffers = 1;
bufferList.mBuffers[0].mNumberChannels = 1;
bufferList.mBuffers[0].mDataByteSize = inNumberFrames * kTwoBytesPerSInt16;
bufferList.mBuffers[0].mData = NULL;
AudioUnitRender(dummyRecorder->audioUnit, ioActionFlags, inTimeStamp, kInputBus, inNumberFrames, &bufferList);

// move samples to ring buffer
if (bufferList.mBuffers[0].mData != NULL)
TPCircularBufferProduceBytes(&dummyRecorder->buffer, bufferList.mBuffers[0].mData, bufferList.mBuffers[0].mDataByteSize);
else
NSLog(@"null pointer");

当我在模拟器中运行该应用程序时,我仍然得到所需的输出,但在设备上,我得到以下信息:

2012-08-21 21:15:38.903 BufferedSamples[544:3b03] null pointer
2012-08-21 21:15:38.926 BufferedSamples[544:3b03] null pointer
2012-08-21 21:15:38.949 BufferedSamples[544:3b03] null pointer
2012-08-21 21:15:38.972 BufferedSamples[544:3b03] null pointer
2012-08-21 21:15:38.996 BufferedSamples[544:3b03] null pointer
2012-08-21 21:15:39.019 BufferedSamples[544:3b03] null pointer
...

CoreAudio 如何在模拟器中正确分配和填充缓冲区,但在设备上却保持缓冲区不变?我错过了什么?

The complete code of my example can be found on Github.

编辑

我添加了一个 method to check for errors在 CoreAudio 调用之后,正如 @MichaelTyson 所建议的那样。现在我在回调中这样做:

OSStatus err = AudioUnitRender(dummyRecorder->audioUnit, ioActionFlags, inTimeStamp, kInputBus, inNumberFrames, &bufferList);

// move samples to ring buffer
if (checkResult(err, "AudioUnitRender"))
TPCircularBufferProduceBytes(&dummyRecorder->buffer, bufferList.mBuffers[0].mData, bufferList.mBuffers[0].mDataByteSize);

我也更新了 Github 上的代码。在模拟器中运行该应用程序不会产生任何错误,而在设备上运行它会出现以下错误:

2012-08-22 11:19:49.248 BufferedSamples[637:3b03] /DummyRecorder.m:50: AudioUnitRender result -50 FFFFFFCE Œˇˇˇ
2012-08-22 11:19:49.271 BufferedSamples[637:3b03] /DummyRecorder.m:50: AudioUnitRender result -50 FFFFFFCE Œˇˇˇ
2012-08-22 11:19:49.294 BufferedSamples[637:3b03] /DummyRecorder.m:50: AudioUnitRender result -50 FFFFFFCE Œˇˇˇ
2012-08-22 11:19:49.317 BufferedSamples[637:3b03] /DummyRecorder.m:50: AudioUnitRender result -50 FFFFFFCE Œˇˇˇ
2012-08-22 11:19:49.341 BufferedSamples[637:3b03] /DummyRecorder.m:50: AudioUnitRender result -50 FFFFFFCE Œˇˇˇ
2012-08-22 11:19:49.364 BufferedSamples[637:3b03] /DummyRecorder.m:50: AudioUnitRender result -50 FFFFFFCE Œˇˇˇ
...

最佳答案

解决这些问题通常需要一些猜测工作,因为很难记住所有参数,但我首先要尝试的是在音频单元输入的输出范围上设置流格式总线(总线 1)。

目前您只在输出总线(总线 0)的输入范围内设置它,我不能 100% 确定这是否足够。

关于objective-c - CoreAudio 不填充在设备上运行的缓冲区(但在模拟器中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12061655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com