'  名称: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