diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/AY_3_8910_SGM.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/AY_3_8910_SGM.cs index dda3520cae..ae9ce5d00f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/AY_3_8910_SGM.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/AY_3_8910_SGM.cs @@ -8,7 +8,6 @@ namespace BizHawk.Emulation.Cores.ColecoVision { public sealed class AY_3_8910_SGM { - public short[] _sampleBuffer = new short[4096]; private short current_sample; public AY_3_8910_SGM() @@ -31,18 +30,11 @@ namespace BizHawk.Emulation.Cores.ColecoVision Register[i] = 0x0000; } sync_psg_state(); - DiscardSamples(); } - public void DiscardSamples() + public short Sample() { - _sampleClock = 0; - } - - public void Sample() - { - _sampleBuffer[_sampleClock] = current_sample; - _sampleClock++; + return current_sample; } private static readonly int[] VolumeTable = @@ -51,10 +43,6 @@ namespace BizHawk.Emulation.Cores.ColecoVision 0x03C5, 0x0555, 0x078B, 0x0AAB, 0x0F16, 0x1555, 0x1E2B, 0x2AAA }; - private int _sampleClock; - - private int TotalExecutedCycles; - private int PendingCycles; private int psg_clock; private int sq_per_A, sq_per_B, sq_per_C; private int clock_A, clock_B, clock_C; @@ -79,8 +67,6 @@ namespace BizHawk.Emulation.Cores.ColecoVision ser.BeginSection("PSG"); ser.Sync("Register", ref Register, false); - ser.Sync("Toal_executed_cycles", ref TotalExecutedCycles); - ser.Sync("Pending_Cycles", ref PendingCycles); ser.Sync("psg_clock", ref psg_clock); ser.Sync("clock_A", ref clock_A); @@ -296,9 +282,9 @@ namespace BizHawk.Emulation.Cores.ColecoVision } else { - v = (short)(sound_out_A ? VolumeTable[env_E] : 0); + v = (short)(sound_out_A ? VolumeTable[vol_A] : 0); } - + if (env_vol_B == 0) { v += (short)(sound_out_B ? VolumeTable[vol_B] : 0); @@ -317,7 +303,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision { v += (short)(sound_out_C ? VolumeTable[env_E] : 0); } - + current_sample = (short)v; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs index a82f635c43..40274119b2 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.IEmulator.cs @@ -73,6 +73,8 @@ namespace BizHawk.Emulation.Cores.ColecoVision int changes_1 = change1 > 0 ? (int)Math.Floor(change1) : (int)Math.Ceiling(change1); int changes_2 = change2 > 0 ? (int)Math.Floor(change2) : (int)Math.Ceiling(change2); + + for (int scanLine = 0; scanLine < 262; scanLine++) { _vdp.RenderScanline(scanLine); @@ -92,11 +94,20 @@ namespace BizHawk.Emulation.Cores.ColecoVision _cpu.ExecuteOne(); // pick out sound samples from the sound devies twice per scanline - if ((i==76) || (i==152)) + int v = PSG.Sample(); + + if (use_SGM) { - PSG.Sample(); - if (use_SGM) { SGM_sound.Sample(); } + v += SGM_sound.Sample(); } + + if (v != _latchedSample) + { + _blip.AddDelta((uint)_sampleClock, v - _latchedSample); + _latchedSample = v; + } + + _sampleClock++; } // starting from scanline 20, changes to the wheel are added once per scanline (up to 144) @@ -163,6 +174,8 @@ namespace BizHawk.Emulation.Cores.ColecoVision public bool enable_SGM_low = false; public byte port_0x53, port_0x7F; + public int _sampleClock = 0; + public int _latchedSample = 0; public int Frame => _frame; diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.ISoundProvider.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.ISoundProvider.cs index f0bafa9274..d08bba6748 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.ISoundProvider.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.ISoundProvider.cs @@ -11,12 +11,12 @@ namespace BizHawk.Emulation.Cores.ColecoVision private SN76489col PSG; private AY_3_8910_SGM SGM_sound; - private short[] _sampleBuffer = new short[0]; + private readonly BlipBuffer _blip = new BlipBuffer(4096); public void DiscardSamples() { - SGM_sound.DiscardSamples(); - PSG.DiscardSamples(); + _blip.Clear(); + _sampleClock = 0; } public void GetSamplesAsync(short[] samples) @@ -38,26 +38,18 @@ namespace BizHawk.Emulation.Cores.ColecoVision public void GetSamplesSync(out short[] samples, out int nsamp) { - nsamp = 524; + _blip.EndFrame((uint)_sampleClock); + _sampleClock = 0; + nsamp = _blip.SamplesAvailable(); samples = new short[nsamp * 2]; - for (int i = 0; i < nsamp; i++) - { - samples[i * 2] = PSG._sampleBuffer[i]; - samples[i * 2 + 1] = PSG._sampleBuffer[i]; - } + _blip.ReadSamples(samples, nsamp, true); - if (use_SGM) + for (int i = 0; i < nsamp * 2; i += 2) { - for (int i = 0; i < nsamp; i++) - { - samples[i * 2] += SGM_sound._sampleBuffer[i]; - samples[i * 2 + 1] += SGM_sound._sampleBuffer[i]; - } - } - - DiscardSamples(); + samples[i + 1] = samples[i]; + } } public void GetSamples(short[] samples) diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs index c2d6699717..e9bcba4f8f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/ColecoVision.cs @@ -35,6 +35,7 @@ namespace BizHawk.Emulation.Cores.ColecoVision PSG = new SN76489col(); SGM_sound = new AY_3_8910_SGM(); + _blip.SetRates(3579545, 44100); ControllerDeck = new ColecoVisionControllerDeck(_syncSettings.Port1, _syncSettings.Port2); diff --git a/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs b/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs index 63f86a560d..451ed8cc5b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs +++ b/BizHawk.Emulation.Cores/Consoles/Coleco/SN76489col.cs @@ -9,7 +9,6 @@ namespace BizHawk.Emulation.Cores.ColecoVision { public sealed class SN76489col { - public short[] _sampleBuffer = new short[4096]; private short current_sample; public SN76489col() @@ -26,8 +25,6 @@ namespace BizHawk.Emulation.Cores.ColecoVision public int noise_rate; public bool noise_bit; - private int _sampleClock; - private int psg_clock; private int clock_A, clock_B, clock_C; @@ -47,19 +44,11 @@ namespace BizHawk.Emulation.Cores.ColecoVision // reset the shift register noise = 0x40000; - - DiscardSamples(); } - public void DiscardSamples() + public int Sample() { - _sampleClock = 0; - } - - public void Sample() - { - _sampleBuffer[_sampleClock] = current_sample; - _sampleClock++; + return current_sample; } public void SyncState(Serializer ser) @@ -81,7 +70,6 @@ namespace BizHawk.Emulation.Cores.ColecoVision ser.Sync("noise_bit", ref noise_bit); ser.Sync("psg_clock", ref psg_clock); - ser.Sync("sample_clock", ref _sampleClock); ser.Sync("A_up", ref A_up); ser.Sync("B_up", ref B_up);