ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 08:33

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




新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 
作成者 メッセージ
 記事の件名: 音楽…
投稿記事Posted: 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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年5月30日(月) 19:23 
うーんと、根本的な解決になってないかもしれませんが、
いつも私が使う手法をば。

私の場合はSetTimer使います。少々長くなりますが
コード:
'-----------------------------------------------------------------------------
'  イベント プロシ?#91;ジャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコ?#91;ディングします。
' ウィンドウ ハンドル: hMainWnd

' TODO: この位置にグロ?#91;バルな変数、構造体、定数、関数を定義します。


'-----------------------------------------------------------------------------
' ウィンドウメッセ?#91;ジを処理するためのコ?#91;ルバック関数

Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
	' TODO: この位置にウィンドウメッセ?#91;ジを処理するためのコ?#91;ドを記述します。

	' イベントプロシ?#91;ジャの呼び出しを行います。
	MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function


'-----------------------------------------------------------------------------
' ここから下は、イベントプロシ?#91;ジャを記述するための領域になります。

Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long

Sub MainWnd_Destroy()
	KillTimer(hMainWnd, 100) '終了時にキルタイ?#125;
	mciSendString("close Media", buf, 255, 0) 'クロ?#91;ズ
	daisdhas_DestroyObjects()
	PostQuitMessage(0)
End Sub

Dim fname As String
Dim buf As String 'mciSendStringの戻りバッファ用
Dim mlen As Long

Sub MainWnd_CommandButton1_Click()
	fname=Ex"\qC:\\Test.mpg\q" '\qでくくることでスペ?#91;スのあるパスも再生可能
	buf = ZeroString(255)
	mciSendString("open " & fname & " type mpegvideo alias Media", buf, 255, 0) 'mpegvideoと指定することで、拡張子偽装のファイルも再生可能です。
	mciSendString("set Media time format ms", buf, 255, 0)
	mciSendString("status Media length", buf, 255, 0)
	mlen = Val(buf) '全体の長さを取得
	mciSendString("play Media", buf, 255, 0)
	SetTimer(hMainWnd, 100, 1, NULL) 'タイ?#125;設定
End Sub

Sub MainWnd_Timer(ByVal TimerID As Long)
	If TimerID = 100 Then
		mciSendString("status Media position", buf, 255, 0)
		If Val(buf) >= mlen Then mciSendString("play Media from 0", buf, 255, 0) '現在時間が全体時間以上になったらル?#91;プ
	End If
End Sub


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年5月30日(月) 19:27 
 返信送れてすみません。学祭などで忙しかったもので……。

> mciSendString("status Media position", buf, 255, 0)
> If Val(buf) >= mlen Then mciSendString("play Media from 0", buf, 255, 0) '現在時間が全体時間以上になったらループ
> End If

 "wait"を廃止し、Do~Loop内に埋め込んでみました。
 ありがとうございました!!前よりも音がなめらかに移るようになりました。やはり問題点は"wait"だったんですね……。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 3 件の記事 ] 

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


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot], Baidu [Spider] & ゲスト[24人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

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