C Linux设备编程 - 直接从/ Dev读取

时间:2012-06-01 19:48:19

标签: c linux device-driver linux-device-driver midi

我一直在玩C中使用数学波函数创建声音。我的项目的下一步是从MIDI键盘控制器获取用户输入,以便将波调制到不同的音高。

我的第一个想法是,这将是相对简单的,Linux,Linux,将允许我从我的设备读取原始数据流,就像我任何其他文件一样。

然而,研究压倒性地建议我为MIDI控制器编写设备驱动程序。一般的想法是,即使设备文件可能存在,当我的应用程序调用read()和write()等函数时,内核也不会知道要执行的系统调用。

尽管有这些警告,我还是做了一个实验。我插入了MIDI控制器并且使用了“/ dev / midi1”设备文件。出现了稳定的空字符流,当我按下MIDI控制器上的一个键时,出现了几个字节,对应于MIDI设备应输出的预期消息块。 MIDI Protocol Info

所以我的问题是:

为什么cat'ed流表现如此?

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

我是否仍然可以继续编写设备驱动程序,还是可以像文件一样阅读它?

感谢您提前在这些方面分享您的智慧。

3 个答案:

答案 0 :(得分:5)

  

为什么cat'ed流表现如此?

因为这可能是控制器正在接收的原始MIDI数据。空字节可能是某种同步标记。

  

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

  

然而,研究压倒性地建议我为MIDI控制器编写设备驱动程序。一般的想法是,即使设备文件可能存在,当我的应用程序调用read()和write()等函数时,内核也不会知道要执行的系统调用。

     

< ...>

     

我是否仍然可以继续编写设备驱动程序,还是可以像文件一样阅读它?

我不确定你在读什么,或者你是如何得出这个结论的,但这是错误的。 :)你已经为你的MIDI控制器安装了一个非常好的驱动程序 - 继续使用它!

答案 1 :(得分:2)

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

阅读设备
od -vtx1 /dev/midi1

如果你看到一堆0xf8,那没关系。如果您不需要MIDI控制器发送的速度信息,请在控制器上禁用它或忽略这些0xf8状态字节。

另外,对于MIDI,请记住当前的MIDI状态通常是一次发送(以节省字节为单位),然后根据需要跟随有效负载字节。例如,音调弯曲状态是字节0xeK(其中K是信道号,即0到15),并且其有效载荷是最低有效字节的7位,接着是最高有效字节的7位。因此,也许你有一个奇怪的控制器,你只看到一些状态的重复有效载荷,但任何非愚蠢的控制器都不会重复它不需要的东西。

现在为驱动程序:在插入MIDI控制器时查看dmesg。现在,当您插入设备(udev正在执行此作业)时,如果您的OSS /dev/midi1 出现,并且dmesg没有发现任何错误,则您不需要任何内容其他。 MIDI协议是另一种串行协议,它具有固定的波特率并发送/接收字节。这没有什么复杂的......只需读取或写入设备就可以了。

唯一的问题是在某个地方排队可能会导致音频延迟不佳(如果你使用MIDI命令控制现场音频,我相信你正在做的事情)。看起来这些设备主要是为系统专用消息而制作的,例如,在线下载合成器的一些补丁/预设并使用MIDI将其上传到设备。在这种情况下,延迟并不重要。

另请查看在Linux上播放MIDI的ALSA way

答案 2 :(得分:1)

如果您没有开发新的MIDI控制器硬件,则不必担心为其编写驱动程序。这是用户关心安装他们的硬件,以及供应商提供驱动程序的义务。

在Linux下,您只需阅读该文件即可。现在用数据来解释和制作有用的东西。