手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

用MixerAPI函数调节控制面板的音频设置

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  Volume对应的值 MIXERLINE_COMPONENTTYPE_DST_SPEAKERS

  CD 对于的值 MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC

  Midi对应的值为 MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER

  Wave对应的值为 MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT

  Line in对应的值为 MIXERLINE_COMPONENTTYPE_SRC_LINE

  Microphone对应的值为 MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE

  我们可以通过音频线路的类型值获得相应的线路的信息,也可以通过音频线路的设备ID来获取相应的线路的信息。

  下面开始我们编程吧。

  首先定义三个变量

UINT m_uMxId; //mixer的ID
HWND m_hWnd; //回调窗口句柄
HMIXER m_hmx; //
  然后就是要打开mixer,可以在对话的初始化中作这些工作。

#define MAX_VOL_VALUE 65535
if (MMSYSERR_NOERROR != mixerOpen(&m_hmx, m_uMxId,(DWORD)m_hWnd, 0, CALLBACK_WINDOW))
{
 return FALSE;
}
if (MMSYSERR_NOERROR == mixerGetID((HMIXEROBJ)m_hmx, &m_uMxId, MIXER_OBJECTF_HMIXER))
{
 return m_uMxId;
}
//设置Volume的滑动条的范围这里只以Volume为例。
m_SliderWaveL.SetRange(0, MAX_VOL_VALUE, TRUE);
m_SliderWaveR.SetRange(0, MAX_VOL_VALUE, TRUE);
  接着我先演示一下如何获取和设置录音设备的左右声道的音量值,以及如何静音放音设备,这里以Volume为例,其他的设备类似,你可以照着我的代码,套用即可。

  1、如何获取Volume设备的音量大小

DWORD dwLValue;
DWORD dwRValue;
GetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, &dwLValue,&dwRValue);
//GetVolume函数的定义见下面,然后根据返回的值调整滑动条的位置
m_SliderVolR.SetPos(MAX_VOL_VALUE - dwLValue);
m_SliderVolL.SetPos(MAX_VOL_VALUE - dwRValue);
  2、如何根据滑动条的位置来调整系统音量的大小

void CMixerControlDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 // m_dwSpkR和m_dwSpkL是用来记录Volume左右声道的音量值,0~~65535
 CSliderCtrl *pSlider = (CSliderCtrl *)pScrollBar;
 int nValue = MAX_VOL_VALUE - pSlider->GetPos(); //获取滑动条的位置pos
 else if (m_SliderVolR.m_hWnd == pSlider->m_hWnd)
 {
  //如果拖动的是Volume的左声道
  m_dwSpkR = nValue;
  // 设置Volume的音量值
  SetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, m_dwSpkL, m_dwSpkR);
 }
 else if (m_SliderVolL.m_hWnd == pSlider->m_hWnd)
 {
  //Volume右声道
  m_dwSpkL = nValue;
  // 设置Volume的音量值
  SetVolume(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, m_dwSpkL, m_dwSpkR);
 }
 //其他音频线路可以依次类推在下面添加
}

  GetVolume和SetVolume函数的定义下面给出

BOOL CMixer::SetVolume(DWORD dwSrcType, DWORD dwLValue, DWORD dwRValue, BOOL bMono)
{
 MIXERLINE mxl;
 if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
  return FALSE;

 MIXERCONTROL mxc;
 if (! GetLineControl(&mxc, &mxl, MIXERCONTROL_CONTROLTYPE_VOLUME))
  return FALSE;

 MIXERCONTROLDETAILS mxcd;
 MIXERCONTROLDETAILS_UNSIGNED mxcd_u1;
 MIXERCONTROLDETAILS_UNSIGNED mxcd_u[2];

 mxcd.cbStruct = sizeof(mxcd);
 mxcd.dwControlID = mxc.dwControlID;
 mxcd.cMultipleItems = 0;

 if (bMono)
 {
  mxcd.cChannels = 1;
  mxcd.cbDetails = sizeof(mxcd_u1);
  mxcd.paDetails = &mxcd_u1;
  mxcd_u1.dwValue = dwLValue;
 }
 else
 {
  mxcd.cChannels = mxl.cChannels;
  mxcd.cbDetails = sizeof(*mxcd_u);
  mxcd.paDetails = mxcd_u;
  mxcd_u[0].dwValue = dwLValue;
  mxcd_u[1].dwValue = dwRValue;
 }

 if (! SetControlDetails(&mxcd, MIXER_OBJECTF_MIXER))
  return FALSE;

 return TRUE;
}

BOOL CMixer::GetVolume(DWORD dwSrcType, DWORD* pdwLValue, DWORD* pdwRValue, BOOL bMono)
{
 MIXERLINE mxl;
 if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
  return FALSE;

 MIXERCONTROL mxc;
 if (! GetLineControl(&mxc, &mxl, MIXERCONTROL_CONTROLTYPE_VOLUME))
  return FALSE;

 MIXERCONTROLDETAILS mxcd;
 MIXERCONTROLDETAILS_UNSIGNED mxcd_u1;
 MIXERCONTROLDETAILS_UNSIGNED mxcd_u[2];

 mxcd.cbStruct = sizeof(mxcd);
 mxcd.dwControlID = mxc.dwControlID;
 mxcd.cMultipleItems = 0;

 if (bMono)
 {
  mxcd.cChannels = 1;
  mxcd.cbDetails = sizeof(mxcd_u1);
  mxcd.paDetails = &mxcd_u1;

  if (! GetControlDetails(&mxcd, MIXER_GETCONTROLDETAILSF_VALUE))
   return FALSE;

  *pdwLValue = mxcd_u1.dwValue;
 }
 else
 {
  mxcd.cChannels = mxl.cChannels;
  mxcd.cbDetails = sizeof(*mxcd_u);
  mxcd.paDetails = mxcd_u;

  if (! GetControlDetails(&mxcd, MIXER_GETCONTROLDETAILSF_VALUE))
   return FALSE;

  *pdwLValue = mxcd_u[0].dwValue;
  *pdwRValue = mxcd_u[1].dwValue;
 }
 return TRUE;
}


BOOL GetLineInfo(LPMIXERLINE pmxl, DWORD dwDstType, DWORD dwSrcType)
{
 MIXERCAPS mxcaps;
 if (! GetDevCaps(&mxcaps))
  return FALSE;

 UINT u=0;
 do
 {
  pmxl->cbStruct = sizeof(*pmxl);

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!