以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  vista audio 录音的几个问题  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=49623)


--  作者:卷积内核
--  发布时间:7/9/2007 4:48:00 PM

--  vista audio 录音的几个问题
vista audio 的编程模式不同于以往.这几天在折腾 vista 下的录音模块.有几点疑问:

1.在以往的模式中,我分别用 vfw 和 directx 处理过.思路都是差不多.以directx 为例:

a. 首先,调用:
ICreateDevEnum->CreateClassEnumerator(CLSID_AudioInputDeviceCategory, ...)
获取音频的捕捉设备.你有几张声卡,就有多少个结果.例如,在其结果中,得到的 friendlyname 有可能是:
Interl AC97 Audio

b. 得到声卡之后, 再通过 IID_IAMAudioInputMixer 结果, 得到它的输入单元,其结果的friendlyname, 有可能是:
Microphone,
Line in
Stereo Mix


2. 然后而 vista 模式下,这些代码仍然可用.但是,

a. CLSID_AudioInputDeviceCategory, 获取的结果,却是声卡的输入单元(不是声卡本身).例如:Stereo Mix, Microphone等.获取的 friendlyname, 是:
Microphone( Inter(r) 82801DB/DBM AC 97 audio control)
Line In ( Inter(r) 82801DB/DBM AC 97 audio control)

b. 调用 IID_IAMAudioInputMixer 接口,获取的输入单元的friendly, 都只有一个:
Master Valume.

3. 由于上述代码,虽然在 vista 下可以工作,但是,无法设置音量.于是,我用 vista sdk 重写了这部分的代码.

4. 我用 IMMDeviceEnumerator,IMMDeviceCollection 枚举捕捉设备,获取到 IMMDevice 接口.通过 IMMDevice 接口的 IPropertyStore, 查询到捕捉设备的 friendlyname, 仍然是如下格式:
Microphone( Inter(r) 82801DB/DBM AC 97 audio control)
Line In ( Inter(r) 82801DB/DBM AC 97 audio control)

通过 IAudioEndpointVolume, 可以获取或控制输入音量的大小.

值得庆幸的是,虽然这种结构不同于以往,但经过调试,程序已经能够正常运行了.

vista 下的问题:

1. 如何判断一个输入单元是否为单声道或双声道?
IAudioEndpointVolume 中有一个接口函数 GetChannelCount().很奇怪的是,象 Mono Mix, Microphone 这类输入单元,得到的值也是 2.我认为应该是1才对.

2. 有没有可能,象以前的模式那样,查询出声卡的名称,然后查出声卡的输入单元名称?


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms