uint16_t GBAMGMQueryInput(struct GBARRContext* rr) { if (!rr->isPlaying(rr)) { return 0; } struct GBAMGMContext* mgm = (struct GBAMGMContext*) rr; if (mgm->peekedTag == TAG_INPUT) { _readTag(mgm, mgm->movieStream); } mgm->inputThisFrame = true; if (mgm->currentInput == INVALID_INPUT) { GBALog(0, GBA_LOG_WARN, "[RR] Stream did not specify input"); } GBALog(0, GBA_LOG_DEBUG, "[RR] Input replay: %03X", mgm->currentInput); return mgm->currentInput; }
void XmlParser::_processXmlNode() { const int nodeType = xmlTextReaderNodeType(_reader); // const int isEmptyElement = xmlTextReaderIsEmptyElement(_reader); // const int hasTextValue = xmlTextReaderHasValue(_reader); std::string value; const xmlChar *val = xmlTextReaderConstValue(_reader); if (val != NULL) { value = (char*) val; } std::string name; const xmlChar *n = xmlTextReaderConstName(_reader); if (n != NULL) { name = (char*) n; } // std::cout << "name: " << name << '\n' // << "value: " << value << '\n' // << "nodeType: " << nodeType << '\n' // << "isEmptyElement: " << isEmptyElement << '\n' // << "hasTextValue: " << hasTextValue << "\n\n"; if (nodeType == XmlNodeType::ELEMENT) { if (name == "osm") { _readOsm(); } else if (name == "note") { _readNote(); } else if (name == "meta") { _readMeta(); } else if (name == "node") { _readNode(); } else if (name == "way") { _readWay(); } else if (name == "relation") { _readRelation(); } else if (name == "tag") { _readTag(); } else if (name == "nd") { _readNd(); } else if (name == "member") { _readMember(); } } }
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); } } }
bool _parseMetadata(struct GBAMGMContext* mgm, struct VFile* vf) { if (!_verifyMagic(mgm, vf)) { return false; } while (_readTag(mgm, vf) != TAG_EOF) { switch (mgm->peekedTag) { case TAG_MAX_STREAM: mgm->maxStreamIdOffset = vf->seek(vf, 0, SEEK_CUR); break; case TAG_INIT_EX_NIHILO: case TAG_INIT_FROM_SAVEGAME: case TAG_INIT_FROM_SAVESTATE: case TAG_INIT_FROM_BOTH: mgm->initFromOffset = vf->seek(vf, 0, SEEK_CUR); break; case TAG_RR_COUNT: mgm->rrCountOffset = vf->seek(vf, 0, SEEK_CUR); break; default: break; } } return true; }