Это мой первый пост на Stackoverflow, надеюсь, я делаю это правильно.
Я новичок в C ++.
Я играл с RtAudio и Qt (на Linux, десктопе и 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);
}
Спасибо за помощь
Отвечая на мой собственный вопрос.
Я сделал свои тесты с нуля на Raspberry Pi 3 / PiSound.
Оказывается, я, должно быть, сделал что-то не так с первого раза. Канонический пример из RtAudio (и входная реализация, которую я сделал для моей программы) хорошо работает при 64, 128 и т.д. размерах буфера.
В настольной сборке все еще слышен треск, но она работает со странными размерами буфера (например, 25, 30 или 27). Скорее всего, проблема связана с Fireface UCX, который не очень хорошо поддерживается в Linux (даже в режиме ClassCompilant).
Спасибо за вашу помощь, и извините, если я потратил впустую ваше время.
Других решений пока нет …