by Sunshine » 2005年5月30日(月) 19:22
ご無沙汰してます。未だにVer3を使っているSunshineです。
今、ゲームに音楽をつけたいと思っています。mciSendString関数を使い、音楽のループ再生を作ってみました。
ゲームとウィンドウは別スレッドで実現したほうが良いと思い、どうせなら音楽も別スレッドを……、という考えから、別スレッドでMCIを使うことにしました。
で、使ってみたのですが、音が途中で途切れてしまいます。ループ内のmciSendStringの処理のせいだろうと思うのですが、どうにか音を途切れさせずに音楽を流すにはどうすればよいのでしょうか。
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (lpstrCommand As BytePtr, lpstrReturnString As BytePtr, uReturnLength As Long, hwndCallback As Long) As Long
Dim hMainThread As DWord
Const FILE = "test.mid"
Const POSITION = "11500" '再生開始位置11.5秒
Sub Main()
Dim retBuffer[19] As Byte
mciSendString("open "+FILE+" type sequencer alias Music", 0, 0, 0)
mciSendString("set Music time format ms", 0, 0, 0)
mciSendString("play Music wait", 0, 0, 0)
Do
mciSendString("play Music from "+POSITION+" wait", 0, 0, 0)
Loop
End Sub
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
TerminateThread(hMainThread, 0)
CloseHandle(hMainThread)
mciSendString("close all", 0, 0, 0)
Player_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim dwDummy As DWord
hMainThread = CreateThread(ByVal 0,0,AddressOf(Main),0,0,VarPtr(dwDummy))
End Sub
ご無沙汰してます。未だにVer3を使っているSunshineです。
今、ゲームに音楽をつけたいと思っています。mciSendString関数を使い、音楽のループ再生を作ってみました。
ゲームとウィンドウは別スレッドで実現したほうが良いと思い、どうせなら音楽も別スレッドを……、という考えから、別スレッドでMCIを使うことにしました。
で、使ってみたのですが、音が途中で途切れてしまいます。ループ内のmciSendStringの処理のせいだろうと思うのですが、どうにか音を途切れさせずに音楽を流すにはどうすればよいのでしょうか。
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (lpstrCommand As BytePtr, lpstrReturnString As BytePtr, uReturnLength As Long, hwndCallback As Long) As Long
Dim hMainThread As DWord
Const FILE = "test.mid"
Const POSITION = "11500" '再生開始位置11.5秒
Sub Main()
Dim retBuffer[19] As Byte
mciSendString("open "+FILE+" type sequencer alias Music", 0, 0, 0)
mciSendString("set Music time format ms", 0, 0, 0)
mciSendString("play Music wait", 0, 0, 0)
Do
mciSendString("play Music from "+POSITION+" wait", 0, 0, 0)
Loop
End Sub
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
TerminateThread(hMainThread, 0)
CloseHandle(hMainThread)
mciSendString("close all", 0, 0, 0)
Player_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
Dim dwDummy As DWord
hMainThread = CreateThread(ByVal 0,0,AddressOf(Main),0,0,VarPtr(dwDummy))
End Sub