Это мой первый пост на Stackoverflow, надеюсь, я делаю это правильно.
Я новичок в C ++.
Я играл с RtAudio и Qt (на linux, desktop и raspberry pi).
Бэкэнд - это ALSA.
Аудиовыход работал нормально как на моем настольном компьютере (RME Fireface UCX в режиме ClassCompilant, так и на Raspberry Pi 3 с HifiBerry и PiSound)
В последнее время я пытался добавить поддержку ввода звука в мою программу.
Я прочитал дуплексное руководство на веб-сайте RtAudio и попытался внедрить его в свой код.
Как только я добавил вход StreamParameters
к openStream
, я получил очень хриплый звук.
Хотя StreamStatus в обратном вызове работает нормально ...
Я попытался создать пустой проект C ++ и просто скопировать учебник по RtAudio.
К сожалению, проблема остается ...
Я добавил это в свой файл проекта в Qt Creator
LIBS += -lpthread -lasound
Я думаю, что моя проблема похожа на эту , но я не мог найти, как (или если) она была решена
Я пробовал разные размеры буфера (от 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);
}
Спасибо за вашу помощь