aplay выходит до того, как вся песня будет прочитана - PullRequest
0 голосов
/ 08 мая 2019

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

выдержки: я новичок в программировании ALSA, и у меня есть встроенная плата с ограниченным набором команд. Я перебрал ссылки здесь: Требуется учебное пособие по ALSA , но я не смог разобраться с этими проблемами, связанными со временем.

Настройка:

OS: linux 4.14.70
aplay: version 1.1.4 by Jaroslav Kysela <perex@perex.cz>
Advanced Linux Sound Architecture Driver Version k4.14.70.

Используемая аудиоблок имеет отдельное оборудование и отдельный DSP для автономной обработки

Поток информации: Linux -> ядро ​​DSP

Входная песня передается ядру Linux, загружая песню в область DMA -> Считать DMA в отдельную кольцевую буферную область DMA, используемую DSP, и записать ее в выходной путь I2S в файл

Я мог видеть, что размер песни составляет 960000 байт, с частотой дискретизации 48000, форматом S16_LE, 2-канальным, 16-битной глубиной -> который рассчитывается, как показано ниже - согласно странице "https://www.colincrawley.com/audio-duration-calculator/"

Bit Rate: 1536 kbps
Duration: 
0 Hours : 0 Minutes : 5 Seconds . 34 Milliseconds

Когда я помещаю логи, мое ядро ​​DSP обрабатывает песню только в течение ок. За 1 секунду до того, как приложение «aplay» отправит вызов ioctl для закрытия аудиоинтерфейса в linux.

Мои вопросы:

  1. Как aplay понимает время? В течение 5 секунд, как мы можем быть уверены, что он работал в течение 5 секунд.
  2. Есть ли способ понять, как ждать, пока вся песня будет передана в ядро ​​DSP для обработки, прежде чем будет выдана команда close IOCTL?

Дополнительная информация о файле ввода, который я передаю:

  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 2
  rate         : 48000
  exact rate   : 48000 (48000/1)
  msbits       : 16
  buffer_size  : 24000
  period_size  : 6000
  period_time  : 125000
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 6000
  period_event : 0
  start_threshold  : 24000
  stop_threshold   : 24000
  silence_threshold: 0
  silence_size : 0
  boundary     : 6755399441055744000
  appl_ptr     : 0
  hw_ptr       : 0

Я был бы рад предоставить больше информации, чтобы понять, почему приложение aplay закрывает песню рано. Но учтите, что это проект с закрытым исходным кодом.

Используемая команда:

aplay input.wav -c 2 -r 48000 -t wav

input size: 960044 bytes (including wav header)
output size: 306 KB observed before IOCTL call to close the audio interface occurs.

For a input.wav file of 960044 file size i.e., 938 KB,

time aplay input.wav returns:

real    0m0.988s
user    0m0.012s
sys     0m0.080s

To find the duration of wav file:

fileLength/(sampleRate*channel*bits per sample/8) = 960000/((48000 * 2 * 16)/8) = 5 seconds


If I run the same song on my Ubuntu machine, it is as expected:

real    0m5.452s
user    0m0.025s
sys 0m0.029s

Любые намеки на то, почему это может произойти? Как показано выше, я мог видеть, что приложения aplay завершают работу через 0,98 секунды. Но песню нужно проигрывать в течение 5 секунд.

1 Ответ

0 голосов
/ 03 июня 2019

Похоже, что была проблема с пользовательским аудиооборудованием, которое задерживало время для обработки песни.Теперь кажется, что это исправлено.Проще говоря, звуковое оборудование должно давать достаточные задержки по крайней мере в соответствии с протоколом AXI во время чтения байтов.Но в данном случае это не так.Его теперь решено.Спасибо за внимание

...