C语言Linux设备编程——直接从/Dev读取

6
我一直在用C语言创建数学波函数来制作声音。我的项目的下一步是从MIDI键盘控制器获取用户输入,以便将波形调制到不同的音高。
我最初认为这会相对简单,并且Linux会像处理其他文件一样允许我读取设备的原始数据流。
然而,研究表明我需要为MIDI控制器编写设备驱动程序。总的想法是,即使设备文件存在,内核也不知道在应用程序调用read()和write()等函数时执行哪些系统调用。
尽管有这些警告,我还是进行了一次实验。我插入了MIDI控制器并cat了“/dev/midi1”设备文件。一连串的空字符出现了,当我按下MIDI控制器上的一个键时,几个字节出现,对应于MIDI设备应输出的预期消息块。MIDI Protocol Info 所以我的问题是:
为什么cat的流会表现出这种方式?
这是否意味着我的系统已经安装了即插即用设备驱动程序?

我是否仍然需要编写设备驱动程序,还是可以像读取文件一样轻松地进行阅读?

非常感谢您在这些领域分享您的智慧。


我建议您在'C'程序中使用read()函数读取设备,而不是使用cat命令。您说您看到了“有效”的数据,为什么不确定一下呢?顺便说一句,必须已经存在一个设备驱动程序,否则您就不会有设备文件,也无法访问它。 - KevinDTimm
3个回答

5

为什么“cat”命令读取流的行为会是这样呢?

因为这可能是控制器接收到的原始MIDI数据。空字节可能是某种同步计时信号。

这是否意味着我的系统已经安装了即插即用设备驱动程序?

是的。

然而,研究结果极力建议我为MIDI控制器编写一个设备驱动程序。总体思路是虽然设备文件可能存在,但内核不知道该执行哪些系统调用当我的应用程序调用像read()和write()这样的函数时。

<...>

我是否仍应编写设备驱动程序,还是可以像读取文件一样使用它?

我不确定你正在阅读什么或者你是如何得出结论的,但是这是错误的 :) 你已经有一个完美的MIDI控制器驱动程序安装在你的系统上 - 可以放心地使用它!


3

您确定读取的是NUL字节而不是0xf8字节吗?因为0xf8是MIDI时间刻度状态,通常定期发送以保持乐器同步。请尝试使用od读取设备:

od -vtx1 /dev/midi1

如果你看到一堆0xf8,没关系。如果你不需要MIDI控制器发送的节奏信息,可以在控制器上禁用它,或者忽略那些0xf8状态字节。
此外,对于MIDI来说,请记住当前的MIDI状态通常只发送一次(为了节省字节),然后跟随所需的有效载荷字节。例如,弯音状态是字节0xeK(其中K是通道号,即0到15),其有效载荷是最低有效字节的7位,后跟最高有效字节的7位。因此,也许你有一个奇怪的控制器,你只看到某些状态的重复有效载荷,但任何不愚蠢的控制器都不会重复不必要的内容。
现在来看驱动程序:当你插入MIDI控制器时,请查看dmesg。如果你的OSS /dev/midi1 出现在你插入设备时(udev正在执行此任务),并且dmesg没有报错,你就不需要其他任何东西。 MIDI协议是另一种串行协议,具有固定的波特率并传输/接收字节。这没什么复杂的...只需从设备读取或写入即可完成。
唯一的问题是,在某些地方排队可能会导致音频延迟较大(如果你使用MIDI命令来控制实时音频,我认为这就是你要做的)。看起来这些设备主要用于系统独占消息,例如,从在线合成器下载一些补丁/预设,并使用MIDI将其上传到设备。在这种情况下,延迟并不重要。
此外,请查看在Linux上玩MIDI的ALSA方法

1

如果您不是在开发新的MIDI控制器硬件,那么您就不必担心为其编写驱动程序。安装硬件是用户的责任,供应商有义务提供驱动程序。

在Linux下,您只需读取文件。现在需要解释和利用数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接