科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件用Mixer API函数调节控制面板的音频设置

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文通过实例代码演示了如何通过Mixer API函数在程序中调节控制面板的音频设备性能的设置。

作者:智慧的鱼 来源:天极网 2007年10月17日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
 3、下面演示一下如何设置Volume设备的静音

  这里提供了两个函数,GetMute用来获取系统设置中是否对某个音频线路进行了静音操作,SetMute是用来对系统的某个音频线路进行静音操作。

BOOL CMixer::SetMute(DWORD dwSrcType, BOOL bValue)
{
 MIXERLINE mxl;
 if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
  return FALSE;

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

 MIXERCONTROLDETAILS mxcd;
 MIXERCONTROLDETAILS_BOOLEAN mxcd_f;

 mxcd.cbStruct = sizeof(mxcd);
 mxcd.dwControlID = mxc.dwControlID;
 mxcd.cChannels = 1;
 mxcd.cMultipleItems = 0;
 mxcd.cbDetails = sizeof(mxcd_f);
 mxcd.paDetails = &mxcd_f;
 
 mxcd_f.fValue = bValue;

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

 return TRUE;
}

BOOL CMixer::GetMute(DWORD dwSrcType, BOOL* pbValue)
{
 MIXERLINE mxl;
 if (! GetLineInfo(&mxl, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, dwSrcType))
  return FALSE;

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

 MIXERCONTROLDETAILS mxcd;
 MIXERCONTROLDETAILS_BOOLEAN mxcd_f;

 mxcd.cbStruct = sizeof(mxcd);
 mxcd.dwControlID = mxc.dwControlID;
 mxcd.cChannels = 1;
 mxcd.cMultipleItems = 0;
 mxcd.cbDetails = sizeof(mxcd_f);
 mxcd.paDetails = &mxcd_f;

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

 *pbValue = mxcd_f.fValue;

 return TRUE;
}

  如果用这两个函数呢,下面我演示了如何设置和获取Volume音频线路的静音操作。

BOOL bValue = TRUE;
SetMute(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, bValue);
GetMute(MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, &bValue);

  4、下面看看当系统的设置改变时,mixer是如何通知我们的吧。

  还记得我前面讲过的,当我们调用mixeropen时可以传递一个窗口的句柄作为回调窗口,当系统的设置改变,比如音量改变,某个音频线路被静音时,mixer都会给我们的回调窗口发送消息的。

  一般只有两个消息,如下

afx_msg void OnMLChange(WPARAM wParam, LPARAM lParam);
afx_msg void OnMCChange(WPARAM wParam, LPARAM lParam);

ON_MESSAGE(MM_MIXM_LINE_CHANGE, OnMLChange)
ON_MESSAGE(MM_MIXM_CONTROL_CHANGE, OnMCChange)

  其中MM_MIXM_CONTROL_CHANGE 消息中,发送消息的两个参数代表的意思如下

wParam = (WPARAM) hMixer
lParam = (LPARAM) dwControlID

  在MM_MIXM_LINE_CHANGE 消息中,发送消息的参数代表的意思如下

wParam = (WPARAM) hMixer
lParam = (LPARAM) dwLineID

  在我们的应用程序中,我们可以在这两个消息处理函数中调整我们的设置,以对应于系统的改变,比如你的代码可以这样写:

void CMixerControlDlg::OnMCChange(WPARAM wParam, LPARAM lParam)
{
 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);
 //你也可以在这里调用GetMute查看Volume是否被静音,
}

  如此你的程序就可以自动的响应系统设置的改变了。

  关于mixer API的应用开发就介绍到这里,记着最后要关闭mixer如此:mixerClose(m_hmx);

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章