예제 #1
0
파일: mgm.c 프로젝트: Sappharad/mgba
bool _skipSegment(struct GBAMGMContext* mgm) {
	mgm->nextTime = 0;
	while (_readTag(mgm, mgm->movieStream) != TAG_EOF);
	if (!mgm->nextTime || !_loadStream(mgm, mgm->nextTime)) {
		_streamEndReached(mgm);
		return false;
	}
	return true;
}
예제 #2
0
파일: rr.c 프로젝트: MoochMcGee/mgba
bool GBARRSkipSegment(struct GBARRContext* rr) {
	rr->nextTime = 0;
	while (_readTag(rr, rr->movieStream) != TAG_EOF);
	if (!rr->nextTime || !GBARRLoadStream(rr, rr->nextTime)) {
		_streamEndReached(rr);
		return false;
	}
	return true;
}
예제 #3
0
파일: mgm.c 프로젝트: Sappharad/mgba
void GBAMGMNextFrame(struct GBARRContext* rr) {
	if (!rr->isRecording(rr) && !rr->isPlaying(rr)) {
		return;
	}

	struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr;
	if (rr->isPlaying(rr)) {
		while (mgm->peekedTag == TAG_INPUT) {
			_readTag(mgm, mgm->movieStream);
			GBALog(0, GBA_LOG_WARN, "[RR] Desync detected!");
		}
		if (mgm->peekedTag == TAG_LAG) {
			GBALog(0, GBA_LOG_DEBUG, "[RR] Lag frame marked in stream");
			if (mgm->inputThisFrame) {
				GBALog(0, GBA_LOG_WARN, "[RR] Lag frame in stream does not match movie");
			}
		}
	}

	++mgm->d.frames;
	GBALog(0, GBA_LOG_DEBUG, "[RR] Frame: %u", mgm->d.frames);
	if (!mgm->inputThisFrame) {
		++mgm->d.lagFrames;
		GBALog(0, GBA_LOG_DEBUG, "[RR] Lag frame: %u", mgm->d.lagFrames);
	}

	if (rr->isRecording(rr)) {
		if (!mgm->inputThisFrame) {
			_emitTag(mgm, mgm->movieStream, TAG_LAG);
		}
		_emitTag(mgm, mgm->movieStream, TAG_FRAME);
		mgm->inputThisFrame = false;
	} else {
		if (!_seekTag(mgm, mgm->movieStream, TAG_FRAME)) {
			_streamEndReached(mgm);
		}
	}
}