From: <m97...@us...> - 2013-03-12 09:47:49
|
Revision: 13199 http://openmsx.svn.sourceforge.net/openmsx/?rev=13199&view=rev Author: m9710797 Date: 2013-03-12 09:47:42 +0000 (Tue, 12 Mar 2013) Log Message: ----------- Don't crash when reverse'ing to 'saving to tape' OpenMSX would crash when you reverse to a moment in time where the MSX is saving something to tape. This patch fixes the crash. We still don't support savestates (and thus also reverse) where the MSX is saving to tape. When you do load such a savestate we force the cassetteplayer to 'STOP' mode. The MSX software will then continue saving, but nothing is actually written to the tape image. We do print a warning when this happens. Reverse in combination with saving to tape is hard to fully implement because it's difficult to control (e.g. also reverse) the state of the tape images on the host filesystem. I don't think reverse + saving to tape is an essential combination, so fully implementing this is low priority for me. Of course it is important that we don't crash. Modified Paths: -------------- openmsx/trunk/src/cassette/CassettePlayer.cc Modified: openmsx/trunk/src/cassette/CassettePlayer.cc =================================================================== --- openmsx/trunk/src/cassette/CassettePlayer.cc 2013-03-11 21:52:56 UTC (rev 13198) +++ openmsx/trunk/src/cassette/CassettePlayer.cc 2013-03-12 09:47:42 UTC (rev 13199) @@ -264,7 +264,8 @@ assert(!((oldState == RECORD) && (newState == PLAY))); // stuff for leaving the old state - if (oldState == RECORD) { + // 'recordImage.get()==nullptr' can happen in case of loadstate. + if ((oldState == RECORD) && recordImage.get()) { flushOutput(); bool empty = recordImage.get()->isEmpty(); recordImage.reset(); @@ -880,7 +881,23 @@ casImage.setResolved(file->getURL()); } } - insertTape(casImage); + try { + insertTape(casImage); + } catch (MSXException& e) { + if (oldChecksum.empty()) { + // It's OK if we cannot reinsert an empty + // image. One likely scenario for this case is + // the following: + // - cassetteplayer new myfile.wav + // - don't actually start saving to tape yet + // - create a savestate and load that state + // Because myfile.wav contains no data yet, it + // is deleted from the filesystem. So on a + // loadstate it won't be found. + } else { + throw; + } + } if (playImage.get() && !oldChecksum.empty()) { Sha1Sum newChecksum = playImage->getSha1Sum(); @@ -913,6 +930,10 @@ if (ar.isLoader()) { if (state == RECORD) { // TODO we don't support savestates in RECORD mode yet + motherBoard.getMSXCliComm().printWarning( + "Restoring a state where the MSX was saving to " + "tape is not yet supported. Emulation will " + "continue without actually saving."); setState(STOP, getImageName(), getCurrentTime()); } if (!playImage.get() && (state == PLAY)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |