- 浏览: 228839 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wahahachuang8:
GoEasy 实时推送支持IE6-IE11及大多数主流浏览器的 ...
服务器推送技术 java -
mahuanjian:
[flash=200,200][/flash]
服务器推送技术 java -
wenjundiandian:
下面有网页编辑器的话还是会被隐藏.
ext中消息框、提示框、确认框显示在最前面的解决方法 -
天塔上的猫:
/**
* JAVA常见的权限控制算法的实现
*
* ...
JAVA常见的权限控制算法的实现
mixer编程
- 博客分类:
- 嵌入式
mixer编程
声卡上的混音器由多个混音通道组成,它们可以通过驱动程序提供的设备文件/dev/mixer进行编程。对混音器的操作一般都通过ioctl()系统调用来完成,所有控制命令都以SOUND_MIXER或者MIXER开头,表17.1列出了常用的混音器控制命令。
表17.1 混音器常用命令
命 令 作 用
SOUND_MIXER_VOLUME 主音量调节
SOUND_MIXER_BASS 低音控制
SOUND_MIXER_TREBLE 高音控制
SOUND_MIXER_SYNTH FM合成器
SOUND_MIXER_PCM 主D/A转换器
SOUND_MIXER_SPEAKER PC喇叭
SOUND_MIXER_LINE 音频线输入
SOUND_MIXER_MIC 麦克风输入
SOUND_MIXER_CD CD输入
SOUND_MIXER_IMIX 放音音量
SOUND_MIXER_ALTPCM 从D/A 转换器
SOUND_MIXER_RECLEV 录音音量
SOUND_MIXER_IGAIN 输入增益
SOUND_MIXER_OGAIN 输出增益
SOUND_MIXER_LINE1 声卡的第1输入
SOUND_MIXER_LINE2 声卡的第2输入
SOUND_MIXER_LINE3 声卡的第3输入
对声卡的输入增益和输出增益进行调节是混音器的一个主要作用,目前大部分声卡采用的是8位或者16位的增益控制器,声卡驱动程序会将它们变换成百分比的形式,也就是说无论是输入增益还是输出增益,其取值范围都是从0到100。
? SOUND_MIXER_READ宏
在进行混音器编程时,可以使用 SOUND_MIXER_READ宏来读取混音通道的增益大小,例如如下代码可以获得麦克风的输入增益:
ioctl(fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol);
对于只有一个混音通道的单声道设备来说,返回的增益大小保存在低位字节中。而对于支持多个混音通道的双声道设备来说,返回的增益大小实际上包括两个部分,分别代表左、右两个声道的值,其中低位字节保存左声道的音量,而高位字节则保存右声道的音量。下面的代码可以从返回值中依次提取左右声道的增益大小:
int left, right;
left = vol & 0xff;
right = (vol & 0xff00) >> 8;
? SOUND_MIXER_WRITE宏
如果想设置混音通道的增益大小,则可以通过SOUND_MIXER_WRITE宏来实现,例如下面的语句可以用来设置麦克风的输入增益:
vol = (right << 8) + left;
ioctl(fd, SOUND_MIXER_WRITE(SOUND_MIXER_MIC), &vol);
? 查询Mixer信息
声卡驱动程序提供了多个ioctl()系统调用来获得混音器的信息,它们通常返回一个整型的位掩码,其中每一位分别代表一个特定的混音通道,如果相应的位为1,则说明与之对应的混音通道是可用的。
通过 SOUND_MIXER_READ_DEVMASK返回的位掩码查询出能够被声卡支持的每一个混音通道,而通过 SOUND_MIXER_READ_RECMAS返回的位掩码则可以查询出能够被当作录音源的每一个通道。例如,如下代码可用来检查CD输入是否是一个有效的混音通道:
ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
if (devmask & SOUND_MIXER_CD)
printf("The CD input is supported");
如下代码可用来检查CD输入是否是一个有效的录音源:
ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask);
if (recmask & SOUND_MIXER_CD)
printf("The CD input can be a recording source");
大多数声卡提供了多个录音源,通过 SOUND_MIXER_READ_RECSRC可以查询出当前正在使用的录音源,同一时刻可使用2个或2个以上的录音源,具体由声卡硬件本身决定。相应地,使用 SOUND_MIXER_WRITE_RECSRC可以设置声卡当前使用的录音源,如下代码可以将CD输入作为声卡的录音源使用:
devmask = SOUND_MIXER_CD;
ioctl(fd, SOUND_MIXER_WRITE_RECSRC, &devmask);
此外,所有的混音通道都有单声道和双声道的区别,如果需要知道哪些混音通道提供了对立体声的支持,可以通过SOUND_MIXER_READ_STEREODEVS来获得。
代码清单17.4的程序实现了利用/dev/mixer接口对混音器进行编程的过程,该程序可对各种混音通道的增益进行调节。
代码清单17.4 OSS mixer接口应用编程范例
1 #include <unistd.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <sys/ioctl.h>
5 #include <fcntl.h>
6 #include <linux/soundcard.h>
7 /* 用来存储所有可用混音设备的名称 */
8 const char *sound_device_names[] = SOUND_DEVICE_NAMES;
9 int fd; /* 混音设备所对应的文件描述符 */
10 int devmask, stereodevs; /* 混音器信息对应的bit掩码 */
11 char *name;
12 /* 显示命令的使用方法及所有可用的混音设备 */
13 void usage()
14 {
15 int i;
16 fprintf(stderr, "usage: %s <device> <left-gain%%> <right-gain%%>\n"
17 "%s <device> <gain%%>\n\n""Where <device> is one of:\n", name, name);
18 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
19 if ((1 << i) &devmask)
20 /* 只显示有效的混音设备 */
21 fprintf(stderr, "%s ", sound_device_names[i]);
22 fprintf(stderr, "\n");
23 exit(1);
24 }
25
26 int main(int argc, char *argv[])
27 {
28 int left, right, level; /* 增益设置 */
29 int status; /* 系统调用的返回值 */
30 int device; /* 选用的混音设备 */
31 char *dev; /* 混音设备的名称 */
32 int i;
33 name = argv[0];
34 /* 以只读方式打开混音设备 */
35 fd = open("/dev/mixer", O_RDONLY);
36 if (fd == - 1)
37 {
38 perror("unable to open /dev/mixer");
39 exit(1);
40 }
41
42 /* 获得所需要的信息 */
43 status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
44 if (status == - 1)
45 perror("SOUND_MIXER_READ_DEVMASK ioctl failed");
46 status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs);
47 if (status == - 1)
48 perror("SOUND_MIXER_READ_STEREODEVS ioctl failed");
49 /* 检查用户输入 */
50 if (argc != 3 && argc != 4)
51 usage();
52 /* 保存用户输入的混音器名称 */
53 dev = argv[1];
54 /* 确定即将用到的混音设备 */
55 for (i = 0; i < SOUND_MIXER_NRDEVICES; i++)
56 if (((1 << i) &devmask) && !strcmp(dev, sound_device_names[i]))
57 break;
58 if (i == SOUND_MIXER_NRDEVICES)
59 {
60 /* 没有找到匹配项 */
61 fprintf(stderr, "%s is not a valid mixer device\n", dev);
62 usage();
63 }
64 /* 查找到有效的混音设备 */
65 device = i;
66 /* 获取增益值 */
67 if (argc == 4)
68 {
69 /* 左、右声道均给定 */
70 left = atoi(argv[2]);
71 right = atoi(argv[3]);
72 }
73 else
74 {
75 /* 左、右声道设为相等 */
76 left = atoi(argv[2]);
77 right = atoi(argv[2]);
78 }
79
80 /* 对非立体声设备给出警告信息 */
81 if ((left != right) && !((1 << i) &stereodevs))
82 {
83 fprintf(stderr, "warning: %s is not a stereo device\n", dev);
84 }
85
86 /* 将两个声道的值合到同一变量中 */
87 level = (right << 8) + left;
88
89 /* 设置增益 */
90 status = ioctl(fd, MIXER_WRITE(device), &level);
91 if (status == - 1)
92 {
93 perror("MIXER_WRITE ioctl failed");
94 exit(1);
95 }
96 /* 获得从驱动返回的左右声道的增益 */
97 left = level &0xff;
98 right = (level &0xff00) >> 8;
99 /* 显示实际设置的增益 */
100 fprintf(stderr, "%s gain set to %d%% / %d%%\n", dev, left, right);
101 /* 关闭混音设备 */
102 close(fd);
103 return 0;
104 }
编译上述程序为可执行文件mixer,执行./mixer <device> <left-gain%> <right-gain%>或./mixer <device> <gain%>可设置增益,device可以是vol、pcm、speaker、line、mic、cd、igain、line1、 phin、video。
来源:http://blog.chinaunix.net/space.php?uid=20564848&do=blog&id=74027
发表评论
-
Linux下获取IP、MAC、网关、掩码的shell脚本
2012-07-05 13:45 1894Mask:ifconfig |grep inet| sed - ... -
输入法
2012-01-04 18:00 0http://civilnet.cn/syszux/syszu ... -
tar压缩解压
2012-01-01 11:04 1021tar -c: 建立压缩档案-x ... -
Linux GUI 技术网
2012-01-01 10:32 693http://www.linuxgraphics.cn/hom ... -
Linux常用命令大全
2012-01-01 10:27 606http://www.emlinix.com/linux-zh ... -
嵌入式Linux应用程序自动载入驱动模块方法
2012-01-01 10:22 1258英利公司推出的嵌入式L ... -
MP4音频解码信息
2011-12-31 11:48 0http://blog.chinaunix.net/space ... -
ffmpeg库音频解码示例
2011-12-31 11:45 0一个英文版的例子(有讲解)ffmpeg的一些使用例子mpeg ... -
基于Bootloader的可靠嵌入式软件远程更新机制
2011-12-31 11:42 0嵌入式软件的远程自动 ... -
Double转STRING
2011-12-31 11:40 0double x=1.23456789; ch ... -
linux下检测网卡与网线连通状态
2011-12-31 11:32 0Linux下检测网卡与网线连接状态,使用ioctl向socke ... -
去除10分钟左右自动关闭LCD显示
2012-01-04 09:50 527注释掉drivers\char\vt.c的blank_scre ... -
linux logo 左上角有黑块解决办法
2012-01-04 09:50 917http://www.unixresources.net/li ... -
linux下gprs ppp 拨号的注意事项
2011-12-31 11:21 0折腾了几天,终于在linux下拨号成功了! 注意事项: 1 ... -
GPRS模块在Linux平台上ppp拨号上网总结与心得
2011-12-31 11:09 0由于一个嵌入式平台 ... -
Linux下检测U盘是否插入
2011-12-31 11:07 0Linux下检测U盘是否插入Linux的文件系统是异步的,也就 ... -
Linux下应用程序如何取得U盘插拔消息
2011-12-31 11:06 0Linux 2.6内核版本以后,对于/dev目录的管理采用了新 ... -
在嵌入式Linux下GPRS上网方案
2011-12-31 11:02 0在嵌入式Linux下GPRS上网方案 硬/软件环境 ... -
FFMpeg框架代码阅读
2011-12-31 10:50 01. 简介FFmpeg是一个集录制、转换、音/视频编码解码 ... -
关于ffmpeg的安装及其编译
2011-12-31 10:48 0所需软件包:nasm-0.98.39-1.i386.r ...
相关推荐
mixer的Windows编程收集,未整理,仅作个人使用
关于MFC编程,MixerControl.rar
实现audio,linein,microphone等的音量控制及声道选择
pygame.mixer.music.load(filename) pygame.mixer.music.play(loops=0, start=0.0) 方法二: import pygame\nfilename='/home/pengtao/Music/b.mp3' pygame.mixer.init() pygame.mixer.music.load(filename) pygame...
ALSA尽管不及OSS运用得广泛,但却具有更加友好的编程接口,而且全然兼容于OSS。 二、Linux OSS音频设备驱动 1、 OSS驱动的组成 OSS标准中有2个最主要的音频设备:mixer(混音器)和DSP(数字信号处理器)。 (1)在...
建立两任务,一任务负责audio处理,送dsp或调节mixer,一任务负责TCP/IP通信,接收网络音频流.
设置电脑的麦克风静音和取消操作,如果系统不支持静音操作,则设置麦克风的音量为最小,和别的版本的不一样,自己写的,欢迎指导。
TCRV-Touchdesigner-NDI-Mixer 该项目已由HéctorCruzJuárez编程 交互图: : 信息 有关此项目的更多信息,请访问 薇薇安·克鲁兹执导的《LOOP 时光之镜》 另请访问此调查的详细信息: : Live Remote Creation ...
3.扩展库的应用:SDL2_image,SDL2_mixer,SDL2_ttf(图像、音频、字库) 4.官方案例实战:亲手练习官方推荐的几个案例,认真分析总结。 梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国...
vbpiano.ZIP 一个模拟钢琴的源程序,(需要Threed32.ocx)(75KB) 5,videocap.ZIP 一个视频捕捉程序,安装了视频捕捉设备的朋友可以下载来看一看(12KB) 6,mixer.ZIP 一个非常完全的waveOut程序,...
For creating new icons or editing existing ones, with color palettes(one for 16x16 icons specifically), a color mixer, a panel for lining up icons for edit, icon new/open/save functions, flip/rotate/...
天线接收——天线匹配电路——双工器——滤波(声表面滤波器SAWfilter)——放大(低噪声放大器LNA)——RX_VCO混频(混频器Mixer)——放大(可编程增益放大器PGA)——滤波——IQ解调(IQ调制器)——(进入基带...
我过去从事的一个过时的项目旨在学习游戏编程的艺术。 后续项目: 。 依赖关系以及如何编译 该程序已使用以下库成功编译: libxml2 2.9.8 sdl2 2.0.8 sdl2_image 2.0.3 sdl2_mixer 2.0.2 zlib 1.2.11 要编译...
This file explains the codec-specific mixer controls.
from pygame import mixer import time mixer.init() mixer.music.load('xx.mp3') mixer.music.play() time.sleep(5) mixer.music.stop() 3、使用mp3play库(仅支持python2,对python3不支持) import mp3...
除了一组内核驱动程序模块之外, ...5 音序器接口 一个比原始 MIDI 接口高级的 MIDI 编程和声音同步高层接口。它可以处 理很多的 MIDI 协议和定时器。 6 mixer 接口 控制发送信号和控制声音大小的声卡上的设备。
对于终端中的 Ubuntu 发行版类型,命令: sudo apt-get install libsdl1.2-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev和 Fedora 发行版类型: sudo yum 安装 SDL-devel SDL_mixer-devel SDL_...
文件中 包含 sdl2.dll sdl2_image.dll SDL2_mixer.dll C# sdl2 封装类
本人使用qt5.8,界面简单测试(录音和放音音量及静音设置),封装好了一个类(manager里有写),可以调节应用的混声器音量,或进行静音设置,本人测试没问题,如有问题愿深入交流及时更正。
米克西洛 Miksilo是一种,它是一种用于构造编程语言的工具。 Miksilo的名字来源于中的mixer,它使您可以通过混合现有语言并在其基础上快速创建语言。 众所周知,语言的构建非常困难,如今不仅涉及编写编译器或解释器...