방법: 소리 재생
업데이트: 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을 호출할 때 원본 파일 이름 앞에 어셈블리 네임스페이스를 추가하여 파일의 리소스 스트림을 반환합니다.
플랫폼 호출을 사용하여 소리를 재생하려면
프로젝트에 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)); } }
단추의 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(); }
코드 컴파일
이 예제에는 다음과 같은 네임스페이스에 대한 참조가 필요합니다.