ARM-Linux:设备-mixer-linux系统声音效果调节_别打名名的博客-程序员秘密

技术标签: Linux声音调节  Linux  设备文件操作  mixer  ARM-Linux  

系统:arm板/Linux系统
内核:2.6.7
设备:/dev/mixer
功能:linux系统声音效果调节
文件名:xxx.c
编译:gcc xxx.c -o mixerSet
终端执行:./mixerSet [leftvalue] [rightvalue]
测试:无问题

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/soundcard.h>


/* 用来存储所有可用混音设备的名称 */
const char *sound_device_names[] = SOUND_DEVICE_NAMES;
/* 混音设备所对应的文件描述符 */
int fd;
/* 混音器信息对应的位图掩码 */
int devmask, stereodevs;
char *name;

/* 显示命令的使用方法及所有可用的混音设备 */
void usage()
{
 int i;

 fprintf(stderr, "usage: %s <device> <left-gain%%> <right-gain%%>\n"
 " %s <device> <gain%%>\n\n"
 "Where <device> is one of:\n", name, name);
 for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
  if ((1 << i) & devmask) /* 只显示有效的混音设备 */
  fprintf(stderr, "%s ", sound_device_names[i]);
 fprintf(stderr, "\n");
 exit(1);
}

int main(int argc, char *argv[])
{

 int left, right, level; /* 增益设置 */
 int status; /* 系统调用的返回值 */
 int device; /* 选用的混音设备 */
 char *dev; /* 混音设备的名称 */
 int i;
 name = argv[0];

 /* 以只读方式打开混音设备 */
 fd = open("/dev/mixer", O_RDONLY);
 if (fd == -1) {
  perror("unable to open /dev/mixer");
  exit(1);
 }

 /* 获得所需要的信息 */
 status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
 if (status == -1)
  perror("SOUND_MIXER_READ_DEVMASK ioctl failed");
 status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs);

 if (status == -1)
  perror("SOUND_MIXER_READ_STEREODEVS ioctl failed");

 /* 检查用户输入 */
 if (argc != 3 && argc != 4)
  usage();
 /* 保存用户输入的混音器名称 */
 dev = argv[1];
 /* 确定即将用到的混音设备 */
 for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
  if (((1 << i) & devmask) && !strcmp(dev, sound_device_names[i]))break;
 if (i == SOUND_MIXER_NRDEVICES) { /* 没有找到匹配项 */
  fprintf(stderr, "%s is not a valid mixer device\n", dev);
  usage();
 }
 /* 查找到有效的混音设备 */
 device = i;
 /* 获取增益值 */
 if (argc == 4) {
  /* 左、右声道均给定 */
  left = atoi(argv[2]);
  right = atoi(argv[3]);
 } else {
  /* 左、右声道设为相等 */
  left = atoi(argv[2]);
  right = atoi(argv[2]);
 }
 /* 对非立体声设备给出警告信息 */
 if ((left != right) && !((1 << i) & stereodevs)) {
  fprintf(stderr, "warning: %s is not a stereo device\n", dev);
 }
 /* 将两个声道的值合到同一变量中 */
 level = (right << 8) + left;
 /* 设置增益 */
 status = ioctl(fd, MIXER_WRITE(device), &level);
 if (status == -1) {
  perror("MIXER_WRITE ioctl failed");
  exit(1);
 }
 /* 获得从驱动返回的左右声道的增益 */
 left = level & 0xff;
 right = (level & 0xff00) >> 8;
 /* 显示实际设置的增益 */
 fprintf(stderr, "%s gain set to %d%% / %d%%\n", dev, left, right);
 /* 关闭混音设备 */
 close(fd);
 return 0;
}


首先不带参数执行编译出来的程序,得到系统中有效的混音设备,我使用的是飞凌OK210,里面已经有的设备有:speakerpcm2 igain ogain phout 共五个。
speaker:测试无效果
pcm2:测试可以调节音量大小,在40%时已经听不见声音了,在100%时声音最大
igain:测试无效果
ogain:测试可以调节音量大小,在40%时已经听不见声音了,在100%时声音最大,但相对于pcm2设备来说,效果较差。
phout:测试无效果

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FreeApe/article/details/45244839

智能推荐

局域网文件共享手机访问电脑文件软件_suoniao的博客-程序员秘密

自己给自己写了个小软件,用于其它IT设备访问电脑里面的文件。软件使用C++语言+QT界面库开发。如果有和我相同需求的人,可以下载用用。顺便还可以帮忙看看那些地方需要改进的。简要功能介绍:1.基于HTTP协议实现的电脑文件操作。2.支持对每一个文件进行共享权限设置3.支持用户注册登录。4.支持文件分享功能类似网盘5.支持百度网盘多账号管理 网盘文件批量改名、批量分享、批量转存6.支持在线预览图片、文本文档、markdown文档、PDF 压缩包 播放视频内容太多不一一截图了 有需要的

QLabel设置行距问题_班公湖里洗过脚的博客-程序员秘密_qlabel 行距

QString text = tr("QLabel is used for displaying text or an image. No user interaction functionality is provided. The visual appearance of the label can be configured in various ways, and it can be

Communications link failure问题解决方案摸索_m0_46485771的博客-程序员秘密

性能测试发现了Communications link failure错误,搜寻了网络上的好多种解决方案,记录总结一下。错误信息Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.在低并发下400个链接没有问题,一旦上了500就会报错,1000并

android: Intent启动activity_weixin_30412013的博客-程序员秘密

使用Intent启动activity:Intent intent = new Intent(MainActivity.this, OtherActivity.class);startActivity(intent);使用Intent启动其他app的activity:Intent intent = new Intent();intent.setClassNa...

vsftpd.conf配置详解_MatrixGod的博客-程序员秘密_vsftpd.conf 配置

1.默认配置:1&amp;gt;允许匿名用户和本地用户登陆。     anonymous_enable=YES     local_enable=YES2&amp;gt;匿名用户使用的登陆名为ftp或anonymous,口令为空;匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传。3&amp;gt;本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自 己家目录中进行读...

Unity基础 Unity获取当前时间的时间戳_其子昱舟的博客-程序员秘密_unity 时间戳

一、单位换算1秒 = 1000毫秒1毫秒 = 1000微妙1微秒 = 1000纳秒二、获取Unix时间戳 /// &lt;summary&gt; /// 获取时间戳(精确到秒) /// TimeTool.ConvertDateTimep(DateTime.Now) /// &lt;/summary&gt; /// &lt;param name="time"&gt;时间&lt;/param&gt; public static long ConvertDa

随便推点

Nodejs资料之package.json文件_宅羽的博客-程序员秘密

◆ node_modules文件夹的问题:文件夹以及文件过多过碎,当我们将项目整体拷贝给别人的时候,,传输速度会很慢很慢复杂的模块依赖关系需要被记录,确保模块的版本和当前保持一致,否则会导致当前项目运行报错◆ package.json文件的作用:项目描述文件,记录了当前项目信息,例如项目名称、版本、作者、github地址、当前项目依赖了哪些第三方模块等。使用npm init -y命令生...

Xmanager Power Suit_ZJQ2016的博客-程序员秘密

文章来源:https://www.cnblogs.com/selier/p/9649064.html#autoid-0-0-0手工操作步骤Xmanger Power Suit 官方 其实有两种 .exe 文件,一个是用于试用的,在注册的时候不能直接输入密钥。而另一个是为注册用户提供的 .exe 文件,在注册的时候可以输入密钥,直接可以激活了。1、 到 Xmanager Power Su...

Mybatis_qq_45849275的博客-程序员秘密

一、关联映射1.一对一数据表-- 用户信息表create table users( user_id int primary key auto_increment, user_name varchar(20) not null unique, user_pwd varchar(20) not null, user_realname varchar(20) not null, user_img varchar(100) not null);-- 用户详情表

TDH大数据平台数据入库方案_weixin_30810583的博客-程序员秘密

一、数据入库方式目前批量数据入库TDH大数据平台主要有如下几种方式1、手工入录一些静态表手工维护的数据,可以直接采用insert导入,或者使用waterdrop客户端工具导入,只适用少数据量的导入和更新2、dblinkTDH inceptor支持建立dblink直接连接db2,oracle,mysql等关系数据库,对于一些数据量不大的静态表,手工维护的表,可以通过建立dbl...

北京科技大学计算机非全调剂,北京科技大学2020年硕士研究生调剂工作的通知..._hby147852的博客-程序员秘密

我校2020年硕士研究生网上调剂工作将于5月20日零点后正式开始,收到并确认接受复试通知的调剂考生应按通知要求进行复试确认、参加各培养单位组织的网络远程模拟复试演练和网络远程正式复试,有关事项通知如下:一、复试准备拟调剂考生应提前登录我校研究生招生信息网(http://yzxc.ustb.edu.cn/)查看《北京科技大学2020年硕士研究生网络远程面试要求及注意事项》和《北京科技大学“云考场”考...

pip豆瓣源_略知12的博客-程序员秘密

pip install 包名 -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com不行的话可以去豆瓣源官网(http://pypi.doubanio.com/simple/)下载whl离线安装