using System; using System.Collections.Generic; using System.Text; using QuartzTypeLib; using System.Runtime.InteropServices; namespace Rmake.Sound { public class SoundBuffer { private FilgraphManager filegraphManager = new FilgraphManager(); private bool repeat = false; private bool endRelease = true; private SoundManager manager = null; public SoundBuffer() { } internal SoundManager Manager { set { manager = value; } get { return manager; } } public double CurrentPosition { set { IMediaPosition mp = null; mp = filegraphManager as IMediaPosition; mp.CurrentPosition = value; } get { IMediaPosition mp = null; mp = filegraphManager as IMediaPosition; return mp.CurrentPosition; } } public double Rate { set { IMediaPosition mp = null; mp = filegraphManager as IMediaPosition; mp.Rate = value; } get { IMediaPosition mp = null; mp = filegraphManager as IMediaPosition; return mp.Rate; } } public int Volume { set { IBasicAudio ba = null; ba = filegraphManager as IBasicAudio; ba.Volume = value; } get { IBasicAudio ba = null; ba = filegraphManager as IBasicAudio; return ba.Volume; } } public bool EndRelease { set { endRelease = value; if (endRelease) { repeat = false; } } get { return endRelease; } } public bool Repeat { set { repeat = value; if (repeat) endRelease = false; } get { return repeat; } } public void Open(string fileName) { filegraphManager.RenderFile(fileName); //IMediaControl mc = null; //IBasicAudio ba = null; CurrentPosition = 0.0; Rate = 1.0; } public void Play() { IMediaControl mc = null; mc = filegraphManager as IMediaControl; mc.Run(); } public void Stop() { IMediaControl mc = null; mc = filegraphManager as IMediaControl; mc.Stop(); } public void Poll() { if (Repeat || EndRelease) { int lEventCode; int lParam1, lParam2; while (true) { try { IMediaEvent me = null; me = filegraphManager as IMediaEvent; me.GetEvent(out lEventCode, out lParam1, out lParam2, 0); me.FreeEventParams(lEventCode, lParam1, lParam2); if (lEventCode == 0x01/*EC_COMPLETE*/) { if (Repeat) { CurrentPosition = 0.0; Play(); } else if (EndRelease) { manager.DeleteSoundBuffer(this); manager = null; } } } catch (Exception) { break; } } } } } }