Как написать программу на C++, которая будет выводить аудио в почти реальном времени с использованием libao в Ubuntu?

Я прохожу курс “от 0 до Linux админа” вот здесь https://yodo.im/courses/linux/?v=1d20b5ff1ee9 и столкнулся с проблемой. Нужно сделать так, чтобы моя программа на C++ могла воспроизводить аудио в реальном времени с помощью библиотеки libao на Ubuntu.

Я опытный программист, в основном занимался графикой, и использую Linux с тех пор, как он назывался “UNIX”. Однако простая задача — воспроизвести звуковой буфер на динамиках — доводит меня до безумия.

Вот с чем я столкнулся:

  • Просто запишите данные в /dev/audio! (Это уже устарело.)
  • Просто установите ALSA — и всё будет просто (но это у меня не работает).
  • Вы должны использовать PulseAudio (но и это не работает).

У меня есть две машины: одна старая с Ubuntu 20.04.6 LTS и другая новая с Ubuntu 25.10. Другие программы прекрасно воспроизводят стереозвук, но когда я пытаюсь открыть устройство с помощью ao_open_live, я получаю ошибку AO_EOPENDEVICE. Это похоже на проблему с отсутствием /dev/dsp.

Я пробовал установить разные пакеты, но ничего не помогло. Я могу генерировать звук, используя SOX или aplay, так что параметры, такие как битрейт и размер выборки, у меня верные.

Вот мой код:

void sndImage::PlayLibAO () const {
    int driver;
    ao_device *device;
    ao_sample_format format;
    char *matrix = strdup("L,R");
    int bufferSize = GetNumFragments() * 2;

    // Инициализация libao
    ao_initialize();
    driver = ao_default_driver_id();
    memset(&format, 0, sizeof(format));

    format.bits = GetBitDepth();
    format.channels = 2;
    format.rate = GetSamplesPerSecond();
    format.byte_format = AO_FMT_NATIVE;

    errno = 0;

    device = ao_open_live(driver, &format, NULL);
    
    if (device == 0) {
        const char *message = NULL;
        switch (errno) {
            case AO_ENODRIVER: message = "Нет соответствующего драйвера."; break;
            case AO_ENOTLIVE: message = "Этот драйвер не является живым выводным устройством."; break;
            case AO_EBADOPTION: message = "Неверное значение параметра."; break;
            case AO_EOPENDEVICE: message = "Не удается открыть устройство."; break;
            case AO_EFAIL: message = "Неопределенная ошибка."; break;
            default: message = "Неизвестная ошибка."; break;
        }
        fprintf(stderr, "ERROR: Не удалось открыть аудиоустройство: %s\n", message);
        ao_shutdown();
        assert(false);
    }
}

Есть ли у кого-то идея, как это исправить или что мне следует проверить? Все подсказки принимаются с благодарностью!

Спасибо за ответ! У меня все получилось, и я смог написать программу на C++, которая выводит аудио в почти реальном времени с использованием libao в Ubuntu. Ваши советы очень помогли!