RtAudio + Qt:双工不能在 Linux 上与 RME Fireface 一起工作

RtAudio + Qt : duplex not working with RME Fireface on Linux

这是我在 Whosebug 上的第一个 post,希望我做对了。

我是 C++ 新手。

我一直在玩 RtAudio 和 Qt(在 linux、桌面和 raspberry pi 上)。

后端是 ALSA。

音频输出在我的台式电脑(ClassCompilant 模式下的 RME Fireface UCX 和带有 HifiBerry 和 PiSound 的 Raspberry Pi 3 上)

最近,我尝试为我的程序添加音频输入支持。 我阅读了 RtAudio 网站上的 duplex tutorial,并尝试在我的代码中实现它。

将输入 StreamParameters 添加到 openStream 后,我听到了非常刺耳的声音。 虽然,StreamStatus 在回调中是可以的...

我尝试创建一个空的C++项目,并简单地复制RtAudio教程。 可悲的是,问题仍然存在...

我在 Qt Creator 中将其添加到我的项目文件中

LIBS += -lpthread -lasound

我认为我的问题与 this one 类似,但我无法找到它是如何(或是否)得到解决的

我尝试了不同的缓冲区大小(从 64 到 4096 甚至更多),裂纹听不见了,但当缓冲区大小增加时仍然存在

您知道关于双工模式下的 RtAudio 应该做些什么来解决这个问题吗?在双工模式下,缓冲区大小似乎不一样。

编辑:

出于好奇(和绝望),我尝试使用 RtAudio 帮助中的规范示例甚至更低的缓冲区大小:事实证明,使用缓冲区大小 1、2、4 和 8 帧可以消除裂缝。 ..

我一用16帧,声音就很烂

连15帧都可以,真搞不懂是怎么回事

代码示例:

RtAudio::StreamOptions options;
options.flags |= RTAUDIO_SCHEDULE_REALTIME;

RtAudio::StreamParameters params_in, params_out;
params_in.deviceId = 3;
params_in.nChannels = 2;
params_out.deviceId = 3;
params_out.nChannels = 2;

仅输出时有效:

try {
    audio.openStream(
        &params_out,
        NULL,
        RTAUDIO_SINT16,
        48000,
        &buffer_frames,
        &inout,
        (void *) &buffer_bytes,
        &options
    );
}
catch (RtAudioError& e) {
    std::cout << "Error while opening stream" << std::endl;
    e.printMessage();
    exit(0);
}

NULL更改为&params_in时出现裂缝:

try {
    audio.openStream(
        &params_out,
        &params_in,
        RTAUDIO_SINT16,
        48000,
        &buffer_frames,
        &inout,
        (void *) &buffer_bytes,
        &options
    );
}
catch (RtAudioError& e) {
    std::cout << "Error while opening stream" << std::endl;
    e.printMessage();
    exit(0);
}

感谢您的帮助

回答我自己的问题。

我在 Raspberry Pi 3 / PiSound 上从头开始测试。

原来我第一次做错了。来自 RtAudio 的典型示例(以及我为我的程序所做的输入实现)在 64、128 等缓冲区大小下运行良好。

桌面版本仍然有刺耳的声音,但可以使用奇怪的缓冲区大小(如 25、30 或 27)。问题很可能来自 Linux(即使在 ClassCompilant 模式下)也没有得到很好支持的 Fireface UCX。

感谢您的帮助,如果浪费了您的时间,我们深表歉意。