【发布时间】:2015-08-31 09:00:43
【问题描述】:
我正在使用ALSA APIs 编写USB Audio Playback 驱动程序。为此,我试图了解Linux 内核中现有的音频驱动程序。但是我对何时更新内核音频缓冲区指针感到困惑。我们知道内核将新的音频数据放入环形缓冲区,我们的驱动程序任务是从环形缓冲区中获取新数据,通过 USB 传递并更新内核缓冲区指针。
我正在查看的驱动程序在 URB 完成函数中处理了这个问题。假设他们有一个预定义的 USB 传输大小宏,几乎在所有情况下都在 4096 字节左右。所以当URB传输完成并且代码执行路径进入URB完成时,他们将另一个4096字节从内核缓冲区复制到URB缓冲区,再次提交URB到USB控制器并将内核缓冲区指针转发4096字节。
但我不明白的是,他们为什么如此确定在URB 传输完成时,内核缓冲区中有4096 字节的新数据?内核缓冲区中的新数据量可能小于4096 字节?那为什么它总是以4096 字节更新缓冲区指针。我认为应该知道内核缓冲区中有多少新字节,并且驱动程序应该只更新那个数量,或者我可能误解了什么?任何建议或指南都是值得赞赏的。
【问题讨论】:
标签: linux-kernel usb linux-device-driver alsa