using System; using System.Runtime.InteropServices; using System.Security; using System.Windows; using System.Windows.Controls; using Jellyfish.Library; namespace Jellyfish.Virtu.Services { public sealed class WpfAudioService : AudioService { [SecurityCritical] public WpfAudioService(Machine machine, UserControl page) : base(machine) { if (page == null) { throw new ArgumentNullException("page"); } _directSound = new DirectSound(SampleRate, SampleChannels, SampleBits, SampleSize, OnDirectSoundUpdate); page.Loaded += (sender, e) => { var window = Window.GetWindow(page); _directSound.Start(window.GetHandle()); window.Closed += (_sender, _e) => _directSound.Stop(); }; } public override void SetVolume(float volume) { _directSound.SetVolume(volume); } protected override void Dispose(bool disposing) { if (disposing) { _directSound.Dispose(); } base.Dispose(disposing); } private void OnDirectSoundUpdate(IntPtr buffer, int bufferSize) // audio thread { //if (_count++ % (1000 / SampleLatency) == 0) //{ // DebugService.WriteLine("OnDirectSoundUpdate"); //} Marshal.Copy(Source, 0, buffer, bufferSize); Update(); } private DirectSound _directSound; //private int _count; } }