Постановка проблемы: я не получаю всю песню на выходе, когда она выгружается в виде файла (я не слышу песню через гнездо, но могу вывести содержимое файла).
выдержки: я новичок в программировании 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.
Мои вопросы:
- Как aplay понимает время? В течение 5 секунд, как мы можем быть уверены, что он работал в течение 5 секунд.
- Есть ли способ понять, как ждать, пока вся песня будет передана в ядро 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 секунд.