一般正常的录音都是对Line in进行录音,但有些需要对line out进行录音,因为有些音源是没有line in的.
如即时聊天时录取对方的语音.但这些声音都要经过声卡播放,所以它们的音源就是声卡输出.
对于声卡的输出,在录音控制中有两个,就是Mono mix和stereo mix,当然最好是选取 stereo mix,效果更好.
编程打开录音设备时,是不能控制打开的设备上的输出还是输入通道的.所在要在打开设备前就设置好.
用Mixer的API可以对输出源进行牧举,不过不同的设备的定义不同,对于SoundMax能够正确区别stereo mix和Mono mix的区别,但AC 97的声卡它都是相似的输出源.所以只能多次地优选列举.代码逻辑不是完美,但只能如此.否则只能让用户手工选择,致少要按6次mouse才行.
以下是自己定义的结构,在第一次没有找到正确的输出源时将所有输出源保的index,swLineID和name保存起来.下面
在结构数组中再优选,而不要再对设备牧举
typedef struct ControlEnumData{
INT index;
CString szName;
DWORD dwLineID;
} CTRL_ENUM_DATA,* LPCTRL_ENUM_DATA;
BOOL XXX::setOutSource()
{
UINT deviceCount = ::mixerGetNumDevs();
if (deviceCount < 1 ){
MessageBox( " 没有找到混音设备,请手工选择录音设备的混音输出! " );
return TRUE;
}
BOOL found = FALSE;
for (UINT devID = 0 ;devID < deviceCount; devID ++ ){
HMIXER hMixer;
if (mixerOpen( & hMixer, devID, (DWORD) 0 , 0 , CALLBACK_WINDOW) != MMSYSERR_NOERROR)
{
::mixerClose(hMixer);
continue ;
}
MIXERLINE line;
line.cbStruct = sizeof (MIXERLINE);
// 注意我们要查找的是录音设备.所以dwComponentType 应该是 MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
line.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
if (::mixerGetLineInfo((HMIXEROBJ)hMixer, & line,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR){
::mixerClose(hMixer);
continue ;
}
DWORD dwConnections = line.cConnections;
DWORD selectIndex = - 1 ;
MIXERLINE linesub;
CTRL_ENUM_DATA enumData[ 8 ];
int enumIndex = 0 ;
// 然后看录音设备上共一连结了几个线路
for (DWORD i = 0 ;i < dwConnections ;i ++ ){ // 列举出波形混音输出源的索引并最声音设置最大
linesub.cbStruct = sizeof (MIXERLINE);
linesub.dwSource = i;
linesub.dwDestination = line.dwDestination;
if<
{
UINT deviceCount = ::mixerGetNumDevs();
if (deviceCount < 1 ){
MessageBox( " 没有找到混音设备,请手工选择录音设备的混音输出! " );
return TRUE;
}
BOOL found = FALSE;
for (UINT devID = 0 ;devID < deviceCount; devID ++ ){
HMIXER hMixer;
if (mixerOpen( & hMixer, devID, (DWORD) 0 , 0 , CALLBACK_WINDOW) != MMSYSERR_NOERROR)
{
::mixerClose(hMixer);
continue ;
}
MIXERLINE line;
line.cbStruct = sizeof (MIXERLINE);
// 注意我们要查找的是录音设备.所以dwComponentType 应该是 MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
line.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
if (::mixerGetLineInfo((HMIXEROBJ)hMixer, & line,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE) != MMSYSERR_NOERROR){
::mixerClose(hMixer);
continue ;
}
DWORD dwConnections = line.cConnections;
DWORD selectIndex = - 1 ;
MIXERLINE linesub;
CTRL_ENUM_DATA enumData[ 8 ];
int enumIndex = 0 ;
// 然后看录音设备上共一连结了几个线路
for (DWORD i = 0 ;i < dwConnections ;i ++ ){ // 列举出波形混音输出源的索引并最声音设置最大
linesub.cbStruct = sizeof (MIXERLINE);
linesub.dwSource = i;
linesub.dwDestination = line.dwDestination;
if<