따라서 웨이브 볼륨이 아닌 다른 장치들의 볼륨은 그대로이다.
웨이브 출력의 볼륨을 조정한다
● 선언
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
'API' 카테고리의 다른 글
LoadCursorFromFile을 사용한 에니메이션 커서 파일(*.ani) 사용하기 (0) | 2011.09.26 |
---|---|
MakeSureDirectoryPathExists를 사용한 경로에 포함된 모든 디렉토리 생성 (0) | 2011.09.25 |
waveOutGetNumDevs를 사용한 사운드 카드수 얻기 (0) | 2011.09.24 |
어떤 윈도우의 키 보내기(윈도우 메세지 사용) (0) | 2011.09.24 |
GetVolumeInformation를 사용한 하드 드라이브 정보 얻기 (0) | 2011.09.23 |