WIn2000下面没问题,98就不能达到选择microphone的效果。最好谁能帮忙修改一下
BOOL SelectRecordIn(DWORD dwSrcType)  //dwSrcType=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE
{
   try{
   MIXERLINE mxl;
   mxl.cbStruct      = sizeof(mxl);
   mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
   mixerGetLineInfo((HMIXEROBJ)m_hmx, &mxl,MIXER_GETLINEINFOF_COMPONENTTYPE);
   LPMIXERCONTROL pmxctrl ;
   DWORD cbmxctrls = sizeof(*pmxctrl) * (UINT)mxl.cControls;
   pmxctrl = (LPMIXERCONTROL)LocalAlloc(LPTR, cbmxctrls);
   MIXERLINECONTROLS mxlctrl={sizeof(mxlctrl),mxl.dwLineID,0,mxl.cControls,sizeof(MIXERCONTROL),pmxctrl};
   mixerGetLineControls((HMIXEROBJ)m_hmx, &mxlctrl,MIXER_GETLINECONTROLSF_ALL);
   DWORD i;
   for(i=0; i < mxl.cControls; i++)
      if (MIXERCONTROL_CT_CLASS_LIST == (pmxctrl[i].dwControlType&MIXERCONTROL_CT_CLASS_MASK))
         break;
   if (i < mxl.cControls)
   {
      BOOL bOneItemOnly = FALSE;
      switch (pmxctrl[i].dwControlType)
      {
         case MIXERCONTROL_CONTROLTYPE_MUX:
         case MIXERCONTROL_CONTROLTYPE_SINGLESELECT:
            bOneItemOnly = TRUE;
      }
      DWORD cChannels = mxl.cChannels, cMultipleItems = 0;
      if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl[i].fdwControl)
         cChannels = 1;
      if (MIXERCONTROL_CONTROLF_MULTIPLE & pmxctrl[i].fdwControl)
         cMultipleItems = pmxctrl[i].cMultipleItems;
      // Get the text description of each item
      LPMIXERCONTROLDETAILS_LISTTEXT plisttext =(LPMIXERCONTROLDETAILS_LISTTEXT)
      malloc(cChannels * cMultipleItems * sizeof(MIXERCONTROLDETAILS_LISTTEXT));
      MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl[i].dwControlID,cChannels,(HWND)cMultipleItems, sizeof(MIXERCONTROLDETAILS_LISTTEXT),(LPVOID) plisttext};
      mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_LISTTEXT);
      LPMIXERCONTROLDETAILS_BOOLEAN plistbool =(LPMIXERCONTROLDETAILS_BOOLEAN)
      malloc(cChannels * cMultipleItems * sizeof(MIXERCONTROLDETAILS_BOOLEAN));
      mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);
      mxcd.paDetails = plistbool;
      mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_VALUE);
      for (DWORD j=0; j<cMultipleItems; j = j + cChannels)
      {
         if (plisttext[j].dwParam2==dwSrcType||plisttext[j].dwParam1==dwSrcType)
         {
            plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 1;
         }
         else if (bOneItemOnly)
            plistbool[j].fValue = plistbool[j+ cChannels - 1].fValue = 0;
      }
      mixerSetControlDetails((HMIXEROBJ)m_hmx, &mxcd,MIXER_GETCONTROLDETAILSF_VALUE);
    free(pmxctrl);
    free(plisttext);
    free(plistbool);
   }
  else
    free(pmxctrl);
   return TRUE;
   }
   catch(...)
   {
     return FALSE;
   }
}