在 portaudio 中管理频道
Posted
技术标签:
【中文标题】在 portaudio 中管理频道【英文标题】:Managing channels in portaudio 【发布时间】:2015-04-27 15:54:29 【问题描述】:目前正在开发 C 语言的实时声音应用程序,我正在学习如何使用 portaudio
。
我的第一个问题是我不太了解如何管理频道。
承认我只想通过portaudio
传递音频。
我认为我的回调函数是:
static int fuzzCallback( const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
SAMPLE *out = (SAMPLE*)outputBuffer;
const SAMPLE *in = (const SAMPLE*)inputBuffer;
(void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags;
(void) userData;
*out++ = *in++; // Left channel
*out++ = *in++; // Right channel
return paContinue;
现在让我们承认我想切换输入并将其发送到输出,即将input 1
发送到output 2
和input 2
到output 1
。
我将如何使用portaudio
实现这一目标?我期待像 *out.1++ = *in.2++;
这样的东西,但找不到任何相关信息。
提前感谢您的回答!
【问题讨论】:
【参考方案1】:out
和 in
是 float
的数组,其中通道是交错的。含义 in
是 L1,R1,L2,R2,L3,R3... 输出相同。当您从输入复制到输出时,要交换通道会更改索引。
static int fuzzCallback( const void *inputBuffer,
void *outputBuffer,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData )
SAMPLE *out = (SAMPLE*)outputBuffer;
const SAMPLE *in = (const SAMPLE*)inputBuffer;
(void) timeInfo; /* Prevent unused variable warnings. */
(void) statusFlags;
(void) userData;
for (int i=0; i < framesPerBuffer; i++)
out[i*2+1] = in[i*2]; // Left -> Right
out[i*2] = in[i*2+1]; // Right -> Left
return paContinue;
【讨论】:
非常感谢您的快速回答!它现在似乎有效!以上是关于在 portaudio 中管理频道的主要内容,如果未能解决你的问题,请参考以下文章