Я пишу драйвер USB Audio Playback
, используя ALSA APIs
. Для этого я пытался понять существующие звуковые драйверы в Linux
ядре. Но я не понимаю, когда обновлять указатель звукового буфера ядра. Мы знаем, что ядро помещает новые аудиоданные в кольцевой буфер, а задача нашего драйвера — брать новые данные из кольцевого буфера, передавать их по USB и обновлять указатель буфера ядра.
Драйверы, на которые я смотрел, позаботятся об этом в функции завершения URB
. Скажем, у них есть предопределенный макрос для размера передачи USB, который почти во всех случаях составляет около 4096
байт. Таким образом, когда URB
передача завершена и путь выполнения кода достигает URB
завершения, они копируют еще 4096
байтов из буфера ядра в буфер URB
, снова отправляют URB
контроллеру USB
и пересылают указатель буфера ядра на 4096
байт.
Но я не понимаю, почему они так уверены, что к моменту завершения передачи URB
в буфере ядра будет 4096
байт новых данных? Новый объем данных в буфере ядра может быть меньше 4096
байт? Тогда почему он всегда обновляет указатель буфера на 4096
байт. Я думаю, что должно быть некоторое знание того, сколько новых байтов находится в буфере ядра, и драйвер должен обновляться только на эту сумму, или, может быть, я что-то неправильно понял? Любое предложение или руководство ценны.