Я написал простую оболочку C ++, представляющую AudioStream, основанную на ALSA API. Мне кажется очень удобным использовать режим asyn c. К сожалению, функция обратного вызова, зарегистрированная для асинхронного режима c, не вызывается.
В документации alsa указано для snd_async_add_handler()
:
Эта функция связывает функцию обратного вызова с данный файл и сохраняет эту связь в объекте snd_async_handler_t. Всякий раз, когда сигнал SIGIO поднимается для файла fd, вызывается функция обратного вызова с параметром, указывающим на объект обработчика asyn c, возвращаемый этой функцией. Обработчик sigaction ALSA для сигнала SIGIO автоматически мультиплексирует уведомления в зарегистрированные асинхронные обратные вызовы c. Однако приложение отвечает за указание драйверу устройства генерировать сигнал SIGIO. Возможно, сигнал SIGIO был заменен другим сигналом, см. Snd_async_handler_get_signo.
Особенно полужирная часть интересно. Означает ли это, что пользователь должен каким-то образом настроить драйвер для генерации этих SIGIO? Я полагаю, что SIGIO - это просто какое-то прерывание, поэтому нужно разрешить генерацию прерываний драйвером ??? Я ожидаю, что это будет обязанностью ALSA через конфигурацию hw_params
или около того.
Единственное, что мне удалось найти, было по следующей ссылке, где в ответе говорится, что ASYN C устарела однако из документации ALSA это не так.
ALSA - управление asyn c IO
Документация ALSA для справки: https://www.alsa-project.org/alsa-doc/alsa-lib/group___global.html#gafd936c40505997bb659b74bd368636b8