`
duyouhua1214
  • 浏览: 236196 次
  • 性别: 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 mixer编程的示例代码、教程文档或者头文件。通常,这样的资料会讲解如何打开混音器设备,枚举设备上的控制项...

    Mixer operator demo

    我们将围绕VC++ 2005编程环境以及Mixer API来讲解相关知识点。 首先,VC++ 2005是微软开发的一款集成开发环境(IDE),用于编写使用C++编程语言的应用程序。这个版本支持.NET Framework 2.0,提供了强大的调试工具...

    SDL_mixer-1.2.12

    - **Mixer**:在音频编程中,混音器是指能够同时处理多个音频流并合成单个输出流的工具。`SDL_mixer`允许开发者混合多种音频格式和音效。 **2. 功能特性** - **多音频格式支持**:`SDL_mixer`支持多种音频格式,如...

    MIXER_MUTE

    在编程或系统开发层面,开发者可以使用各种API(应用程序接口)或库来访问和控制"MIXER_MUTE"和"MIXER_VOLUME"。例如,Linux系统中有ALSA(Advanced Linux Sound Architecture)提供底层音频访问,而Windows系统则有...

    Python库 | mixer-6.2.5-py3-none-any.whl

    Python库是开发者在编程时经常会使用到的重要工具,它们提供了丰富的功能,可以帮助程序员高效地完成各种任务。在本文中,我们将深入探讨名为“mixer”的Python库,版本为6.2.5,以及如何在Python环境中安装和使用它...

    SDL_mixer-devel-1.2.11-VC.zip

    在本文中,我们将深入探讨SDL_mixer-devel-1.2.11-VC.zip这个压缩包,它是针对Windows平台的开发版本,特别适用于使用Visual C++(VC)进行编程的开发者。 首先,我们要理解“SDL”是什么。Simple DirectMedia ...

    SDL_mixer-devel-1.2.12-VC.zip

    虽然标题中提到的"Delphi"通常与Pascal编程语言和其对应的开发环境相关,而SDL_mixer主要被C/C++开发者使用,但存在一些社区提供的第三方绑定(如Delphi bindings),使得Delphi开发者也能利用SDL_mixer的功能。...

    MIXER_DEMO

    3. **编程语言和框架**:开发音乐播放器通常会用到Java、Swift或Kotlin这样的编程语言,针对Android和iOS平台。对于跨平台应用,可能会选择React Native、Flutter或Xamarin等框架。 4. **用户界面设计**:良好的...

    混音器原理及Mixer API函数介绍

    在编程环境中,Mixer API是一组接口,允许开发者直接控制混音器的功能,实现音频混合、音量控制等功能。在Windows系统中,Microsoft提供了WaveMixing API,而在Linux系统中,ALSA库提供了混音器相关的函数。 以下是...

    MixerControl声音调节

    在Windows编程领域,MFC(Microsoft Foundation Classes)是一个强大的C++类库,它为开发者提供了构建Windows应用程序的框架。本文将深入探讨如何使用MFC来实现声音调节功能,特别是通过`MixerControl`来控制音频...

    color mixer

    【标题】"颜色混合器" 是一个基于OpenGL的软件应用,专为编程爱好者和学习者设计,用于理解和实践颜色理论以及图形渲染技术。这个项目的核心是利用OpenGL的强大功能来实现颜色的混合效果,通过交互式的界面,用户...

    Windows游戏编程大师技巧——2D和3D游戏编程基础.zip

    Windows平台提供了DirectSound或XAudio2来处理声音播放和混音,同时,开源库如SDL Mixer也提供了跨平台的音频解决方案。 7. **资源管理**:游戏中的图像、音频、模型等资源需要高效地加载、存储和释放。理解内存...

    Windows Mixer Control in C#

    总的来说,“Windows Mixer Control in C#”涉及的知识点包括:C#编程基础、P/Invoke技术、Windows Mixer API的使用、音频输入输出管理、事件驱动编程以及GUI设计。通过掌握这些内容,开发者可以构建出能够灵活控制...

    mlp-mixer-pytorch-main.zip

    **标题解析:** "mlp-mixer-pytorch-main.zip" 这个文件名暗示了这是一个与多层感知机(MLP)相关的项目,且它使用PyTorch框架实现。"main"通常指的是项目的主体部分,暗示我们可能将找到一个核心的MLP模型实现。 *...

    c语言游戏编程.rar

    通过OpenAL或SDL Mixer等库,可以播放、暂停、停止和混合音频。 8. **网络编程**:多人在线游戏需要网络编程知识,如TCP/IP协议、UDP套接字、数据包封装和解析等,以实现玩家间的互动。 9. **资源管理**:游戏中的...

    c++经典游戏编程c++经典游戏编程

    了解OpenAL或SDL_Mixer等库可以帮助实现这一点。 10. **输入处理**:游戏需要响应用户的键盘、鼠标或游戏手柄输入。C++库如SDL或SFML提供接口来处理这些输入事件。 11. **文件I/O**:游戏可能需要保存和加载游戏...

    Multichannel Mixer For Adjusting The Output Of Audio Sources

    其中,Multichannel Mixer(多通道混音器)是一个关键工具,它允许用户通过编程方式灵活调整不同音频源的输出。本文将深入探讨如何利用Mixer API函数来实现这一功能。 首先,我们要理解什么是Mixer API。这是...

    PC 游戏编程(人机博弈)ceb和pdf两种格式 超清晰

    此外,声音处理也是重要的一部分,可能涵盖OpenAL或SDL_Mixer等库。网络编程也可能涉及,尤其是多人在线游戏,需要理解TCP/IP协议和同步机制。 文件“PC游戏编程 人机博弈”很可能包含了这些主题的详细教程和实例...

    YURI_1000-1001 + wsock32.dll + rulesmd.ini + XCC Mixer.exe

    在IT行业中,游戏相关的软件和工具常常涉及到各种技术细节,如动态链接库(DLL)、配置文件和混合器程序。...同时,学习关于DLL编程、网络通信以及配置文件解析的知识,对理解游戏的内部机制也有一定帮助。

    游戏音频编程入门随书附赠源代码

    这些都是通过编程语言实现的,例如C++或Python,利用开源库如OpenAL、SDL Mixer或FMOD。OpenAL是一个跨平台的API,提供高级3D音频处理功能;SDL Mixer是一个简单易用的音频库,适合初学者;FMOD则是一个功能强大的...

Global site tag (gtag.js) - Google Analytics