Я прохожу курс “от 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);
}
}
Есть ли у кого-то идея, как это исправить или что мне следует проверить? Все подсказки принимаются с благодарностью!