Option Explicit

'MCI文字列
'http://eternalwindows.jp/winmm/mci/mci02.html

Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" _
    (ByVal lpszSoundName As String, _
     ByVal uFlags As Long) As Long

Private Const SND_SYNC = &H0
Private Const SND_ASYNC = &H1
Private Const SND_NODEFAULT = &H2
Private Const SND_MEMORY = &H4
Private Const SND_LOOP = &H8
Private Const SND_NOSTOP = &H10

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


Dim Com As String

Public Const SOUND_ALIAS = "MySound"


'■PlaySound − サウンドファイルを開く
'■引数:strFileName ファイルパス
'    strAlias    MCI名
Public Sub OpenSound(strFileName As String, strAlias As String)

    On Error GoTo MyErr
    Com = "open " & """" & strFileName & """" & " alias " & strAlias & " type MPEGVideo"
    Call mciSendString(Com, "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0
    
End Sub

'■CloseSound − サウンドファイルを閉じる
'■引数:strAlias   MCI名
Public Sub CloseSound(strAlias As String)

    On Error GoTo MyErr
    Call mciSendString("close """ & strAlias & """", "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Sub

'■PlaySound − サウンドを再生する
'■引数:strAlias   MCI名
Public Sub PlaySound(strAlias As String)

    On Error GoTo MyErr
    Call mciSendString("play " & strAlias, "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Sub

'■PauseSound − サウンドの再生を一時停止する
'■引数:strAlias   MCI名
Public Sub PauseSound(strAlias As String)

    On Error GoTo MyErr
    Call mciSendString("pause " & strAlias, "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Sub

'■ResumeSound − 一時停止の続きからサウンドの再生をする
'■引数:strAlias   MCI名
Public Sub ResumeSound(strAlias As String)

    On Error GoTo MyErr
    Call mciSendString("resume " & strAlias, "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Sub

'■StopSound − サウンドの再生を停止する
'■引数:strAlias   MCI名
Public Sub StopSound(strAlias As String)

    On Error GoTo MyErr
    Call mciSendString("stop " & strAlias, "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Sub

'■GetLength − ファイルの長さを秒単位で返す。
'■引数:strAlias   MCI名
Public Function GetSoundLength(strAlias As String) As Double

    Dim strStatus As String * 256
    Dim MCICommandString As String
    
    On Error GoTo MyErr
    
    MCICommandString = "status " & strAlias & " length"
    Call mciSendString(MCICommandString, strStatus, Len(strStatus), 0)
    GetSoundLength = Val(strStatus) / 1000
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Function

'■GetPosition − 再生中のファイルの位置を秒単位で返す。
'■引数:strAlias   MCI名
Public Function GetSoundPosition(strAlias As String) As Double

    Dim strStatus As String * 256
    Dim MCICommandString As String

    On Error GoTo MyErr
    MCICommandString = "status " & strAlias & " position"
    mciSendString MCICommandString, strStatus, Len(strStatus), 0
    
    GetSoundPosition = Val(strStatus) / 1000
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Function

'■SetPosition − ファイルの再生位置を指定する。
'■引数:strAlias   MCI名
'■      Position   再生位置を秒単位で指定する
Public Sub SetSoundPosition(strAlias As String, Position As Double)

    Dim NewPosition As Long

    On Error GoTo MyErr
    NewPosition = Position * 1000

    Call mciSendString("seek " & strAlias & " to " & NewPosition, "", 0, 0)
    Call mciSendString("play " & strAlias, "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Sub

'■GetSoundStatus − 現在の再生状態を取得する
'■引数:strAlias   MCI名
'■戻り値:再生中のとき"PLAYING"、停止中のとき"STOPPED"、一時停止中のとき"PAUSED"
Public Function GetSoundStatus(strAlias As String) As String

    Dim MCICommandString As String

    On Error GoTo MyErr
    Dim strStatus As String * 256
    MCICommandString = "status " & strAlias & " mode"
    Call mciSendString(MCICommandString, strStatus, Len(strStatus), 0)

    GetSoundStatus = GetString(strStatus)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Function


'■SetVolume − 音量を取得
'■引数:strAlias   MCI名
Public Function GetSoundVolume(strAlias As String) As Double

    Dim strStatus As String * 256
    
    On Error GoTo MyErr
    Call mciSendString("status " & strAlias & " volume ", strStatus, Len(strStatus), 0)
    GetSoundVolume = Val(GetString(strStatus))
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0

End Function

'■SetVolume − 音量をセット
'■引数:strAlias   MCI名
'■      Vol   音量を指定する
Public Sub SetSoundVolume(strAlias As String, Vol As Double)


    On Error GoTo MyErr
    Call mciSendString("setaudio " & strAlias & " volume to " & Vol, "", 0, 0)
    GoTo MyEnd
MyErr:
    MsgBox Err.Number & " " & Err.Description
MyEnd:
    On Error GoTo 0
End Sub

Public Function GetString(strBuf As String) As String
'
' Null位置までの文字列を取得する
'
    Dim p As Long
    p = InStr(1, strBuf, vbNullChar) - 1
    If p < 0 Then p = 0
    GetString = Left(strBuf, p)
End Function