From 71ddbde18d1ee1e0804c6cd35e9a5d595ee3ba8a Mon Sep 17 00:00:00 2001 From: goyuken Date: Fri, 20 Jun 2014 00:39:46 +0000 Subject: [PATCH] bk2 savestate anchor stuff --- .../movie/bk2/Bk2Movie.HeaderApi.cs | 18 ++--------- .../movie/bk2/Bk2Movie.IO.cs | 32 +++++++++++-------- .../movie/bkm/BkmMovie.HeaderApi.cs | 9 ++---- .../movie/bkm/BkmMovie.IO.cs | 7 ++++ .../conversions/MovieConversionExtensions.cs | 3 +- .../movie/interfaces/IMovie.cs | 7 ++-- BizHawk.Client.EmuHawk/MainForm.Movie.cs | 22 ++++++++++--- BizHawk.Client.EmuHawk/movie/RecordMovie.cs | 21 +++++++++--- 8 files changed, 69 insertions(+), 50 deletions(-) diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs index 1337251b3f..b9fe21542e 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.HeaderApi.cs @@ -9,8 +9,6 @@ namespace BizHawk.Client.Common { protected readonly Bk2Header Header = new Bk2Header(); private string _syncSettingsJson = string.Empty; - private string _savestateBlob = string.Empty; - public IDictionary HeaderEntries { @@ -26,19 +24,6 @@ namespace BizHawk.Client.Common set { _syncSettingsJson = value; } } - public string SavestateBinaryBase64Blob - { - get - { - return _savestateBlob; - } - - set - { - _savestateBlob = value; - } - } - public ulong Rerecords { get @@ -197,5 +182,8 @@ namespace BizHawk.Client.Common return sb.ToString(); } + + public string TextSavestate { get; set; } + public byte[] BinarySavestate { get; set; } } } diff --git a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs index 2f05d6f129..2a7aa57c8d 100644 --- a/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs +++ b/BizHawk.Client.Common/movie/bk2/Bk2Movie.IO.cs @@ -117,23 +117,19 @@ namespace BizHawk.Client.Common } }); - // Movies 2.0 TODO: be smart about text or binary state if (StartsFromSavestate) { - bl.GetLump(BinaryStateLump.CorestateText, true, delegate(TextReader tr) - { - string line; - while ((line = tr.ReadLine()) != null) + bl.GetCoreState( + delegate(BinaryReader br) { - if (!string.IsNullOrWhiteSpace(line)) - { - SavestateBinaryBase64Blob = line; - } - } - }); + BinarySavestate = br.ReadBytes((int)br.BaseStream.Length); + }, + delegate(TextReader tr) + { + TextSavestate = tr.ReadToEnd(); + }); } } - return true; } @@ -164,7 +160,14 @@ namespace BizHawk.Client.Common if (StartsFromSavestate) { - bs.PutLump(BinaryStateLump.CorestateText, (tw) => tw.WriteLine(SavestateBinaryBase64Blob)); + if (TextSavestate != null) + { + bs.PutLump(BinaryStateLump.CorestateText, (TextWriter tw) => tw.Write(TextSavestate)); + } + else + { + bs.PutLump(BinaryStateLump.Corestate, (BinaryWriter bw) => bw.Write(BinarySavestate)); + } } } @@ -178,7 +181,8 @@ namespace BizHawk.Client.Common Subtitles.Clear(); Comments.Clear(); _syncSettingsJson = string.Empty; - _savestateBlob = string.Empty; + TextSavestate = null; + BinarySavestate = null; } } } diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.HeaderApi.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.HeaderApi.cs index f132a913b2..91c84046a4 100644 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.HeaderApi.cs +++ b/BizHawk.Client.Common/movie/bkm/BkmMovie.HeaderApi.cs @@ -28,12 +28,6 @@ namespace BizHawk.Client.Common set { Header[HeaderKeys.SYNCSETTINGS] = value; } } - public string SavestateBinaryBase64Blob - { - get { return Header.SavestateBinaryBase64Blob; } - set { Header.SavestateBinaryBase64Blob = value; } - } - public ulong Rerecords { get { return Header.Rerecords; } @@ -99,5 +93,8 @@ namespace BizHawk.Client.Common get { return Header[HeaderKeys.FIRMWARESHA1]; } set { Header[HeaderKeys.FIRMWARESHA1] = value; } } + + public string TextSavestate { get; set; } + public byte[] BinarySavestate { get; set; } } } diff --git a/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs b/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs index 5d81a9139f..cc558a4bc6 100644 --- a/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs +++ b/BizHawk.Client.Common/movie/bkm/BkmMovie.IO.cs @@ -107,6 +107,8 @@ namespace BizHawk.Client.Common } } } + if (Header.SavestateBinaryBase64Blob != null) + BinarySavestate = Convert.FromBase64String(Header.SavestateBinaryBase64Blob); Loaded = true; return true; @@ -229,6 +231,11 @@ namespace BizHawk.Client.Common private void Write(string fn) { + if (BinarySavestate != null) + Header.SavestateBinaryBase64Blob = Convert.ToBase64String(BinarySavestate); + else + Header.SavestateBinaryBase64Blob = null; + using (var fs = new FileStream(fn, FileMode.Create, FileAccess.Write, FileShare.Read)) { using (var sw = new StreamWriter(fs)) diff --git a/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs b/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs index 16dfb79fb8..402a8cec89 100644 --- a/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs +++ b/BizHawk.Client.Common/movie/conversions/MovieConversionExtensions.cs @@ -32,7 +32,8 @@ namespace BizHawk.Client.Common.MovieConversionExtensions bk2.Subtitles.Add(sub); } - bk2.SavestateBinaryBase64Blob = bkm.SavestateBinaryBase64Blob; + bk2.TextSavestate = bkm.TextSavestate; + bk2.BinarySavestate = bkm.BinarySavestate; for (int i = 0; i < bkm.InputLogLength; i++) { diff --git a/BizHawk.Client.Common/movie/interfaces/IMovie.cs b/BizHawk.Client.Common/movie/interfaces/IMovie.cs index 7d74ce9789..178316f670 100644 --- a/BizHawk.Client.Common/movie/interfaces/IMovie.cs +++ b/BizHawk.Client.Common/movie/interfaces/IMovie.cs @@ -58,10 +58,9 @@ namespace BizHawk.Client.Common SubtitleList Subtitles { get; } IList Comments { get; } - /// - /// For savestate anchored movies, this is the starting savestate - /// - string SavestateBinaryBase64Blob { get; set; } + // savestate anchor. + string TextSavestate { get; set; } + byte[] BinarySavestate { get; set; } ulong Rerecords { get; set; } bool StartsFromSavestate { get; set; } diff --git a/BizHawk.Client.EmuHawk/MainForm.Movie.cs b/BizHawk.Client.EmuHawk/MainForm.Movie.cs index 6447d44787..bda78ae7fb 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Movie.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Movie.cs @@ -80,9 +80,10 @@ namespace BizHawk.Client.EmuHawk if (Global.MovieSession.Movie.StartsFromSavestate) { - var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob); - Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state))); - Global.Emulator.ResetCounters(); + if (Global.MovieSession.Movie.TextSavestate != null) + Global.Emulator.LoadStateText(new StringReader(Global.MovieSession.Movie.TextSavestate)); + else + Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(Global.MovieSession.Movie.BinarySavestate, false))); } if (!fromTastudio) @@ -195,8 +196,19 @@ namespace BizHawk.Client.EmuHawk LoadRom(CurrentlyOpenRom); if (Global.MovieSession.Movie.StartsFromSavestate) { - var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob); - Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state))); + // TODO: why does this code exist twice?? + + if (Global.MovieSession.Movie.TextSavestate != null) + { + Global.Emulator.LoadStateText(new StringReader(Global.MovieSession.Movie.TextSavestate)); + } + else + { + Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(Global.MovieSession.Movie.BinarySavestate, false))); + } + + //var state = Convert.FromBase64String(Global.MovieSession.Movie.SavestateBinaryBase64Blob); + //Global.Emulator.LoadStateBinary(new BinaryReader(new MemoryStream(state))); Global.Emulator.ResetCounters(); } diff --git a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs b/BizHawk.Client.EmuHawk/movie/RecordMovie.cs index e59ffea852..d953044941 100644 --- a/BizHawk.Client.EmuHawk/movie/RecordMovie.cs +++ b/BizHawk.Client.EmuHawk/movie/RecordMovie.cs @@ -70,11 +70,22 @@ namespace BizHawk.Client.EmuHawk movieToRecord.StartsFromSavestate = true; - // TODO - some emulators (c++ cores) are just returning a hex string already - // theres no sense hexifying those again. we need to record that fact in the IEmulator somehow - var bytestate = Global.Emulator.SaveStateBinary(); - string stringstate = Convert.ToBase64String(bytestate); - movieToRecord.SavestateBinaryBase64Blob = stringstate; + if (Global.Emulator.BinarySaveStatesPreferred) + { + movieToRecord.BinarySavestate = (byte[])Global.Emulator.SaveStateBinary().Clone(); + } + else + { + using (var sw = new StringWriter()) + { + Global.Emulator.SaveStateText(sw); + movieToRecord.TextSavestate = sw.ToString(); + } + } + + //var bytestate = Global.Emulator.SaveStateBinary(); + //string stringstate = Convert.ToBase64String(bytestate); + //movieToRecord.SavestateBinaryBase64Blob = stringstate; } // Header