본문 바로가기
C# /SmartClient

SmartClient를 이용한 간단한 Wav 파일 재생기 제작 - 1. WAV 파일 재생기 Window Control Library 제작

by Hwoarang757 2013. 1. 28.

죄송합니다 상당히 형편없이 만든 수준낮은 예제입니다. 근거 없는 자신감으로 올려봅니다 -_-; 

------------------------- 순     서 -------------------------

1. WAV 파일 재생기 Window Control Library 제작

2. 예제 웹사이트에 Object 태그를 이용한 Dll 파일 Embed

3. CAS(Code Access Security) 보안 설정 프로그램 배포 및 설치

 

 1. Window Control Library 제작

제작목적 - 현재 운영하는 웹사이트에서 서버에서 WAV 파일을 다운로드 하는 ActiveX모듈은 구현이 되어있으나

웹에서 직접 클라이언트로 직접 다운로드한 wav파일을 웹 페이지에서 재생을 해보고자 -_-;; 

방법을 찾아보니 c# 에서 쉽게 Wav형식의 파일을 재생할 수 있는 System.Media.SoundPlayer의 클래스의 예제를 보았으나

다른부분은 전혀 문제가 없어보였지만 계획했던 TrackBar를 이용해 시간조정(Duration) 재생이 어렵다고 느껴졌다 . 

Duration ( 시간조정 ) 을 자유롭게 조정하며 원하는 부분을 재생하며 재생시간을 표시해주는 방법이 뭐가 있을까 ?

찾다보니 DirectX SDK를 설치하면 .NET 컴포넌트에서 참조 추가를 할수 있는  Microsoft.DirectX.AudioVideoPlayback 의 개체 였다.

프로퍼티를 통해 쉽게 재생시간을 알수 있었으며 시간 조정 재생도 메소드를 제공해 쉽게 구현이 가능해 보였다.

System.Windows.Forms.Timer를 이용한 단일스레드로 구현....

 1-(1) 새 프로젝트 - 클래스라이브러리 생성 - 사용자 정의 컨트롤을 추가하였다.

컨트롤의 배치도는 이렇다 ( 너무 허접함 -_-);

 

1-(2) 소스와 이벤트  -

Lable - lblFileName -> 재생 파일 명 표시

           lblAddDurationTime -> 현재 재생시간 표시

           lblDurationAllTime -> wav 파일의 총 재생시간표시

TrackBar - trackBarDuartion -> wav 파일의 재생간격 조정  

Button -> btnPlay -> wav 재생

               btnPause -> wav 재생 일시정지

               btnStop  -> wav 재생 정지

-------------------------------------------------------------------------------------------------------------------------

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Text;

using System.Windows.Forms;

//참조 추가 - .NET -> Microsoft.DirectX.AudioVideoPlayback 추가

using Microsoft.DirectX;

using Microsoft.DirectX.AudioVideoPlayback;

using Timer = System.Windows.Forms.Timer;

using System.IO;

 

namespace SmartClient_AudioPlayer

{

    public partial class SoundPlayer : UserControl

    {

        //Directx.AudioVideoPlayBack 오디오플레이어 인스턴스

        Audio player;

        public SoundPlayer()

        {

            InitializeComponent();

        }

        /// <summary>

        /// Wav 파일의 파일 경로를 받아 재생을 시작한다.

        /// </summary>

        /// <param name="FilePath"></param>

        public void WavPlay(string FilePath)

        {

            lblAddDurationTime.Text = "";

            if (!File.Exists(FilePath))

            {

             MessageBox.Show("파일이 없습니다");                return;

            }

            FileInfo fi = new FileInfo(FilePath);

            //파일네임을 표시해준다.

            lblFileName.Text = fi.Name.ToString();

            player = new Audio(FilePath, false);

            Double playDuration = player.Duration;

            DateTime allDuationTime = new DateTime();

            allDuationTime = allDuationTime.AddSeconds(playDuration);

            // 시간을 구해준다.

            lblDurationAllTime.Text = allDuationTime.ToString("HH:mm:ss");

            trackBarDuration.SetRange(0, int.Parse(Math.Truncate((playDuration + 1)).ToString()));

            //0초부터 재생한다.

            AudioPlay(0);

        }

        /// <summary>

        /// 재생을 중지하고 모든 사용중인 자원을 Dispose 한다.

        /// </summary>

        public void WavPlayStop()

        {

            foreach (Control control in this.Controls)

            {

                control.Dispose();

            }

            this.Dispose();

        }

        /// <summary>

        /// 폼이 로드되었을때 이벤트이다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void SoundPlayer_Load(object sender, EventArgs e)

        {

        }

        /// <summary>

        /// 재생 하고자 하는 (Second) 값을 받아 해당부분부터 재생하도록 한다.

        /// </summary>

        /// <param name="durationStartValue"></param>

        private void AudioPlay(int durationStartValue)

        {

            //스크롤이 움직인곳에서 다시 포인트를 움직이기 시작한다.

            trackBarDuration.Value = durationStartValue;

            timer.Enabled = true;

            timer.Interval = 1000;

            //TrackBar 움직이기 시작한다.

            timer.Start();

            //Wave 파일 재생을 시작한다.

            if (player.Playing)

            {

                player.CurrentPosition = Double.Parse(durationStartValue.ToString());

            }

            else

            {

                player.CurrentPosition = Double.Parse(durationStartValue.ToString());

                player.Play();

            }

        }

        /// <summary>

        /// 타이머의 Tick 이벤트가 1초씩 발생할때마다 Label 시간증가와 트랙바의 Value 증가시켜준다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        public void timer_Tick(object sender, EventArgs e)

        {

            DateTime DurationTime = new DateTime();

            DurationTime = DurationTime.AddSeconds(Double.Parse(trackBarDuration.Value.ToString()));

            lblAddDurationTime.Text = DurationTime.ToString("HH:mm:ss");

            trackBarDuration.Value = trackBarDuration.Value + 1;

        }

        /// <summary>

        /// Duration TrackBar 값이 변경될때마다 이벤트가 발생한다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void trackBarDuration_ValueChanged(object sender, EventArgs e)

        {

            if (trackBarDuration.Maximum <= trackBarDuration.Value)

            {

                timer.Stop();

            }

        }

        /// <summary>

        /// Duration TrackBar  스크롤을 제어할때마다 이벤트가 발생한다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void trackBarDuration_Scroll(object sender, EventArgs e)

        {

            AudioPlay(trackBarDuration.Value);

        }

        /// <summary>

        /// Wav 파일의 재생을 시작한다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnPlay_Click(object sender, EventArgs e)

        {

            player.Play();

            timer.Start();

        }

        /// <summary>

        /// Wav파일의  재생을 일시 중지한다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnPause_Click(object sender, EventArgs e)

        {

            player.Pause();

            timer.Stop();

            timer.Enabled = false;

        }

        /// <summary>

        /// Wav 파일 재생을 중지 한다.

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void btnStop_Click(object sender, EventArgs e)

        {

            player.Stop();

            timer.Stop();

            timer.Enabled = false;

            trackBarDuration.Value = trackBarDuration.Minimum;

        }

    }

}

 

빌드가 완료 되면 Dll(Dynamic Linking Library) 가 생성된다.

-------------------------------------------------------------------------------------------------------------------------

* 웹서버에서 해당 메소드에 접근하려면

AssemblyInfo.cs 중 아래 부분을 수정해야한다.

// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
// 해당 형식에 대해 ComVisible 특성을 true로 설정하십시오.
[assembly: ComVisible(true)]

로 설정해야 웹서버에서 해당 메소드 호출이 가능하다.