有段代码如下:
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!
  }
 }

 }

解决方案 »

  1.   

    再问一个问题,如何才能取得C-Media wave device 中录音控制的每个SRC的MUTE的CONTROL ID
    在系统的控制板下只能选一个,如何编程来实现控制?
      

  2.   

       参考这篇文章:
    用Mixer API函数调节控制面板的音频设置http://dev.yesky.com/123/2198123.shtml
      

  3.   

    使用mixerGetLineControls()(retrieves one or more controls associated with an audio line.)获取对某一line的一个或多个控制。
    此函数的第二个参数类型为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,还有必要再重新获取一次吗?
      

  4.   

    mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
    err = mixerGetLineControls((HMIXEROBJ)hMixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE);
    最后一句写错了,如果如上,没有错误,但如果值为MIXERCONTROL_CONTROLTYPE_MUTE时,在Realtek声卡上返回MMSYSERR_NOERROR,但在C-Media上就会返回MMSYSERR_ERROR,想知道为什么会这样