ab.com コミュニティ https://www.activebasic.com/forum/ |
|
mp3の再生について https://www.activebasic.com/forum/viewtopic.php?t=2828 |
ページ 1 / 1 |
作成者: | ShellExecute [ 2011年12月23日(金) 00:52 ] |
記事の件名: | mp3の再生について |
自作のゲームを作っています。 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以下はhttp://www.activebasic.com/forum/viewto ... 9%E3%82%B9を参考にサブクラス化でメッセージを取得しました。 コード: 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もある等)もありますがよろしくお願いします。長文ですみません。 |
作成者: | 水波形 [ 2012年1月04日(水) 13:43 ] |
記事の件名: | |
手元にWindowsが無いので確認できませんが、 とりあえず私的に思ったことは…… RADツールを使っているなら、サブクラスにしなくても コールバック関数で取得できるんじゃないかなぁと思います。(コードをちゃんと読んでないのでわかりませんが) ループ再生は、デバイスを一回停止してもう一回再生するとか MCI_SEEK……でしたっけ?そんなので0に戻すとかですかね。 RADツールのイベントに、MCIのイベントがあったと思います。 (終了したらメッセージを送信するとかウンタラカンタラ) そこにメッセージが飛んでくるので、そいつを捕まえてやればいい感じに…… >BGMを鳴らしながらの他の音(効果音)を再生 WAVなら、PlaySound関数使えば簡単に出来ます。 MCI使うなら……まあ、めんどくさいですがね^^; ActiveBasicのヘルプセンターなんかにサンプルがありますので、 こっちを参考にしてみてくださいな PlaySound http://www.activebasic.com/help_center/ ... index.html MCI http://www.activebasic.com/help_center/ ... index.html |
作成者: | ShellExecute [ 2012年1月04日(水) 17:13 ] |
記事の件名: | 有難うございました。 |
とりあえずやってみます。 |
ページ 1 / 1 | 全ての表示時間は UTC+09:00 です |
Powered by phpBB® Forum Software © phpBB Limited https://www.phpbb.com/ |