using QuartzTypeLib;
using System;
using System.Windows.Forms;
namespace LYFZ.Software.MainBusiness.CallerWizard
{
    public class Audio : Form
	{
		private const int WM_APP = 32768;
		private const int WM_GRAPHNOTIFY = 32769;
		private const int EC_COMPLETE = 1;
		private int mediaStatus;
		private double mediaDuration;
		private double mediaCurPos;
		private int mediaVolum;
		private FilgraphManager objMedia;
		private IBasicAudio volMedia;
		private IMediaControl ctlMedia;
		private IMediaPosition posMedia;
		private IMediaEventEx eexMedia;
		public int MediaStatus
		{
			get
			{
				return this.mediaStatus;
			}
		}
		public int MediaDuration
		{
			get
			{
				return (int)this.mediaDuration;
			}
		}
		public int MediaCurPos
		{
			get
			{
				if (this.posMedia != null)
				{
					this.mediaCurPos = this.posMedia.CurrentPosition;
				}
				return (int)this.mediaCurPos;
			}
		}
		public string MediaDuration2
		{
			get
			{
				return this.getLengthWithFormat((int)this.mediaDuration);
			}
		}
		public string MediaCurPos2
		{
			get
			{
				if (this.posMedia != null)
				{
					this.mediaCurPos = this.posMedia.CurrentPosition;
				}
				return this.getLengthWithFormat((int)this.mediaCurPos);
			}
		}
		public int MediaVol
		{
			get
			{
				return this.mediaVolum / 50;
			}
			set
			{
				this.mediaVolum = value * 50;
				if (this.volMedia != null)
				{
					this.volMedia.Volume = this.mediaVolum;
				}
			}
		}
		private void clearUp()
		{
			if (this.ctlMedia != null)
			{
				this.ctlMedia.Stop();
			}
			this.mediaStatus = 1;
			this.mediaDuration = 0.0;
			this.mediaCurPos = 0.0;
			if (this.eexMedia != null)
			{
				this.eexMedia.SetNotifyWindow(0, 0, 0);
			}
			if (this.ctlMedia != null)
			{
				this.ctlMedia = null;
			}
			if (this.volMedia != null)
			{
				this.volMedia = null;
			}
			if (this.posMedia != null)
			{
				this.posMedia = null;
			}
			if (this.eexMedia != null)
			{
				this.eexMedia = null;
			}
			if (this.objMedia != null)
			{
				this.objMedia = null;
			}
		}
		public void CloseMedia()
		{
			this.clearUp();
		}
		public void RenderMedia(string mediaFileName, bool run)
		{
			this.clearUp();
            try
            {
                this.objMedia = new QuartzTypeLib.FilgraphManager(); 
                this.objMedia.RenderFile(mediaFileName);
                this.volMedia = (this.objMedia as IBasicAudio);
                this.posMedia = (this.objMedia as IMediaPosition);
                this.ctlMedia = this.objMedia;
                this.eexMedia = (this.objMedia as IMediaEventEx);
                this.eexMedia.SetNotifyWindow((int)base.Handle, 32769, 0);
                this.mediaStatus = 1;
                this.mediaDuration = this.posMedia.Duration;
                this.volMedia.Volume = this.mediaVolum;
                if (run)
                {
                    this.Play();
                }
            }
            catch
            {
               // MessageBoxCustom.Show("�޷��ҵ������ļ�!");
                return;
                //this.clearUp();

            }
		}
		public void Play()
		{
			this.ctlMedia.Run();
			this.mediaStatus = 3;
		}
		public void Pause()
		{
			this.ctlMedia.Pause();
			this.mediaStatus = 2;
		}
		public void Stop()
		{
			this.ctlMedia.Stop();
			this.posMedia.CurrentPosition = 0.0;
			this.mediaStatus = 1;
		}
		public void Seek(int posTar)
		{
			this.posMedia.CurrentPosition = (double)posTar;
		}
		protected override void WndProc(ref Message m)
		{
			if (m.Msg == 32769)
			{
				try
				{
					while (true)
					{
						int lEventCode;
						int lParam;
						int lParam2;
						this.eexMedia.GetEvent(out lEventCode, out lParam, out lParam2, 0);
						this.eexMedia.FreeEventParams(lEventCode, lParam, lParam2);
						if (lEventCode == 1)
						{
							this.ctlMedia.Stop();
							this.posMedia.CurrentPosition = 0.0;
							this.mediaStatus = 1;
						}
					}
				}
				catch (Exception)
				{
				}
			}
			base.WndProc(ref m);
		}
		private string getLengthWithFormat(int len)
		{
			int nh = len / 3600;
			int nm = (len - nh * 3600) / 60;
			int ns = len - (nh * 3600 + nm * 60);
			return string.Format("{0:D2}:{1:D2}:{2:D2}", nh, nm, ns);
		}
	}
}