c – AudioUnit中的输入缓冲区结构

c – AudioUnit中的输入缓冲区结构,第1张

概述我写了一个简单的audiounit,它应该交换立体声源的左右声道.对于使用BASS库的命令行程序,此代码的移植版本在C中运行良好,但是我无法在 Xcode中使用相同的代码来进行音频处理. 对于例如{1,2,3,4,5,6}的缓冲器输入,我预期立体声反转为{2,1,4,3,6,5}. 我的代码以这种方式正确地反转了样本,但我听到的只是某种低通滤波,而不是样本的立体反转. 我的输入缓冲区中的前4个值是 我写了一个简单的audiounit,它应该交换立体声源的左右声道.对于使用BASS库的命令行程序,此代码的移植版本在C中运行良好,但是我无法在 Xcode中使用相同的代码来进行音频处理.

对于例如{1,2,3,4,5,6}的缓冲器输入,我预期立体声反转为{2,1,6,5}.

我的代码以这种方式正确地反转了样本,但我听到的只是某种低通滤波,而不是样本的立体反转.

我的输入缓冲区中的前4个值是:
0.000104
0.000101
0.000080
0.000113

输出是:
0.000101
0.000104
0.000113
0.000080

我是否误解了输入/输出缓冲区的结构方式?

voID        First::FirstKernel::Process(    const float32   *inSourceP,float32         *inDestP,UInt32          inSamplestoprocess,UInt32          inNumChannels,bool            &ioSilence ){if (!ioSilence) {                                                     const float32 *sourceP = inSourceP;      float32  *destP = inDestP;      for (int i = inSamplestoprocess/2; i>0; --i) {         *(destP+1) = *sourceP;        *destP = *(sourceP+1);        sourceP = sourceP +2;        destP = destP +2;}   }   }
解决方法 这段代码不起作用的原因是因为你正在使用AudioUnit内核,它调用你的插件来处理一个音频数据通道(如果我理解的话).虽然在某些情况下内核可能非常方便,但它肯定不适用于执行相互依赖的立体声处理的插件.您正在传递回调中的频道数 – 您是否已检查此值?

无论如何,您应该继承AUEffectBase类并重写ProcessBufferLists()方法.然后,您将获得一个适当的AudioBufferList结构,其中包含每个音频通道的非隔行缓冲区.与使用内核相比,它还可以更好地控制渲染过程.

编辑:好的,事实证明,内核回调总是传递1个音频通道.另外,如我最初建议的那样覆盖Render()并不是最好的方法.根据AUEffectBase.h源代码中的注释:

If your unit processes N to N channels,and there are no interactions between channels,
it can overrIDe NewKernel to create a mono processing object per channel. Otherwise,
don’t overrIDe NewKernel,and instead,overrIDe ProcessBufferLists.

由于AUEffectBase不是“标准”AudioUnit代码的一部分,因此您需要将cpp / h文件添加到项目中.它们可以在AudioUnits / AUPublic / OtherBases文件夹中的AudioUnit SDK根目录下找到.所以对于你的插件,它看起来像这样:

MyEffect.h:

#include "AUEffectBase.h"class MyEffect : public AUEffectBase {public:  // Constructor,other overrIDden methods,etc.  virtual Osstatus ProcessBufferLists(AudioUnitRenderActionFlags &ioActionFlags,const audiobufferlist &inBuffer,audiobufferlist &outBuffer,UInt32 inFramestoprocess);private:  // Private member variables,methods};

MyEffect.cpp:

// Other stuff ....Osstatus MyEffect::ProcessBufferLists(AudioUnitRenderActionFlags &ioActionFlags,UInt32 inFramestoprocess) {  const float *srcBufferL = (float32 *)inBuffer.mBuffers[0].mData;  const float *srcBufferR = (float32 *)inBuffer.mBuffers[1].mData;  float *destBufferL = (float32 *)outBuffer.mBuffers[0].mData;  float *destBufferR = (float32 *)outBuffer.mBuffers[1].mData;  for(UInt32 frame = 0; frame < inFramestoprocess; ++frame) {    *destBufferL++ = *srcBufferL++;    *destBufferR++ = *srcBufferR++;  }}
总结

以上是内存溢出为你收集整理的c – AudioUnit中的输入缓冲区结构全部内容,希望文章能够帮你解决c – AudioUnit中的输入缓冲区结构所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1022676.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存