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

上传人:ldj****22 文档编号:46621079 上传时间:2018-06-27 格式:PDF 页数:20 大小:360.79KB
返回 下载 相关 举报
混音器原理及Mixer API函数介绍_第1页
第1页 / 共20页
混音器原理及Mixer API函数介绍_第2页
第2页 / 共20页
混音器原理及Mixer API函数介绍_第3页
第3页 / 共20页
混音器原理及Mixer API函数介绍_第4页
第4页 / 共20页
混音器原理及Mixer API函数介绍_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《混音器原理及Mixer API函数介绍》由会员分享,可在线阅读,更多相关《混音器原理及Mixer API函数介绍(20页珍藏版)》请在金锄头文库上搜索。

1、混音器原理及混音器原理及 Mixer API 函数介绍函数介绍 为了理解 Mixer API 是如何工作的,首先我们得弄清楚一个典型声卡的硬件组成。因此非常有必要去建立一个声卡模型,此声卡应拥有多个 典型的组件并且这些组件都是相关联的。 让我们看一个典型的、最基本的声卡。首先,如果声卡能够进行数字化录音,那么典型情况下它就有一个 Microphone Input(麦克风传声器, 下同) (附有某种前置放大器) ,同时它还有一个 ADC(模数转换器,下同)将麦克风输入的模拟信号转换为数字信号,因此,它就有两个组件 Microphone Input 和 ADC。从 Microphone Input

2、 组件输入的信号输送到 ADC。我们可以使用以下的方块图来表示这两个组件,并表明信号在这 两个组件之间的传输关系(通过箭头表示) 。 一个典型的声卡应该还可以回放数字声音,因此它有一个 DAC(数模转换器,下同)组件将数字信号转换回模拟信号,同时它还应有一个 Speaker Out (扬声器, 下同) (附有某种模拟信号放大器) 。 因此, 它又添加了两个组件DAC 和 Speaker Out。 从 DAC 输出的信号输送到 Speaker Out 中。 一个典型的声卡或许还有其它组件。例如,它或许有一个能播放 MIDI 音频的内置声音模块(比如 Synth(合成器,下同) ) 。这个组件的声

3、音 输出同 DAC 的输出同样输入到 Speaker Out 组件中。因此,我们的方框图现在是如下的样子: 同样的,一个典型的声卡还有一个内部的连接器连接着计算机的 CDROM 驱动器的声音输出(这样就可以通过扬声器来播放 CDROM 里的 CD) 。与 Synth 和 DAC 一样,这个组件的输出会输入到 Speaker Out。现在,我们的方块图就成了如下的样子: 最后,我们假设这个声卡还有一个 Line In(线路输入,下同)组件,因此其它外部的录音机或音频设备或外部的硬件混音器就能够连接到此 插孔并将其输入信号数字化。同 Microphone Input 组件一样,这个组件的输出会输送

4、到 ADC 组件。下面是我们最终的方块图,其中包括 7 个组件 (和 5 个信号流向线图也就是将各个组件相连的箭头线) 典型情况下,每个组件都有它自己的参数。例如,Synth 通常会有它的音量参数。Internal CD Audio 同样有它自己的音量参数。DAC 也会有 它自己的音量参数。在这种方式下,如果用户同时播放一个 Audio CD、一个 MIDI 文件和一个 WAVE 文件,他可以分别调整这三个组件输入到 Speaker Out 的音量。同样的,Speaker Out 组件也有它自己的音量参数控制上述 3 个输入组件最终输出的主音量。 同样的,Line In 和 Microphon

5、e Input 组件也都有各自的音量参数,这样在同时录音的情况下,就可以平衡二者的输入。ADC 组件有个主音量 参数,它控制着上述 2 个连接到它的输入组件的录音音量。 一个给定的组件还拥有其它可控的参数。例如,上述每个组件都有各自的用于快速打开或关闭声音的静音(Mute)开关。 混音器设备混音器设备 系统中每个声卡都有一个与其相连的混音器设备。 声卡上所有的组件都由与声卡关联的混音器设备控制。 Windows Mixer API 就是用来访问声 卡的混音器设备的一组函数。Mixer API 有一组函数,可以获取声卡上所有的组件并调整它们的参数。这是 Win95/98 和 WinNT (4.X

6、 及以上版本) 新增的一组 API,虽然加入到 windows 3.1 及更早的版本中也可以使用。 注意:有些声卡的设备驱动需要额外的支持才可以协同 Mixer API 工作。不是所有的 Win95 和 WinNT 驱动都支持 Mixer API 操作。Win3.1 驱 动不支持 Mixer API 操作。 在一个计算机中,可能安装有一个以上声卡。你或许已经注意到 windows 在系统中维护了一组 WAVE 和 MIDI 输入输出的设备列表。既然每 个已安装的声卡都有其对应的混音器设备(只要声卡的驱动支持) ,windows 同样也就维护了一组已安装在系统中的混音器设备。例如,如果你有 在系

7、统中安装了两块声卡,那么系统中就应该有两个混音器设备(假设两个声卡的驱动都支持 Mixer API) 。 同 WAVE 和 MIDI 输入输出设备一样,windows 也会给每个混音器设备赋一个数值 ID。因此,系统中的第一个(默认)混音器设备的 ID 号 为 0。如果系统中有第二个声卡,那么就有一个 ID 为 1 的混音器设备。 打开一个混音器设备打开一个混音器设备 怎样在你的程序中选择一个混音器设备来进行操作?这里有很多种方法,具体要看你想做多炫、多灵活的程序了。 如果你只是想简单的打开首选的混音器设备,那么您可以使用 mixerOpen 函数,并使设备 ID 值 0,如下: unsign

8、ed long err; HMIXER mixerHandle; /* 打开与默认的打开与默认的 Audio/MIDI 声卡相连的混音器声卡相连的混音器 */ err = mixerOpen( if (err) printf(“ERROR: Cant open Mixer Device! - %08Xn“, err); else /*混音器已打开,你可以此混音器句柄混音器已打开,你可以此混音器句柄 mixerHandle 用在其它用在其它 Mixer API 中中*/ 当然,如果没有安装混音器,上述调用将会返回一个错误值,因此要始终检查那个返回值。 (调用 Mixer API 返回的预期错误值

9、已列在头文件 MMSYSTEM.H 中。不幸的是,不像其它 WAVE 和 MIDI 那些更低级的 API,这里没有将这些错误值代码转换为描述字符串的 API 函数) 。 但是,什么是首选混音器设备?好,让我来告诉你,那就是第一个安装在系统中的混音器设备。如果系统中只有一个声卡,那么你得到的混 音器设备肯定就是首选混音器设备。但是,如果你尝试着去使用第二块声卡上的 Wave Output 组件,那该怎么做?你肯定不希望使用第一块声卡 的混音器设备去控制第二块声卡上的 Wave Out 组件的音量。 (第一块声卡的混音器当然控制不了第二块声卡的 Wave Output 组件了) 。 但是,你怎样打

10、开与你想要的那块声卡关联的混音器?幸运的是,mixerOpen()函数允许你传递与这个声卡关联的其它设备的 ID 或句柄来打 开混音器。在这种情况下,mixerOpen()函数将会准确无疑的返回与那个声卡的其它设备关联的混音器设备。以下是一个样例程序,展示了如何通 过打开默认的 WAVE OUT 设备(默认声卡上的 WAVE OUT 设备)获取混音器设备的句柄: unsigned long err; HMIXER mixerHandle; WAVEFORMATEX waveFormat; HWAVEOUT hWaveOut; /* 打开默认的打开默认的 WAVE Out 设备设备, 指定回调函

11、数,确保指定回调函数,确保 waveFormat 已被正确的初始化已被正确的初始化 */ err = waveOutOpen( if (err) printf(“ERROR: Cant open WAVE Out Device! - %08Xn“, err); else /* 已打开与已打开与 WAVE OUT 设备关联的混音器设备关联的混音器. 注意我传递的是通过注意我传递的是通过 waveOutOpen()返回的句柄返回的句柄 */ err = mixerOpen( if (err) printf(“ERROR: Cant open Mixer Device! - %08Xn“, err)

12、; 上述代码的关键不仅仅是传递 waveOutOpen()(或者 waveInOpen(), 或者 midiOutOpen(),或者 midiInOpen()返回的句柄,同样要注意的是 mixerOpen()的最后一个参数必须是 MIXER_OBJECTF_HWAVEOUT (或者 MIXER_OBJECTF_HWAVEIN,或者 MIXER_OBJECTF_HMIDIOUT, 或 者 MIXER_OBJECTF_HMIDIIN),用于指明传递的是哪一类设备句柄。 如果你知道你想要打开的 WAVE OUT 设备的 ID(但是还未通过 waveOutOpen()获取它的句柄) ,你可以传递这个

13、ID 并在 mixerOpen 的最 后一个参数中指定 MIXER_OBJECTF_WAVEOUT。mixerOpen()将会找到与这个 ID 关联的混音器。 你可以通过混音器的句柄获取它的 ID,按如下方式使用 mixerGetID(): unsigned long mixerID; err = mixerGetID(mixerHandle, if (err) printf(“ERROR: Cant get Mixer Device ID! - %08Xn“, err); else printf(“Mixer Device ID = %dn“, mixerID); 列举所有的混音器设备列举所

14、有的混音器设备 如果你想写一个能列举系统中所有混音器的程序,windows 有一个函数可以确定列表中有多少个混音器,这个函数就是 mixerGetNumDevs()。 它返回系统中混音器的个数。切记设备 ID 是从 0 开始并以 1 递增。因此,如果 windows 显示列表中有 3 个混音器,那么你就应该知道它们的 ID 分别是 0、1、2。然后你可以将这些 ID 用于其他 windows 函数中。例如,这里有一个函数可以用来获取列表中的设备信息,包括它的名称和其它 特征比如它包含多少个组件及每个组件的类型,等等。你可以传递你想获取信息的混音器设备 ID(和一个指向类型为 MIXERCAPS

15、 的结构体 的指针,windows 将设备信息填入此结构体) ,然后调用获取混音器设备信息的函数 mixerGetDevCaps()。 如下样例程序遍历混音器列表,并打印出每个设备名: MIXERCAPS mixcaps; unsigned long iNumDevs, i; /* 获取系统中混音器设备个数获取系统中混音器设备个数 */ iNumDevs = mixerGetNumDevs(); /* 遍历所有的混音器并显示它们的遍历所有的混音器并显示它们的 ID 和名称和名称 */ for (i = 0; i iNumDevs; i+) /* 获取下一个混音器设备的信息获取下一个混音器设备的

16、信息 */ if (!mixerGetDevCaps(i, 线路和控件线路和控件 我已经使用了术语“组件”来描述一个具有独立并可调整参数的硬件模块,Mixer API 实际上通过信号流来工作。 (在我们的方块图中,信号 流是那 5 个连接各个组件的箭头) 微软官方文档将每个信号流 (就是方块图中的每个箭头) 称为一个 “源线路” , 因此, 一个混音器设备控制着 “源 线路” ,而不是组件本身。每个“源线路”有它独立的、可调整的参数而不是每个组件本身拥有。我们的示例声卡关联的混音器有 5 个源线路, 从此,只要你看到“源线路” ,就将它想象为组件之间的信号流。 例如,实际上不是 Microphone Input 组件与 Mixer API 相关联,而是 Microphone Input 组件和 ADC 组件之间的信号流与 Mixer API 关联。 Micr

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号