在 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 2input 2output 1

我将如何使用portaudio 实现这一目标?我期待像 *out.1++ = *in.2++; 这样的东西,但找不到任何相关信息。

提前感谢您的回答!

【问题讨论】:

【参考方案1】:

outinfloat 的数组,其中通道是交错的。含义 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 中管理频道的主要内容,如果未能解决你的问题,请参考以下文章

Office 365: 私有频道的使用和管理技巧

YouTube API - 列出我管理的所有频道

如何创建只有具有管理员和管理频道权限的成员才能使用的“创建文本/vc 频道”命令?

在使用机器人的频道中发现或禁止电报用户?

信息发布员和频道管理员如何查看dedecms自定义表单内容

如何将电报机器人添加到我不是管理员的公共频道?