diff --git a/BizHawk.MultiClient/Sound.cs b/BizHawk.MultiClient/Sound.cs index cce0d02727..cc84205f6a 100644 --- a/BizHawk.MultiClient/Sound.cs +++ b/BizHawk.MultiClient/Sound.cs @@ -5,59 +5,59 @@ using SlimDX.Multimedia; namespace BizHawk.MultiClient { - public class Sound : IDisposable - { - public bool Muted = false; - private bool disposed = false; + public class Sound : IDisposable + { + public bool Muted = false; + private bool disposed = false; - private SecondarySoundBuffer DSoundBuffer; - private byte[] SoundBuffer; - private const int BufferSize = 4410 * 2 * 2; // 1/10th of a second, 2 bytes per sample, 2 channels; - //private int SoundBufferPosition; //TODO: use this + private SecondarySoundBuffer DSoundBuffer; + private byte[] SoundBuffer; + private const int BufferSize = 4410 * 2 * 2; // 1/10th of a second, 2 bytes per sample, 2 channels; + //private int SoundBufferPosition; //TODO: use this bool needDiscard; - private BufferedAsync semisync = new BufferedAsync(); - - public Sound(IntPtr handle, DirectSound device) - { - device.SetCooperativeLevel(handle, CooperativeLevel.Priority); + private BufferedAsync semisync = new BufferedAsync(); - var format = new WaveFormat(); - format.SamplesPerSecond = 44100; - format.BitsPerSample = 16; - format.Channels = 2; - format.FormatTag = WaveFormatTag.Pcm; - format.BlockAlignment = 4; - format.AverageBytesPerSecond = format.SamplesPerSecond * format.Channels * (format.BitsPerSample / 8); + public Sound(IntPtr handle, DirectSound device) + { + device.SetCooperativeLevel(handle, CooperativeLevel.Priority); - var desc = new SoundBufferDescription(); - desc.Format = format; - desc.Flags = BufferFlags.GlobalFocus | BufferFlags.Software | BufferFlags.GetCurrentPosition2 | BufferFlags.ControlVolume; - desc.SizeInBytes = BufferSize; - DSoundBuffer = new SecondarySoundBuffer(device, desc); - ChangeVolume(Global.Config.SoundVolume); - SoundBuffer = new byte[BufferSize]; - - disposed = false; - } + var format = new WaveFormat(); + format.SamplesPerSecond = 44100; + format.BitsPerSample = 16; + format.Channels = 2; + format.FormatTag = WaveFormatTag.Pcm; + format.BlockAlignment = 4; + format.AverageBytesPerSecond = format.SamplesPerSecond * format.Channels * (format.BitsPerSample / 8); - public void StartSound() - { - if (disposed) throw new ObjectDisposedException("Sound"); - if (Global.Config.SoundEnabled == false) return; + var desc = new SoundBufferDescription(); + desc.Format = format; + desc.Flags = BufferFlags.GlobalFocus | BufferFlags.Software | BufferFlags.GetCurrentPosition2 | BufferFlags.ControlVolume; + desc.SizeInBytes = BufferSize; + DSoundBuffer = new SecondarySoundBuffer(device, desc); + ChangeVolume(Global.Config.SoundVolume); + SoundBuffer = new byte[BufferSize]; - if(IsPlaying) + disposed = false; + } + + public void StartSound() + { + if (disposed) throw new ObjectDisposedException("Sound"); + if (Global.Config.SoundEnabled == false) return; + + if (IsPlaying) return; needDiscard = true; - DSoundBuffer.Write(SoundBuffer, 0, LockFlags.EntireBuffer); - DSoundBuffer.CurrentPlayPosition = 0; - DSoundBuffer.Play(0, PlayFlags.Looping); - } + DSoundBuffer.Write(SoundBuffer, 0, LockFlags.EntireBuffer); + DSoundBuffer.CurrentPlayPosition = 0; + DSoundBuffer.Play(0, PlayFlags.Looping); + } bool IsPlaying - { + { get { if (DSoundBuffer == null) return false; @@ -67,31 +67,31 @@ namespace BizHawk.MultiClient } public void StopSound() - { - if(!IsPlaying) + { + if (!IsPlaying) return; - for (int i = 0; i < SoundBuffer.Length; i++) - SoundBuffer[i] = 0; - DSoundBuffer.Write(SoundBuffer, 0, LockFlags.EntireBuffer); - DSoundBuffer.Stop(); - } + for (int i = 0; i < SoundBuffer.Length; i++) + SoundBuffer[i] = 0; + DSoundBuffer.Write(SoundBuffer, 0, LockFlags.EntireBuffer); + DSoundBuffer.Stop(); + } - public void Dispose() - { - if (disposed) return; - if (DSoundBuffer != null && DSoundBuffer.Disposed == false) - { - DSoundBuffer.Dispose(); - DSoundBuffer = null; - } - } + public void Dispose() + { + if (disposed) return; + if (DSoundBuffer != null && DSoundBuffer.Disposed == false) + { + DSoundBuffer.Dispose(); + DSoundBuffer = null; + } + } static int circularDist(int from, int to, int size) { - if(size == 0) + if (size == 0) return 0; int diff = (to - from); - while(diff < 0) + while (diff < 0) diff += size; return diff; } @@ -105,25 +105,25 @@ namespace BizHawk.MultiClient int curToWrite = circularDist(soundoffset, writecursor, BufferSize); int curToPlay = circularDist(soundoffset, playcursor, BufferSize); - if(curToWrite < curToPlay) + if (curToWrite < curToPlay) return 0; // in-between the two cursors. we shouldn't write anything during this time. return curToPlay / 4; } - public void UpdateSound(ISoundProvider soundProvider) - { + public void UpdateSound(ISoundProvider soundProvider) + { if (Global.Config.SoundEnabled == false || disposed) { soundProvider.DiscardSamples(); return; } - int samplesNeeded = SNDDXGetAudioSpace()*2; + int samplesNeeded = SNDDXGetAudioSpace() * 2; if (samplesNeeded == 0) return; - short[] samples = new short[samplesNeeded]; + short[] samples = new short[samplesNeeded]; //Console.WriteLine(samplesNeeded/2); if (soundProvider != null && Muted == false) @@ -144,39 +144,36 @@ namespace BizHawk.MultiClient cursor = 0; } - DSoundBuffer.Write(SoundBuffer, 0, LockFlags.EntireBuffer); + DSoundBuffer.Write(SoundBuffer, 0, LockFlags.EntireBuffer); soundoffset += samplesNeeded * 2; soundoffset %= BufferSize; - } + } - /// - /// Range: 0-100 - /// - /// - public void ChangeVolume(int vol) - { - if (vol > 100) - vol = 100; - if (vol < 0) - vol = 0; - if (Global.Config.SoundEnabled) - UpdateSoundSettings(); - else - DSoundBuffer.Volume = 0 - ((100 - Global.Config.SoundVolume) * 50); - - } + /// + /// Range: 0-100 + /// + /// + public void ChangeVolume(int vol) + { + if (vol > 100) + vol = 100; + if (vol < 0) + vol = 0; + Global.Config.SoundVolume = vol; + UpdateSoundSettings(); + } - /// - /// Uses Global.Config.SoundEnabled, this just notifies the object to read it - /// - public void UpdateSoundSettings() - { - int vol = Global.Config.SoundVolume; - if (Global.Config.SoundEnabled) - vol = -5000; - DSoundBuffer.Volume = 0 - ((100 - Global.Config.SoundVolume) * 50); - - } - } + /// + /// Uses Global.Config.SoundEnabled, this just notifies the object to read it + /// + public void UpdateSoundSettings() + { + int vol = Global.Config.SoundVolume; + if (!Global.Config.SoundEnabled || Global.Config.SoundVolume == 0) + DSoundBuffer.Volume = -5000; + else + DSoundBuffer.Volume = 0 - ((100 - Global.Config.SoundVolume) * 15); + } + } } \ No newline at end of file