2009年1月14日水曜日

APIのPlaySound関数をVB.NETから使用してWavファイルを再生

VB.NETからAPIのPlaySound関数を使用してWavファイルを再生。
*もちろん、Wav以外は再生できないです
PlaySound関数では同時再生することはできないので、同時再生させるためにMediaPlayerを併用しました。
BGMなどはMediaPlayerで再生させておき、効果音など軽い音源はPlaySound関数を使用すれば、同時に再生できるようです。
smdn:総武ソフトウェア推進所さんのソースを参考にさせていただきました。
記事はこちら↓
WAVEファイルを再生する
http://smdn.invisiblefulmoon.net/ikimasshoy/dotnettips/tips027.html

画面のようにコントロールを配置。DllImportsやマーシャリングは各自でお願いしますね。

' ファイルから再生する
Private Shared Function PlaySound( _
ByVal pszSound As String, _
ByVal hModule As Integer, _
ByVal dwFlags As Integer) _
As Integer
End Function

' メモリ上のバッファから再生する
Private Shared Function PlaySound( _
ByVal pszSound As Byte(), _
ByVal hModule As Integer, _
ByVal dwFlags As Integer) _
As Integer
End Function
' 再生フラグ
Private Const SND_SYNC As Integer = &H0
' 同期再生
Private Const SND_ASYNC As Integer = &H1
' 非同期再生
Private Const SND_MEMORY As Integer = &H4
' バッファからの再生
Private Const SND_LOOP As Integer = &H8
' ループ再生
Private Const SND_NOSTOP As Integer = &H10
' 再生中のサウンドを停止しない
Private Const SND_NOWAIT As Integer = &H2000
' ビジー状態なら即座に処理を返す
' バッファ Dim buffer() As Byte

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' ファイルからバイト配列に読み込み
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel Then Exit Sub
Dim stream As FileStream Dim reader As BinaryReader
stream = New FileStream(OpenFileDialog1.FileName, FileMode.Open, FileAccess.Read)
reader = New BinaryReader(stream)
buffer = reader.ReadBytes(CInt(stream.Length))
reader.Close()
stream.Close()

'メディアプレーヤーにBGMを設定
AxWindowsMediaPlayer1.URL = System.IO.Path.Combine(Application.StartupPath, "one_resort.wav")
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' ファイルから再生
' ファイルからバイト配列に読み込み
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel Then Exit Sub
PlaySound(OpenFileDialog1.FileName, Nothing, SND_ASYNC)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
If buffer Is Nothing Then
If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.Cancel Then Exit Sub End If
' バッファから再生
PlaySound(buffer, Nothing, SND_MEMORY Or SND_ASYNC)
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'PlaySoundの停止
PlaySound("", Nothing, SND_MEMORY Or SND_ASYNC)
End Sub
End Class