有段代码如下:
MMRESULT err;
HMIXER hMixer;
MIXERCAPS mxcaps;
MIXERLINE mxl;
MIXERLINECONTROLS mxlc;
MIXERCONTROL mxc;
MIXERCONTROLDETAILS_BOOLEAN mxcd_b;DWORD component_dst;
DWORD component_src;
int count = mixerGetNumDevs();
while(count--)
{
err = mixerOpen(&hMixer,count,0,0,MIXER_OBJECTF_HMIXER);
err = mixerGetDevCaps((UINT)hMixer,&mxcaps,sizeof(MIXERCAPS));
int dst = mxcaps.cDestinations;
while(dst--)
{
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwDestination = dst;
err = mixerGetLineInfo((HMIXEROBJ)hMixer,&mxl,MIXER_GETLINEINFOF_DESTINATION);
component_dst = mxl.dwDestination;
int source = mxl.cConnections;
while(source--)
{
MIXERLINE mxl2;
mxl2.cbStruct = sizeof(MIXERLINE);
mxl2.dwDestination = mxl.dwDestination;
mxl2.dwSource = source;
err = mixerGetLineInfo((HMIXEROBJ)hMixer,&mxl2,MIXER_GETLINEINFOF_SOURCE);
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
mxlc.dwLineID = mxl2.dwLineID;
mxlc.cControls = 1;
err = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYID);
//到这一句就会出错,请问一下前面应该修改些什么才OK!
}
}
}
MMRESULT err;
HMIXER hMixer;
MIXERCAPS mxcaps;
MIXERLINE mxl;
MIXERLINECONTROLS mxlc;
MIXERCONTROL mxc;
MIXERCONTROLDETAILS_BOOLEAN mxcd_b;DWORD component_dst;
DWORD component_src;
int count = mixerGetNumDevs();
while(count--)
{
err = mixerOpen(&hMixer,count,0,0,MIXER_OBJECTF_HMIXER);
err = mixerGetDevCaps((UINT)hMixer,&mxcaps,sizeof(MIXERCAPS));
int dst = mxcaps.cDestinations;
while(dst--)
{
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwDestination = dst;
err = mixerGetLineInfo((HMIXEROBJ)hMixer,&mxl,MIXER_GETLINEINFOF_DESTINATION);
component_dst = mxl.dwDestination;
int source = mxl.cConnections;
while(source--)
{
MIXERLINE mxl2;
mxl2.cbStruct = sizeof(MIXERLINE);
mxl2.dwDestination = mxl.dwDestination;
mxl2.dwSource = source;
err = mixerGetLineInfo((HMIXEROBJ)hMixer,&mxl2,MIXER_GETLINEINFOF_SOURCE);
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
mxlc.dwLineID = mxl2.dwLineID;
mxlc.cControls = 1;
err = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYID);
//到这一句就会出错,请问一下前面应该修改些什么才OK!
}
}
}
在系统的控制板下只能选一个,如何编程来实现控制?
用Mixer API函数调节控制面板的音频设置http://dev.yesky.com/123/2198123.shtml
此函数的第二个参数类型为LPMIXERLINECONTROLS,是一个[int,out]型参数。特别注意传入时需要进行的一些初始化动作。
a.如果mixerGetLineControls获取一个control by type(此时第三个参数为MIXER_GETLINECONTROLSF_ONEBYTYPE)时,需要对此结构的dwLineID和dwControlType进行设置,dwControlType用来说明控制的类型,而dwLineID用来说明对哪条line进行此种类型的控制。
b.如果mixerGetLineControls获取一个control by id(此时第三个参数为MIXER_GETLINECONTROLSF_ONEBYID)时,则需要初始化此结构的dwControlID成员,注意此时它的dwLineID成员不需要被初始化。为什么前一种方式需要对dwLineID成员初始化,而后一种不需要呢?
难道是这样的:通过控制类型获取控制时,可能不同的line都有此控制类型,因此还要指定具体的line。而通过控制ID时,因为控制ID是唯一的,就没必要了?但经过debug发现,MIXERLINECONTROLS的dwControlID和dwControlType是一一对应的,而且还相等,也就是说对于不同的line,MIXERLINECONTROLS的dwControlID成员也是一样的,因此并不具有唯一性,难道上面的推论是错误的?偶然发现初始化MIXERLINECONTROLS的dwControlID后(先用ONEBYTYPE方式debug得到MIXERLINECONTROLS的dwControlID成员的值进行初始化),通过ONEBYID方式调用mixerGetLineControls,其返回值竟然不是MMSYSERR_NOERROR,这说明有问题,我马上想到:MIXERCONTROL结构也有一个dwControlID成员,这次用MIXERCONTROL结构的dwControlID成员的值初始化MIXERLINECONTROLS的dwControlID的值,这次成功了,而且得到了正确的结果,这也符合上面的推论,因为MIXERCONTROL的dwControlID是唯一的。但我们一般使用前一种方式,因为我们开始并不知道控制ID是多少。而且这种方式有画蛇添足之举,既然已经得到dwControlID,还有必要再重新获取一次吗?
err = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE);
最后一句写错了,如果如上,没有错误,但如果值为MIXERCONTROL_CONTROLTYPE_MUTE时,在Realtek声卡上返回MMSYSERR_NOERROR,但在C-Media上就会返回MMSYSERR_ERROR,想知道为什么会这样