방법: 소리 재생

업데이트: 2007년 11월

이 예제에서는 플랫폼 호출을 사용하여 두 개의 WAV 파일을 재생하는 방법, 즉 하나는 포함 리소스로 재생하고 다른 하나는 콘텐츠로 재생하는 방법을 보여 줍니다.

Visual Studio에서 WAV 파일을 포함 리소스로 구현하려면 속성 창에서 빌드작업 속성을 "포함 리소스"로 설정합니다. 명령줄에서 컴파일하는 경우 포함 리소스의 컴파일에 대한 내용을 보려면 방법: 명령 프롬프트에서 컴파일을 참조하십시오.

참고:

.NET Compact Framework 버전 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의 상호 운용성