控制声卡声音音量

1、头文件(Mixer.h)

// Mixer.h: interface for the CMixer class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_MIXER_H__7369BAA5_012E_467E_AD1E_A383E4474C58__INCLUDED_)
#define AFX_MIXER_H__7369BAA5_012E_467E_AD1E_A383E4474C58__INCLUDED_
#define WIN32_LEAN_AND_MEAN   // Exclude rarely-used stuff from Windows headers

#include "windows.h"
#include <mmsystem.h>

#pragma comment (lib, "winmm.lib")
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CMixer 
{
public:
CMixer();
CMixer(const int VolRange);
virtual ~CMixer();
enum MixerDeice{
SPEAKERS=0,
WAVEOUT,
SYNTHESIZER,
MICROPHONE
};

bool GetMute(MixerDeice dev);   //检查设备是否静音
bool SetMute(MixerDeice dev,bool vol);     //设置设备静音
bool SetVolume(MixerDeice dev,long vol);   //设置设备的音量
unsigned GetVolume(MixerDeice dev);    //得到设备的音量dev=0主音量,1WAVE ,2MIDI ,3 LINE IN

private:
bool GetVolumeControl(HMIXER hmixer ,long componentType,long ctrlType,MIXERCONTROL* mxc);
bool SetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc, long volume);
bool SetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc, bool mute);
unsigned GetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc);
long GetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc);


long m_VolRange ;
};

#endif // !defined(AFX_MIXER_H__7369BAA5_012E_467E_AD1E_A383E4474C58__INCLUDED_)

2、cpp文件(Mixer.cpp)
// Mixer.cpp: implementation of the CMixer class.
//
//#include "stdwx.h"
#include "Mixer.h"

 

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMixer::CMixer()
{
m_VolRange = 100;
}

CMixer::~CMixer()
{

}

CMixer::CMixer(const int VolRange)
{
m_VolRange = VolRange;
}
//----------------------------设定音量---------------------------------------

bool CMixer::GetVolumeControl(HMIXER hmixer ,long componentType,long ctrlType,MIXERCONTROL* mxc)
{
MIXERLINECONTROLS mxlc;
MIXERLINE mxl;
bool exist = false;
mxl.cbStruct = sizeof(mxl);
mxl.dwComponentType = componentType;

if (componentType == MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE)
{//获取录音麦克风设备
   mxl.dwComponentType   =   MIXERLINE_COMPONENTTYPE_DST_WAVEIN;   
   //   得到录制总线中的连接数   
   mixerGetLineInfo(   (HMIXEROBJ)hmixer,   &mxl,   
    MIXER_OBJECTF_HMIXER   |   MIXER_GETLINEINFOF_COMPONENTTYPE   );   
   //   将连接数保存   
   DWORD   dwConnections   =   mxl.cConnections;   
   //   准备获取麦克风设备的ID   
   DWORD   dwLineID   =   0;   
   for   (   DWORD   i   =   0;   i   <   dwConnections;   i++   )   
   {   
    //   枚举每一个设备,当Source的ID等于当前的迭代记数   
    mxl.dwSource   =   i;   
    //   根据SourceID获得连接的信息   
    MMRESULT mr   =   mixerGetLineInfo(   (HMIXEROBJ)hmixer,   &mxl,   
     MIXER_OBJECTF_HMIXER   |   MIXER_GETLINEINFOF_SOURCE   );   
    //   判断函数执行错误   
    if   (   mr   !=   0   )   
    {   
     break;   
    }   
    //   如果当前设备类型是麦克风,则跳出循环。   
    if   (   mxl.dwComponentType   ==   
     MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE   )   
    {   
     exist = true;
     break;   
    }   
   } 
}else if(!mixerGetLineInfo((HMIXEROBJ)hmixer, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE))
{
   exist = true;
}

if (exist)
{
   mxlc.cbStruct = sizeof(mxlc);
   mxlc.dwLineID = mxl.dwLineID;
   mxlc.dwControlType = ctrlType;
   mxlc.cControls = 1;
   mxlc.cbmxctrl = sizeof(MIXERCONTROL);
   mxlc.pamxctrl = mxc;
   if(mixerGetLineControls((HMIXEROBJ)hmixer,&mxlc,MIXER_GETLINECONTROLSF_ONEBYTYPE))
    return 0;
   else
    return 1;
}
return 0;
}
//---------------------------------------------------------------------------
long CMixer::GetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_BOOLEAN mxcdMute;
mxcd.hwndOwner = 0;
mxcd.cbStruct = sizeof(mxcd);
mxcd.dwControlID = mxc->dwControlID;
mxcd.cbDetails = sizeof(mxcdMute);
mxcd.paDetails = &mxcdMute;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
if (mixerGetControlDetails((HMIXEROBJ)hmixer, &mxcd,MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE))
   return -1;
return mxcdMute.fValue;
}

//---------------------------------------------------------------------------
unsigned CMixer::GetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol; 
vol.dwValue=0;
mxcd.hwndOwner = 0;
mxcd.cbStruct = sizeof(mxcd);
mxcd.dwControlID = mxc->dwControlID;
mxcd.cbDetails = sizeof(vol);
mxcd.paDetails = &vol;
mxcd.cChannels = 1;
if(mixerGetControlDetails((HMIXEROBJ)hmixer, &mxcd, MIXER_OBJECTF_HMIXER|MIXER_GETCONTROLDETAILSF_VALUE))
   return -1;
return vol.dwValue;
}

//---------------------------------------------------------------------------
bool CMixer::SetMuteValue(HMIXER hmixer ,MIXERCONTROL *mxc, bool mute)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_BOOLEAN mxcdMute;
mxcdMute.fValue=mute;
mxcd.hwndOwner = 0;
mxcd.dwControlID = mxc->dwControlID;
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(mxcdMute);
mxcd.paDetails = &mxcdMute;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
if (mixerSetControlDetails((HMIXEROBJ)hmixer, &mxcd, MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
   return 0;
return 1;
}

//---------------------------------------------------------------------------

bool CMixer::SetVolumeValue(HMIXER hmixer ,MIXERCONTROL *mxc, long volume)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED vol;
vol.dwValue = volume;
mxcd.hwndOwner = 0;
mxcd.dwControlID = mxc->dwControlID;
mxcd.cbStruct = sizeof(mxcd);
mxcd.cbDetails = sizeof(vol);
mxcd.paDetails = &vol;
mxcd.cChannels = 1;
if(mixerSetControlDetails((HMIXEROBJ)hmixer, &mxcd, MIXER_OBJECTF_HMIXER|MIXER_SETCONTROLDETAILSF_VALUE))
   return 0;
return 1;
}


//---------------------------------------------------------------------------
unsigned /*WINAPI */CMixer::GetVolume(MixerDeice dev)//得到设备的音量dev=0主音量,1WAVE ,2MIDI ,3 LINE IN
{

long device;
unsigned rt=0;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
    case WAVEOUT:
   device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
    case SYNTHESIZER:
   device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
    case MICROPHONE:
   // device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break; // cd 音量
    device=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; break;   //麦克风音量
   // device=MIXERLINE_COMPONENTTYPE_SRC_LINE; break;         //PC 扬声器音量
   //device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break;
  
    default:
   device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}

if(mixerOpen(&hmixer, 0, 0, 0, 0)) return 0;
if(!GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
   {

mixerClose(hmixer);

return 0;

}
rt=GetVolumeValue(hmixer,&volCtrl)*m_VolRange /volCtrl.Bounds.lMaximum;
mixerClose(hmixer);
return rt;

}

//---------------------------------------------------------------------------

bool /*WINAPI*/ CMixer::SetVolume(MixerDeice dev,long vol)//设置设备的音量
{
// dev =0,1,2   分别表示主音量,波形,MIDI ,LINE IN
// vol=0-m_VolRange      表示音量的大小 , 设置与返回音量的值用的是百分比,即音量从0 - m_VolRange ,而不是设备的绝对值
// retrun false 表示设置音量的大小的操作不成功
// retrun true 表示设置音量的大小的操作成功

long device;
bool rc=false;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
case WAVEOUT:
   device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
case SYNTHESIZER:
   device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
case MICROPHONE:
  
   // device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break; // cd 音量
   device=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; break;   //麦克风音量
   // device=MIXERLINE_COMPONENTTYPE_SRC_LINE; break;         //PC 扬声器音量
   //device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break;
default:
   device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}

if(mixerOpen(&hmixer, 0, 0, 0, 0)) return 0;

if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_VOLUME,&volCtrl))
{
   vol=vol*volCtrl.Bounds.lMaximum/m_VolRange ;
   if(SetVolumeValue(hmixer,&volCtrl,vol))
    rc=true;
}
mixerClose(hmixer);
return rc;
}

//---------------------------------------------------------------------------

bool /*WINAPI*/ CMixer::SetMute(MixerDeice dev,/*long*/bool vol)//设置设备静音
{
// dev =0,1,2   分别表示主音量,波形,MIDI ,LINE IN
// vol=0,1      分别表示取消静音,设置静音
// retrun false 表示取消或设置静音操作不成功
// retrun true 表示取消或设置静音操作成功

long device;
bool rc=false;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
case WAVEOUT:
   device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
case SYNTHESIZER:
   device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
case MICROPHONE:
   // device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break; // cd 音量
   device=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; break;   //麦克风音量
   // device=MIXERLINE_COMPONENTTYPE_SRC_LINE; break;         //PC 扬声器音量
   //device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break;
  
default:
   device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}

if(mixerOpen(&hmixer, 0, 0, 0, 0)) return 0;
if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&volCtrl))
   if(SetMuteValue(hmixer,&volCtrl,(bool)vol))
    rc=true;
   mixerClose(hmixer);
   return rc;
}

//---------------------------------------------------------------------------

bool /*WINAPI */CMixer::GetMute(MixerDeice dev)//检查设备是否静音
{
//dev =0,1,2 分别表示主音量,波形,MIDI ,LINE IN
// retrun false 表示没有静音
// retrun true 表示静音
long device;
bool rc=false;
MIXERCONTROL volCtrl;
HMIXER hmixer;
switch (dev)
{
case WAVEOUT:
        device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT; break;
case SYNTHESIZER:
        device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER; break;
case MICROPHONE:  
   // device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break; // cd 音量
   //device=MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE; break;   //麦克风音量
   // device=MIXERLINE_COMPONENTTYPE_SRC_LINE; break;         //PC 扬声器音量
   //device=MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC; break;
   device=MIXERLINE_COMPONENTTYPE_DST_WAVEIN; break;
default:
        device=MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
}

if(mixerOpen(&hmixer, 0, 0, 0, 0)) return 0;

if(GetVolumeControl(hmixer,device,MIXERCONTROL_CONTROLTYPE_MUTE,&volCtrl))
   rc=GetMuteValue(hmixer,&volCtrl);
mixerClose(hmixer);
return rc;

}

 

 

 

  winmm - winmm.dll - DLL文件信息 
  DLL 文件: winmm 或者 winmm.dll
  DLL 名称: Windows Multimedia API
  描述: 
  winmm.dll是Windows多媒体相关应用程序接口,用于低档的音频和游戏手柄。
  函数汇总:
  auxGetDevCaps 查询指定的辅助输出设备以确定其性能
  auxGetNumDevs 检取系统中存在的辅助输出设备的数量
  auxGetVolume 返回指定的辅助输出设备的当前卷设备
  auxOutMessage 向指定的辅助输出设备发送一条消息
  auxSetVolume 在指定的辅助输出设备中设置卷
  CloseDirver 关闭指定的可安装驱动器
  DefDriverProc 为任何不由可安装驱动器处理的消息提供的缺省处理
  Drivercallback 调用一个回调函数,发送一条消息给窗口或将一个线程的阻塞解除
  DrvGetModuleHandle 返回包含指定可安装驱动器模块的实例句柄
  DrvsendMessage 把指定的消息发送给可安装驱动器
  GetDriverModuleHandle 返回包含指定可安装驱动器模块的实例句柄
  joyGetDevCaps 查询指定的游戏杆设备以确定其性能
  joyGetNumDevs 返回系统支持的游戏杆设备的数量
  joyGetPos 查询指定的游戏杆设备的位置和活动性
  joyGetPosEx 查询一个游戏杆设备的位置和它的按扭状态
  joyGetThreshold 查询指定的游戏杆设备的当前移动阈值
  joyReleaseCapture 释放由JoySetCapture函数设置的在指定游戏杆设备上的捕获
  joySetCapture 发送一个游戏杆消息到指定的窗口
  joySetThreshold 设置指定的游戏杆设备的移动阈值
  mciGetCreatorTask 为指定的MCI设备检取其创建的任务
  mciGetDeviceID 返回和打开设备名相匹配的设备标识符
  mciGetErrorString 检取描述指定媒介控制接口错误代码的字符串
  mciGetYieldProc 返回和媒介控制接口的WAIT标志相关的回调函数的地址
  mciSendCommand 向指定的媒介控制接口设备发送一条命令
  mciSendString 向指定的媒介控制接口设备发送一个字符串
  mciSetYieldProc 设置一个过程地址,在MCI设备因指定了WAIT标志而等待一个命令完成时,该过程被周期性调用
  midiConnect 将指定的MIDI输入设备连接到输出设备
  midiDisconnect 断开MIDI输入设备和输出设备的连接
  midiInAddBuffer 向指定的音乐仪器数字接口的输入设备增加一个缓冲区
  midiInClose 关闭指定的音乐仪器数字接口的输入设备
  midiInGetDveCaps 查询指定的音乐仪器数字接口的输入设备,以确定其性能
  midiInGetErrorText 检取有关音乐仪器数字接口的输入设备指定错误的文本说明
  midiInGetID 获得一个音乐一起数字接口的输入设备的标识符
  midiInGetNumDevs 检取系统中音乐仪器数字接口的输入设备的数量
  midiInMessage 向指定的音乐仪器数字接口的输入设备驱动器发送一条消息
  midiInOpen 打开指定的音乐仪器数字接口的输入设备
  midiInPrepareHeader 为音乐仪器数字接口的输入设备准备一个缓冲区
  midiInReset 在给定的MIDI输入设备上输入,并将所有挂起的输入缓冲区标记为已执行的
  midiInStart 启动在指定的音乐仪器数字接口的输入设备上的输入
  midiInStop 停止在给定的音乐仪器数字接口的输入设备上的输入
  midiInUnprepareHeader 消除由midiInPrepareHeader函数完成的准备
  midiOutCacheDrumPatches 请求内部的一个MIDI合成设备预装指定的基于键的击打音色集
  midiOutCachePatches 请求内部的音乐仪器数字接口的合成设备预装指定的音色集
  midiOutClose 关闭指定的音乐仪器数字接口的输出设备
  midiOutGetDevCaps 查询指定的音乐仪器数字接口的输出设备,以确定其性能
  midiOutGetErrorText 检取有关MIDI输出设备指定采取的文本说明
  midiOutGetID 检取指定的MIDI输出设备的标识符
  midiOutGetNumDevs 检取系统中存在的MIDI输出设备的数量
  midiOutGetVolume 返回一个MIDI输出设备的当前卷设置
  midiOutLongMsg 向指定的MIDI输出设备发送一条系统专用的MIDI消息
  midiOutMessage 向一MIDI输出设备驱动器发送一条消息
  midiOutOpen 打开指定的MIDI输出设备进行回放
  midiOutPrepareHeader 为MIDI输出设备准备一个缓冲区
  midiOutReset 为指定的MIDI输出设备关闭所有MIDI通道上的所有标志
  midiOutSetVolume 设置一个MIDI输出设备的卷
  midiOutShortMsg 向指定的MIDI输出设备发送一条短MIDI消息
  midiOutUnprepareHeader 清除由midiOutPrepareHeader函数完成的准备
  midiStreamClose 关闭一个打开的MIDI流
  midiStreamOpen 为输出,打开一个MIDI流
  midiStreamOut 在MIDI输出设备上播放或排队一个MIDI数据流
  midiStreamPause 暂停一个MIDI流的播放
  midiStreamPosition 在一个MIDI流中检取当前位置
  midiStreamProperty 设置或检取与MIDI输出设备相关MIDI数据流的特性
  midiStreamRestart 重新启动一个暂停的MIDI流
  midiStreamStop 关掉指定MIDI输出设备的所有MIDI通道
  mixerClose 关闭指定的混频器
  mixerGetControlDetails 检取和一个声频指线路相关的单一控件的细节
  mixerGetDevCaps 查询指定的混频器以确定其性能
  mixerGetID 获取指定混频器的标识符
  mixerGetLineContrils 检取和一个声频线路相关的一个或多个控件
  mixerGetLineInfo 检取混频器有关特有线路的信息
  mixerGetNumDevs 返回系统中存在的混频器的数量
  mixerMessage 把一个定制混频器驱动器消息直接发送给混频器驱动器
  mixerOpen 打开指定的混频器,在应用程序关闭该句柄前保证该设备不被移走
  mixerSetControlDetails 设置和一个声频指线路相关的单一控件的细节
  mmioAsvance 填充一个文件的IO缓冲区
  mmioAscend 取出一个RIFF文件块
  mmioClose 关闭有mmioOpen打开的文件
  mmioCreateChunk 创建由mmioOpen函数打开的RIFF文件中的一个块
  mmioDescend 进入由mmioOpen函数打开的RIFF文件的块中,并查找一个块
  mmioFlush 把文件缓冲区的数据写入磁盘中
  mmioGetInfo 检取有关由mmioOpen函数创建的RIFF文件的信息
  mmioInstallIOProcA 装入或删除一个自定义的IO过程
  mmioOpen 为输入输出打开一个文件
  mmioRead 从由mmioOpen函数打开的文件中读取指定字节数的数据
  mmioRename 重新命名指定的文件
  mmioSeek 改变由mmioOpen函数打开的文件中的当前指针位置
  mmioSendMessage 向与指定文件相联系的IO过程发送一条消息
  mmioSetBuffer 允许或禁止文件缓冲区的IO,或改变这个缓冲区,或改变这个缓冲区的大小
  mmioSetInfo 更新从被打开文件中检取的信息
  mmioStringToFOURCC 把一个以NULL结束的字符串转换成一个4字符代码
  mmioWrite 向由mmioOpen函数打开的文件中写入指定字节数的数据
  mmsystemGetVersion 返回多媒体扩展系统软件的当前版本号
  OpenDriver 打开一个可安装驱动器实例,并用缺省设置或指定值初始化该实例
  PlaySound 播放一个波形声音
  SendDriveMessage 向指定的可安装驱动器发送一条消息
  SndPlaySound 播放一个由文件名或由登记的[sound]段的入口指定的波形声音
  timeBeginPeriod 设置应用程序或驱动程序使用的最小定时器分辨率
  timeEndPeriod 清除应用程序或驱动程序使用的最小定时器分辨率
  timeGetDevCaps 查询定时器设备以确定其性能
  timeGetSystemTime 检取从WINDOWS开始已逝去的毫秒数
  timeGetTime 检取从WINDOWS开始已逝去的毫秒数,此函数比上一条函数开销小
  timeKillEvent 毁掉指定的定时器回调事件
  timeSetEvent 设置一个定时器回调事件
  waveInAddBuffer 向波形输入设备添加一个输入缓冲区
  WaveInClose 关闭指定的波形输入设置
  waveInGetDevCaps 查询指定的波形输入设备以确定其性能
  waveInGetErrorText 检取由指定的错误代码标识的文本说明
  waveInGetID 获取指定的波形输入设备的标识符
  waveInGetNumDevs 返回系统中存在的波形输入设备的数量
  waveInGetPosition 检取指定波形输入设备的当前位置
  waveInMessage 发送一条消息给波形输入设备的驱动器
  waveInOpen 为录音而打开一个波形输入设备
  waveInPrepareHeader 为波形输入准备一个输入缓冲区
  waveInReset 停止给定的波形输入设备的输入,且将当前位置清零
  waveInStart 启动在指定的波形输入设备的输入
  waveInStop 停止在指定的波形输入设备上的输入
  waveInUnprepareHeader 清除由waveInPrepareHeader函数实现的准备
  waveOutBreakLoop 中断给定的波形输出设备上一个循环,并允许播放驱动器列表中的下一个块
  waveOutClose 关闭指定的波形输出设备
  waveOutGetDevCaps 查询一个指定的波形输出设备以确定其性能
  waveOutGetErrorText 检取由指定的错误代码标识的文本说明
  waveOutGetID 检取指定的波形输出设备的标识符
  waveOutGetNumDevs 检取系统中存在的波形输出设备的数量
  waveOutGetPitch 查询一个波形输出设备的当前音调设置
  waveOutGetPlaybackRate 查询一个波形输出设备当前播放的速度
  waveOutGetPosition 检取指定波形输出设备的当前播放位置
  waveOutGetVolume 查询指定波形输出设备的当前音量设置
  waveOutMessage 发送一条消息给一个波形输出设备的驱动器
  waveOutOpen 为播放打开一个波形输出设备
  waveOutPause 暂停指定波形输出设备上的播放
  waveOutPrepareHeader 为播放准备一个波形缓冲区
  waveOutRestart 重新启动一个被暂停的波形输出设备
  waveOutSetPitch 设置一个波形输出设备的音调
  waveOutSetPlaybackRate 设置指定波形输出设备的速度
  waveOutSetVolume 设置指定的波形输出设备的音量
  waveOutUnprepareHeader 清除由waveOutPrepareHeader函数实现的准备
  waveOutWrite 向指定的波形输出设备发送一个数据块

你可能感兴趣的:(控制声卡声音音量)