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
[7406] Re:사운드 볼륨 조절... [5288] 엄태인님의 질문에 대한 답변입니다.
V6 [] 3010 읽음    2001-05-13 07:50
엄태인 님이 쓰신 글 :
: 볼륨을 조절할려고 하는데요...
: API에 보면 waveOutSetVolume()이라는 함수와 auxSetVolume()이라는 함수가 있긴 있는데..
: 이걸 사용하면 line-in쪽의 볼륨이나 볼륨컨트롤(화면 우측 하단에 스피커 아이콘)에
: wave볼륨만 조절이 되는거 같아요..
: 제가 하고 싶은건 사운드 카드에서 Line-Out이나 스피커 볼륨을 조절할수 있는
: 마스터 볼륨을 제어하고 싶은데...
: 어떻게 해야 하나요...



이 사이트에서 배우는게 많은것 같아 항상 고맙게 생각합니다.

저도 아는게 있으면 많은 사람들과 공유하고 싶은 마음으로 답변을 올립니다.

파일을 올릴려다가 그냥 소스를 올립니다.

폼을 하나 만들고 트랙바, 타이머, 에디트 컴포넌트를 하나씩 넣어주세요.
트랙바의 Max값에 100을 설정해 주시고, Min값은 0으로 두세요.
Max가 100이되면 눈금이 너무 많으니까 Frequency값을 적절히 조절하세요.

반드시 트랙바의 Max를 100로 설정하셔야 합니다.

트랙바를 조절하면 윈도우즈 볼륨콘트롤창의 Main 볼륨이 조절될 수 있게
트랙바의 온체인지 이벤트를 넣어주시면되구요
에디트는 볼륨값을 숫자로 표시해서 보여줄 수 있게 했습니다.

또한 윈도우즈 볼륨콘트롤창의 Main 볼륨을 조절하면 트랙바가 움직일 수 있게
타이머의 온타이머 이벤트를 넣어주시면 되구요.
타이머의 시간을 짧게 주는게 좋겠죠.

그리고 폼이 실행될 때 윈도우즈의 Main 볼륨값을 읽어올 수 있게 넣어주었습니다.

제가 동작하는거 테스트 해보구 올립니다.
만약 안되면 제가 만들어 놓은 파일을 올려 드릴께요.


================================================================================================
//---------------------------------------------------------------------------

#include <vcl.h>
#include <mmsystem.h>  //이걸 넣어주세요.
#pragma hdrstop

#include "MainVolumeControl.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMailVolumeControl *MailVolumeControl;
//---------------------------------------------------------------------------

void SetSpeakerVolume(float fVolPercent)
{
    HMIXER hmx;
    mixerOpen(&hmx, 0, 0, 0, 0);

    MIXERLINE mxl;
    mxl.cbStruct = sizeof(mxl);
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

    DWORD cConnections = mxl.cConnections;
    for(DWORD j=0; j<cConnections; j++){
        mxl.dwSource = j;
        mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_DESTINATION);
        if (MIXERLINE_COMPONENTTYPE_DST_SPEAKERS == mxl.dwComponentType)
            break;
        }

    LPMIXERCONTROL pmxctrl = (LPMIXERCONTROL)malloc(sizeof (MIXERCONTROL));
    MIXERLINECONTROLS mxlctrl = {sizeof mxlctrl, mxl.dwLineID,
    MIXERCONTROL_CONTROLTYPE_VOLUME, 1, sizeof (MIXERCONTROL), pmxctrl};
    if(!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl, MIXER_GETLINECONTROLSF_ONEBYTYPE)){
        DWORD cChannels = mxl.cChannels;
        if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
            cChannels = 1;

        LPMIXERCONTROLDETAILS_UNSIGNED pUnsigned =
            (LPMIXERCONTROLDETAILS_UNSIGNED)
            malloc(cChannels * sizeof (MIXERCONTROLDETAILS_UNSIGNED));

        MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl->dwControlID,
            cChannels, (HWND)0,
            sizeof (MIXERCONTROLDETAILS_UNSIGNED), (LPVOID) pUnsigned};

        mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd,
            MIXER_SETCONTROLDETAILSF_VALUE);

        float fvoldist, fsetvol;
        fvoldist = pmxctrl->Bounds.dwMaximum - pmxctrl->Bounds.dwMinimum;
        fsetvol = fvoldist * (fVolPercent / 100.0);
        DWORD newvol;
        newvol = pmxctrl->Bounds.dwMinimum + (DWORD)fsetvol;
        pUnsigned[0].dwValue = pUnsigned[cChannels - 1].dwValue = newvol;

        mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd,
            MIXER_SETCONTROLDETAILSF_VALUE);

        free(pmxctrl);
        free(pUnsigned);
        }
        else
        free(pmxctrl);

    mixerClose(hmx);
}


float GetSpeakerVolume()
{
    HMIXER hmx;
    mixerOpen(&hmx, 0, 0, 0, 0);

    MIXERLINE mxl;
    mxl.cbStruct = sizeof(mxl);
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
    mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE);

    DWORD cConnections = mxl.cConnections;
    for(DWORD j=0; j<cConnections; j++){
        mxl.dwSource = j;
        mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_DESTINATION);
        if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == mxl.dwComponentType)
            break;
        }

    LPMIXERCONTROL pmxctrl = (LPMIXERCONTROL)malloc(sizeof (MIXERCONTROL));
    MIXERLINECONTROLS mxlctrl = {sizeof mxlctrl, mxl.dwLineID,
    MIXERCONTROL_CONTROLTYPE_VOLUME, 1, sizeof (MIXERCONTROL), pmxctrl};
    if(!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl, MIXER_GETLINECONTROLSF_ONEBYTYPE)){
        DWORD cChannels = mxl.cChannels;
        if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl)
            cChannels = 1;

        LPMIXERCONTROLDETAILS_UNSIGNED pUnsigned =
            (LPMIXERCONTROLDETAILS_UNSIGNED)
            malloc(cChannels * sizeof (MIXERCONTROLDETAILS_UNSIGNED));

        MIXERCONTROLDETAILS mxcd = {sizeof(mxcd), pmxctrl->dwControlID,
            cChannels, (HWND)0,
            sizeof (MIXERCONTROLDETAILS_UNSIGNED), (LPVOID) pUnsigned};

        mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd,MIXER_SETCONTROLDETAILSF_VALUE);


        float fvoldist, fsetvol;
        fvoldist = pmxctrl->Bounds.dwMaximum - pmxctrl->Bounds.dwMinimum;
        long volume = pUnsigned[0].dwValue;
        volume = volume - pmxctrl->Bounds.dwMinimum;
        if(fvoldist<=0) fvoldist = 1;
        float percent = volume*100/fvoldist;

        free(pmxctrl);
        free(pUnsigned);
        return percent;
        }
        else
        free(pmxctrl);

    mixerClose(hmx);
    return 0;
}


void GetMainVol()
{
    float GetSpeakerVolume();
    float f = GetSpeakerVolume();
    int i = f;
    if(i<f) MailVolumeControl->TrackBar1->Position = i + 1;
    else MailVolumeControl->TrackBar1->Position = i;
}

__fastcall TMailVolumeControl::TMailVolumeControl(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TMailVolumeControl::TrackBar1Change(TObject *Sender)
{
    float f  = TrackBar1->Position;
    void SetSpeakerVolume(float fVolPercent);
    SetSpeakerVolume(f);
    Edit1->Text = (AnsiString)f;
}
//---------------------------------------------------------------------------
void __fastcall TMailVolumeControl::Timer1Timer(TObject *Sender)
{
    void GetMainVol();
    GetMainVol();
}
//---------------------------------------------------------------------------
void __fastcall TMailVolumeControl::FormCreate(TObject *Sender)
{
    void GetMainVol();
    GetMainVol();
}
//---------------------------------------------------------------------------

=============================================================================

+ -

관련 글 리스트
7406 Re:사운드 볼륨 조절... [5288] 엄태인님의 질문에 대한 답변입니다. V6 3010 2001/05/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.