move some avi dump stuff out of the frame advance function

This commit is contained in:
goyuken 2012-11-26 21:08:08 +00:00
parent 4f732be765
commit a378a47b67
1 changed files with 69 additions and 59 deletions

View File

@ -2638,66 +2638,9 @@ namespace BizHawk.MultiClient
Global.Emulator.FrameAdvance(!throttle.skipnextframe || CurrAviWriter != null, !coreskipaudio);
MemoryPulse.Pulse();
//=======================================
if (CurrAviWriter != null)
{
long nsampnum = 44100 * (long)Global.Emulator.CoreOutputComm.VsyncDen + SoundRemainder;
long nsamp = nsampnum / Global.Emulator.CoreOutputComm.VsyncNum;
// exactly remember fractional parts of an audio sample
SoundRemainder = nsampnum % Global.Emulator.CoreOutputComm.VsyncNum;
short[] temp = new short[nsamp * 2];
AviSoundInput.GetSamples(temp);
DumpProxy.buffer.enqueue_samples(temp, (int)nsamp);
try
{
IVideoProvider output;
if (avwriter_resizew > 0 && avwriter_resizeh > 0)
{
Bitmap bmpin;
if (Global.Config.AVI_CaptureOSD)
bmpin = CaptureOSD();
else
{
bmpin = new Bitmap(Global.Emulator.VideoProvider.BufferWidth, Global.Emulator.VideoProvider.BufferHeight, PixelFormat.Format32bppArgb);
var lockdata = bmpin.LockBits(new Rectangle(0, 0, bmpin.Width, bmpin.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
System.Runtime.InteropServices.Marshal.Copy(Global.Emulator.VideoProvider.GetVideoBuffer(), 0, lockdata.Scan0, bmpin.Width * bmpin.Height);
bmpin.UnlockBits(lockdata);
}
Bitmap bmpout = new Bitmap(avwriter_resizew, avwriter_resizeh, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmpout))
g.DrawImage(bmpin, new Rectangle(0, 0, bmpout.Width, bmpout.Height));
bmpin.Dispose();
output = new AVOut.BmpVideoProvder(bmpout);
}
else
{
if (Global.Config.AVI_CaptureOSD)
output = new AVOut.BmpVideoProvder(CaptureOSD());
else
output = Global.Emulator.VideoProvider;
}
CurrAviWriter.AddFrame(output);
if (output is AVOut.BmpVideoProvder)
(output as AVOut.BmpVideoProvder).Dispose();
CurrAviWriter.AddSamples(temp);
}
catch (Exception e)
{
MessageBox.Show("Video dumping died:\n\n" + e.ToString());
AbortAVI();
}
if (autoDumpLength > 0)
{
autoDumpLength--;
if (autoDumpLength == 0) // finish
StopAVI();
}
}
AVIFrameAdvance();
if (Global.Emulator.IsLagFrame && Global.Config.AutofireLagFrames)
{
Global.AutoFireController.IncrementStarts();
@ -3709,6 +3652,8 @@ namespace BizHawk.MultiClient
if (Global.Config.SaveSlot == 9) StatusSlot9.BackColor = SystemColors.ControlDark;
}
#region AVI Stuff
/// <summary>
/// start avi recording, unattended
/// </summary>
@ -3897,6 +3842,71 @@ namespace BizHawk.MultiClient
RewireSound();
}
void AVIFrameAdvance()
{
if (CurrAviWriter != null)
{
long nsampnum = 44100 * (long)Global.Emulator.CoreOutputComm.VsyncDen + SoundRemainder;
long nsamp = nsampnum / Global.Emulator.CoreOutputComm.VsyncNum;
// exactly remember fractional parts of an audio sample
SoundRemainder = nsampnum % Global.Emulator.CoreOutputComm.VsyncNum;
short[] temp = new short[nsamp * 2];
AviSoundInput.GetSamples(temp);
DumpProxy.buffer.enqueue_samples(temp, (int)nsamp);
try
{
IVideoProvider output;
if (avwriter_resizew > 0 && avwriter_resizeh > 0)
{
Bitmap bmpin;
if (Global.Config.AVI_CaptureOSD)
bmpin = CaptureOSD();
else
{
bmpin = new Bitmap(Global.Emulator.VideoProvider.BufferWidth, Global.Emulator.VideoProvider.BufferHeight, PixelFormat.Format32bppArgb);
var lockdata = bmpin.LockBits(new Rectangle(0, 0, bmpin.Width, bmpin.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
System.Runtime.InteropServices.Marshal.Copy(Global.Emulator.VideoProvider.GetVideoBuffer(), 0, lockdata.Scan0, bmpin.Width * bmpin.Height);
bmpin.UnlockBits(lockdata);
}
Bitmap bmpout = new Bitmap(avwriter_resizew, avwriter_resizeh, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmpout))
g.DrawImage(bmpin, new Rectangle(0, 0, bmpout.Width, bmpout.Height));
bmpin.Dispose();
output = new AVOut.BmpVideoProvder(bmpout);
}
else
{
if (Global.Config.AVI_CaptureOSD)
output = new AVOut.BmpVideoProvder(CaptureOSD());
else
output = Global.Emulator.VideoProvider;
}
CurrAviWriter.AddFrame(output);
if (output is AVOut.BmpVideoProvder)
(output as AVOut.BmpVideoProvder).Dispose();
CurrAviWriter.AddSamples(temp);
}
catch (Exception e)
{
MessageBox.Show("Video dumping died:\n\n" + e.ToString());
AbortAVI();
}
if (autoDumpLength > 0)
{
autoDumpLength--;
if (autoDumpLength == 0) // finish
StopAVI();
}
}
}
#endregion
private void SwapBackupSavestate(string path)
{
//Takes the .state and .bak files and swaps them