端口音频处理立体声

时间:2015-06-02 14:42:23

标签: c++ audio portaudio

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

我应该如何修改才能通过我的立体声麦克风单独获取两个声道,然后单独处理它们?

1 个答案:

答案 0 :(得分:0)

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

因此您需要覆盖 processingCallback() 函数。

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

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

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

当我使用 PortAudio 时,示例 examples 对我很有帮助。

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

祝你好运。