private int ReverseReadAudio(byte[] buffer, int offset, int samplesRequested) { int totalSamplesWritten = 0; int currentSamplesRequested = samplesRequested; lock (_snapshots) { SnapshotInfo currentSnapshot = _snapshots.LastOrDefault(); while (totalSamplesWritten < samplesRequested && currentSnapshot != null) { int samplesWritten = currentSnapshot.AudioBuffer.Render16BitStereo(Volume, buffer, offset, currentSamplesRequested, true); if (samplesWritten == 0) { _core.PushRequest(CoreRequest.RevertToSnapshot(currentSnapshot.Id, currentSnapshot)); _core.PushRequest(CoreRequest.DeleteSnapshot(currentSnapshot.Id)); _snapshots.RemoveAt(_snapshots.Count - 1); currentSnapshot = _snapshots.LastOrDefault(); } totalSamplesWritten += samplesWritten; currentSamplesRequested -= samplesWritten; offset += 4 * samplesWritten; } } return(totalSamplesWritten); }
static public CoreRequest CoreRequestFromBytes(MemoryByteStream stream) { byte type = stream.ReadByte(); switch (type) { case _coreActionKeyPress: { byte keyCode = stream.ReadByte(); bool keyDown = stream.ReadBool(); return(CoreRequest.KeyPress(keyCode, keyDown)); } case _coreActionReset: { return(CoreRequest.Reset()); } case _coreActionLoadDisc: { byte drive = stream.ReadByte(); byte[] media = stream.ReadArray(); return(CoreRequest.LoadDisc(drive, media)); } case _coreActionLoadTape: { byte[] media = stream.ReadArray(); return(CoreRequest.LoadTape(media)); } case _coreActionRunUntil: { UInt64 stopTicks = stream.ReadUInt64(); return(CoreRequest.RunUntil(stopTicks)); } case _coreActionLoadCore: { byte[] state = stream.ReadArray(); return(CoreRequest.LoadCore(new MemoryBlob(state))); } case _coreActionCoreVersion: { Int32 version = stream.ReadInt32(); return(CoreRequest.CoreVersion(version)); } case _coreActionCreateSnapshot: { Int32 snapshotId = stream.ReadInt32(); return(CoreRequest.CreateSnapshot(snapshotId)); } case _coreActionDeleteSnapshot: { Int32 snapshotId = stream.ReadInt32(); return(CoreRequest.DeleteSnapshot(snapshotId)); } case _coreActionRevertToSnapshot: { Int32 snapshotId = stream.ReadInt32(); return(CoreRequest.RevertToSnapshot(snapshotId, null)); } default: throw new Exception(String.Format("Unknown CoreRequest type {0}!", type)); } }