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(
¶ms_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
更改为¶ms_in
时出现裂缝:
try {
audio.openStream(
¶ms_out,
¶ms_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。
感谢您的帮助,如果浪费了您的时间,我们深表歉意。
这是我在 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(
¶ms_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
更改为¶ms_in
时出现裂缝:
try {
audio.openStream(
¶ms_out,
¶ms_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。
感谢您的帮助,如果浪费了您的时间,我们深表歉意。