MCIは不慣れで、やっと他の人のソースを参考に曲を一回再生する程度ができるようになったくらいです。
さて、そのゲームで
・BGMのループ再生
・BGMを鳴らしながらの他の音(効果音)を再生
をやりたいのですが、上手くいきません。
http://www.activebasic.com/forum/viewto ... D%E7%94%9FのSunshine
様の質問内容をコピーして「mop」を「mop[127]」と配列にしてみました。呼び出し用の関数で配列の番号を指定したつもりです。
コード: 全て選択
Class BACKGROUNDMUSIC
Private
mop[127] As MCI_OPEN_PARMS
mpp[127] As MCI_PLAY_PARMS
msp[127] As MCI_SET_PARMS
dwCallback As DWord
bErr[127] As DWord
Public
Sub ~BACKGROUNDMUSIC()
Dim a As Byte
Do
Stop(a)
a++
Loop Until a=128
End Sub
Function GetError(id As Char) As String
Dim pszText As BytePtr,str As String
mciGetErrorString(bErr[id], pszText, 255)
str=MakeStr(pszText)
GetError=str
End Function
Sub Stop(id As Char)
'デバイスの停止
bErr[id] = mciSendCommand(mop[id].wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)
'デバイスのクローズ
mciSendCommand(mop[id].wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback)
mop.wDeviceID=0:
End Sub
Sub Play(hCallBackWnd As HWND, filename As BytePtr, from As DWord,id As Char)
mpp[id].dwFrom = from
If mop[id].wDeviceID Then Stop(id)
mop[id].lpstrElementName = filename
mop[id].dwCallback = hCallBackWnd
mop[id].lpstrDeviceType = "MPEGVideo"
bErr[id]=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT or MCI_OPEN_TYPE,mop[id])
msp[id].dwTimeFormat = MCI_FORMAT_MILLISECONDS
mciSendCommand(mop[id].wDeviceID, MCI_SET, MCI_SET_TIME_FORMAT, msp[id])
mpp[id].dwCallback = hCallBackWnd
bErr[id]=mciSendCommand(mop[id].wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp[id])
End Sub
Sub Notify(flags As Long, DevID As Long)
If flags = MCI_NOTIFY_SUCCESSFUL Then
bErr[DevID]=mciSendCommand(mop[DevID].wDeviceID,MCI_SEEK,MCI_SEEK_TO_START or MCI_WAIT,msp[DevID])
bErr[DevID]=mciSendCommand(mop[DevID].wDeviceID,MCI_PLAY,MCI_NOTIFY ,mpp[DevID])
End If
End Sub
End Class
コード: 全て選択
Dim MainDefaultWndProc As DWord
MainDefaultWndProc=GetWindowLong(hMainWnd,GWL_WNDPROC)
Function SubClass(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
SelectCase dwMsg
Case MM_MCINOTIFY
If PS3fg[lParam]=0 then
PS3buf.Stop(lParam)
Else then
PS3buf.Notify(wParam,lParam)
EndIf
EndSelect
SubClass=CallWindowProc(MainDefaultWndProc,hWnd,dwMsg,wParam,lParam)
EndFunction
SetWindowLong(hMainWnd,GWL_WNDPROC,AddressOf(SubClass))
コード: 全て選択
Dim PS3buf As BACKGROUNDMUSIC,PS3fg[127] As Byte
Sub PS3(playID As Char)(filepath As BytePtr,IsLoop As Byte,from As DWord)
If Asc(MakeStr(filepath))=0 then
/*ファイルパスが指定されてなければ
playIDの再生を停止*/
PS3fg[playID]=0
PS3buf.Stop(playID)
Else then
/*IsLoopがTRUEだったら
PS3fg配列のplayID番目を1に
それ以外は普通に再生*/
If IsLoop=TRUE then PS3fg[playID]=1
PS3buf.Play(hMainWnd,filepath,from,playID)
EndIf
End Sub
コード: 全て選択
PS3(1,ファイル名TRUE)
初心者なので無駄なところ(配列が127もある等)もありますがよろしくお願いします。長文ですみません。