RtAudio + Qt: дуплекс не работает с RME Fireface на Linux - PullRequest
0 голосов
/ 07 ноября 2018

Это мой первый пост на 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(
        &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 голосов
/ 09 ноября 2018

Отвечая на мой вопрос.

Я сделал свои тесты с нуля на Raspberry Pi 3 / PiSound.

Оказывается, я, должно быть, сделал что-то не так в первый раз. Канонический пример из RtAudio (и входная реализация, которую я сделал для моей программы) хорошо работает при 64, 128 и т.д. размерах буфера.

В настольной сборке все еще слышен хриплый звук, но она работает со странными размерами буфера (например, 25, 30 или 27). Скорее всего, проблема связана с Fireface UCX, который не очень хорошо поддерживается в Linux (даже в режиме ClassCompilant).

Спасибо за вашу помощь, и извините, если я потратил впустую ваше время.

...