bool GBARRReinitStream(struct GBARRContext* rr, enum GBARRInitFrom initFrom) { if (!rr) { return false; } if (rr->metadataFile) { rr->metadataFile->truncate(rr->metadataFile, 0); } else { rr->metadataFile = rr->streamDir->openFile(rr->streamDir, METADATA_FILENAME, O_CREAT | O_TRUNC | O_RDWR); } _emitMagic(rr, rr->metadataFile); rr->initFrom = initFrom; rr->initFromOffset = rr->metadataFile->seek(rr->metadataFile, 0, SEEK_CUR); _emitTag(rr, rr->metadataFile, TAG_INIT | initFrom); rr->streamId = 0; rr->maxStreamId = 0; _emitTag(rr, rr->metadataFile, TAG_MAX_STREAM); rr->maxStreamIdOffset = rr->metadataFile->seek(rr->metadataFile, 0, SEEK_CUR); rr->metadataFile->write(rr->metadataFile, &rr->maxStreamId, sizeof(rr->maxStreamId)); rr->rrCount = 0; _emitTag(rr, rr->metadataFile, TAG_RR_COUNT); rr->rrCountOffset = rr->metadataFile->seek(rr->metadataFile, 0, SEEK_CUR); rr->metadataFile->write(rr->metadataFile, &rr->rrCount, sizeof(rr->rrCount)); return true; }
bool _incrementStream(struct GBAMGMContext* mgm, bool recursive) { uint32_t newStreamId = mgm->maxStreamId + 1; uint32_t oldStreamId = mgm->streamId; if (mgm->d.isRecording(&mgm->d) && mgm->movieStream) { if (!_markStreamNext(mgm, newStreamId, recursive)) { return false; } } if (!_loadStream(mgm, newStreamId)) { return false; } GBALog(0, GBA_LOG_DEBUG, "[RR] New segment: %u", newStreamId); _emitMagic(mgm, mgm->movieStream); mgm->maxStreamId = newStreamId; _emitTag(mgm, mgm->movieStream, TAG_PREVIOUSLY); mgm->movieStream->write(mgm->movieStream, &oldStreamId, sizeof(oldStreamId)); _emitTag(mgm, mgm->movieStream, TAG_BEGIN); mgm->metadataFile->seek(mgm->metadataFile, mgm->maxStreamIdOffset, SEEK_SET); mgm->metadataFile->write(mgm->metadataFile, &mgm->maxStreamId, sizeof(mgm->maxStreamId)); mgm->previously = oldStreamId; return true; }
bool GBARRIncrementStream(struct GBARRContext* rr, bool recursive) { uint32_t newStreamId = rr->maxStreamId + 1; uint32_t oldStreamId = rr->streamId; if (GBARRIsRecording(rr) && rr->movieStream) { if (!_markStreamNext(rr, newStreamId, recursive)) { return false; } } if (!GBARRLoadStream(rr, newStreamId)) { return false; } GBALog(0, GBA_LOG_DEBUG, "[RR] New segment: %u", newStreamId); _emitMagic(rr, rr->movieStream); rr->maxStreamId = newStreamId; _emitTag(rr, rr->movieStream, TAG_PREVIOUSLY); rr->movieStream->write(rr->movieStream, &oldStreamId, sizeof(oldStreamId)); _emitTag(rr, rr->movieStream, TAG_BEGIN); rr->metadataFile->seek(rr->metadataFile, rr->maxStreamIdOffset, SEEK_SET); rr->metadataFile->write(rr->metadataFile, &rr->maxStreamId, sizeof(rr->maxStreamId)); rr->previously = oldStreamId; return true; }
bool GBAMGMCreateStream(struct GBAMGMContext* mgm, enum GBARRInitFrom initFrom) { if (mgm->metadataFile) { mgm->metadataFile->truncate(mgm->metadataFile, 0); } else { mgm->metadataFile = mgm->streamDir->openFile(mgm->streamDir, METADATA_FILENAME, O_CREAT | O_TRUNC | O_RDWR); } _emitMagic(mgm, mgm->metadataFile); mgm->d.initFrom = initFrom; mgm->initFromOffset = mgm->metadataFile->seek(mgm->metadataFile, 0, SEEK_CUR); _emitTag(mgm, mgm->metadataFile, TAG_INIT | initFrom); mgm->streamId = 0; mgm->maxStreamId = 0; _emitTag(mgm, mgm->metadataFile, TAG_MAX_STREAM); mgm->maxStreamIdOffset = mgm->metadataFile->seek(mgm->metadataFile, 0, SEEK_CUR); mgm->metadataFile->write(mgm->metadataFile, &mgm->maxStreamId, sizeof(mgm->maxStreamId)); mgm->d.rrCount = 0; _emitTag(mgm, mgm->metadataFile, TAG_RR_COUNT); mgm->rrCountOffset = mgm->metadataFile->seek(mgm->metadataFile, 0, SEEK_CUR); mgm->metadataFile->write(mgm->metadataFile, &mgm->d.rrCount, sizeof(mgm->d.rrCount)); return true; }