빌더6 에서 되는지는 모르겠내요,
인터넷에서 찾아서 .. 쓰고 있고요,잘 작동 합니다. (XE2 에서요)
#include <mmsystem.h>
//---------------------------------------------------------------------------
#define AUDFREQ 22050 // Frequency
#define AUDCHANNELS 1 // Number of channels
#define AUDBITSMPL 16 // Number of bits per sample
//---------------------------------------------------------------------------
void change_system_volume(int percent)
{
// Mixer Info
UINT m_uMixerID;
DWORD m_dwMixerHandle=0;
DWORD m_dwLineID;
DWORD m_dwVolumeControlID;
int m_nChannelCount;
DWORD m_dwMinimalVolume;
DWORD m_dwMaximalVolume;
DWORD m_dwVolumeStep;
MMRESULT mmResult;
do{
if(mixerGetNumDevs()==0){
break;
}
// Getting Mixer ID
HWAVEOUT hwaveOut;
MMRESULT mmResult;
WAVEFORMATEX WaveFmt;
// SetDeviceType( &WaveFmt );
// //---------------------------------------------------------------------------
memset( &WaveFmt, 0, sizeof(WAVEFORMATEX) );
WORD nBlockAlign = (AUDCHANNELS*AUDBITSMPL)/8;
DWORD nSamplesPerSec = AUDFREQ;
WaveFmt.wFormatTag = WAVE_FORMAT_PCM;
WaveFmt.nChannels = AUDCHANNELS;
WaveFmt.nBlockAlign = nBlockAlign;
WaveFmt.nSamplesPerSec = nSamplesPerSec;
WaveFmt.wBitsPerSample = AUDBITSMPL;
WaveFmt.nAvgBytesPerSec = nSamplesPerSec*nBlockAlign;
// //---------------------------------------------------------------------------
mmResult = waveOutOpen( &hwaveOut, WAVE_MAPPER, &WaveFmt, 0L, 0L, CALLBACK_NULL );
if( mmResult != MMSYSERR_NOERROR ){
break;
}
mmResult = mixerGetID( (HMIXEROBJ)hwaveOut, &m_uMixerID, MIXER_OBJECTF_HWAVEOUT );
waveOutClose( hwaveOut );
if ( mmResult != MMSYSERR_NOERROR ){
break;
}
MIXERLINE MixerLine;
memset( &MixerLine, 0, sizeof(MIXERLINE) );
MixerLine.cbStruct = sizeof(MIXERLINE);
MixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
mmResult = mixerGetLineInfo( (HMIXEROBJ)m_dwMixerHandle, &MixerLine, MIXER_GETLINEINFOF_COMPONENTTYPE );
if ( mmResult != MMSYSERR_NOERROR ) {
break;
}
MIXERCONTROL Control;
memset( &Control, 0, sizeof(MIXERCONTROL) );
Control.cbStruct = sizeof(MIXERCONTROL);
MIXERLINECONTROLS LineControls;
memset( &LineControls, 0, sizeof(MIXERLINECONTROLS) );
LineControls.cbStruct = sizeof(MIXERLINECONTROLS);
LineControls.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
LineControls.dwLineID = MixerLine.dwLineID;
LineControls.cControls = 1;
LineControls.cbmxctrl = sizeof(MIXERCONTROL);
LineControls.pamxctrl = &Control;
mmResult = mixerGetLineControls( (HMIXEROBJ)m_dwMixerHandle, &LineControls, MIXER_GETLINECONTROLSF_ONEBYTYPE );
if ( mmResult != MMSYSERR_NOERROR ){
break;
}
if ( Control.fdwControl & MIXERCONTROL_CONTROLF_DISABLED ){
break;
}
m_nChannelCount = MixerLine.cChannels;
m_dwLineID = LineControls.dwLineID;
m_dwVolumeControlID = Control.dwControlID;
m_dwMinimalVolume = Control.Bounds.dwMinimum;
m_dwMaximalVolume = Control.Bounds.dwMaximum;
m_dwVolumeStep = Control.Metrics.cSteps;
//---------------------------------------------------------------------------
// set volume
//---------------------------------------------------------------------------
DWORD dwValue=m_dwMaximalVolume*percent/100;
MIXERCONTROLDETAILS_UNSIGNED* aDetails = (MIXERCONTROLDETAILS_UNSIGNED*)malloc(m_nChannelCount*sizeof(MIXERCONTROLDETAILS_UNSIGNED));
if ( !aDetails ){
break;
}
for ( int i = 0; i < m_nChannelCount; i++ ) {
aDetails[i].dwValue = dwValue;
}
MIXERCONTROLDETAILS ControlDetails;
memset( &ControlDetails, 0, sizeof(MIXERCONTROLDETAILS) );
ControlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
ControlDetails.dwControlID = m_dwVolumeControlID;
ControlDetails.cChannels = m_nChannelCount;
ControlDetails.cMultipleItems = 0;
ControlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
ControlDetails.paDetails = &aDetails[0];
mmResult = mixerSetControlDetails( (HMIXEROBJ)m_dwMixerHandle, &ControlDetails, MIXER_SETCONTROLDETAILSF_VALUE );
free( aDetails );
if ( mmResult != MMSYSERR_NOERROR )
{
}
}while(false);
if(m_dwMixerHandle){
mixerClose( (HMIXER)m_dwMixerHandle ) ;
}
}
//---------------------------------------------------------------------------
검은인간 님이 쓰신 글 :
: 제목 그대로 빌더6에서 마스터 볼륨을 바꾸고 싶은 데 어떻게 해야 하나요?
:
:

← 이거요!!