主题:WAV/MID媒体文件播放类
' 名称:clsMedia
' 类型:系统服务类
' 功能:对游戏系统提供声音文件的播放控制功能
' 版权:自由电子软件开发社—TCG设计组
' 作者:猪头王子
' 日期:2003-01-22
'<类内部封装的API函数>
'游戏音效(WAV文件)播放系统函数定义
Private Declare Function sndPlaySound _
Lib "winmm.dll" Alias "sndPlaySoundA" ( _
ByVal lpszSoundName As String, _
ByVal uFlags As Long _
) As Long
'游戏音乐(MID文件)播放系统函数定义
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
'<API函数参数常量声明段>
'WAV文件播放参数常量枚举
Public Enum tpsPlayFlag
SND_SYNC = &H0 '同步播放声音文件
SND_ASYNC = &H1 '异步播放声音文件
SND_NODEFAULT = &H2 '若找不到文件则返回
SND_LOOP = &H8 '循环播放声音文件
SND_NOTSTOP = &H10 '若有文件正播放则返回
End Enum
'定义MCI操作命令代号常量枚举
Public Enum tpsMCICommandID
MCI_OPEN = 1
MCI_CLOSE = 2
MCI_PLAY = 3
MCI_STOP = 4
MCI_PAUSE = 5
MCI_PREV = 6
MCI_NEXT = 7
End Enum
'<类的私有数据变量声明段>
Private m_strWAVSource As String
Private m_strMIDSource As String
'<类的属性定义段>
'属性 - [StopFlag]
'类型:读/写
'作用:用于标记系统当前是否中止声音服务
Public StopFlag As Boolean
'属性 - [WAVName]
'类型:读/写
'作用:用于记录要操作WAV声音文件的完整路径
Public Property Get WAVName() As String
WAVName = m_strWAVSource
End Property
Public Property Let WAVName(ByVal vData As String)
Dim strErrString As String
If vData = "" Then
Exit Property
End If
If Right(App.Path, 1) = "\" Then
m_strWAVSource = App.Path & vData
Else
m_strWAVSource = App.Path & "\" & vData
End If
End Property
'属性[MIDName]
'类型:读/写
'作用:用于记录要操作MID文件的完整路径
Public Property Get MIDName() As String
MIDName = m_strMIDSource
End Property
Public Property Let MIDName(ByVal vData As String)
Dim strErrString As String
If vData = "" Then
Exit Property
End If
If Right(App.Path, 1) = "\" Then
m_strMIDSource = App.Path & vData
Else
m_strMIDSource = App.Path & "\" & vData
End If
End Property
'<类的方法定义段>
'方法 - [PlayWAV]
'目的: 播放通过参数指定的游戏WAV文件
'参数: 1.tFlag [ Enum ] WAV播放类型的枚举
Public Sub PlayWAV(tFlag As tpsPlayFlag)
Call m_subWAVPlay(WAVName, tFlag)
End Sub
'方法 - [PlayMIDI]
'目的: 播放通过参数指定的游戏MIDI文件
'参数: 1.tMCICommand [ Enum ] MCI命令的枚举
Public Sub PlayMIDI(tMCICommand As tpsMCICommandID)
Call m_subMCIAction(MIDName, tMCICommand)
End Sub
'方法 - [MIDIPlayLoop]
'目的: 用于判断并执行循环播放MIDI文件
'参数: 无
Public Sub MCIPlayLoop()
Dim strReturns As String * 255
Dim intPos As Integer, lngMusic As Long
If StopFlag Then
Exit Sub
Else
intPos = mciSendString("Status " & Chr(34) & m_strMIDSource & Chr(34) & " Mode", strReturns, Len(strReturns), 0)
If Left(strReturns, 7) = "stopped" Then
lngMusic = mciSendString("Close " & Chr(34) & m_strMIDSource & Chr(34), 0&, 0, 0)
lngMusic = mciSendString("Open " & Chr(34) & m_strMIDSource & Chr(34), 0&, 0, 0)
lngMusic = mciSendString("Play " & Chr(34) & m_strMIDSource & Chr(34), 0&, 0, 0)
End If
End If
End Sub
'<类的私有函数与子过程>
'子过程 - [WAVPlay]
'目的: 播放由参数指定的WAV文件
'参数: 1.sSource [String] WAV文件的完整路径
' 2.tPlayFlag [ Enum ] WAV播放类型的枚举
Private Sub m_subWAVPlay(sSource As String, tPlayFlag As tpsPlayFlag)
Dim lngSound As Long
lngSound = sndPlaySound(sSource, tPlayFlag)
End Sub
'子过程 - [MCIAction]
'目的: 通过由参数传入的MCI命令来操作MCI设备
'参数: 1.sSource [String] MCI文件的完整路径
' 2.tCommandID [ Enum ] MCI命令的枚举
Private Sub m_subMCIAction(sSource As String, tCommandID As tpsMCICommandID)
Dim lngMusic As Long
Select Case tCommandID
Case MCI_OPEN
lngMusic = mciSendString("Open " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_CLOSE
lngMusic = mciSendString("Close " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_PLAY
lngMusic = mciSendString("Play " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_STOP
lngMusic = mciSendString("Stop " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_PAUSE
lngMusic = mciSendString("Pause " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_PREV
lngMusic = mciSendString("Prev " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_NEXT
lngMusic = mciSendString("Next " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case Else
Exit Sub
End Select
End Sub
'< 类的事件 >
'{当该类被废止时关闭MCI设备}
Private Sub Class_Terminate()
PlayMIDI (MCI_CLOSE)
End Sub
' 类型:系统服务类
' 功能:对游戏系统提供声音文件的播放控制功能
' 版权:自由电子软件开发社—TCG设计组
' 作者:猪头王子
' 日期:2003-01-22
'<类内部封装的API函数>
'游戏音效(WAV文件)播放系统函数定义
Private Declare Function sndPlaySound _
Lib "winmm.dll" Alias "sndPlaySoundA" ( _
ByVal lpszSoundName As String, _
ByVal uFlags As Long _
) As Long
'游戏音乐(MID文件)播放系统函数定义
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
'<API函数参数常量声明段>
'WAV文件播放参数常量枚举
Public Enum tpsPlayFlag
SND_SYNC = &H0 '同步播放声音文件
SND_ASYNC = &H1 '异步播放声音文件
SND_NODEFAULT = &H2 '若找不到文件则返回
SND_LOOP = &H8 '循环播放声音文件
SND_NOTSTOP = &H10 '若有文件正播放则返回
End Enum
'定义MCI操作命令代号常量枚举
Public Enum tpsMCICommandID
MCI_OPEN = 1
MCI_CLOSE = 2
MCI_PLAY = 3
MCI_STOP = 4
MCI_PAUSE = 5
MCI_PREV = 6
MCI_NEXT = 7
End Enum
'<类的私有数据变量声明段>
Private m_strWAVSource As String
Private m_strMIDSource As String
'<类的属性定义段>
'属性 - [StopFlag]
'类型:读/写
'作用:用于标记系统当前是否中止声音服务
Public StopFlag As Boolean
'属性 - [WAVName]
'类型:读/写
'作用:用于记录要操作WAV声音文件的完整路径
Public Property Get WAVName() As String
WAVName = m_strWAVSource
End Property
Public Property Let WAVName(ByVal vData As String)
Dim strErrString As String
If vData = "" Then
Exit Property
End If
If Right(App.Path, 1) = "\" Then
m_strWAVSource = App.Path & vData
Else
m_strWAVSource = App.Path & "\" & vData
End If
End Property
'属性[MIDName]
'类型:读/写
'作用:用于记录要操作MID文件的完整路径
Public Property Get MIDName() As String
MIDName = m_strMIDSource
End Property
Public Property Let MIDName(ByVal vData As String)
Dim strErrString As String
If vData = "" Then
Exit Property
End If
If Right(App.Path, 1) = "\" Then
m_strMIDSource = App.Path & vData
Else
m_strMIDSource = App.Path & "\" & vData
End If
End Property
'<类的方法定义段>
'方法 - [PlayWAV]
'目的: 播放通过参数指定的游戏WAV文件
'参数: 1.tFlag [ Enum ] WAV播放类型的枚举
Public Sub PlayWAV(tFlag As tpsPlayFlag)
Call m_subWAVPlay(WAVName, tFlag)
End Sub
'方法 - [PlayMIDI]
'目的: 播放通过参数指定的游戏MIDI文件
'参数: 1.tMCICommand [ Enum ] MCI命令的枚举
Public Sub PlayMIDI(tMCICommand As tpsMCICommandID)
Call m_subMCIAction(MIDName, tMCICommand)
End Sub
'方法 - [MIDIPlayLoop]
'目的: 用于判断并执行循环播放MIDI文件
'参数: 无
Public Sub MCIPlayLoop()
Dim strReturns As String * 255
Dim intPos As Integer, lngMusic As Long
If StopFlag Then
Exit Sub
Else
intPos = mciSendString("Status " & Chr(34) & m_strMIDSource & Chr(34) & " Mode", strReturns, Len(strReturns), 0)
If Left(strReturns, 7) = "stopped" Then
lngMusic = mciSendString("Close " & Chr(34) & m_strMIDSource & Chr(34), 0&, 0, 0)
lngMusic = mciSendString("Open " & Chr(34) & m_strMIDSource & Chr(34), 0&, 0, 0)
lngMusic = mciSendString("Play " & Chr(34) & m_strMIDSource & Chr(34), 0&, 0, 0)
End If
End If
End Sub
'<类的私有函数与子过程>
'子过程 - [WAVPlay]
'目的: 播放由参数指定的WAV文件
'参数: 1.sSource [String] WAV文件的完整路径
' 2.tPlayFlag [ Enum ] WAV播放类型的枚举
Private Sub m_subWAVPlay(sSource As String, tPlayFlag As tpsPlayFlag)
Dim lngSound As Long
lngSound = sndPlaySound(sSource, tPlayFlag)
End Sub
'子过程 - [MCIAction]
'目的: 通过由参数传入的MCI命令来操作MCI设备
'参数: 1.sSource [String] MCI文件的完整路径
' 2.tCommandID [ Enum ] MCI命令的枚举
Private Sub m_subMCIAction(sSource As String, tCommandID As tpsMCICommandID)
Dim lngMusic As Long
Select Case tCommandID
Case MCI_OPEN
lngMusic = mciSendString("Open " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_CLOSE
lngMusic = mciSendString("Close " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_PLAY
lngMusic = mciSendString("Play " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_STOP
lngMusic = mciSendString("Stop " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_PAUSE
lngMusic = mciSendString("Pause " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_PREV
lngMusic = mciSendString("Prev " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case MCI_NEXT
lngMusic = mciSendString("Next " & Chr(34) & sSource & Chr(34), 0&, 0, 0)
Case Else
Exit Sub
End Select
End Sub
'< 类的事件 >
'{当该类被废止时关闭MCI设备}
Private Sub Class_Terminate()
PlayMIDI (MCI_CLOSE)
End Sub