方法 : サウンドを再生する

更新 : 2007 年 11 月

この例では、プラットフォーム呼び出しを使用して 2 つの WAV ファイルを再生する方法を示します。WAV ファイルは、1 つを埋め込みリソースとして再生し、もう 1 つをコンテンツとして再生します。

Visual Studio で、埋め込みリソースとして WAV ファイルを実装するには、[プロパティ] ペインで、対象のファイルの [ビルド アクション] プロパティに "埋め込まれたリソース" を設定します。コマンド ラインでコンパイルする場合の埋め込みリソースのコンパイル方法については、「方法 : コマンド プロンプトでコンパイルする」を参照してください。

ms229685.alert_note(ja-jp,VS.90).gifメモ :

.NET Compact Framework Version 3.5 では、SoundPlayer によるサウンドの再生をサポートします。詳細については、「.NET Compact Framework の SoundPlayer」を参照してください。

この例では、Windows CE の CoreDll.dll を使用して次のネイティブ コード機能を持つ Sound クラスを定義します。

  • ファイル名またはストリームを使用してサウンドを再生する、プラットフォーム呼び出しメソッドの宣言。

  • プラットフォーム呼び出しメソッドを呼び出すときに引数として渡す、ビット値の列挙体。

  • 個別のファイルまたは埋め込みリソースを再生するために、適切なプラットフォーム呼び出しメソッドを呼び出す Play メソッド。

この例では、Chimes.wav という名前のサウンド ファイルを使用します。このサウンド ファイルを埋め込みリソースに含める場合は、GetManifestResourceStream を呼び出すときに元のファイル名の先頭にアセンブリの名前空間を付加することにより、ファイルのリソース ストリームを返す必要があります。

プラットフォーム呼び出しを使用してサウンドを再生するには

  1. Sound クラスをプロジェクトに追加します。

    Public Class Sound
       Private m_soundBytes() As Byte
        Private m_fileName As String
    
        Public Declare Function WCE_PlaySound Lib "CoreDll.dll" Alias "PlaySound" (ByVal szSound As String, ByVal hMod As IntPtr, ByVal flags As Integer) As Integer
        Public Declare Function WCE_PlaySoundBytes Lib "CoreDll.dll" Alias "PlaySound" (ByVal szSound() As Byte, ByVal hMod As IntPtr, ByVal flags As Integer) As Integer
    
    
    
       Private Enum Flags
          SND_SYNC = &H0 ' play synchronously (default) 
          SND_ASYNC = &H1 ' play asynchronously 
          SND_NODEFAULT = &H2 ' silence (!default) if sound not found 
          SND_MEMORY = &H4 ' pszSound points to a memory file 
          SND_LOOP = &H8 ' loop the sound until next sndPlaySound 
          SND_NOSTOP = &H10 ' don't stop any currently playing sound 
          SND_NOWAIT = &H2000 ' don't wait if the driver is busy 
          SND_ALIAS = &H10000 ' name is a registry alias 
          SND_ALIAS_ID = &H110000 ' alias is a predefined ID 
          SND_FILENAME = &H20000 ' name is file name 
          SND_RESOURCE = &H40004 ' name is resource name or atom 
        End Enum
    
    
        ' Construct the Sound object to play sound data from the specified file.
        Public Sub New(ByVal fileName As String)
            m_fileName = fileName
        End Sub
    
    
        ' Construct the Sound object to play sound data from the specified stream.
        Public Sub New(ByVal stream As Stream)
            ' read the data from the stream
            m_soundBytes = New Byte(stream.Length) {}
            stream.Read(m_soundBytes, 0, Fix(stream.Length))
        End Sub 'New
    
    
        ' Play the sound
        Public Sub Play()
            ' If a file name has been registered, call WCE_PlaySound, 
            ' otherwise call WCE_PlaySoundBytes.
            If Not (m_fileName Is Nothing) Then
                WCE_PlaySound(m_fileName, IntPtr.Zero, Fix(Flags.SND_ASYNC Or Flags.SND_FILENAME))
            Else
                WCE_PlaySoundBytes(m_soundBytes, IntPtr.Zero, Fix(Flags.SND_ASYNC Or Flags.SND_MEMORY))
            End If
        End Sub 
    End Class
    
    public class Sound
    {
        private byte[] m_soundBytes;
        private string m_fileName;
    
        private enum Flags {
            SND_SYNC = 0x0000,  /* play synchronously (default) */
            SND_ASYNC = 0x0001,  /* play asynchronously */
            SND_NODEFAULT = 0x0002,  /* silence (!default) if sound not found */
            SND_MEMORY = 0x0004,  /* pszSound points to a memory file */
            SND_LOOP = 0x0008,  /* loop the sound until next sndPlaySound */
            SND_NOSTOP = 0x0010,  /* don't stop any currently playing sound */
            SND_NOWAIT = 0x00002000, /* don't wait if the driver is busy */
            SND_ALIAS = 0x00010000, /* name is a registry alias */
            SND_ALIAS_ID = 0x00110000, /* alias is a predefined ID */
            SND_FILENAME = 0x00020000, /* name is file name */
            SND_RESOURCE = 0x00040004  /* name is resource name or atom */
        }
    
        [DllImport("CoreDll.DLL", EntryPoint="PlaySound", SetLastError=true)]
        private extern static int WCE_PlaySound(string szSound, IntPtr hMod, int flags);
    
        [DllImport("CoreDll.DLL", EntryPoint="PlaySound", SetLastError=true)]
        private extern static int WCE_PlaySoundBytes (byte[] szSound, IntPtr hMod, int flags);
    
        /// <summary>
        /// Construct the Sound object to play sound data from the specified file.
        /// </summary>
        public Sound (string fileName) {
            m_fileName = fileName;
        }
    
        /// <summary>
        /// Construct the Sound object to play sound data from the specified stream.
        /// </summary>
        public Sound(Stream stream)    {
            // read the data from the stream
            m_soundBytes = new byte [stream.Length];
            stream.Read(m_soundBytes, 0,(int)stream.Length);
        }
    
        /// <summary>
        /// Play the sound
        /// </summary>
        public void Play () {
            // if a file name has been registered, call WCE_PlaySound,
            //  otherwise call WCE_PlaySoundBytes
            if (m_fileName != null)
                WCE_PlaySound(m_fileName, IntPtr.Zero, (int) (Flags.SND_ASYNC | Flags.SND_FILENAME));
            else
                WCE_PlaySoundBytes (m_soundBytes, IntPtr.Zero, (int) (Flags.SND_ASYNC | Flags.SND_MEMORY));
        }
    }
    
  2. Click イベントなどとして、Sound クラスのインスタンスを作成し、ファイルを再生するメソッドを追加します。

    ' To return a Stream object associated with an embedded
    ' resource, you must prepend the namespace to the original
    ' name of the file in the project.
    Private Sub btnEmbedded_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEmbedded.Click
        Dim sound As New Sound([Assembly].GetExecutingAssembly().GetManifestResourceStream("SoundSample.chimes.wav"))
        sound.Play()
    End Sub 
    
    
    Private Sub btnFile_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFile.Click
        Dim sound As New Sound("Program Files\SoundSample\chord.wav")
        sound.Play()
    End Sub
    
    // To return a Stream object associated with an embedded
    // resource, you must prepend the namespace to the original
    // name of the file in the project.
    private void btnEmbedded_Click(object sender, System.EventArgs e) {
        Sound sound = new Sound (Assembly.GetExecutingAssembly().GetManifestResourceStream("SoundSample.chimes.wav"));
        sound.Play();
    }
    
    private void btnFile_Click(object sender, System.EventArgs e) {
        Sound sound = new Sound ("Program Files\\SoundSample\\chord.wav");
        sound.Play();
    }
    

コードのコンパイル方法

この例では、次の名前空間への参照が必要です。

参照

概念

.NET Compact Framework に関する「方法」トピック

その他の技術情報

.NET Compact Framework の相互運用性