linux 控制音量大小
来源:互联网 发布:linux ps命令找不到 编辑:程序博客网 时间:2024/05/05 14:45
#include <string.h>#include <math.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <errno.h>#include <sys/ioctl.h>#include <linux/soundcard.h>int init_mixer("/dev/mixer", int *fd){ if ((*fd = open(device_name, O_WRONLY)) < 0){ fprintf(stderr, "Error opening %s: %s\n", device_name, strerror(errno)); return -1; } return 0;}int contrl_vol(int *fd, int increment){ int vol; ioctl(*fd,MIXER_READ(SOUND_MIXER_VOLUME),&vol); vol += increment; ioctl(*fd,MIXER_WRITE(SOUND_MIXER_VOLUME),&vol); return 0;}
CU首页 >> 读书频道 >> 分类浏览 >> Linux环境C程序设计 >> 阅读内容
Linux环境C程序设计
16.3 媒体播放器——完善退出和音量控制功能
一些小型的应用程序很少使用进程间通信机制,但在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.h> // 包含glib库
#include <dbus/dbus-glib.h> // 包含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 <ioctl.h> // 提供I/O操作相关控制函数
#include <unistd.h> // 标准函数库
#include <fcntl.h> // 提供文件操作相关控制函数
#include <sys/soundcard.h> // 提供声卡配置相关系统调用
#include <oss.h> // 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;
}
2.查询音量
媒体播放器查询音量是通过向核心控制模块发送REQUEST_VOLUME指令实现的,核心控制模块调用request_volume()函数通过OSS查询音量的值。程序代码如下:
int request_volume(void) // 查询音量函数
{
int mixer_fd; // 用于设备文件的标识符
int data; // 用于保存音量的数值
mixer_fd = oss_get_mixer(); // 打开设备文件
if (ioctl(mixer_fd, SOUND_MIXER_READ(SOUND_MIXER_WAV), &data) == -1) {
// 读取混音器中音量数值
printf("无法打开指定声卡\n");
return -1;
}
return data; // 返回音量的数值
}
http://book.chinaunix.net/showart.php?id=7289
- linux 控制音量大小
- 音量大小控制
- SoundPool控制音量大小
- 控制音量大小widget
- C# 控制音量大小
- 控制音量的大小
- c# 控制音量大小 CoreAudioApi
- linux利用asound控制音量
- linux 用命令设置系统音量大小
- C#程序中如何控制播放音量的大小
- AE里面如何控制背景音乐音量的大小
- cocos2d-x 控制android硬件音量大小调节按钮
- android 控制手机音量的大小 切换声音的模式
- Unity 滑动条Slider控制音量大小(笔记)
- 音量控制
- c# Winform 获取麦克风音量 控制麦克风音量大小 (自用笔记未测试)
- 获取mic音量大小
- 调节音量大小
- 使用JavaMail收发Internet邮件
- 《2011中国物联网优秀应用案例汇编》报告简介
- 开学
- 我的大学--Boost
- 如何给windows服务增加依存关系
- linux 控制音量大小
- QT signals and slots
- 找工作是估计用的到的东东
- 应用实例3的抖动率的测量---实现的全过程!
- 我的大学--微机原理
- 我的大学--数据库
- 我的大学--网络编程
- 为什么Lisp语言如此先进?
- 设备驱动的异步通知实现