Move MovieService.Get to IMovieSession, and require an IMovieSession in Bk2Movie and TasMovie ctors, refactor accordingly

This commit is contained in:
adelikat 2020-06-05 21:09:03 -05:00
parent 863d022bc5
commit 55bb627550
16 changed files with 49 additions and 42 deletions

View File

@ -18,7 +18,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
public static ITasMovie ToTasMovie(this IMovie old)
{
string newFilename = ConvertFileNameToTasMovie(old.Filename);
var tas = (ITasMovie)MovieService.Get(newFilename);
var tas = (ITasMovie)old.Session.Get(newFilename);
tas.CopyLog(old.GetLogEntries());
old.Truncate(0); // Trying to minimize ram usage
@ -53,7 +53,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
public static IMovie ToBk2(this IMovie old)
{
var bk2 = MovieService.Get(old.Filename.Replace(old.PreferredExtension, Bk2Movie.Extension));
var bk2 = old.Session.Get(old.Filename.Replace(old.PreferredExtension, Bk2Movie.Extension));
bk2.CopyLog(old.GetLogEntries());
bk2.HeaderEntries.Clear();
@ -87,7 +87,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
{
string newFilename = ConvertFileNameToTasMovie(old.Filename);
var tas = (ITasMovie)MovieService.Get(newFilename);
var tas = (ITasMovie)old.Session.Get(newFilename);
tas.BinarySavestate = savestate;
tas.LagLog.Clear();
@ -144,7 +144,7 @@ namespace BizHawk.Client.Common.MovieConversionExtensions
{
string newFilename = ConvertFileNameToTasMovie(old.Filename);
var tas = (ITasMovie) MovieService.Get(newFilename);
var tas = (ITasMovie)old.Session.Get(newFilename);
tas.SaveRam = saveRam;
tas.TasStateManager.Clear();
tas.LagLog.Clear();

View File

@ -1,22 +1,10 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace BizHawk.Client.Common
{
public static class MovieService
{
public static IMovie Get(string path)
{
// TODO: change IMovies to take HawkFiles only and not path
if (Path.GetExtension(path)?.EndsWith("tasproj") ?? false)
{
return new TasMovie(path);
}
return new Bk2Movie(path);
}
public static string StandardMovieExtension => Bk2Movie.Extension;
public static string TasMovieExtension => TasMovie.Extension;

View File

@ -245,7 +245,7 @@ namespace BizHawk.Client.Common
public void RunQueuedMovie(bool recordMode, IEmulator emulator, IDictionary<string, string> preferredCores)
{
_queuedMovie.Attach(this, emulator);
_queuedMovie.Attach(emulator);
foreach (var previousPref in _preferredCores)
{
preferredCores[previousPref.Key] = previousPref.Value;
@ -339,6 +339,18 @@ namespace BizHawk.Client.Common
Movie.SwitchToPlay();
}
public IMovie Get(string path)
{
// TODO: change IMovies to take HawkFiles only and not path
if (Path.GetExtension(path)?.EndsWith("tasproj") ?? false)
{
return new TasMovie(this, path);
}
return new Bk2Movie(this, path);
}
private void ClearFrame()
{
if (Movie.IsPlayingOrFinished())

View File

@ -160,7 +160,7 @@ namespace BizHawk.Client.Common
SetCycleValues(); // We are pretending these only need to be set on save
CreateDirectoryIfNotExists(fn);
using var bs = new ZipStateSaver(fn, Global.MovieSession.Settings.MovieCompressionLevel);
using var bs = new ZipStateSaver(fn, Session.Settings.MovieCompressionLevel);
AddLumps(bs);
if (!isBackup)

View File

@ -9,18 +9,19 @@ namespace BizHawk.Client.Common
{
private Bk2Controller _adapter;
internal Bk2Movie(string filename)
internal Bk2Movie(IMovieSession session, string filename)
{
if (string.IsNullOrWhiteSpace(filename))
{
throw new ArgumentNullException($"{nameof(filename)} can not be null.");
}
Session = session;
Filename = filename;
Header[HeaderKeys.MovieVersion] = "BizHawk v2.0.0";
}
public virtual void Attach(IMovieSession session, IEmulator emulator)
public virtual void Attach(IEmulator emulator)
{
// TODO: this check would ideally happen
// but is disabled for now because restarting a movie doesn't new one up
@ -32,11 +33,10 @@ namespace BizHawk.Client.Common
//}
Emulator = emulator;
Session = session;
}
public IEmulator Emulator { get; private set; }
public IMovieSession Session { get; private set; }
public IMovieSession Session { get; }
protected bool MakeBackup { get; set; } = true;

View File

@ -7,7 +7,7 @@ namespace BizHawk.Client.Common
{
public interface IMovieImport
{
ImportResult Import(string path, Config config);
ImportResult Import(IMovieSession session, string path, Config config);
}
internal abstract class MovieImporter : IMovieImport
@ -16,7 +16,7 @@ namespace BizHawk.Client.Common
protected const string Md5 = "MD5";
protected const string MovieOrigin = "MovieOrigin";
public ImportResult Import(string path, Config config)
public ImportResult Import(IMovieSession session, string path, Config config)
{
SourceFile = new FileInfo(path);
Config = config;
@ -28,7 +28,7 @@ namespace BizHawk.Client.Common
}
var newFileName = $"{SourceFile.FullName}.{Bk2Movie.Extension}";
Result.Movie = MovieService.Get(newFileName);
Result.Movie = session.Get(newFileName);
RunImport();

View File

@ -30,7 +30,7 @@ namespace BizHawk.Client.Common
);
// Attempt to import another type of movie file into a movie object.
public static ImportResult ImportFile(string path, Config config)
public static ImportResult ImportFile(IMovieSession session, string path, Config config)
{
string ext = Path.GetExtension(path) ?? "";
var importerType = ImporterForExtension(ext);
@ -47,7 +47,7 @@ namespace BizHawk.Client.Common
return importer == null
? ImportResult.Error($"No importer found for file type {ext}")
: importer.Import(path, config);
: importer.Import(session, path, config);
}
private static Type ImporterForExtension(string ext)

View File

@ -234,13 +234,18 @@ namespace BizHawk.Client.Common
/// Thrown if attempting to attach a core when one is already attached
/// or if the given core does not meet all required dependencies
/// </exception>
void Attach(IMovieSession session, IEmulator emulator);
void Attach(IEmulator emulator);
/// <summary>
/// The currently attached core or null if not yet attached
/// </summary>
IEmulator Emulator { get; }
/// <summary>
/// The current movie session
/// </summary>
IMovieSession Session { get; }
IStringLog GetLogEntries();
void CopyLog(IEnumerable<string> log);
}

View File

@ -61,8 +61,10 @@ namespace BizHawk.Client.Common
void StopMovie(bool saveChanges = true);
/// <summary>
/// If a movie is active, it will be converted to a <see cref="TasMovie" />
/// If a movie is active, it will be converted to a <see cref="ITasMovie" />
/// </summary>
void ConvertToTasProj();
IMovie Get(string path);
}
}

View File

@ -13,7 +13,7 @@ namespace BizHawk.Client.Common
private IInputPollable _inputPollable;
/// <exception cref="InvalidOperationException">loaded core does not implement <see cref="IStatable"/></exception>
internal TasMovie(string path) : base(path)
internal TasMovie(IMovieSession session, string path) : base(session, path)
{
Branches = new TasBranchCollection(this);
ChangeLog = new TasMovieChangeLog(this);
@ -24,7 +24,7 @@ namespace BizHawk.Client.Common
Markers.Add(0, "Power on");
}
public override void Attach(IMovieSession session, IEmulator emulator)
public override void Attach(IEmulator emulator)
{
if (!emulator.HasSavestates())
{
@ -39,7 +39,7 @@ namespace BizHawk.Client.Common
_inputPollable = emulator.AsInputPollable();
TasStateManager.Attach(emulator);
base.Attach(session, emulator);
base.Attach(emulator);
}
public override bool StartsFromSavestate

View File

@ -102,7 +102,7 @@ namespace BizHawk.Client.EmuHawk
return;
}
StartNewMovie(MovieService.Get(filename), false);
StartNewMovie(MovieSession.Get(filename), false);
}
private void LoadRom(string filename, string archive = null)

View File

@ -496,7 +496,7 @@ namespace BizHawk.Client.EmuHawk
// If user picked a game, then do the commandline logic
if (!Game.IsNullInstance())
{
var movie = MovieService.Get(_argParser.cmdMovie);
var movie = MovieSession.Get(_argParser.cmdMovie);
MovieSession.ReadOnly = true;
// if user is dumping and didn't supply dump length, make it as long as the loaded movie
@ -531,7 +531,7 @@ namespace BizHawk.Client.EmuHawk
{
if (File.Exists(Config.RecentMovies.MostRecent))
{
StartNewMovie(MovieService.Get(Config.RecentMovies.MostRecent), false);
StartNewMovie(MovieSession.Get(Config.RecentMovies.MostRecent), false);
}
else
{
@ -2065,7 +2065,7 @@ namespace BizHawk.Client.EmuHawk
{
if (File.Exists(path))
{
var movie = MovieService.Get(path);
var movie = MovieSession.Get(path);
MovieSession.ReadOnly = true;
StartNewMovie(movie, false);
}
@ -4015,7 +4015,7 @@ namespace BizHawk.Client.EmuHawk
private void ProcessMovieImport(string fn, bool start)
{
var result = MovieImport.ImportFile(fn, Config);
var result = MovieImport.ImportFile(MovieSession, fn, Config);
if (result.Errors.Any())
{

View File

@ -128,7 +128,7 @@ namespace BizHawk.Client.EmuHawk
private IMovie PreLoadMovieFile(HawkFile hf, bool force)
{
var movie = MovieService.Get(hf.CanonicalFullPath);
var movie = _movieSession.Get(hf.CanonicalFullPath);
try
{

View File

@ -92,7 +92,7 @@ namespace BizHawk.Client.EmuHawk
}
}
var movieToRecord = MovieService.Get(path);
var movieToRecord = _movieSession.Get(path);
var fileInfo = new FileInfo(path);
if (!fileInfo.Exists)

View File

@ -121,7 +121,7 @@ namespace BizHawk.Client.EmuHawk
if (result1.IsOk())
{
_initializing = true; // Starting a new movie causes a core reboot
MainForm.StartNewMovie(MovieService.Get(ofd.FileName), false);
MainForm.StartNewMovie(MovieSession.Get(ofd.FileName), false);
ConvertCurrentMovieToTasproj();
_initialized = false;
StartNewMovieWrapper(CurrentTasMovie);

View File

@ -622,7 +622,7 @@ namespace BizHawk.Client.EmuHawk
return false;
}
var newMovie = (ITasMovie)MovieService.Get(file.FullName);
var newMovie = (ITasMovie)MovieSession.Get(file.FullName);
newMovie.BindMarkersToInput = Settings.BindMarkersToInput;
newMovie.TasStateManager.InvalidateCallback = GreenzoneInvalidated;
@ -677,7 +677,7 @@ namespace BizHawk.Client.EmuHawk
}
var filename = DefaultTasProjName(); // TODO don't do this, take over any mainform actions that can crash without a filename
var tasMovie = (ITasMovie)MovieService.Get(filename);
var tasMovie = (ITasMovie)MovieSession.Get(filename);
tasMovie.BindMarkersToInput = Settings.BindMarkersToInput;