waveOutSetVolume은 마스터 볼륨이 아닌 웨이브의 볼륨을 조정한다.
따라서 웨이브 볼륨이 아닌 다른 장치들의 볼륨은 그대로이다.

웨이브 출력의 볼륨을 조정한다
● 선언
Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long

● 인수

uDeviceID ━ waveform-audio 장치 핸들
dwVolume ━ 하위워드는 왼쪽 체널 볼륨, 상위워드는 오른쪽 채널 볼륨, 각 채널의 볼륨 값은 0에서 &hffff까지이다.

● 반환

성공 ━ MMSYSERR_NOERROR
실패 ━ 에러 원인

소스 이미지이다.


라인과 커맨드 버튼 컨트롤을 이용해서 슬라이더를 만들었다. 슬라이더바를 움직이면 웨이브 출력 장치의 볼륨을 조정한다.

다음은 소스이다.
' 마스터 볼륨이 아니라 웨이브 볼륨을 조정한다.
' 공식은 이렇다. 슬라이더 위치:볼륨값 = 슬라이더 최대 위치:볼륨 최대값
Option Explicit

Private Const MMSYSERR_NOERROR = 0
Private Const MAXVOLUME = &HFFFF&
Private Declare Function waveOutGetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, lpdwVolume As Long) As Long
Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
Private Declare Function waveOutSetVolume Lib "winmm.dll" (ByVal uDeviceID As Long, ByVal dwVolume As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, ByVal Source As Any, ByVal Length As Long)
Private CenterSliderPos As Long '  슬라이더의 중심 위치
Private FirstSliderPos As Long ' 슬라이더 처음 위치
Private LastSliderPos As Long ' 슬라이더 마지막 위치
Private FirstLinePos As Long ' 라인의 처음 위치
Private LastLinePos As Long ' 라인의 마지막 위치
Private MaxSlider As Long ' 슬라이더의 최대값
Private InitSlider As Long ' 슬라이더 처음 위치
Private MaxLine As Long ' 라인의 최대값
Private PrePos As Long

Private Sub cmdSlider_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' 슬라이드 드래그 처리
    If Not Button = vbLeftButton Then Exit Sub
    PrePos = Y
End Sub

Private Sub cmdSlider_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim Pos As Long
    If Not Button = vbLeftButton Then Exit Sub
    Pos = cmdSlider.Top + Y - PrePos
    If Pos < FirstSliderPos Then Pos = FirstSliderPos
    If Pos > LastSliderPos Then Pos = LastSliderPos
    cmdSlider.Top = Pos
    SetVolume (GetSliderVolume)
End Sub

Private Sub Form_Load()
    If Not HasWaveOutDevice Then ' 웨이브 출력 장치 존재 유무 확인
        MsgBox "사운드 카드가 없거나, 웹이브 출력장치가 없는 사운드 카으입니다."
        Unload Me
        Exit Sub
    End If
    CenterSliderPos = cmdSlider.Height / 2
    FirstLinePos = linLimit.Y1
    LastLinePos = linLimit.Y2
    FirstSliderPos = FirstLinePos - CenterSliderPos
    LastSliderPos = LastLinePos - CenterSliderPos

    linLimit.X1 = Me.Width / 2 ' 컨트롤 위치
    linLimit.X2 = linLimit.X1
    cmdSlider.Left = linLimit.X1 - cmdSlider.Width / 2
    cmdSlider.Top = FirstSliderPos
   
    MaxSlider = linLimit.Y2 - linLimit.Y1
    MaxLine = linLimit.Y2 - linLimit.Y1
    InitSlider = cmdSlider.Height / 2 - linLimit.Y1
    SetSliderVolume (GetVolume)
End Sub

Private Function HasWaveOutDevice() As Boolean ' 시스템에 웨이브 출력 장치의 유무 검사
    Dim HowNumDevice As Long ' 웨이브 출력 장치 갯수
    Dim DevCount As Long ' 웨이브 출력 장치 카운트
    Dim UseCount As Long ' 사용할 수 있는 웨이브 출력 장치 카운트
    Dim DummyVolume As Long ' 의미없는 볼륨값
   
    HasWaveOutDevice = False
    HowNumDevice = waveOutGetNumDevs() ' 웨이브 출력 장치 갯수를 얻는다.
    HasWaveOutDevice = HowNumDevice
    If HasWaveOutDevice Then ' 웨이브 출력 장치를 가지고 있다면
        For DevCount = 0 To HowNumDevice - 1
            If MMSYSERR_NOERROR = waveOutGetVolume(DevCount, DummyVolume) Then
                UseCount = UseCount + 1
            End If
        Next DevCount
        HasWaveOutDevice = UseCount
    End If
End Function

Private Function GetVolume() As Long ' 웨이브 출력 장치의 불륨을 얻는다.
    Call waveOutGetVolume(0, GetVolume)
    GetVolume = GetVolume And MAXVOLUME
End Function
Private Sub SetVolume(ByVal Volume As Long) '웨이브 출력 장치의 볼륨을 지정한다.
    CopyMemory VarPtr(Volume) + 2, VarPtr(Volume), 2
    Call waveOutSetVolume(0, Volume)
End Sub

Private Function GetSliderVolume() As Long ' 슬라이더 값을 읽는다. 볼륨 값을 반환
    Dim SliderPos As Long ' 라인에서 슬라이더 위치
   
    SliderPos = cmdSlider.Top + InitSlider
    GetSliderVolume = SliderPos * MAXVOLUME / MaxLine
End Function

Private Sub SetSliderVolume(ByVal Volume As Long) ' 슬라이더 값을 설정한다.
    cmdSlider.Top = (Volume * MaxLine / MAXVOLUME) - InitSlider
End Sub

+ Recent posts