zoukankan      html  css  js  c++  java
  • Linux音频编程(三)混音器介绍

     

    一、介绍

    1、mixer:用来控制多个输入、输出的音量,也控制输入(microphone,line-in,CD)之间的切换,可以将多个信号组合或者叠加在一起。声卡上的混音器由多个混音通道组成,它们可以通过声卡驱动程序提供的设备文件/dev/mixer进行编程(对混音器进行操作的软件接口)混音器主要是对声卡的输入增益和输出增益进行调节
    2、混音器的操作不符合典型的读/写操作模式,除了open和close系统调用大部分通过ioctl系统调用来完成的。与/dev/dsp不同,/dev/mixer允许多个应用程序同时访问,并且混音器的设置值会一直保持到对应的设备文件被关闭为止。Linux上的声卡驱动程序大多都支持将混音器的ioctl操作直接应用到声音设备上,也就是说如果已经打开了/dev /dsp,那么就不用再打开/dev/mixer来对混音器进行操作,而是可以直接用打开/dev/dsp时得到的文件标识符来设置混音器。

    二、Mixer编程

    1、使用ioctl系统调用控制命令由SOUND_MIXER或者MIXER开头,以下常用的几个混音器控制命令:

    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 输入

    2、(1)在进行混音器编程时,可以使用 SOUND_MIXER_READ宏来读取混音通道的增益大小,如下:

    int vol;  
    ioctl(fd, SOUND_MIXER_READ(SOUND_MIXER_MIC), &vol);  
    printf("Mic gain is at %d %% ", vol);  

    对于只有一个混音通道的单声道设备来说,返回的增益大小保存在低位字节中。

    2)支持多个混音通道的双声道设备来说,返回的增益大小实际上包括两个部分,分别代表左、右两个声道的值,其中低位字节保存左声道的音量,而高位字节则保存右声道的音量。下面的代码可以从返回值中依次提取左右声道的增益大小:

    int left, right;  

    left = vol & 0xff;  

    right = (vol & 0xff00) >> 8;  

    printf("Left gain is %d %%, Right gain is %d %% ",left, right);  

    3)设置混音通道的增益大小,则可以通过SOUND_MIXER_WRITE宏来实现,此时遵循的原则与获取增益值时的原则基本相同,设置输入增益如下

    vol = (right << 8) + left;  
    ioctl(fd, SOUND_MIXER_WRITE(SOUND_MIXER_MIC), &vol);  

    4)声卡驱动程序提供了多个 ioctl系统调用来获得混音器的信息,返回一个整型的位掩码(bitmask)中每一位分别代表一个特定的混音通道,如果相应的位为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");

    5)其是否是一个有效的录音源,如下:

    ioctl(fd, SOUND_MIXER_READ_RECMASK, &recmask);  
    if (recmask & SOUND_MIXER_CD)   
      printf("The CD input can be a recording source");  

    6)目前大多数声卡提供多个录音源,通过SOUND_MIXER_READ_RECSRC可以查询出当前正在使用的录音源,同一时刻能够使用几个录音源是由声卡硬件决定的。类似地,使用SOUND_MIXER_WRITE_RECSRC可以设置声卡当前使用的录音源,例如下面的代码可以将CD输入作为声卡的录音源使用:

    devmask = SOUND_MIXER_CD;  
    ioctl(fd, SOUND_MIXER_WRITE_DEVMASK, &devmask);

    (7)所有的混音通道都有单声道和双声道的区别,如果需要知道哪些混音通道提供了对立体声的支持,可以通过SOUND_MIXER_READ_STEREODEVS来获得。

    三、参考: 

    1、mixer.h

    原文链接:

    https://github.com/tinyalsa/tinyalsa/blob/67b9210d344c34e8d1aa0cfe638abce71c5221ca/include/tinyalsa/mixer.h

    2、mixer.c

    原文链接:

    https://github.com/tinyalsa/tinyalsa/blob/8752514eaf1e530e9fa8db4dda51ce80b775f001/src/mixer.c

  • 相关阅读:
    POJ 3259 Wormholes【BellmanFord】
    POJ 2960 SNim【SG函数的应用】
    ZOJ 3578 Matrixdp水题
    HDU 2897 邂逅明下【bash博弈】
    BellmanFord 算法及其优化【转】
    【转】几个Java的网络爬虫
    thinkphp 反字符 去标签 自动加点 去换行 截取字符串 冰糖
    php 二维数组转 json文本 (jquery datagrid 数据格式) 冰糖
    PHP 汉字转拼音(首拼音,所有拼音) 冰糖
    设为首页与加入收藏 兼容firefox 冰糖
  • 原文地址:https://www.cnblogs.com/L-102/p/11526525.html
Copyright © 2011-2022 走看看