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* будет автоматически ждать, если буфер заполнен.

Если вы не можете контролировать скорость отправителя с помощью получателя (поскольку они не находятся на одной машине и у вас нет протокола, обеспечивающего обратную связь), вам необходимо измерить относительные скорости отправителя и получателя и выполнить повторную выборку данных соответствующим образом.,

Другие вопросы по тегам