diff --git a/BizHawk.Client.EmuHawk/Sound/Utilities/SoundOutputProvider.cs b/BizHawk.Client.EmuHawk/Sound/Utilities/SoundOutputProvider.cs index bdc5c7bf88..b0fdf44da4 100644 --- a/BizHawk.Client.EmuHawk/Sound/Utilities/SoundOutputProvider.cs +++ b/BizHawk.Client.EmuHawk/Sound/Utilities/SoundOutputProvider.cs @@ -32,19 +32,19 @@ namespace BizHawk.Client.EmuHawk private const int MinResamplingDistanceSamples = 3; private Queue _buffer = new Queue(); - private bool _standaloneMode; - private int _targetExtraSamples; + private readonly bool _standaloneMode; + private readonly int _targetExtraSamples; private int _maxSamplesDeficit; - private Queue _extraCountHistory = new Queue(); - private Queue _outputCountHistory = new Queue(); - private Queue _hardCorrectionHistory = new Queue(); + private readonly Queue _extraCountHistory = new Queue(); + private readonly Queue _outputCountHistory = new Queue(); + private readonly Queue _hardCorrectionHistory = new Queue(); private int _baseConsecutiveEmptyFrames; - private Queue _baseEmptyFrameCorrectionHistory = new Queue(); + private readonly Queue _baseEmptyFrameCorrectionHistory = new Queue(); private double _lastAdvertisedSamplesPerFrame; - private Queue _baseSamplesPerFrame = new Queue(); + private readonly Queue _baseSamplesPerFrame = new Queue(); private short[] _outputBuffer = new short[0]; @@ -59,6 +59,7 @@ namespace BizHawk.Client.EmuHawk const double targetExtraMs = 10.0; _targetExtraSamples = (int)Math.Ceiling(targetExtraMs * SampleRate / 1000.0); } + ResetBuffer(); } @@ -73,10 +74,7 @@ namespace BizHawk.Client.EmuHawk } } - private int EffectiveMaxSamplesDeficit - { - get { return _maxSamplesDeficit + _targetExtraSamples; } - } + private int EffectiveMaxSamplesDeficit => _maxSamplesDeficit + _targetExtraSamples; public ISoundProvider BaseSoundProvider { get; set; } @@ -168,6 +166,7 @@ namespace BizHawk.Client.EmuHawk { _buffer.Enqueue(0); } + hardCorrected = true; } else if (extraSampleCount > maxSamplesSurplus) @@ -178,6 +177,7 @@ namespace BizHawk.Client.EmuHawk { _buffer.Dequeue(); } + hardCorrected = true; } @@ -226,6 +226,7 @@ namespace BizHawk.Client.EmuHawk { _baseConsecutiveEmptyFrames = 0; } + UpdateHistory(_baseEmptyFrameCorrectionHistory, correctedEmptyFrame, MaxHistoryLength); if (AdvertisedSamplesPerFrame != _lastAdvertisedSamplesPerFrame) @@ -233,6 +234,7 @@ namespace BizHawk.Client.EmuHawk _baseSamplesPerFrame.Clear(); _lastAdvertisedSamplesPerFrame = AdvertisedSamplesPerFrame; } + UpdateHistory(_baseSamplesPerFrame, count, BaseSampleRateMaxHistoryLength); if (_baseSamplesPerFrame.Count >= BaseSampleRateUsableHistoryLength && @@ -303,6 +305,7 @@ namespace BizHawk.Client.EmuHawk { _outputBuffer = new short[count * ChannelCount]; } + return _outputBuffer; } @@ -312,6 +315,7 @@ namespace BizHawk.Client.EmuHawk { _resampleBuffer = new short[count * ChannelCount]; } + return _resampleBuffer; }