历史上的今天
返回首页

历史上的今天

今天是:2025年04月13日(星期日)

正在发生

2018年04月13日 | ARM-Linux:设备-mixer-linux系统声音效果调节

2018-04-13 来源:eefocus

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

#include

#include

#include

#include

#include

#include



/* 用来存储所有可用混音设备的名称 */

const char *sound_device_names[] = SOUND_DEVICE_NAMES;

/* 混音设备所对应的文件描述符 */

int fd;

/* 混音器信息对应的位图掩码 */

int devmask, stereodevs;

char *name;


/* 显示命令的使用方法及所有可用的混音设备 */

void usage()

{

 int i;


 fprintf(stderr, "usage: %s \n"

 " %s \n\n"

 "Where 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:测试无效果

推荐阅读

史海拾趣

Everbuild公司的发展小趣事

Everbuild深知人才是企业发展的核心。因此,公司注重人才培养和团队建设。公司建立了完善的培训体系,为员工提供各种技能培训和职业发展机会。同时,Everbuild还鼓励员工参与创新项目和技术研发,激发员工的创造力和工作热情。这些努力使Everbuild拥有一支高素质、专业化的团队,为公司的持续发展提供了强有力的保障。

EBK Kruger GmbH & Co KG公司的发展小趣事

随着公司技术的不断成熟和产品的多样化,EBK Kruger开始将目光投向国际市场。公司参加了多个国际电子展会,并成功与多家国际知名企业建立了合作关系。通过与这些企业的合作,EBK Kruger不仅扩大了市场份额,还学到了先进的国际管理经验和技术知识,为公司的发展注入了新的活力。

EMMICRO公司的发展小趣事

面对竞争激烈的电子市场,EMMICRO公司制定了精准的市场拓展策略。公司根据市场需求和客户需求,不断调整产品结构和市场定位,积极开拓新的销售渠道和合作伙伴。同时,公司还加大了对新兴市场的投入和布局,通过差异化竞争策略,成功打开了多个新的市场领域。

Electro Adapter Inc公司的发展小趣事

Electro Adapter Inc公司(以下简称EA公司)的成立源于创始人对电子行业未来发展的深刻洞察。在创立初期,EA公司主要生产一些基本的电源适配器,面临着激烈的市场竞争和资金短缺的双重压力。然而,创始人凭借其深厚的技术背景和敏锐的市场洞察力,不断研发新产品,提升产品质量,逐渐在市场上站稳了脚跟。特别是在一次技术革新中,EA公司率先推出了一款高效能、低成本的适配器,赢得了客户的青睐,也为公司的发展奠定了坚实的基础。

Crocus Technology公司的发展小趣事

在成立初期,Crocus Technology专注于IP存储模块的研发与销售。这一时期,公司通过不断的技术创新和市场调研,成功开发出了一系列具有竞争力的产品。这些产品不仅满足了市场对高性能存储解决方案的需求,还为公司积累了宝贵的市场经验和客户资源。

Deutsch公司的发展小趣事

人才是企业发展的核心驱动力。Deutsch公司非常重视人才引进和培养工作。公司积极招聘具有丰富经验和专业技能的人才,并为他们提供广阔的发展空间和良好的职业前景。同时,公司还注重内部人才的培养和晋升,通过培训、交流等方式提升员工的综合素质和业务能力。这些措施使得Deutsch公司拥有一支高素质、高效率的团队,为公司的持续发展提供了有力保障。

问答坊 | AI 解惑

学习单片机需要掌握的硬件问题,大家一起分享

学习单片机需要掌握的硬件问题,大家一起分享 就单片机学习过程中硬件设计方面的几个基本问题一起分享 1、电阻电容的封装形式如何选择,有没有什么原则?比如,同样是 104 的电容有 0603、0805 的封装,同样是 10uF 电容有 3216、0805、3528 ...…

查看全部问答>

施耐德触摸屏XBTGT5330之COM1或COM2口进行串口通讯得进

想利用XBTGT5330的COM口(com1或com2口)与第三方厂家的仪表进行串行通讯 该第三方的通讯协议符合modbus协议。其具体协议数据格式为: 开始符       指令代码          ...…

查看全部问答>

高人求救

请问A/D转换显示 S3C44BO 4路LCD显示曲线 屏幕显示三分钟 超过三分钟将右半屏移到左半屏 每秒采样60次,外接5V电压 请高手指点…

查看全部问答>

+++++++++GPRS数据串口转以太网

我的ARM开发板通过串口连接的GPRS MODEM上网,它也有以太网口,我想把接收的GPRS数据转发到以太网口上(它所在的局域网),请问难不难啊。…

查看全部问答>

单片机的汇编指令使用基础

1 .MOV A,Rn 寄存器内容送入累加器2 .MOV A,direct 直接地址单元中的数据送入累加器3 .MOV A,@Ri (i=0,1)间接RAM 中的数据送入累加器4 .MOV A,#data 立即数送入累加器5 .MOV Rn,A 累加器内容送入寄存器6 .MOV Rn,direct 直接地址单元中的数据送入寄 ...…

查看全部问答>

C6455 TCP2中TCPIC0~15有一半的寄存器写不进去

在CCS3.3下,查看寄存器的值,发现TCP2中TCPIC0~TCPIC15中,有一半的寄存器不能write,分别是TCPIC(1,3,5,7,9,11,13,15),是因为哪个控制器锁住了吗? 情况紧急,请求各位帮助,谢谢!…

查看全部问答>

LPC1500体验+(4)使用SWM将功能动态分配到任意引脚

本帖最后由 mars4zhu 于 2014-9-23 11:14 编辑 LPCXpresso1549试用报告——(3)使用SWM将功能动态分配到任意引脚 文档编号AN-0001-A0关键字LPCXpresso1549, LPCOpen, LPC1549, Keil MDK, ARM Cortex-M, SWM, 功能分配任意引脚摘要本文记 ...…

查看全部问答>

关于程序计数器PC的理解

51单片机的程序计数器PC的16位的也就是65536 ARM的程序计数器是32位也就是4G的空间地址 如何理解这写内容呢? PC指针是否就限制了程序的大小呢,或者说是程序的长短。 以STC89C52为例 程序存储空间是8K   PC的最大数是65536。 …

查看全部问答>

Micropython Timer回调函数的疑问

import pyb import time from pyb import Pin,Timer from DHT11 import DHT11 S=DHT11(\'Y2\') A=\'\'    def f(t):         global A,S         pyb.LED(1).toggle()     ...…

查看全部问答>

TI TMS320C2000 I2C模块参考指南

TI TMS320C2000 I2C模块参考指南 …

查看全部问答>