`
duyouhua1214
  • 浏览: 228839 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    mixer的Windows编程

    mixer的Windows编程收集,未整理,仅作个人使用

    MixerControl声音调节

    关于MFC编程,MixerControl.rar

    混音器编程CMixer

    实现audio,linein,microphone等的音量控制及声道选择

    pygame播放音乐的方法

    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...

    Linux声卡的驱动实现原理及代码实现(播放和录音的实现).docx

    ALSA尽管不及OSS运用得广泛,但却具有更加友好的编程接口,而且全然兼容于OSS。 二、Linux OSS音频设备驱动 1、 OSS驱动的组成 OSS标准中有2个最主要的音频设备:mixer(混音器)和DSP(数字信号处理器)。 (1)在...

    linux OSS+TCP/IP编程

    建立两任务,一任务负责audio处理,送dsp或调节mixer,一任务负责TCP/IP通信,接收网络音频流.

    编程实现麦克风静音与取消

    设置电脑的麦克风静音和取消操作,如果系统不支持静音操作,则设置麦克风的音量为最小,和别的版本的不一样,自己写的,欢迎指导。

    TCRV-Touchdesigner-NDI-Mixer

    TCRV-Touchdesigner-NDI-Mixer 该项目已由HéctorCruzJuárez编程 交互图: : 信息 有关此项目的更多信息,请访问 薇薇安·克鲁兹执导的《LOOP 时光之镜》 另请访问此调查的详细信息: : Live Remote Creation ...

    FFmpeg4.3开发系列之八:SDL2.0小白入门

    3.扩展库的应用:SDL2_image,SDL2_mixer,SDL2_ttf(图像、音频、字库) 4.官方案例实战:亲手练习官方推荐的几个案例,认真分析总结。     梅老师从事音视频与流媒体行业18年;曾在永新视博、中科大洋、百度、美国...

    VB编程资源大全(源码 多媒体)

    vbpiano.ZIP 一个模拟钢琴的源程序,(需要Threed32.ocx)(75KB) 5,videocap.ZIP 一个视频捕捉程序,安装了视频捕捉设备的朋友可以下载来看一看(12KB) 6,mixer.ZIP 一个非常完全的waveOut程序,...

    VB编程资源大全(英文源码 控件)

    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/...

    一文读透手机信号接收和发射流程涉及到的器件.doc

    天线接收——天线匹配电路——双工器——滤波(声表面滤波器SAWfilter)——放大(低噪声放大器LNA)——RX_VCO混频(混频器Mixer)——放大(可编程增益放大器PGA)——滤波——IQ解调(IQ调制器)——(进入基带...

    janitor-jamboree:我过去用来研究游戏编程艺术的一个过时项目

    我过去从事的一个过时的项目旨在学习游戏编程的艺术。 后续项目: 。 依赖关系以及如何编译 该程序已使用以下库成功编译: libxml2 2.9.8 sdl2 2.0.8 sdl2_image 2.0.3 sdl2_mixer 2.0.2 zlib 1.2.11 要编译...

    HD-Audio-Controls.rar_Windows编程_Unix_Linux_

    This file explains the codec-specific mixer controls.

    python打开音乐文件的实例方法

    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...

    ALSA 驱动架构说明

    除了一组内核驱动程序模块之外, ...5 音序器接口 一个比原始 MIDI 接口高级的 MIDI 编程和声音同步高层接口。它可以处 理很多的 MIDI 协议和定时器。 6 mixer 接口 控制发送信号和控制声音大小的声卡上的设备。

    JewelrySpace:珠光宝气

    对于终端中的 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 C# 封装

    文件中 包含 sdl2.dll sdl2_image.dll SDL2_mixer.dll C# sdl2 封装类

    qt creator项目使用原生Windows进行混声器音量设置(包括录音)

    本人使用qt5.8,界面简单测试(录音和放音音量及静音设置),封装好了一个类(manager里有写),可以调节应用的混声器音量,或进行静音设置,本人测试没问题,如有问题愿深入交流及时更正。

    Miksilo:建立语言的最快方法

    米克西洛 Miksilo是一种,它是一种用于构造编程语言的工具。 Miksilo的名字来源于中的mixer,它使您可以通过混合现有语言并在其基础上快速创建语言。 众所周知,语言的构建非常困难,如今不仅涉及编写编译器或解释器...

Global site tag (gtag.js) - Google Analytics