Port音频处理立体声
Port Audio process stereo
我是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时,这些例子真的帮助了我。
这是一个记录音频,将其存储在内存中并播放的示例。密切关注recordCallback
和playCallback
。
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- Port音频处理立体声