C - Linux在内核模式下创建声音[关闭]

Posted

技术标签:

【中文标题】C - Linux在内核模式下创建声音[关闭]【英文标题】:C - Linux create sound in kernel mode [closed] 【发布时间】:2021-04-09 15:18:20 【问题描述】:

我需要编写一个内核模式驱动程序,当一个键被按下时播放一个音符。我可以捕捉击键,但我不知道如何从内核播放声音。我必须做什么才能播放声音?我是创建驱动程序的新手。

【问题讨论】:

一个驱动适用于给定的硬件/协议,是哪一个? @bruno,恐怕我不知道。我怎样才能知道我使用的是什么硬件/协议? 多么奇怪的问题,我怎么能猜出你用的电脑,甚至你想用的输出呢?即使在我的“简单”PI4 上,我也可以通过多种输出/方式产生声音。您确定要实现驱动程序,还是要使用您计算机中现有的功能之一? @bruno,我绝对不想,但我必须。一定有办法查看当前的硬件,对吧?我不确定你问了什么,但我可以告诉我的音频控制器名称(那些 lspci 节目) 可能我错了,但对我来说编写驱动程序意味着实现驱动程序,而不是使用驱动程序。可见你想使用一个,并且可能间接通过一个lib 【参考方案1】:

我需要编写一个内核模式驱动程序,当按键被按下时播放一个音符。

为什么?

说真的,为什么。这种“需要”背后的原因是什么?需要播放声音的真正原因是什么?也许有更好的方法。

假设一台PC,加载了pcspkr 模块,你当然可以调用它的函数。但是如果你想通过声卡播放某些东西,你基本上必须“打开”一个 ALSA 设备(在内核内部),并调用它的 fops,而用户空间可能会做同样的事情。

【讨论】:

这是一个大学项目,我的老师要求内核模式下的完整项目。设备驱动程序已经实现是否正确,我只需要找出这个设备是什么,然后以某种方式打开它以从内核访问它? @Rabter:这完全取决于你的东西运行的系统。在 PC 上,您可能有也可能没有可用的物理扬声器,它可以发出哔哔声(或不发出哔声)。老实说:从内核内部创建“哔”声可能比乍看之下要求高得多。如果您有可用的 PC 扬声器,请使用它。如果没有:祝你好运! – 您正在处理的问题是,所有这些设备都是从用户空间驱动的。所以内核内部发生的任何事情都必须确保它不会干扰从用户空间发起的操作。 @Rabter:保持话题。如果您遵循 KIOCSOUND ioctl 采用的路径,它最终会在elixir.bootlin.com/linux/latest/source/drivers/tty/vt/… 结束,它实际上将 beep 命令注入到/到用户空间的事件流中,从那里它最终采用与启动事件相同的路径用户空间。 我一直在研究你在那里链接的源代码。问题是,为了使用该函数发出哔哔声,我必须有一个 input_handler 对象,该对象需要实现一些函数。在这个文件中,这些函数是(据我所知)键盘事件处理程序。这些分配在这里:elixir.bootlin.com/linux/latest/source/drivers/tty/vt/… 但我想我可以只使用 ioctl(fd, KIOCSOUND, (long) argument) 因为 pkspcr 模块适用于我。我只需要找出 fd 应该是什么。据我了解,它是我的 ALSA 设备之一的描述符。但我不知道如何从任何地方获取它

以上是关于C - Linux在内核模式下创建声音[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用非标准 C(gcc 特定功能)对 linux 内核进行编码? [关闭]

Linux下如何创建和监控子进程? [关闭]

Linux 2.6 OSS 声音系统中是不是有内核内重采样

Rust 要“进驻” Linux 内核了?Linux 之父:保持观望

linux内核—进程调度时机

使用 Linux 内核 call_usermodehelper 在用户模式下运行用户空间进程