RtAudio + Qt:双工无法在Linux上与RME Fireface一起使用

时间:2018-11-07 12:41:27

标签: c++ qt audio rtaudio

这是我关于Stackoverflow的第一篇文章,希望我做对了。

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

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

回答我自己的问题。

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

事实证明,我第一次肯定做错了什么。 RtAudio的规范示例(以及我为程序执行的输入实现)在64、128等缓冲区大小下可以很好地工作。

桌面版本的声音仍然有些刺耳,但是可以使用奇怪的缓冲区大小(例如25、30或27)。该问题很可能是由于Fireface UCX所致,该Linux在Linux(甚至在ClassCompilant模式下)也没有很好地支持。

谢谢您的帮助,对不起,如果我浪费您的时间。