C++ Builder下的音量控制

 首先给我的:控制主音量的大小 使用于一般的多媒体

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

#include
#pragma hdrstop
#include "mmsystem.h"
#include "volume.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

#define WVolumeR(V,P)((DWORD)(V) & 0x0000FFFF | ((P)<<24 ))
#define WVolumeL(V,P)((DWORD)(V) &0xFFFF0000  | ((P)<<8 ))
#define RVolume(V) ((DWORD) ((V)>>24) &((V)>>8))
#define WVolume(P) ((DWORD)((P)<<24) | ((P)<<8))

void __fastcall GetVolume(void);

 

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{

}
//---------------------------------------------------------------------------


void __fastcall TForm1::TB_VChange(TObject *Sender)
{
        int pos;
        pos=TB_V->Position;
        waveOutSetVolume(0,WVolume(pos));
        Edit1->Text =String(WVolume(pos));
        GetVolume();

}
//---------------------------------------------------------------------------


void __fastcall TForm1::GetVolume(void)
{
        DWORD  vol;
        waveOutGetVolume(0,&vol);
        TB_V->Position=RVolume(vol);
        Edit1->Text=TB_V->Position   ;//显示音量的大小
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        GetVolume();
}
//---------------------------------------------------------------------------

 

 

 

 

 

下面这个转至:很全面 大家看下。

http://topic.csdn.net/t/20021207/00/1239143.html

 

 

//----------------------------设定音量---------------------------------------

bool   GetVolumeControl(HMIXER   hmixer   ,long   componentType,long   ctrlType,MIXERCONTROL*   mxc)
{
MIXERLINECONTROLS   mxlc;
MIXERLINE   mxl;
mxl.cbStruct   =   sizeof(mxl);
mxl.dwComponentType   =   componentType;
if(!mixerGetLineInfo((HMIXEROBJ)hmixer,   &mxl,   MIXER_GETLINEINFOF_COMPONENTTYPE))
{
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   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   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   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   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   GetVolume(int   dev)//得到设备的音量dev=0主音量,1WAVE   ,2MIDI   ,3   LINE   IN
{

long   device;unsigned   rt=0;
MIXERCONTROL   volCtrl;
HMIXER   hmixer;
    switch   (dev)
      {
        case   1:
                      device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
        case   2:
                        device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
        case   3:
                    //     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))
return   0;
rt=GetVolumeValue(hmixer,&volCtrl)*100/volCtrl.Bounds.lMaximum;
mixerClose(hmixer);
return   rt;

}

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

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

long   device;
bool   rc=false;
MIXERCONTROL   volCtrl;
HMIXER   hmixer;
switch   (dev)
  {
    case   1:
                      device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
    case   2:
                      device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
    case   3:
                      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/100;
    if(SetVolumeValue(hmixer,&volCtrl,vol))
    rc=true;
    }
mixerClose(hmixer);
return   rc;
}

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

bool   WINAPI   SetMute(long   dev,long   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   1:
                    device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
      case   2:
                    device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
      case   3:
                    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   GetMute(long   dev)//检查设备是否静音
{
//dev   =0,1,2     分别表示主音量,波形,MIDI   ,LINE   IN
//   retrun   false   表示没有静音
//   retrun   true     表示静音
long   device;
bool   rc=false;
MIXERCONTROL   volCtrl;
HMIXER   hmixer;
switch   (dev)
{
case   1:
                device=MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT;   break;
case   2:
                device=MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER;   break;
case   3:
                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))
rc=GetMuteValue(hmixer,&volCtrl);
mixerClose(hmixer);
return   rc;

}
使用:
//调节音量
void   __fastcall   TForm1::TrackBar0Change(TObject   *Sender)
{
SetVolume(0,TrackBar0-> Position*10);
}

//静音
void   __fastcall   TForm1::CheckBox0Click(TObject   *Sender)
{
SetMute(0,CheckBox0-> Checked);
}

你可能感兴趣的:(C++ Builder下的音量控制)