첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestProject.zip
5.28MB

▶ Program.cs

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
    }
}
728x90
반응형
그리드형
Posted by 사용자 icodebroker

댓글을 달아 주세요