Alsa Buffer переполняется при воспроизведении аудио
Я подключил IMX
доска для ПК спина к спине. Я запускаю двоичный файл на плате, который отправляет аудио кадры каждые 5,7 мс с 1024 байтами. ПК получает кадры и пишет, используя
printf("snd_pcm_avail %d \n",snd_pcm_avail (FMWK.FMWK_Handler.playback_handle));
err = snd_pcm_writei(FMWK.FMWK_Handler.playback_handle, OutputPointer, PERIOD_BYTES);
Когда происходит воспроизведение, через каждые 6 секунд я получаю сломанную трубу
Журналы при успешном воспроизведении
snd_pcm_avail 32
snd_pcm_avail 17
snd_pcm_avail 81
snd_pcm_avail 25
snd_pcm_avail 89
snd_pcm_avail 32
snd_pcm_avail 17
snd_pcm_avail 81
snd_pcm_avail 32
snd_pcm_avail 17
snd_pcm_avail 81
snd_pcm_avail 25
snd_pcm_avail 89
snd_pcm_avail 32
snd_pcm_avail 17
snd_pcm_avail 81
Приблизительно уменьшается на 56. Когда через 5 секунд увеличивается полезность, и буфер переполняет настроенный лимит buffer_size=256
Журналы:
snd_pcm_avail 89
snd_pcm_avail 112
snd_pcm_avail 96
snd_pcm_avail 120
snd_pcm_avail 104
snd_pcm_avail 129
snd_pcm_avail 153
snd_pcm_avail 137
snd_pcm_avail 160
snd_pcm_avail 184
snd_pcm_avail 168
snd_pcm_avail 193
snd_pcm_avail 176
snd_pcm_avail 201
snd_pcm_avail 224
snd_pcm_avail 209
snd_pcm_avail 232
snd_pcm_avail 217
snd_pcm_avail 240
snd_pcm_avail -32
(AVB Info) 12:26:11 PM.606306 (Slave) ==> Broken pipe
snd_pcm_avail 256
snd_pcm_avail 48
Я установил period_size как 128
Я не уверен, что в исходной конфигурации snd_pcm мне чего-то не хватает? это 44.1khz
аудио.
2 ответа
Что происходит, так это то, что ваша программа не может поспевать за воспроизведением данных PCM устройством. Когда на аудиоустройстве происходит "Сломанная труба", оно ждет новых семплов, но ваша программа не доставила их вовремя.
Ситуация, с которой вы столкнулись, - бич онлайн-аудиосистем; к сожалению, существующая звуковая архитектура Linux (ALSA) не очень хорошая работа; PulseAudio + RealtimeKit пытался (ИМХО не очень успешно) намазать трещины, выполняя странное и безумное вуду, чтобы не голодать водителей ALSA; дела обстоят не лучше, если некоторые драйверы ломаются и не сообщают должным образом о положении воспроизводящей головки.
В вашем случае вы можете сделать две вещи:
- Используйте большие кадры (больше образцов в буфере)
- Поставить в очередь больше кадров (поставить в очередь несколько буферов) и сохранить минимальное количество кадров в очереди
Аудиоустройства, как правило, имеют свои собственные тактовые импульсы, которые не синхронизированы с системными часами.
Таким образом, вы не можете использовать системные часы для контроля скорости отправки образцов на устройство; он будет работать слишком быстро или слишком медленно почти на всех системах.
Чтобы отправить образцы с правильной скоростью, просто попытайтесь написать свои образцы как можно быстрее; snd_pcm_write
* будет автоматически ждать, если буфер заполнен.
Если вы не можете контролировать скорость отправителя с помощью получателя (поскольку они не находятся на одной машине и у вас нет протокола, обеспечивающего обратную связь), вам необходимо измерить относительные скорости отправителя и получателя и выполнить повторную выборку данных соответствующим образом.,