C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[70689] Re:빌더에서 윈도우 마스터 볼륨을 바꾸는 법을 알고 싶어요!!
[] 2520 읽음    2014-01-13 22:47
빌더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에서 마스터 볼륨을 바꾸고 싶은 데 어떻게 해야 하나요?

:

: ← 이거요!!

+ -

관련 글 리스트
70685 빌더에서 윈도우 마스터 볼륨을 바꾸는 법을 알고 싶어요!! 검은인간 3029 2014/01/13
70689     Re:빌더에서 윈도우 마스터 볼륨을 바꾸는 법을 알고 싶어요!! 2520 2014/01/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.