有哪位做个在Vista下录音的程序吗? 就是把当前计算机播放的声音录制下来。
希望能给个思路,当然有一些例子代码更是感谢。以前在xp下的代码工作不正常了。感觉有些原理不一样了

解决方案 »

  1.   

    我做过MIC的录音,XP和VISTA没有差别啊.
    是不是声卡类型不一样啊,设备的ID变了.
      

  2.   

    好像问题出在选择声卡的录音设备,不知道在vista下怎么选择
      

  3.   

    用什么函数进行录音?WaveIn类的吗?
      

  4.   

    void   SelectMic()  
      {  
            //   Open   the   mixer   device  
      HMIXER   hmx;  
      mixerOpen(&hmx,   0,   0,   0,   0);     //   Get   the   line   info   for   the   wave   in   destination   line  
      MIXERLINE   mxl;  
      memset(&mxl, 0, sizeof(mxl)) ;
      mxl.cbStruct             =   sizeof(mxl);  
      mxl.dwComponentType   =   MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;  
      mixerGetLineInfo((HMIXEROBJ)hmx,   &mxl,  
      MIXER_GETLINEINFOF_COMPONENTTYPE);     //   Find   a   LIST   control,   if   any,   for   the   wave   in   line  
      LPMIXERCONTROL   pmxctrl   =   (LPMIXERCONTROL)malloc(mxl.cControls   *   sizeof  
      MIXERCONTROL);  
      MIXERLINECONTROLS   mxlctrl   =   {sizeof   mxlctrl,   mxl.dwLineID,   0,  
      mxl.cControls,   sizeof   MIXERCONTROL,   pmxctrl};  
      mixerGetLineControls((HMIXEROBJ)   hmx,   &mxlctrl,  
      MIXER_GETLINECONTROLSF_ALL);     //   Now   walk   through   each   control   to   find   a   type   of   LIST   control.   This  
      //   can   be   either   Mux,   Single-select,   Mixer   or   Multiple-select.  
      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)   {   //   Found   a   LIST   control  
      //   Check   if   the   LIST   control   is   a   Mux   or   Single-select   type  
      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)hmx,   &mxcd,  
      MIXER_GETCONTROLDETAILSF_LISTTEXT);     //   Now   get   the   value   for   each   item  
      LPMIXERCONTROLDETAILS_BOOLEAN   plistbool   =  
      (LPMIXERCONTROLDETAILS_BOOLEAN)  
      malloc(cChannels   *   cMultipleItems   *   sizeof  
      MIXERCONTROLDETAILS_BOOLEAN);  
      mxcd.cbDetails   =   sizeof   MIXERCONTROLDETAILS_BOOLEAN;  
      mxcd.paDetails   =   plistbool;  
      mixerGetControlDetails((HMIXEROBJ)hmx,   &mxcd,  
      MIXER_GETCONTROLDETAILSF_VALUE);     //   Select   the   "Microphone"   item  
      for   (DWORD   j=0;   j<cMultipleItems;   j   =   j   +   cChannels)  
      if   (0   ==   strcmp(plisttext[j].szName,   "Microphone"))  
      //   Select   it   for   both   left   and   right   channels  
      plistbool[j].fValue   =   plistbool[j+   cChannels   -   1].fValue   =   1;  
      else   if   (bOneItemOnly)  
      //   Mux   or   Single-select   allows   only   one   item   to   be   selected  
      //   so   clear   other   items   as   necessary  
      plistbool[j].fValue   =   plistbool[j+   cChannels   -   1].fValue   =   0;  
      //   Now   actually   set   the   new   values   in  
      mixerSetControlDetails((HMIXEROBJ)hmx,   &mxcd,  
      MIXER_GETCONTROLDETAILSF_VALUE);     free(pmxctrl);  
      free(plisttext);  
      free(plistbool);  
      }  
      else  
      free(pmxctrl);  
      mixerClose(hmx);  
      }     我用上面的代码选择录音设备,用MCI录音。
    在xp下工作正常。在vista下,就没有声音了,不知道是为什么
      

  5.   

    vista audio 的编程模式不同于以往,原来的vfw 和 directx 代码虽然可用,但有问题;给你个连接参考一下http://www.ieee.org.cn/dispbbs.asp?boardID=61&ID=49623
      

  6.   

    准确的说不是你进行录音(录音应该用WAVEIN类的API),而是控制OS的当前录音设备(应该用MIXER类的API)。从你的代码和错误现象上看VISTA的声卡类型是HDA的(高保真的)。
    XP的设备是AC97的。。设备类型不同,导致你的代码失效。
      

  7.   

    实际上在VIST下已经没有选择MIC作为当前LINE的功能了.
    MIC已经变成设备了,如果用MIC时需要取得MIC的设备号