一些小型的应用程序很少使用进程间通信机制,但在Linux系统中,可利用D-Bus获取操作系统的变化。例如在桌面环境退出时,D-Bus将发出相关信号告知接入系统总线的程序,使这些程序能够在强制退出前保存数据。除此以外,音量调节、网络连接、新的文件系统被挂载(CDROM、USB驱动器)都可由D-Bus报告。这是因为Linux的多种桌面环境均使用D-Bus,应用程序的可移植性也得到了保证。本节将介绍媒体播放器使用D-Bus的实例。

16.3.1  媒体播放器在桌面环境退出时响应

媒体播放器需要使用图形界面,而图形界面必须依赖于一种Linux桌面环境。Linux的内核与桌面环境是分离的,在系统退出前首先会结束桌面会话,因此可通过D-Bus获得桌面环境退出的消息。媒体播放器退出前需要进行一系统工作,例如保存当前程序界面的数据、保存播放列表等,这些工作在核心控制模块收到GENERAL_EXIT指令后进行。使用D-Bus需启动GLib主循环,相关代码可放在主函数或某个独立的函数内,代码如下:

#include // 包含glib库

#include // 包含glib库中D-Bus管理库

int link_dbus()

{

GMainLoop *loop;                              // 定一个事件循环对象的指针

DBusConnection *bus;                          // 定义总线连接对象的指针

DBusError error;                             // 定义D-Bus错误消息对象

loop = g_main_loop_new(NULL, FALSE);         // 创建新事件循环对象

dbus_error_init(&error);                     // 将错误消息对象连接到D-Bus错误消息对象

bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error); // 连接到系统总线

if (!bus) {                                      // 判断是否连接错误

g_warning("连接到D-Bus失败: %s", error.message);

// 使用GLib输出错误警告信息

dbus_error_free(&error);                   // 清除错误消息

return 1;

}

dbus_connection_setup_with_g_main(bus, NULL);// 将总线设为接收GLib事件

// 循环

dbus_bus_add_match(bus, "type='signal',interface='com.system.dbus.Signal'"); // 定义匹配器

dbus_connection_add_filter(bus, general_exit, loop, NULL);

// 调用函数接收消息

g_main_loop_run(loop);                       // 启动事件循环

return 0;

}

该函数连接到D-Bus的系统总线中,并接收com.system.dbus.Signal管道内的信息,系统关闭信息即通过该管道传送。当接收到任何消息后,将调用general_exit()函数进行处理,代码如下:

static DBusHandlerResult                // 定义接收消息函数的细节

general_exit (DBusConnection *connection, DBusMessage *message, void*user_data)

{

GMainLoop *loop = user_data;          // 定义事件循环对象的指针,并与主函数中

// 的同步

if (dbus_message_is_signal            // 接收连接成功消息,判断是否连接失败

(message, DBUS_INTERFACE_ORG_FREEDESKTOP_LOCAL, "Disconnected")) {

g_main_loop_quit (loop);           // 退出主循环

return DBUS_HANDLER_RESULT_HANDLED;

}

if (dbus_message_is_signal(message, "com.burtonini.dbus.Signal", "Ping")) {

// 指定消息对象路径,判断是否成功

DBusError error;                   // 定义错误对象

char *s;

dbus_error_init(&error);           // 将错误消息对象连接到D-Bus错误消息

// 对象

if (dbus_message_get_args          // 接收消息,并判断是否有错误

(message, &error, DBUS_TYPE_STRING, &s, DBUS_TYPE_INVALID)) {

if (!strcmp(s, "SHUTDOWN")) {   // 判断收到的消息是否为系统关闭信息

main_core(GENERAL_EXIT, NULL);    // 调用核心控制模块

dbus_free (s);                    // 清除该消息

}

}

else {                                 // 有错误时执行下列语句

g_print("消息已收到,但有错误提示: %s\n", error.message);

dbus_error_free (&error);

}

return DBUS_HANDLER_RESULT_HANDLED;

}

return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;

}

该函数将在收到系统信息时运行,首先判断收到的信息是否为系统关闭信息,如果是,则调用核心控制模块进行处理。

16.3.2  调整系统音量

Linux系统使用通用的音频接口OSS(Open Sound System)管理声卡,该接口建立在声卡驱动程序之上,可操作任何类型的声卡。选择“系统”|“首选项”|“硬件”|“音效”命令,可打开相关配置窗口,如图16.1所示。

调整系统音量可通过调用OSS实现,在C语言程序中使用该接口首选需要安装相关函数库。下载源代码可访问其官方网站,地址为http://www.opensound.com。或者在终端中输入下列命令:

yum install oss-devel

安装后,头文件的路径位于“/usr/include/oss”目录中,编译使用OSS的程序需要加入编译指令“`pkg-config --cflags --libs oss`”。

图16.1  查看声卡

1.调节音量

媒体播放器调节音量的操作是向核心控制模块发送GENERAL_VOLUME指令,核心控制模块调用general_volume()函数进行操作。首先在main_core.c文件中加入下列头文件:

#include // 提供I/O操作相关控制函数

#include // 标准函数库

#include // 提供文件操作相关控制函数

#include // 提供声卡配置相关系统调用

#include // OSS函数库

然后实现general_volume()函数细节,代码如下:

int general_volume(*((int*) data))               // 设置音量

{

int mixer_fd;                            // 用于调音器标识符

mixer_fd = oss_get_mixer();                  // 获得调音器的标识符

if (*data < 0 || *data > 100) {               // 判断输入的数值是否有误

printf("输入的音量调节值有误\n");

return 0;

}

if (ioctl(mixer_fd, SOUND_MIXER_WRITE(SOUND_MIXER_WAV), data) == -1) {

// 打开声卡设备文件,设置音量

printf("无法打开指定声卡\n");

return 0;

}

return 1;

}

linux 控制音量大小,linux 控制音量大小相关推荐

  1. linux除了eeprom其他的保存方法,linux的EEPROM的读写控制.doc

    毕业设计[论文]题目:基于linux的EEPROM的读写控制毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果.据我所知,除文中已经注明引用的内容 ...

  2. Linux进程缓冲区大小,Linux IOCTL动态命令、动态|自定义缓冲区大小、IOCTL使用大缓冲区的问题...

    深夜睡不着,点根烟起来写点儿东西吧. 一个驱动程序除了具备读写设备的能力之外,其也应当具有对硬件控制的能力.在Windows下用户层代码使用API函数DeviceIoControl,通过传入驱动句柄, ...

  3. linux看java堆大小,linux 改java堆内存大小

    linux 改java堆内存大小 [2021-02-08 23:06:29]  简介: linux查内存大小的方法:首先打开应用程序:然后选择系统工具选项,并单击系统终端选项:接着在系统终端命令行输入 ...

  4. 如何将linux内核的带级别控制的printk内容打印出来

    要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来 Linux命令:dmesg 功能说明:显示开机信息. 语 法:dmesg ...

  5. linux下eeprom读写测试,本科毕业设计__基于linux的eeprom的读写控制.doc

    毕业设计[论文] 题目:基于linux的EEPROM的读写控制 毕业论文(设计)原创性声明 本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果.据我所知,除文中已经注明引用的 ...

  6. Vue3+TypeScript实现网易云音乐WebApp(播放界面:播放、暂停、音量控制、播放进度控制(点击/拖拽进度条)、上一首、下一首)

    1. 成果展示 真实接口地址 本项目使用的是真实线上的网易云API 线上演示地址 目前只做了每日推荐(需登录)以及排行榜功能,点个star吧大佬们! 项目GitHub地址 main分支是Vue3+Ty ...

  7. Windows和Linux下的系统声音控制

    简介 项目中需要在windows和linux系统下对系统的声音进行控制,相关操作包括获取系统的音量,设置系统的音量,获取系统的静音状态和静音,特此记录相关的C++实现. 主要涉及的系统有windows ...

  8. Linux下查看文件或文件夹大小的命令df 、du、ls

    转自:http://www.cnblogs.com/benio/archive/2010/10/13/1849946.html 当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的 ...

  9. vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制

    Linux系统编程之进程控制 一.结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳 ...

  10. linux的阻塞waitqueue,Linux阻塞控制 wait_event与wait_event_interruptible函数详解

    Linux阻塞控制 wait_event与wait_event_interruptible函数详解 最近研究了一下linux驱动对进程的阻塞与非阻塞的控制,感觉linux对进程的控制真的是牛逼,各种进 ...

最新文章

  1. 2020年全国信息安全标准化技术委员会大数据安全标准特别工作组全体会议即将召开...
  2. labview叠加白噪声_强化学习中Ornstein-Uhlenbeck噪声是鸡肋吗?
  3. 阿里云的linux服务器简单部署网站80端口
  4. Android7.0 PowerManagerService(1) 启动过程
  5. parted如何将磁盘所有空间格式化_linux下大于2T的硬盘格式化方法
  6. mysql 一对一关联查询_学习ThinkPHP的第20天--MySQL事务操作、查询事件、一对一关联...
  7. Nacos的服务注册表结构是怎样的?
  8. 《JavaScript高级程序设计》笔记 - Map与Object的差异与选择
  9. 适配器模式(PHP实现)
  10. apk 打包 java出错_Android Release 打包提示 错误:找不到符号
  11. 集成产品开发(IPD)初探
  12. Yii2.0 两次奇葩的数据库连接经历
  13. Java同步三种实现方式
  14. android button设置边框背景颜色
  15. 工业互联网+VLC,可见光通信撬动工业4.0!
  16. 安卓开发—Android基础
  17. 正则:\b 匹配出一个单词的小天使
  18. webuploader-上传图片到服务器
  19. 跟着团子学SAP EPPM: CPM主要底表
  20. linux c语言编译成exe,C/C++程序从编译到最终生成可执行文件的过程分析

热门文章

  1. 【多线程与高并发】这可能是最全的多线程面试题了
  2. 技嘉主板bios怎么进入,如何进入技嘉主板的bios
  3. c++三子棋游戏程序
  4. 苹果视频剪辑计算机配置,视频剪辑后期神器-创作PC黑苹果系统安装与台式电脑配置推荐...
  5. 问题记录——Unity PackageManager下载失败
  6. 判断访问浏览器的类型
  7. esxi7.0虚拟机安装群辉DS3615-6.2.2版本
  8. Kconfig配置文件
  9. JS实现图片上传并显示
  10. 全球降雨、气温、干旱指数等数据集