为啥我们在 aurioTouch 项目中只使用第一个缓冲区

Posted

技术标签:

【中文标题】为啥我们在 aurioTouch 项目中只使用第一个缓冲区【英文标题】:Why do we use only the first buffer in aurioTouch project为什么我们在 aurioTouch 项目中只使用第一个缓冲区 【发布时间】:2012-07-16 11:18:17 【问题描述】:

我正在调查aurioTouch2 示例代码。 我注意到,当我们分析音频数据时,我们只使用该数据的第一个缓冲区,而不使用其他缓冲区。 在void FFTBufferManager::GrabAudioData(AudioBufferList *inBL)函数中:

    UInt32 bytesToCopy = min(inBL->mBuffers[0].mDataByteSize, mAudioBufferSize - mAudioBufferCurrentIndex * sizeof(Float32));
    memcpy(mAudioBuffer+mAudioBufferCurrentIndex, inBL->mBuffers[0].mData, bytesToCopy);

在函数中

static OSStatus PerformThru(
                            void                        *inRefCon, 
                            AudioUnitRenderActionFlags  *ioActionFlags, 
                            const AudioTimeStamp        *inTimeStamp, 
                            UInt32                      inBusNumber, 
                            UInt32                      inNumberFrames, 
                            AudioBufferList             *ioData)
if (THIS->displayMode == aurioTouchDisplayModeOscilloscopeWaveform)

        AudioConverterConvertComplexBuffer(THIS->audioConverter, inNumberFrames, ioData, THIS->drawABL);
        SInt8 *data_ptr = (SInt8 *)(THIS->drawABL->mBuffers[0].mData);

问题是为什么我们忽略inBL->mBuffers1.mData中的数据?

【问题讨论】:

【参考方案1】:

由于您的 iPhone 上只有 1 个麦克风,因此 2 个立体声通道缓冲区(L 和 R)中的样本是相同的。由于第二个缓冲区只是冗余的(或者在某些配置中是空的),因此不需要(再次)分析那里的数据。

【讨论】:

【参考方案2】:

可能是,我错了,但现在有所不同,使用什么缓冲区。您只有 2 个缓冲区: mBuffers[0] 和 mBuffers1。我尝试在频谱图中使用缓冲区 0 而不是缓冲区 1(发音相同)。使用缓冲区 0 完成了图像的左侧部分;右侧部分 - 使用缓冲区 1(在制作快照期间产生了右侧峰值)。

所以,你可以看到,没有区别。

【讨论】:

我也在尝试将 auriotouch 项目集成到我的应用程序中。我已经尝试了很长时间,但我仍然无法弄清楚。那么,你能帮我解决这个问题吗?

以上是关于为啥我们在 aurioTouch 项目中只使用第一个缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 pandas 列中只得到一个项目(而不是多个项目)?

如何更改 aurioTouch 项目以将录音写入 .caff 或 .wav 文件

AudioBufferList 的 AurioTouch 用途

为啥这段代码在 for 循环中只使用 x 而不是 x 和 y? [关闭]

将 Auriotouch 线性刻度更改为对数

aurioTouch2 录音问题。我需要将数据从一个 AudioBufferList 添加到另一个