65.9K
CodeProject 正在变化。 阅读更多。
Home

一个简单的录制和播放音量控制类

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.64/5 (11投票s)

2001年10月28日

2分钟阅读

viewsIcon

304207

downloadIcon

3687

一个使设置录制和播放音量更简单的类。

引言

有时我们需要控制声卡的音量,而微软提供了一个API waveOutSetVolume() 来实现这一点。不幸的是,这个API只能设置播放音量。当我们想要设置其他线路的音量,例如麦克风或MIDI,或者用于录音的线路输入时,却没有API可以帮助我们!

起初,我以为DirectMedia可能会提供一个接口来做到这一点,它确实提供了,但我在编写和测试代码后,结果并不理想。接口 IAMAudioInputMixer 只能处理录音,而不能处理播放,而且最重要的是

"每个引脚的名称,例如“线路输入”或“麦克风”,反映了输入类型"

但是,在不同的机器上,名称并不相同!

例如
我想设置麦克风的音量,所以我通过名称“麦克风”找到引脚并控制它,这在我的电脑上可以工作。当我尝试在另一台机器上测试时,它失败了,因为引脚的名称是“麦克风音量”!

我尝试了许多方法,最终我找到了使用MIXER的方法。

可能有些人也为同样的问题头疼过,所以我发布了我的解决方案。希望对您有所帮助。

用法

  1. 将 Mixer.h 和 Mixer.cpp 包含到您的项目中;
  2. 添加如下代码
      CMixer mixer(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Record);
    
      ......
      mixer.GetVolume();
      mixer.SetVolume(...);
    

备注

构造函数接受两个参数,第一个是 MIXERLINE 中的 ComponentType(有关所有可能的值,请参阅 MSDN),第二个是一个 enum 类型,可以是 Record 或 Play。以上控制录音(waveIn)音量,您也可以使用

CMixer mixer(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Play);

请注意,没有默认构造函数,不接受任何参数,因此,如果您在 C++ 类中使用它,应该这样编写代码

// MyClass.h
//////////////////////////
class CMixer;
class CMyClass
{
  CMyClass();
private:
  CMixer m_mixer;
....
}

//MyClass.cpp
///////////////////////////
CMyClass::CMyClass():m_mixer(MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE, CMixer::Play)
{
}
....

如果您有任何建议或改进,请告诉我:whoo@isWhoo.com

© . All rights reserved.