http://blog.csdn.net/lqg1999/article/details/4006047
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 向指定的波形输出设备发送一个数据块