by トモカズ » 2008年9月07日(日) 08:06
「Win32プログラミング講座 ~ Step30. MCIコマンドで音楽ファイルを再生する ~」
のサンプルコードをN88BASICモードとして以下の様に置き換えてみました。
試行錯誤にて、「どうにか、動作出来るレベル」になった程度なので、本来の手法(?)とは違うのだろうなぁと感じています。
「ここはこうすべき」、「この方が効率的」、「ここが変」
などなど、アドバイスをいただけますと幸いです。
よろしくお願いいたします。
#N88BASIC
#include <api_mmsys.sbp>
Dim I$ AS STRING
Dim filename(500) AS BYTE
' ----------------------------------ここから----------------------------------
Dim mop As MCI_OPEN_PARMS
*loop
Openfile()
Playsound()
I$=Input$(1)
Playstop()
goto *loop
end
' ----------------------------------ここまで----------------------------------
'↑先頭部分には、MCIデバイスのオープン情報のための構造体を用意します。
Sub Openfile()
Dim ofn As OPENFILENAME
Dim buffer[MAX_PATH-1] As Byte
'ファイル名を取得
ofn.lStructSize=76
ofn.hwndOwner=_PromptSys_hWnd'hMainWnd
ofn.lpstrFilter=Ex"音楽 ファイル(*.wav;*.mid;*.mp3)\0*.wav;*.mid;*.mp3\0すべてのファイル(*.*)\0*\0\0"
ofn.nFilterIndex=1
ofn.nMaxFile=MAX_PATH
ofn.lpstrFile=buffer
GetOpenFileName(ofn)
lstrcpy(filename,buffer)
End Sub
'↑OPENボタンがクリックされたときに呼び出されるイベントです。GetOpenFileName関数でファイル名を取得し、テキストボックス(Static_Path)にファイルパスを表示します。
Sub Playsound()
Dim bErr As Long
Dim mpp As MCI_PLAY_PARMS
Dim buffer[MAX_PATH-1] As Byte
'再生中の場合は停止させる
If mop.wDeviceID Then Playstop()
'サウンド ファイルのパスを設定します。
mop.lpstrElementName=buffer
'メッセージ通知のためのウィンドウを指定
mop.lpstrElementName=filename
mop.dwCallback=_PromptSys_hWnd
'MCIデバイスをオープン
bErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop)
If bErr Then
MessageBox(_PromptSys_hWnd,"デバイスのオープンに失敗","error",MB_OK)
Exit Sub
End If
'再生
mpp.dwCallback=_PromptSys_hWnd
bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp)
If bErr Then
MessageBox(_PromptSys_hWnd,"デバイスの再生に失敗","error",MB_OK)
Exit Sub
End If
End Sub
'↑PLAYボタンがクリックされたときに呼び出されるイベントです。MCI_OPENコマンドでMCIデバイスを開き、MCI_PLAYコマンドでデバイスを再生します。
Sub Playstop()
Dim bErr As Long
Dim dwCallback As DWord
'停止
bErr=mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)
If bErr Then
MessageBox(_PromptSys_hWnd,"デバイスの停止に失敗","error",MB_OK)
Exit Sub
End If
'デバイスを閉じる
mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback)
mop.wDeviceID=0
End Sub
'↑STOPボタンがクリックされたときに呼び出されるイベントです。MCI_STOPコマンドでデバイスを停止させ、MCI_CLOSEコマンドでデバイスをクローズしています。
Sub MainWnd_MciNotify(flags As Long, DevID As Long)
Dim dwCallback As DWord
If flags=MCI_NOTIFY_SUCCESSFUL Then
'デバイスを閉じる
mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback)
mop.wDeviceID=0
MessageBox(_PromptSys_hWnd,"再生終了","Sound test",MB_OK)
End If
End Sub
/*
↑MciNotifyは、再生が終了した場合などにMCIコマンドから送られるイベントです。RADツールの「イベント処理」ダイアログのMMSYSタブで表示されています。
再生が正常に終了した場合(flagsパラメータに MCI_NOTIFY_SUCCESSFUL フラグがセットされていたとき)はMCI_CLOSEコマンドを送り、MCIデバイスをクローズします。DevID変数とmop.wDeviceID変数には同じ値がセットされています。
「Win32プログラミング講座 ~ Step30. MCIコマンドで音楽ファイルを再生する ~」
のサンプルコードをN88BASICモードとして以下の様に置き換えてみました。
試行錯誤にて、「どうにか、動作出来るレベル」になった程度なので、本来の手法(?)とは違うのだろうなぁと感じています。
「ここはこうすべき」、「この方が効率的」、「ここが変」
などなど、アドバイスをいただけますと幸いです。
よろしくお願いいたします。
#N88BASIC
#include <api_mmsys.sbp>
Dim I$ AS STRING
Dim filename(500) AS BYTE
' ----------------------------------ここから----------------------------------
Dim mop As MCI_OPEN_PARMS
*loop
Openfile()
Playsound()
I$=Input$(1)
Playstop()
goto *loop
end
' ----------------------------------ここまで----------------------------------
'↑先頭部分には、MCIデバイスのオープン情報のための構造体を用意します。
Sub Openfile()
Dim ofn As OPENFILENAME
Dim buffer[MAX_PATH-1] As Byte
'ファイル名を取得
ofn.lStructSize=76
ofn.hwndOwner=_PromptSys_hWnd'hMainWnd
ofn.lpstrFilter=Ex"音楽 ファイル(*.wav;*.mid;*.mp3)\0*.wav;*.mid;*.mp3\0すべてのファイル(*.*)\0*\0\0"
ofn.nFilterIndex=1
ofn.nMaxFile=MAX_PATH
ofn.lpstrFile=buffer
GetOpenFileName(ofn)
lstrcpy(filename,buffer)
End Sub
'↑OPENボタンがクリックされたときに呼び出されるイベントです。GetOpenFileName関数でファイル名を取得し、テキストボックス(Static_Path)にファイルパスを表示します。
Sub Playsound()
Dim bErr As Long
Dim mpp As MCI_PLAY_PARMS
Dim buffer[MAX_PATH-1] As Byte
'再生中の場合は停止させる
If mop.wDeviceID Then Playstop()
'サウンド ファイルのパスを設定します。
mop.lpstrElementName=buffer
'メッセージ通知のためのウィンドウを指定
mop.lpstrElementName=filename
mop.dwCallback=_PromptSys_hWnd
'MCIデバイスをオープン
bErr=mciSendCommand(0,MCI_OPEN,MCI_OPEN_ELEMENT,mop)
If bErr Then
MessageBox(_PromptSys_hWnd,"デバイスのオープンに失敗","error",MB_OK)
Exit Sub
End If
'再生
mpp.dwCallback=_PromptSys_hWnd
bErr=mciSendCommand(mop.wDeviceID,MCI_PLAY,MCI_NOTIFY,mpp)
If bErr Then
MessageBox(_PromptSys_hWnd,"デバイスの再生に失敗","error",MB_OK)
Exit Sub
End If
End Sub
'↑PLAYボタンがクリックされたときに呼び出されるイベントです。MCI_OPENコマンドでMCIデバイスを開き、MCI_PLAYコマンドでデバイスを再生します。
Sub Playstop()
Dim bErr As Long
Dim dwCallback As DWord
'停止
bErr=mciSendCommand(mop.wDeviceID,MCI_STOP,MCI_WAIT,dwCallback)
If bErr Then
MessageBox(_PromptSys_hWnd,"デバイスの停止に失敗","error",MB_OK)
Exit Sub
End If
'デバイスを閉じる
mciSendCommand(mop.wDeviceID,MCI_CLOSE,MCI_WAIT,dwCallback)
mop.wDeviceID=0
End Sub
'↑STOPボタンがクリックされたときに呼び出されるイベントです。MCI_STOPコマンドでデバイスを停止させ、MCI_CLOSEコマンドでデバイスをクローズしています。
Sub MainWnd_MciNotify(flags As Long, DevID As Long)
Dim dwCallback As DWord
If flags=MCI_NOTIFY_SUCCESSFUL Then
'デバイスを閉じる
mciSendCommand(DevID,MCI_CLOSE,MCI_WAIT,dwCallback)
mop.wDeviceID=0
MessageBox(_PromptSys_hWnd,"再生終了","Sound test",MB_OK)
End If
End Sub
/*
↑MciNotifyは、再生が終了した場合などにMCIコマンドから送られるイベントです。RADツールの「イベント処理」ダイアログのMMSYSタブで表示されています。
再生が正常に終了した場合(flagsパラメータに MCI_NOTIFY_SUCCESSFUL フラグがセットされていたとき)はMCI_CLOSEコマンドを送り、MCIデバイスをクローズします。DevID変数とmop.wDeviceID変数には同じ値がセットされています。