首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RtAudio + Qt :在Linux上不使用RME防火墙的双工

RtAudio + Qt :在Linux上不使用RME防火墙的双工
EN

Stack Overflow用户
提问于 2018-11-07 12:41:26
回答 1查看 302关注 0票数 0

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

我是C++的新手。

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

后端是ALSA。

音频输出在我的桌面计算机上都很好( ClassCompilant模式下的RME Fireface,以及带有HifiBerry和PiSound的Raspberry Pi 3)。

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

当我将输入StreamParameters添加到openStream时,我就听到了非常刺耳的声音。虽然,StreamStatus在回调中很好.

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

我将其添加到中的项目文件中。

LIBS += -lpthread -lasound

我认为我的问题类似于这一个,但我找不到(或者如果)它是如何解决的

我试过不同的缓冲器尺寸(从64到4096或更多),裂纹较难听到,但当缓冲区尺寸增加时,裂纹仍然存在。

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

编辑:

出于好奇(和绝望),我尝试了更低的缓冲区大小,使用了来自RtAudio help的典型示例:结果是使用缓冲区大小1、2、4和8帧消除了裂缝.

当我使用16帧时,声音是可怕的

甚至15帧都能工作,我真的不明白是怎么回事

代码示例:

代码语言:javascript
复制
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;

只有输出时,它才能工作:

代码语言:javascript
复制
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时会出现裂纹:

代码语言:javascript
复制
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);
}

谢谢你的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-09 13:27:20

回答我自己的问题。

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

原来我第一次肯定做错了什么。来自RtAudio的规范示例(以及我为我的程序所做的输入实现)在64,128等缓冲区大小下工作得很好。

桌面的构建仍然有古怪的声音,但适用于奇怪的缓冲区大小(比如25、30或27)。这个问题很可能来自Fireface,它在Linux上不受很好的支持(即使是在ClassCompilant模式下)。

谢谢你的帮助,如果我浪费了你的时间,我很抱歉。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53189676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档