在一些使用声卡进行音频采集的应用程序中,通常有如下这样的功能需求:程序启动的时候,要求自动为声卡选择某个特定的输入端子——比如一些通用的采集程序,希望将“Line In”作为默认输入;而一些视频会议软件,希望将“Microphone”作为默认输入。遗憾的是,DirectShow并不能直接支持这样的功能。
大家知道,声卡在DirectShow中是以Filter的形式出现的,我们通常称之为Audio Capture Filter。Filter的每个输入Pin即代表声卡的一个输入端子,Pin的名字就是输入端子的名字。对于不同的声卡来说,输入端子的个数和类型都可能是不一样的。以Avance AC97 Audio和SoundMAX Digital Audio两块声卡为例,它们的输入Pin分别为(注:以“索引:Pin的名字”的方式列出):
0:Mono Mix 1:Stereo Mix 2:Aux 3:TV Tuner Audio 4:CD Player 5:Line In 6:Microphone 7: Phone Line
0:CD Player 1:Micro-phone 2:Line-In 3:Mono Out 4:Wave Out Mix
在DirectShow中,可以通过索引的方式枚举出Audio Capture Filter的所有输入Pin,但单纯依靠索引无法识别出Pin代表的具体输入端子类型,而且不同声卡的索引也不具有通用的意义。对于一块未知的声卡,应用程序怎么通过一种统一的方式去选择一个特定类型的输入端子呢?有一个笨办法,那就是猜——尽可能多地猜测输入Pin的名字!以选择“Line In”作为默认输入为例:
// 演示代码1
// We set "Line In" as default, by checking the pin name
if (pinName.CompareNoCase("Line In") == 0 ||
pinName.CompareNoCase("Line-In") == 0 ||
pinName.CompareNoCase("Line_In") == 0 ||
pinName.CompareNoCase("LineIn") == 0 ||
pinName.CompareNoCase("Line") == 0)
{
found = TRUE;
}
代码有点丑陋,但如果没有更好的办法的话,也不失为一种解决方案。(注:《DirectShow实务精选》第2章的AVCap例子采用的就是这样的方法。)有没有更好的办法呢?有!那就要依赖Windows Multimedia API函数的配合了——通过mixerGetDevCaps、mixerGetLineInfo等一系列函数,我们可以首先确切地获得想要的那种输入端子在当前系统、当前声卡上采用的名字,然后再去枚举Audio Capture Filter上的输入Pin,挑选其中一个名字匹配的。使用Windows Multimedia API函数查询特定输入端子的名字的函数GetConnectionName实现如下:
// 演示代码2
// Some frequently-used line type:
// line in -> MIXERLINE_COMPONENTTYPE_SRC_LINE
// microphone -> MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
// CD Player -> MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC
BOOL GetConnectionName(DWORD inLineType, CString& outName)
{
UINT cMixers = mixerGetNumDevs();
if (cMixers < 1)
{
TRACE("No mixer device present.");
return FALSE;
}
// Open a mixer and determine its capabilities.
HMIXER hMixer;
if (mixerOpen(&hMixer, 0, 0, 0, 0 ) != MMSYSERR_NOERROR)
{
TRACE("Could not open mixer device.");
return FALSE;
}
MIXERCAPS caps;
if (mixerGetDevCaps((UINT)hMixer, &caps, sizeof(MIXERCAPS)) != MMSYSERR_NOERROR)
{
mixerClose(hMixer);
return FALSE;
}
TRACE("Name of device: %s/n", caps.szPname);
MIXERLINEline;
BOOL found = FALSE;
int cDest = caps.cDestinations;
for (int i = 0; i < cDest && !found; i++)
{
line.cbStruct = sizeof(MIXERLINE);
line.dwSource = 0;
line.dwDestination = i;
mixerGetLineInfo((HMIXEROBJ)hMixer, &line, MIXER_GETLINEINFOF_DESTINATION);
// For recording control
if (line.dwComponentType == MIXERLINE_COMPONENTTYPE_DST_WAVEIN)
{
// Enumerate all source connections for this destination line
UINT cConnections = line.cConnections;
for (UINT j = 0; j < cConnections; j++)
{
line.cbStruct = sizeof(MIXERLINE);
line.dwSource = j;
line.dwDestination = i;
mixerGetLineInfo((HMIXEROBJ)hMixer, &line, MIXER_GETLINEINFOF_SOURCE);
// Compare with the user-specified line type
if (line.dwComponentType == inLineType)
{
// Retrieve the connection name
outName = line.szName;
found = TRUE;
break;
}
}
}
}
mixerClose(hMixer);
return found;
}
于是,演示代码1可以修改如下:
// 演示代码3
CString defaultConnection;
GetConnectionName(MIXERLINE_COMPONENTTYPE_SRC_LINE, defaultConnection);
if (pinName == defaultConnection)
{
found = TRUE;
}
显然,第2种方案要优于第1种方案。但再好的解决方案也不如微软更新一下DirectShow SDK,使得Audio Capture Filter上的每个输入Pin上都增加一个接口(如IAMAudioConnection);通过IAMAudioConnection接口,开发者能够很容易地识别出Pin代表的输入端子类型(像Windows Multimedia一样,用一个整型数值来标示不同的输入端子类型)。
分享到:
相关推荐
基于GUI的声卡监测示波器,可实时显示声卡输入
能够播放声音波形的VC+源代码,用声卡输入信后
万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡驱动万能声卡...
C#调用C++的VLC库,播放视频并选择声卡的小例子。 开发环境为VS2013,VLC的库版本为3.0.4。 可以正确编译和运行。 ...自己封装了一个类VlcPlayerHelper.cs,选择声卡的关键代码为listget方法中。
delphi基于directshow开发的播放器,希望对从事directshow的开发者有帮助.
寻找声卡 的程序 声卡找不到? 简单 用本工具一下就搞定
虚拟仪器(声卡作输入),可以用电脑作为一个高级示波器,只要自己制作一条采集线就可以,内附有说明书
多声卡播放 当有多个声卡时选择播放。多声卡播放 当有多个声卡时选择播放。多声卡播放 当有多个声卡时选择播放。多声卡播放 当有多个声卡时选择播放。多声卡播放 当有多个声卡时选择播放。多声卡播放 当有多个声卡时...
对声卡输入的声音经行FFT变化,显示频谱图
商业编程-源码-DirectShow 多声卡播放器.zip
创新声卡KX驱动全自动安装
基于QT设计的录音机: 支持选择指定声卡录音选择指定扬声器放音 QT通过QAudioInput类读取声卡PCM数据,在封装WAV头,转为WAV格式的文件保存到本地。代码里固定录制10S的声音,有进度条显示录制和播放的进度。
这是来源于单片机社区的资源,提供项...2)如果系统有多个声卡,ID就可能是0,1...,通过调用系统动态链接库DLL,获取语音设备,再选择声卡,方便程序运行。 文件提供实现原理的链接和原文链接,实测有用! 实测有用!
黑苹果万能声卡驱动-自动安装版。 帮助你一键安装好黑苹果的声卡驱动,10.7.5上亲测成功!
当在系统默认时,如果拔插声卡,会自动切换到拔插后的默认声卡。 当在指定设备名称时,如果拔插声卡,如果没有切换到默认声卡,如果有则保持。 软件封装DLL可以免费使用,必要位置附上作者QQ,如需源码或者其他需求...
安装步骤,直接点下一步就行。...使用教程:首先打开需要静音的软件,然后鼠标右键桌面左下角的扬声器,选择打开声音设置,然后就可以设置指定应用的扬声器的输出和麦克风的输入,选择所安装的虚拟声卡就可以了。
使用电脑自带声卡在labview中实现录音播放(With labview achieve Recording Playback)
创新SBLive5.1混音效果调试方法:目前在语音聊天室里有很多的朋友在使用创新5.1声卡,特此献给所有爱好语音唱歌的朋友!首先安装好声卡的硬件,在进CMOS里去屏蔽原来板载声卡。进入CMOS找到Integrated Peripherals...
dx 方式多声卡方式播放wav
在安装声卡驱动程序时,要选择“厂家提供的驱动程序”而不要选“Windows默认的驱动程序”如果用“添加新硬件”的方式安装,要选择“从磁盘安装”而不要从列表框中选择。如果已经安装了Windows自带的驱动程序,可选...