프로그래밍 팁

사운드 볼륨 컨트롤

바보 악마 2009. 3. 21. 22:04

출처 - http://cafe.daum.net/itbankcafe/Gpr4/19?docid=oTPO|Gpr4|19|20070425121130&q=mixerGetControlDetails&srchid=CCBoTPO|Gpr4|19|20070425121130


스피커 마스터 볼륨 제어를 위한 mixerSetControlDetails API


<원본 출처: 코드 프로젝트, mixerSetControlDetails, by David Crow>


편역: 오상문 sualchi@daum.net


환경: Visual C++ 6.0


다운로드 데모 :

http://www.codeproject.com/audio/mixerSetControlDetails/VolumeDemo.zip



스피커 마스터 볼륨 설정을 위한 mixerSetControlDetails API 사용법을 살펴보자.



- 볼륨 설정하기


MMRESULT result;

result = waveOutSetVolume(0, 0x48444844);


코드는 매우 간단하지만, 이렇게 간편한 사운드 작업만이 언제나 최상의 방법은 아니다.

이것은 스피커 볼륨을 다루지만, 웨이브 형태의 오디오 출력에 한정된다.

우리가 원하는 것은 출력 장치와 관계없이 마스터 볼륨을 설정하는 능력이다.


그러기 위한 첫 번째 작업은 믹서 장치에 대한 핸들을 얻는 것이다.


MMRESULT result;

HMIXER hMixer;

result = mixerOpen(&hMixer, MIXER_OBJECTF_MIXER, 0, 0, 0);


다음에는 믹서 장치의 스피커 라인을 구해야 한다.


MIXERLINE ml = {0};

ml.cbStruct = sizeof(MIXERLINE);

ml.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;

result = mixerGetLineInfo((HMIXEROBJ) hMixer,

         &ml, MIXER_GETLINEINFOF_COMPONENTTYPE);


그 다음에는 스피커 라인의 볼륨 컨트롤을 구해야 한다.


MIXERLINECONTROLS mlc = {0};

MIXERCONTROL mc = {0};

mlc.cbStruct = sizeof(MIXERLINECONTROLS);

mlc.dwLineID = ml.dwLineID;

mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;

mlc.cControls = 1;

mlc.pamxctrl = &mc;

mlc.cbmxctrl = sizeof(MIXERCONTROL);

result = mixerGetLineControls((HMIXEROBJ) hMixer,

           &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);


이제 모든 것을 확인했으며 볼륨 수준을 실제로 설정하는 것만 남았다.


MIXERCONTROLDETAILS mcd = {0};

MIXERCONTROLDETAILS_UNSIGNED mcdu = {0};

mcdu.dwValue = 18500;        // 볼륨 크기는 0에서 65535 사이 값

mcd.cbStruct = sizeof(MIXERCONTROLDETAILS);

mcd.hwndOwner = 0;

mcd.dwControlID = mc.dwControlID;

mcd.paDetails = &mcdu;

mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);

mcd.cChannels = 1;

result = mixerSetControlDetails((HMIXEROBJ) hMixer,

               &mcd, MIXER_SETCONTROLDETAILSF_VALUE);


이것이 원하던 것이다.

만약 스피커를 잠재우고(mute 기능) 싶으면 단순히 볼륨 값을 0으로 설정하면 된다.

만약 스피커의 신축성 테스하고 싶으면 65535 값으로 설정한다.


스피커의 현재 볼륨을 얻는 것은 크게 다를 게 없다. 단순히 mixerGetControlDetails()

함수를 호출하되 MIXERCONTROLDETAILS_UNSIGNED 구조체의 dwValue 멤버에 대한

값으로 할당하지 마라. 그것은 성공적이라면 mixerGetControlDetails()에서 현재 스피커

볼륨을 얻게 될 것이다.



한가지 더!

mcdu.dwValue = 0으로 마스터 스피커를 끌 수 있지만 다른 방법이 있다.

컨트롤 타입을 MIXERCONTROL_CONTROLTYPE_VOLUME대신에

MIXERCONTROL_CONTROLTYPE_MUTE를 사용하자.

그리고 MIXERCONTROLDETAILS_UNSIGNED대신에

MIXERCONTROLDETAILS_BOOLEAN 구조체를 사용한다.

fValue 멤버의 값이 1이면 조용해지고 0이면 켜진다. 코드는 다음과 같다.


mlc.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;

result = mixerGetLineControls((HMIXEROBJ) hMixer,

               &mlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);


MIXERCONTROLDETAILS_BOOLEAN mcb = {0};

mcb.fValue    = true;  // mute : 1 = true

mcd.paDetails = &mcb;

mcd.cbDetails = sizeof(MIXERCONTROLDETAILS_BOOLEAN);

result = mixerSetControlDetails((HMIXEROBJ) hMixer,

             &mcd, MIXER_SETCONTROLDETAILSF_VALUE);


- 참고

이 코드는 모든 오디오 조합에서 테스트한 것은 아니다.

해당 API 사용법으로 참고하라.

'프로그래밍 팁' 카테고리의 다른 글

c# ftp 파일&디렉토리 리스트 얻기  (0) 2009.03.24
c# 스트링, 유니코드를 바이트로 변환  (0) 2009.03.24
D3DXCreateTexture & D3DXLoadSurfaceFromFile  (0) 2009.03.17
EvictManagedResources  (0) 2009.03.16
softwareverify  (0) 2009.03.10