ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 19:00

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - mp3の再生について
作成者 メッセージ
  記事の件名:  有難うございました。  引用付きで返信する
とりあえずやってみます。
投稿記事 Posted: 2012年1月04日(水) 17:13
  記事の件名:     引用付きで返信する
手元に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
投稿記事 Posted: 2012年1月04日(水) 13:43
  記事の件名:  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もある等)もありますがよろしくお願いします。長文ですみません。
投稿記事 Posted: 2011年12月23日(金) 00:52

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean