Core: Allow video playback to be non-blocking

This commit is contained in:
Vicki Pfau 2017-04-17 02:55:26 -07:00
parent 3f92b1e67f
commit b8593bdb7b
4 changed files with 6 additions and 6 deletions

View File

@ -168,9 +168,9 @@ void mVideoLoggerRendererFlush(struct mVideoLogger* logger) {
logger->writeData(logger, &dirty, sizeof(dirty));
}
bool mVideoLoggerRendererRun(struct mVideoLogger* logger) {
bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block) {
struct mVideoLoggerDirtyInfo item = {0};
while (logger->readData(logger, &item, sizeof(item), false)) {
while (logger->readData(logger, &item, sizeof(item), block)) {
switch (item.type) {
case DIRTY_REGISTER:
case DIRTY_PALETTE:
@ -186,7 +186,7 @@ bool mVideoLoggerRendererRun(struct mVideoLogger* logger) {
return false;
}
}
return false;
return !block;
}
static bool _writeData(struct mVideoLogger* logger, const void* data, size_t length) {

View File

@ -107,7 +107,7 @@ void mVideoLoggerRendererWriteOAM(struct mVideoLogger* logger, uint32_t address,
void mVideoLoggerRendererDrawScanline(struct mVideoLogger* logger, int y);
void mVideoLoggerRendererFlush(struct mVideoLogger* logger);
bool mVideoLoggerRendererRun(struct mVideoLogger* logger);
bool mVideoLoggerRendererRun(struct mVideoLogger* logger, bool block);
struct mCore;
struct mVideoLogContext* mVideoLoggerCreate(struct mCore* core);

View File

@ -769,7 +769,7 @@ static void _GBAVLPStartFrameCallback(void *context) {
struct GBACore* gbacore = (struct GBACore*) core;
struct GBA* gba = core->board;
if (!mVideoLoggerRendererRun(&gbacore->logProxy.logger)) {
if (!mVideoLoggerRendererRun(&gbacore->logProxy.logger, true)) {
GBAVideoProxyRendererUnshim(&gba->video, &gbacore->logProxy);
gbacore->logProxy.logger.vf->seek(gbacore->logProxy.logger.vf, 0, SEEK_SET);
core->loadState(core, gbacore->logContext->initialState);

View File

@ -174,7 +174,7 @@ static THREAD_ENTRY _proxyThread(void* renderer) {
}
proxyRenderer->threadState = PROXY_THREAD_BUSY;
MutexUnlock(&proxyRenderer->mutex);
if (!mVideoLoggerRendererRun(&proxyRenderer->d.logger)) {
if (!mVideoLoggerRendererRun(&proxyRenderer->d.logger, false)) {
// FIFO was corrupted
proxyRenderer->threadState = PROXY_THREAD_STOPPED;
mLOG(GBA_VIDEO, ERROR, "Proxy thread queue got corrupted!");