.NET Framework 개발자 가이드
방법: 소리 재생
이 예제에서는 플랫폼 호출을 사용하여 두 개의 WAV 파일을, 하나는 포함 리소스로 재생하고 다른 하나는 콘텐츠로 재생하는 방법을 보여 줍니다.
Microsoft Visual Studio 2005에서 WAV 파일을 포함 리소스로 구현하려면 속성 창에서 빌드 작업 속성을 "포함 리소스"로 설정합니다. 명령줄에서 컴파일하는 경우 포함 리소스의 컴파일에 대한 내용을 보려면 방법: 명령 프롬프트에서 컴파일을 참조하십시오.
이 예제에서는 Windows CE에서 CoreDll.dll을 사용하여 다음과 같은 네이티브 코드 기능을 제공하는 Sound 클래스를 정의합니다.
-
파일 이름이나 스트림을 사용하여 소리를 재생하는 플랫폼 호출 메서드 선언
-
플랫폼 호출 메서드를 호출할 때 인수를 전달하기 위한 비트 값 열거
-
정확한 플랫폼 호출 메서드를 호출하여 별도의 파일이나 포함 리소스를 재생하는 Play 메서드
플랫폼 호출을 사용하여 소리를 재생하려면
1. 프로젝트에 Sound 클래스를 추가합니다.
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));
}
}
{
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 클래스의 인스턴스를 만들고 파일을 재생하는 메서드를 추가합니다.
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();
}
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();
}
이 예제에는 다음과 같은 네임스페이스에 대한 참조가 필요합니다.