VISTA或WIN7下使用立体声混音作为录音来源时,如何通过编程方式去除或加入麦克风的输入

       在编制一个录制会议的程序时遇到一些问题。该程序有这样的需求,通过程序可以控制录制过程中是否录制远端通过网络传输过来的声音(Speaker)、录制方本地麦克风的声音(Microphone)以及两者全录(ALL)或全不录(NONE)。最初的思路是MIC的录制使用waveIn系列API,写一个回调函数将MIC的输入写入AVI中,同时SPEAKER的录制使用API钩子函数实现,即改写waveOut系列中需要用到的那几个API,链接入系统的钩子函数链,这样一进一出均可录制,另外分别设置一个布尔变量来控制录与不录、录哪个的组合(Speaker、Microphone、ALL、NONE)。但在实现后发觉,要么全有(ALL)、要么全无(NONE),深入调试后发现:waveOut的钩子函数根本没起作用,录制全在waveIn的回调函数里了,而且即使禁用麦克风而仅仅使用立体声混音作为录制的默认设备,也能录到麦克风的声音(这个的确很让人感到不寻常)。但是,播放->扬声器->级别 页面上的麦克风禁音却是个总开关!!!如果这里关了,录制里无论禁不禁麦克风,都不会有麦克风的声音;但这里开了,录制里无论禁不禁麦克风,都会有麦克风的声音!!!这就解释了要么全录、要么全未录的原因所在。考虑到APIHOOK使用的是比较老版的Jeffray的类库(第4版),于是换用最新第5版的(2008年发布),结果却出现堆栈溢出的情况,分析发现其新的类库用在全局钩子时没有这个问题,在局部钩子中会出现此问题。因此其中一个解决方案是改写程序,增加一个动态链接库而不是目前的仅一个EXE文件。另外一个方案是通过程序来控制WINDOWS系统的声音控制,如果人工操作非常简单,就是开或禁:播放->扬声器->级别 页面上的麦克风,这看似简单至极的方案用程序来实现却一点不简单。搜遍了VS2005关于声音及多媒体的所有SDK文档,均找不到相关的控制这个的办法。后来在网上搜,得知VISTA之前微软是没有开放这些低层音频接口的,VISTA之后微软通过COM提供给开发者这些控制功能,但即使如此,也是很晦涩的,这些接口的使用已经很靠近驱动层了。


要用到的头文件有:
#include

#include


要用到的API:
MMDevice API

DeviceTopology API


通过遍历SPEAKER里所有的PART,找到MICROPHONE节点,判断其是否有MUTE这个PART,如果有就对其进行操作从而控制输出中MIC的输出,如果禁掉这里的MIC,就录制不到MIC,打开则可以录制。(未完待续)

你可能感兴趣的:(Programming)