Port音频处理立体声

Port Audio process stereo

本文关键字:立体声 处理 音频 Port      更新时间:2023-10-16

我是PortAudio新手。我将它与c++包装头一起使用。

http://sdr.f4gkr.org/trac/browser/gkSDR/Logiciel/audio/pawrapper.h?rev=5

我需要知道应该怎么做才能把立体声输入分解成两个独立的通道。

我通过这个代码从一个通道输入。

  inputStreamParam.channelCount = 2;
  inputStreamParam.device = Pa_GetDefaultInputDevice();
  inputStreamParam.sampleFormat = paFloat32;
  inputStreamParam.suggestedLatency = suggestedLatency;
  inputStreamParam.hostApiSpecificStreamInfo = NULL;
  if(outputStreamParam.device > 0)
    sampleRate = getDefaultSampleRate(outputStreamParam.device);
  else
    sampleRate = 44100.0;
  frameLength = 1024; //set to a useful value
int paWrapper::startAudio(void)
{
  if(isRunning) return pawErrorAudioIsRunning;
  isRunning=true;
  err = Pa_OpenStream(&stream,
                      &inputStreamParam,
                      &outputStreamParam,
                      sampleRate,
                      frameLength,
                      paNoFlag,
                      &paWrapper::paStaticCallback,
                      this);
  if(err != paNoError)
  {
    isRunning=false;
    return err;
  }
  int err = Pa_StartStream( stream );
  if(err != paNoError)
    isRunning=false;
  return err;
}

我应该如何修改,以便能够通过我的立体声麦克风分别获取两个通道,然后分别处理它们?

当您调用Pa_OpenStream(...)时,倒数第二个参数是回调函数,这是音频处理的主要内容。看起来您的包装器正在使用函数paStaticCallback。通过查看包装器,我看到它调用另一个函数userdata->processingCallBack(...),这是Pa_OpenStream(...)函数的最后一个参数。你把this作为参数。

所以你需要重写processingCallback()函数。

在PortAudio文档中有更多的细节,但是该函数的第一个参数是指向输入缓冲区的void指针。如果你有立体声,那么每个通道将交错。

例如,如果您以每个采样16位记录,该缓冲区的前两个字节(16位)将是左侧通道采样,接下来的2个字节将是右侧通道采样。这将重复。

你可以提取回调函数中的每个通道。

当我在使用PortAudio时,这些例子真的帮助了我。

这是一个记录音频,将其存储在内存中并播放的示例。密切关注recordCallbackplayCallback

祝你好运。