using System;
using System.IO;
using NAudio.Wave;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Field
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region Field
/// <summary>
/// 파일 경로
/// </summary>
private static string _filePath = "sample.mp3";
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
////////////////////////////////////////////////////////////////////// Event
#region 다이렉트 사운드 출력 재생 중단시 처리하기 - directSoundOut_PlaybackStopped(sender, e)
/// <summary>
/// 다이렉트 사운드 출력 재생 중단시 처리하기
/// </summary>
/// <param name="sender">이벤트 발생자</param>
/// <param name="e">이벤트 인자</param>
private static void directSoundOut_PlaybackStopped(object sender, StoppedEventArgs e)
{
DirectSoundOut directSoundOut = sender as DirectSoundOut;
PlaySound(directSoundOut, _filePath);
}
#endregion
////////////////////////////////////////////////////////////////////// Function
#region 사운드 재생하기 - PlaySound(directSoundOut, filePath)
/// <summary>
/// 사운드 재생하기
/// </summary>
/// <param name="directSoundOut">다이렉트 사운드 출력</param>
/// <param name="filePath">파일 경로</param>
private static void PlaySound(DirectSoundOut directSoundOut, string filePath)
{
MemoryStream memoryStream = new MemoryStream();
using(FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
byte[] bufferByteArray = new byte[32768];
int byteCountRead;
while((byteCountRead = fileStream.Read(bufferByteArray, 0, bufferByteArray.Length)) > 0)
{
memoryStream.Write(bufferByteArray, 0, byteCountRead);
}
}
memoryStream.Position = 0;
BlockAlignReductionStream blockAlignReductionStream;
if(filePath.EndsWith(".mp3"))
{
WaveStream waveStream = WaveFormatConversionStream.CreatePcmStream(new Mp3FileReader(memoryStream));
blockAlignReductionStream = new BlockAlignReductionStream(waveStream);
}
else if(filePath.EndsWith(".wav"))
{
WaveStream waveStream = new WaveChannel32(new WaveFileReader(memoryStream));
blockAlignReductionStream = new BlockAlignReductionStream(waveStream);
}
else
{
throw new InvalidOperationException("Not a correct audio file type");
}
directSoundOut.Init(blockAlignReductionStream);
directSoundOut.Play();
}
#endregion
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
DirectSoundOut directSoundOut = new DirectSoundOut();
directSoundOut.PlaybackStopped += directSoundOut_PlaybackStopped;
PlaySound(directSoundOut, _filePath);
Console.WriteLine("프로그램을 종료하기 위해서 아무 키나 눌러 주시기 바랍니다.");
Console.ReadKey(true);
}
#endregion
}
}