#linux #audio #embedded #latency #alsa
#linux #Аудио #встроенный #задержка #alsa
Вопрос:
Я работаю на встроенной плате Linux (на основе Eukrea iMx25). Приложение представляет собой игру, в которой воспроизводятся музыкальные ноты или другие песни. Я получаю события от радиооборудования, а затем проигрываю файлы wav.
-
Самодельный проигрыватель: Первое решение для воспроизведения — использовать системную функцию open / write для вывода / dev / dsp. Задержка очень хорошая, быстрый запуск песни и быстрая остановка. Однако есть некоторые ошибки, и иногда песня заменяется шумом или шум появляется в конце песни. (Вероятно, это связано с проблемой синхронизации воспроизведения с оборудованием, поскольку это программное приложение хорошо работает в одиночку в качестве минималистичного программного теста).
-
Aplay (монофонический): Второе решение — использовать «aplay», предоставляемый в дистрибутиве Linux. Проблема в задержке, при остановке воспроизведения сразу после запуска (с устройства tlv320aic23) появляется ошибка ядра. Ожидание 100 или 200 мс перед остановкой воспроизведения неприемлемо, поскольку у моего радиосенсора задержка составляет 100 мс.
-
Воспроизведение с dmix (полифоническое): я думаю, что в обоих решениях ограничения связаны с устройством tlv320aic23. Интересно, может ли быть лучше использовать звуковой сервер. Я мог бы воспроизвести новую песню сразу после получения события и останавливать песни, когда захочу. Я протестировал плагин aplay -D: dmix / home / root / mysong.wav, но я получаю сбой при подключении после разных тестов. Проблема в том, что aplay не возвращает ошибку, касающуюся сбоя подключения, а aplay без dmix все еще работает.
Должен ли я использовать другой звуковой сервер? Например, «Джек»?
Вот тестовая программа :
for(i=50; i>0; i--){
periode = 23 * i;
// Display in log
msg(USER, MSG_CONTROLE, "declenchement dalle %d et attente %f",
choixDalle, periode);
// Send event to audio task
signalerAppuiDalleCtrl(amp;ctrlInstances, Hw.xmlParams, amp;Hw, choixDalle 100, 0);
// Waiting with arg in second
attendre(periode/1000.0);
}
Комментарии:
1. Маловероятно, что какой-либо другой API сможет сделать больше, чем ALSA, поскольку драйвер / ядро основаны на ALSA. Таким образом, любое стороннее решение, такое как JACK, основано на ALSA. Существует множество различных вариантов воспроизведения ALSA. Смотрите: Документы Alsa lib и обзор PCM . Убедитесь, что у вас включена поддержка FIQ. Вы можете уменьшить частоту дискретизации. Возможно, вам потребуется изменить источник, чтобы он соответствовал модели FIQ; Я не уверен, какие скорости / форматы он поддерживает. Вам не нужно программное преобразование сэмплов.
2. Я ожидал, что разъем будет таким же, как подключаемый dmix, без сбоев.
3. Мне нужно провести некоторое исследование модели FIQ, чтобы понять ваше предупреждение. Я надеюсь, что FIQ включен, потому что я использовал скрипт из Eukrea для компиляции ядра и корневых файлов, но, возможно, я ошибаюсь.
Ответ №1:
Я не знаю больше о функции FIQ, и сегодня я все еще использую третье решение, но с файлом asound.conf (параметр not -D plug: dmix), и, похоже, он работает хорошо. мой файл asound.conf :
pcm.dmixed {
type dmix
ipc_key 1024
ipc_key_add_uid 0
slave.pcm "hw:0,0"
}
pcm.dsnooped {
type dsnoop
ipc_key 1026
slave.pcm "hw:0,0"
}
pcm.duplex {
type asym
playback.pcm "dmixed"
capture.pcm "dsnooped"
}
# Instruct ALSA to use pcm.duplex as the default device
pcm.!default {
type plug
slave.pcm "duplex"
}
ctl.!default {
type hw
card 0
}