A bit more sound cleanup.
This commit is contained in:
parent
84480e4235
commit
a33a8252ff
|
@ -14,29 +14,27 @@ namespace BizHawk.Client.EmuHawk
|
||||||
public const int BlockAlign = BytesPerSample * ChannelCount;
|
public const int BlockAlign = BytesPerSample * ChannelCount;
|
||||||
|
|
||||||
private bool _disposed;
|
private bool _disposed;
|
||||||
private ISoundOutput _soundOutput;
|
private readonly ISoundOutput _outputDevice;
|
||||||
|
private readonly SoundOutputProvider _outputProvider = new SoundOutputProvider();
|
||||||
|
private readonly BufferedAsync _bufferedAsync = new BufferedAsync();
|
||||||
private ISoundProvider _sourceProvider;
|
private ISoundProvider _sourceProvider;
|
||||||
private SyncSoundMode _syncMode;
|
private SyncSoundMode _syncMode;
|
||||||
|
|
||||||
private SoundOutputProvider _outputProvider = new SoundOutputProvider();
|
|
||||||
private readonly BufferedAsync _semiSync = new BufferedAsync();
|
|
||||||
|
|
||||||
public Sound(IntPtr mainWindowHandle)
|
public Sound(IntPtr mainWindowHandle)
|
||||||
{
|
{
|
||||||
#if WINDOWS
|
#if WINDOWS
|
||||||
if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.DirectSound)
|
if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.DirectSound)
|
||||||
_soundOutput = new DirectSoundSoundOutput(this, mainWindowHandle);
|
_outputDevice = new DirectSoundSoundOutput(this, mainWindowHandle);
|
||||||
|
|
||||||
if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.XAudio2)
|
if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.XAudio2)
|
||||||
_soundOutput = new XAudio2SoundOutput(this);
|
_outputDevice = new XAudio2SoundOutput(this);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.OpenAL)
|
if (Global.Config.SoundOutputMethod == Config.ESoundOutputMethod.OpenAL)
|
||||||
_soundOutput = new OpenALSoundOutput(this);
|
_outputDevice = new OpenALSoundOutput(this);
|
||||||
|
|
||||||
if (_soundOutput == null)
|
if (_outputDevice == null)
|
||||||
_soundOutput = new DummySoundOutput(this);
|
_outputDevice = new DummySoundOutput(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
@ -45,8 +43,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
|
|
||||||
StopSound();
|
StopSound();
|
||||||
|
|
||||||
_soundOutput.Dispose();
|
_outputDevice.Dispose();
|
||||||
_soundOutput = null;
|
|
||||||
|
|
||||||
_disposed = true;
|
_disposed = true;
|
||||||
}
|
}
|
||||||
|
@ -59,11 +56,11 @@ namespace BizHawk.Client.EmuHawk
|
||||||
if (!Global.Config.SoundEnabled) return;
|
if (!Global.Config.SoundEnabled) return;
|
||||||
if (IsStarted) return;
|
if (IsStarted) return;
|
||||||
|
|
||||||
_soundOutput.StartSound();
|
_outputDevice.StartSound();
|
||||||
|
|
||||||
_outputProvider.MaxSamplesDeficit = _soundOutput.MaxSamplesDeficit;
|
_outputProvider.MaxSamplesDeficit = _outputDevice.MaxSamplesDeficit;
|
||||||
|
|
||||||
Global.SoundMaxBufferDeficitMs = (int)Math.Ceiling(SamplesToMilliseconds(_soundOutput.MaxSamplesDeficit));
|
Global.SoundMaxBufferDeficitMs = (int)Math.Ceiling(SamplesToMilliseconds(_outputDevice.MaxSamplesDeficit));
|
||||||
|
|
||||||
IsStarted = true;
|
IsStarted = true;
|
||||||
}
|
}
|
||||||
|
@ -72,10 +69,10 @@ namespace BizHawk.Client.EmuHawk
|
||||||
{
|
{
|
||||||
if (!IsStarted) return;
|
if (!IsStarted) return;
|
||||||
|
|
||||||
_soundOutput.StopSound();
|
_outputDevice.StopSound();
|
||||||
|
|
||||||
_outputProvider.DiscardSamples();
|
_outputProvider.DiscardSamples();
|
||||||
_semiSync.DiscardSamples();
|
_bufferedAsync.DiscardSamples();
|
||||||
|
|
||||||
Global.SoundMaxBufferDeficitMs = 0;
|
Global.SoundMaxBufferDeficitMs = 0;
|
||||||
|
|
||||||
|
@ -92,8 +89,8 @@ namespace BizHawk.Client.EmuHawk
|
||||||
_outputProvider.DiscardSamples();
|
_outputProvider.DiscardSamples();
|
||||||
_outputProvider.BaseSoundProvider = null;
|
_outputProvider.BaseSoundProvider = null;
|
||||||
|
|
||||||
_semiSync.DiscardSamples();
|
_bufferedAsync.DiscardSamples();
|
||||||
_semiSync.BaseSoundProvider = null;
|
_bufferedAsync.BaseSoundProvider = null;
|
||||||
|
|
||||||
_sourceProvider = source;
|
_sourceProvider = source;
|
||||||
if (_sourceProvider == null)
|
if (_sourceProvider == null)
|
||||||
|
@ -108,8 +105,8 @@ namespace BizHawk.Client.EmuHawk
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_semiSync.BaseSoundProvider = _sourceProvider;
|
_bufferedAsync.BaseSoundProvider = _sourceProvider;
|
||||||
_semiSync.RecalculateMagic(Global.Emulator.CoreComm.VsyncRate);
|
_bufferedAsync.RecalculateMagic(Global.Emulator.CoreComm.VsyncRate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +133,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
{
|
{
|
||||||
int samplesPerFrame = (int)Math.Round(SampleRate / Global.Emulator.CoreComm.VsyncRate);
|
int samplesPerFrame = (int)Math.Round(SampleRate / Global.Emulator.CoreComm.VsyncRate);
|
||||||
int silenceSamples = Math.Max(samplesNeeded - (SilenceLeaveRoomForFrameCount * samplesPerFrame), 0);
|
int silenceSamples = Math.Max(samplesNeeded - (SilenceLeaveRoomForFrameCount * samplesPerFrame), 0);
|
||||||
_soundOutput.WriteSamples(new short[silenceSamples * 2], silenceSamples);
|
_outputDevice.WriteSamples(new short[silenceSamples * 2], silenceSamples);
|
||||||
samplesNeeded -= silenceSamples;
|
samplesNeeded -= silenceSamples;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,10 +162,10 @@ namespace BizHawk.Client.EmuHawk
|
||||||
|
|
||||||
if (atten < 0) atten = 0;
|
if (atten < 0) atten = 0;
|
||||||
if (atten > 1) atten = 1;
|
if (atten > 1) atten = 1;
|
||||||
_soundOutput.ApplyVolumeSettings(atten);
|
_outputDevice.ApplyVolumeSettings(atten);
|
||||||
|
|
||||||
short[] samples;
|
short[] samples;
|
||||||
int samplesNeeded = _soundOutput.CalculateSamplesNeeded();
|
int samplesNeeded = _outputDevice.CalculateSamplesNeeded();
|
||||||
int samplesProvided;
|
int samplesProvided;
|
||||||
|
|
||||||
if (atten == 0)
|
if (atten == 0)
|
||||||
|
@ -188,7 +185,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
while (samplesNeeded < samplesProvided && !Global.DisableSecondaryThrottling)
|
while (samplesNeeded < samplesProvided && !Global.DisableSecondaryThrottling)
|
||||||
{
|
{
|
||||||
Thread.Sleep((samplesProvided - samplesNeeded) / (SampleRate / 1000)); // Let the audio clock control sleep time
|
Thread.Sleep((samplesProvided - samplesNeeded) / (SampleRate / 1000)); // Let the audio clock control sleep time
|
||||||
samplesNeeded = _soundOutput.CalculateSamplesNeeded();
|
samplesNeeded = _outputDevice.CalculateSamplesNeeded();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -204,7 +201,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
{
|
{
|
||||||
samples = new short[samplesNeeded * ChannelCount];
|
samples = new short[samplesNeeded * ChannelCount];
|
||||||
|
|
||||||
_semiSync.GetSamplesAsync(samples);
|
_bufferedAsync.GetSamplesAsync(samples);
|
||||||
|
|
||||||
samplesProvided = samplesNeeded;
|
samplesProvided = samplesNeeded;
|
||||||
}
|
}
|
||||||
|
@ -213,7 +210,7 @@ namespace BizHawk.Client.EmuHawk
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_soundOutput.WriteSamples(samples, samplesProvided);
|
_outputDevice.WriteSamples(samples, samplesProvided);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int MillisecondsToSamples(int milliseconds)
|
public static int MillisecondsToSamples(int milliseconds)
|
||||||
|
|
Loading…
Reference in New Issue