📄 bassound.bas
字号:
Attribute VB_Name = "basSound"
Option Explicit
Private Const SND_ALIAS = &H10000
Private Const SND_ASYNC = &H1
Private Const SND_FILENAME = &H20000
Private Const SND_LOOP = &H8
Private Const SND_NODEFAULT = &H2
Private Const SND_NOSTOP = &H10
Private Const SND_NOWAIT = &H2000
Private Const SND_SYNC = &H0
Private Declare Function PlaySound Lib "winmm.dll" Alias _
"PlaySoundA" (ByVal lpszName As String, _
ByVal hModule As Long, ByVal dwFlags As Long) As Long
Private Declare Function waveOutGetNumDevs Lib "winmm" () As Long
Private Declare Function midiOutGetNumDevs Lib "winmm" () As Integer
Private Declare Function midiOutGetVolume Lib "winmm.dll" _
(ByVal uDeviceID As Long, lpdwVolume As Long) As Long
Private Declare Function waveOutGetVolume Lib "winmm.dll" _
(ByVal uDeviceID As Long, lpdwVolume As Long) As Long
Public Declare Function midiOutSetVolume Lib "winmm.dll" _
(ByVal uDeviceID As Long, lpdwVolume As Long) As Long
Public Declare Function waveOutSetVolume Lib "winmm.dll" _
(ByVal uDeviceID As Long, lpdwVolume As Long) As Long
Private Declare Function mciSendString Lib "winmm.dll" Alias _
"mciSendStringA" (ByVal lpstrCommand As String, _
ByVal lpstrReturnString As String, ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) As Long
Private Const MMSYSERR_NOERROR = 0
Public Const AUDIO_NONE = 0
Public Const AUDIO_WAVE = 1
Public Const AUDIO_MIDI = 2
'
' Returns 1 if wave output
' Returns 2 if midi output
' Returns 3 if both
'
Public Function CanPlaySound() As Integer
Dim i As Integer
i = AUDIO_NONE
If waveOutGetNumDevs > 0 Then
i = AUDIO_WAVE
End If
If midiOutGetNumDevs > 0 Then
i = i + AUDIO_MIDI
End If
CanPlaySound = i
End Function
'
' Bug: Does not work correctly
Public Function GetVolume(Optional rt As Variant, Optional lt As Variant, Optional audiotype As Variant) As Integer
Dim i As Long
Dim k As Integer
rt = 0
lt = 0
k = 0
If IsMissing(audiotype) Then
audiotype = AUDIO_MIDI + AUDIO_WAVE
End If
If (audiotype And AUDIO_MIDI) = AUDIO_MIDI Then
midiOutGetVolume 0, i
rt = ((i And &HFFFF0000) \ &HFFFF&) And &HFFFF&
lt = i And &HFFFF&
k = 1
End If
If (audiotype And AUDIO_WAVE) = AUDIO_WAVE Then
waveOutGetVolume 0, i
rt = rt + ((i And &HFFFF0000) / &H10000) And &HFFFF&
lt = lt + (i And &HFFFF&)
k = k + 1
End If
If k = 0 Then
GetVolume = 0
Else
GetVolume = (rt + lt) / (k * 2)
rt = rt / k
lt = lt / k
End If
End Function
'
'
' Bug: Does not work correctly
Public Sub SetVolume(ByVal rt As Integer, ByVal lt As Integer, Optional audiotype As Variant)
If IsMissing(audiotype) Then
audiotype = AUDIO_MIDI + AUDIO_WAVE
End If
If (audiotype And AUDIO_MIDI) = AUDIO_MIDI Then
midiOutSetVolume 0, (rt * &HFFFF&) + lt
End If
If (audiotype And AUDIO_WAVE) = AUDIO_WAVE Then
waveOutSetVolume 0, (rt * &HFFFF&) + lt
End If
End Sub
'
' Typical system sounds constant across all windows platforms
'
' SystemQuestion
' SystemStart
' SystemAsterisk
' SystemExclamation
' SystemExit
' SystemHand
'
' Returns true if success, false if failed.
' async assumes true
' loop assumes false
Public Function SoundPlay(filename As String, Optional async As Variant, Optional sLoop As Variant) As Boolean
Dim i As Integer
Dim f As String
Dim j As Long
i = Len(filename)
f = UCase(filename)
If IsMissing(async) Then
j = SND_ASYNC
Else
If async Then
j = SND_ASYNC
Else
j = SND_SYNC
End If
End If
If Not IsMissing(sLoop) Then
If sLoop And (j = SND_ASYNC) Then
j = j + SND_LOOP
End If
End If
j = j + SND_NOSTOP + SND_NOWAIT
If InStr(f, ".WAV") = i - 3 Then
If CanPlaySound And AUDIO_WAVE = AUDIO_WAVE Then
j = j + SND_FILENAME + SND_NODEFAULT
i = PlaySound(filename, 0, j)
SoundPlay = IIf(i = 0, False, True)
Else
Beep
SoundPlay = True
End If
'Assume media player for other file names .MID .RMI etc..
ElseIf InStr(f, ".") = i - 3 Then
If CanPlaySound And AUDIO_MIDI = AUDIO_MIDI Then
i = mciSendString("open " & filename & " type sequencer alias filename", 0&, 0, 0)
'Note the true/false order is supposed to be opposite of the others.
SoundPlay = IIf(i = 0, True, False)
If (j And SND_ASYNC) = SND_ASYNC Then
If (j And SND_LOOP) = SND_LOOP Then
'Bug: repeat doesn't work.
mciSendString "play filename repeat", 0&, 0, 0
Else
mciSendString "play filename", 0&, 0, 0
End If
Else
mciSendString "play filename wait", 0&, 0, 0
mciSendString "close filename", 0&, 0, 0
End If
Else
Beep
SoundPlay = True
End If
Else
j = j + SND_ALIAS
i = PlaySound(filename, 0, j)
SoundPlay = IIf(i = 0, False, True)
End If
End Function
Public Function SoundStop(Optional audiotype As Variant)
If IsMissing(audiotype) Then
mciSendString "close filename", 0&, 0, 0
SoundPlay vbNullString, 0, 0
Else
If (audiotype And AUDIO_MIDI) = AUDIO_MIDI Then
mciSendString "close filename", 0&, 0, 0
End If
If (audiotype And AUDIO_WAVE) = AUDIO_WAVE Then
SoundPlay vbNullString, 0, 0
End If
End If
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -