![0546e19d49e24fff8bdf349f2e914ff3.png](https://i-blog.csdnimg.cn/blog_migrate/4dd1a94d5bbc7efb49f9140b3b395e5c.jpeg)
![f28cc163e63dde86b4baeb30709f4f60.png](https://i-blog.csdnimg.cn/blog_migrate/220d9b1f361ea598ebe939a73d9c529e.jpeg)
这是一个模拟机械键盘发声的程序,当你按下鼠标的时候,音箱中就会传出类似机械键盘按下的声音,目前只适合linux系统。
我一直使用vim/neovim(最近发现vim8.2速度要比neovim0.5快哦,配置文件完全一样),然后vim/neovim中有一个插件叫keysound,这个插件实现了在vim/neovim中机械键盘的音效,我是以这个插件为启发写的一个全局的模拟机械键盘音效的软件。
能力有限,当前这个程序比较简单,代码结构也不好,仅仅是实现了全局监控键盘,然后键盘按下之后发出卡哒声的功能。
代码的原理很简单,当然能力有限,只能以简单的方式实现,待我能力提高,我会用高级方法实现,哈哈。代码主要是通过监测/dev/input/下键盘相关的文件,然后只要判断有按键输入就调用SDL发声,就是这么简单,哈哈。
依赖
该程序依赖SDL2
,所以在编译该程序之前需要先安装SDL2
。
使用
- 编译
git clone https://github.com/fgheng/keysound
gcc ./keysound.c -lSDL2
sudo chown root ./a.out
sudo chmod u+s ./a.out
- 运行
./a.out
问题
目前这个程序很原始,代码结构也不好,仅仅是实现了功能而已,而且当前还有很多问题需要解决。
1.SDL2的权限问题,如果使用普通用户执行,那么SDL是可以发声的,但是/dev/input/*下的文件无法读取,如果是root用户执行,那么/dev/input/*下的文件可以读取,但是SDL会有问题,我目前想到的解决方案便是下面的方法:
sudo chown root ./a.out
sudo chmod u+s ./a.out
这样普通用户就可以直接执行了,但我觉得这样非常的不优雅,我也没明白为什么这样就可以了呢?我们知道,上面的命令让这个可执行程序在执行的时候拥有root的权限,但是root权限下SDL有问题啊,为什么这样就没问题了呢?
2.没有做程序终止的后续操作,读取/dev/input/*的描述符没有被释放,这个释放应该是在程序被终止的时候进行的,但是代码中没有体现
TODO
- 重新设计代码结构
- 不读取
/dev/input/*
文件,而是学习键盘驱动的写法,所有的键盘输入都可以检测到而不是单纯的一个特定的键盘 - 可以选择音效
- 按下一个声音,抬起一个声音
- 添加一个终端界面,使用
- 调节音量