diff --git a/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs b/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs index e2bf7cc8d0..49765bffba 100644 --- a/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs +++ b/src/BizHawk.Client.Common/movie/tasproj/TasStateManager.cs @@ -47,7 +47,7 @@ namespace BizHawk.Client.Common _decay = new StateManagerDecay(_movie, this); - _expectedStateSize = (ulong)Core.SaveStateBinary().Length; + _expectedStateSize = (ulong)Core.CloneSavestate().Length; // TODO: why do we store this in a ulong? if (_expectedStateSize == 0) { throw new InvalidOperationException("Savestate size can not be zero!"); diff --git a/src/BizHawk.Client.EmuHawk/config/RewindConfig.cs b/src/BizHawk.Client.EmuHawk/config/RewindConfig.cs index 525228d260..953a62e74b 100644 --- a/src/BizHawk.Client.EmuHawk/config/RewindConfig.cs +++ b/src/BizHawk.Client.EmuHawk/config/RewindConfig.cs @@ -42,7 +42,7 @@ namespace BizHawk.Client.EmuHawk RewindSpeedNumeric.Value = _config.Rewind.SpeedMultiplier; DiskBufferCheckbox.Checked = _config.Rewind.OnDisk; RewindIsThreadedCheckbox.Checked = _config.Rewind.IsThreaded; - _stateSize = _statableCore.SaveStateBinary().Length; + _stateSize = _statableCore.CloneSavestate().Length; BufferSizeUpDown.Value = Math.Max(_config.Rewind.BufferSize, BufferSizeUpDown.Minimum); _mediumStateSize = _config.Rewind.MediumStateSize; diff --git a/src/BizHawk.Client.EmuHawk/movie/RecordMovie.cs b/src/BizHawk.Client.EmuHawk/movie/RecordMovie.cs index 384ac2c1f9..75b96953f8 100644 --- a/src/BizHawk.Client.EmuHawk/movie/RecordMovie.cs +++ b/src/BizHawk.Client.EmuHawk/movie/RecordMovie.cs @@ -109,7 +109,7 @@ namespace BizHawk.Client.EmuHawk if (_config.SaveStateType == SaveStateTypeE.Binary) { - movieToRecord.BinarySavestate = (byte[])core.SaveStateBinary().Clone(); + movieToRecord.BinarySavestate = core.CloneSavestate(); } else { diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs index 0619e083c9..2e787f7662 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/GreenzoneSettings.cs @@ -82,7 +82,7 @@ namespace BizHawk.Client.EmuHawk private void MemStateGapDivider_ValueChanged(object sender, EventArgs e) { - int val = (int)(Statable.SaveStateBinary().Length / MemStateGapDividerNumeric.Value / 1024); + int val = (int)(Statable.CloneSavestate().Length / MemStateGapDividerNumeric.Value / 1024); if (val <= 1) MemStateGapDividerNumeric.Maximum = MemStateGapDividerNumeric.Value; diff --git a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs index 20bbf59eab..94a78465fe 100644 --- a/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs +++ b/src/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.MenuItems.cs @@ -7,6 +7,7 @@ using System.Windows.Forms; using BizHawk.Client.Common; using BizHawk.Client.Common.MovieConversionExtensions; using BizHawk.Client.EmuHawk.ToolExtensions; +using BizHawk.Emulation.Common; namespace BizHawk.Client.EmuHawk { @@ -38,10 +39,8 @@ namespace BizHawk.Client.EmuHawk { if (AskSaveChanges()) { - int index = Emulator.Frame; - var newProject = CurrentTasMovie.ConvertToSavestateAnchoredMovie( - index, (byte[])StatableEmulator.SaveStateBinary().Clone()); + Emulator.Frame, StatableEmulator.CloneSavestate()); MainForm.PauseEmulator(); LoadFile(new FileInfo(newProject.Filename), true); @@ -752,7 +751,7 @@ namespace BizHawk.Client.EmuHawk if (CurrentTasMovie.TasStateManager.HasState(Emulator.Frame)) { - byte[] state = (byte[])StatableEmulator.SaveStateBinary().Clone(); + byte[] state = StatableEmulator.CloneSavestate(); byte[] greenZone = CurrentTasMovie.TasStateManager[Emulator.Frame]; if (!state.SequenceEqual(greenZone)) diff --git a/src/BizHawk.Emulation.Common/Interfaces/Services/IStatable.cs b/src/BizHawk.Emulation.Common/Interfaces/Services/IStatable.cs index 180344c915..35489a26db 100644 --- a/src/BizHawk.Emulation.Common/Interfaces/Services/IStatable.cs +++ b/src/BizHawk.Emulation.Common/Interfaces/Services/IStatable.cs @@ -87,5 +87,20 @@ namespace BizHawk.Emulation.Common using var br = new BinaryReader(ms); core.LoadStateBinary(br); } + + /// + /// Creates a byte array copy of the core's current state + /// This creates a new buffer, and should not be used in performance sensitive situations + /// + public static byte[] CloneSavestate(this IStatable core) + { + using var ms = new MemoryStream(); + using var bw = new BinaryWriter(ms); + core.SaveStateBinary(bw); + bw.Flush(); + var stateBuffer = ms.ToArray(); + bw.Close(); + return stateBuffer; + } } }