c++ - 如何使用 RtAudio 调整音频声像

标签 c++ audio duplex audio-panning rtaudio

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

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

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

最佳答案

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

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

Hard Left:
l=1; r=0
Center:
l=1; r=1
Hard Right:
l=0; r=1;

如果这是更奇葩的东西,你应该在谷歌上搜索“pan law”。这是一个看起来不错的例子:

http://www.kvraudio.com/forum/viewtopic.php?p=4264576

更新: 我从未使用过 RT 音频(我通常使用类似的 PortAudio),但我认为要平移的代码看起来像这样,其中 l 和 r 如上所述(假设类型为 int32_t - 带符号的 32 位整数):

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;
}

关于c++ - 如何使用 RtAudio 调整音频声像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13243079/

相关文章:

c# - Unity3d 中的受控音高或频移

silverlight - 契约(Contract)需要双工,但绑定(bind) 'BasicHttpBinding' 不支持或未正确配置以支持它

c# - WCF 与 SOAP HTTPS 和双工绑定(bind)

WCF 双工回调示例失败

c++ - 修改列表后 std::list<T>::end() 的值是否改变?

c++ - x 秒后写入多个文件速度变慢

python - 在python中记录输出声音

python - Kivy 中的音频录制

c++ - "It doesn’ t 对作为对象成员的引用有效在 GotW #88 中意味着什么?

c++ - 如何在 C++ 中清空套接字读/写缓冲区