C++ 如何使用RtAudio调整音频平移

C++ 如何使用RtAudio调整音频平移,c++,audio,duplex,audio-panning,rtaudio,C++,Audio,Duplex,Audio Panning,Rtaudio,我使用Rtaudio库,我想实现一个音频程序,在其中我可以控制平移(例如,将声音从左声道切换到右声道) 在我的特定情况下,我使用双工模式(您可以在这里找到一个示例:)。这意味着我将麦克风输入链接到扬声器输出 我应该在输出缓冲区上应用过滤器吗?什么样的过滤器? 有人能帮我吗?要减少左边的信号,只需将左边的每个样本乘以一个小于或等于1的数字,我们称之为l。同样地,对于右边,我们称之为r。一般来说,您不希望乘以大于1的数字,否则可能会导致信号失真 l和r都是“平移位置”的功能。你如何从平盘位置到你的数

我使用Rtaudio库,我想实现一个音频程序,在其中我可以控制平移(例如,将声音从左声道切换到右声道)

在我的特定情况下,我使用双工模式(您可以在这里找到一个示例:)。这意味着我将麦克风输入链接到扬声器输出

我应该在输出缓冲区上应用过滤器吗?什么样的过滤器?

有人能帮我吗?

要减少左边的信号,只需将左边的每个样本乘以一个小于或等于1的数字,我们称之为l。同样地,对于右边,我们称之为r。一般来说,您不希望乘以大于1的数字,否则可能会导致信号失真

l和r都是“平移位置”的功能。你如何从平盘位置到你的数字是一个讨论的问题。如果这是为了简单的事情,您可以在极端情况下使用这些值线性地降低值:

Hard Left:
l=1; r=0
Center:
l=1; r=1
Hard Right:
l=0; r=1;
如果这是一个更有趣的东西,你应该在谷歌上搜索“泛法律”。以下是一个看似良好开端的示例:

更新: 我从未使用过RT音频(我通常使用PortAudio,这与之类似),但我认为pan的代码应该是这样的,上面定义了l和r(假设类型为int32_t-带符号的32位整数):

int-inout(void*outputBuffer,void*inputBuffer,unsigned int-nBufferFrames,
双流时间、RtAudioStreamStatus状态、void*数据)
{

如果(状态)std::cout实际上,这不是我需要的。如果从双工模式示例开始,我在函数inout中有一个audio*outputBuffer。我如何修改该缓冲区以获得平移?我是说一个简单的二维音频平移我添加了一些示例代码,不确定它是否正确,但它会给你一个想法。使用浮点数据可能更容易我认为RtAudio支持。另外,仅供参考,大多数人都说2D平移,所以没有混淆,但实际上是1D。
int inout( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
           double streamTime, RtAudioStreamStatus status, void *data )
{
  if ( status ) std::cout << "Stream over/underflow detected." << std::endl;

  int32_t *ob = (int32_t *)outputBuffer;
  int32_t *in = (int32_t *)inputBuffer;

  unsigned long *bytes = (unsigned long *) data;
  int i =0;
  while( i < bytes / 4 ) {
     ob[i] = (int32_t) ( ib[i] * l + .5 );
     ++i;
     ob[i] = (int32_t) ( ib[i] * r + .5 );
     ++i;
  }
  return 0;
}