我正在使用USB Audio Playback
编写ALSA APIs
驱动程序。为此,我试图了解Linux
内核中的现有音频驱动程序。但我对何时更新内核音频缓冲区指针感到困惑。我们知道内核将新的音频数据放入环形缓冲区,我们的驱动程序任务是从环形缓冲区获取新数据,通过USB传递并更新内核缓冲区指针。
我正在查看的驱动程序在URB
完成功能中处理此问题。假设他们有一个用于USB传输大小的预定义宏,几乎在所有情况下大约为4096
个字节。因此,当URB
传输完成并且代码执行路径进入URB
完成时,它们将另一个4096
字节从内核缓冲区复制到URB
缓冲区,提交{再次{1}}到URB
控制器并将内核缓冲区指针转发USB
个字节。
但是我不明白的是,为什么他们如此确定在4096
传输完成时,内核缓冲区中有URB
字节的新数据?内核缓冲区中的新数据量可能小于4096
个字节?那为什么它总是按4096
字节更新缓冲区指针。我认为应该有一些知道内核缓冲区中有多少新字节,驱动程序应该只更新那个数量,或者可能是我误解了什么?任何建议或指南都是可观的。
答案 0 :(得分:0)
这些USB音频驱动程序的行为与PCI声卡完全相同,即当设备需要一些样本时,这些样本只是从环形缓冲区读取。
PCI芯片无法知道缓冲区的哪个部分实际包含有效样本。 稍后由软件检测到缓冲区欠载(设备通过中断通知驱动程序当前位置;如果位置太远,则中断处理程序会引发欠载错误。)
USB音频驱动程序使用完全相同的机制来检测欠载,即snd_pcm_period_elapsed()
函数检查当前位置(由.pointer
回调返回)是否过早。