diff --git a/include/msgba/client_connection_data.h b/include/msgba/client_connection_data.h index f497447..e0f7e21 100644 --- a/include/msgba/client_connection_data.h +++ b/include/msgba/client_connection_data.h @@ -31,6 +31,8 @@ struct msClientConnectionData { pthread_mutex_t *mutexSaveRequests; //! The number of save requests. size_t saveRequestsLen; + //! The number of frame. + size_t numberFrame; }; /** diff --git a/src/client_connection_data.c b/src/client_connection_data.c index f33b8af..563bc85 100644 --- a/src/client_connection_data.c +++ b/src/client_connection_data.c @@ -15,6 +15,7 @@ msClientConnectionDataNew(size_t numberOfThread, int clientFd) { data->mutexSaveRequests = malloc(sizeof *data->mutexSaveRequests); data->saveRequests = NULL; data->saveRequestsLen = 0; + data->numberFrame = 0; data->lastFrameDate = calloc(sizeof *data->lastFrameDate, 1); pthread_mutex_init(data->mutexSendPacket, NULL); pthread_mutex_init(data->mutexPressKey, NULL); diff --git a/src/core_controller.c b/src/core_controller.c index 5d3fbf4..048ee21 100644 --- a/src/core_controller.c +++ b/src/core_controller.c @@ -60,6 +60,10 @@ msCoreControllerLoadGame (const unsigned char *rom, size_t rom_len, mCoreConfigSetIntValue(&core->config, "videoSync", 1); core->desiredVideoDimensions(core, &width, &height); + if (core->platform(core) == mPLATFORM_GB) { + width = 160; + height = 144; + } color_t *outputBuffer = malloc((sizeof *outputBuffer) * width * height); printf("controller->outputBuffer width: %u\n", width); core->setVideoBuffer(core, outputBuffer, width); @@ -87,7 +91,7 @@ mCoreThreadAfterStart(struct mCoreThread *threadContext) { struct msClientConnectionData *data = (struct msClientConnectionData *)threadContext->userData; struct msCoreController *coreController = data->coreController; struct mCore *core = coreController->threadContext.core; - if (!mCoreLoadStateNamed (core, coreController->saveState, SAVESTATE_SAVEDATA & SAVESTATE_RTC)) { + if (!mCoreLoadStateNamed (core, coreController->saveState, SAVESTATE_SAVEDATA | SAVESTATE_RTC | SAVESTATE_SCREENSHOT)) { fprintf(stderr, "Unable to load save state\n"); } } diff --git a/src/packet/hello.c b/src/packet/hello.c index c31c2c1..e9fb912 100644 --- a/src/packet/hello.c +++ b/src/packet/hello.c @@ -40,7 +40,6 @@ msThreadCallbackSetFrame(struct mCoreThread *threadContext) { #define SEC_TO_NANO(sec) \ (((uint64_t)sec) * 1000 * 1000 * 1000) struct msClientConnectionData *data = (struct msClientConnectionData *)threadContext->userData; - unsigned int stride; color_t *outputBuffer; unsigned width, height; unsigned char *rawData = NULL; @@ -55,7 +54,6 @@ msThreadCallbackSetFrame(struct mCoreThread *threadContext) { if (!data || !data->coreController) { goto return_ms_thread_callback_set_frame; } - stride = data->coreController->stride; outputBuffer = data->coreController->outputBuffer; while (nanoCurrent < nanoLast && nanoLast != 0 && nanoLast - nanoCurrent < SEC_TO_NANO(10)) { @@ -66,8 +64,16 @@ msThreadCallbackSetFrame(struct mCoreThread *threadContext) { *data->lastFrameDate = currentDate; data->coreController->threadContext.core->desiredVideoDimensions(data->coreController->threadContext.core, &width, &height); + if (data->coreController->threadContext.core->platform(data->coreController->threadContext.core) == mPLATFORM_GB) { + width = 160; + height = 144; + } - sendFrame = msPacketSendFrameNew(stride, width * height, outputBuffer); + if (data->numberFrame++ % 10 != 0) { + return; + } + + sendFrame = msPacketSendFrameNew(width, width * height, outputBuffer); rawData = msPacketSendFrameSerialize(sendFrame, &rawDataLen); if (!rawData) { goto return_ms_thread_callback_set_frame; diff --git a/src/packet/save_request.c b/src/packet/save_request.c index 8ccd570..de2c3c3 100644 --- a/src/packet/save_request.c +++ b/src/packet/save_request.c @@ -73,7 +73,7 @@ shrinkOrNullSaveRequestsDataArray(struct msClientConnectionData *data) { } static unsigned char * -VFileToBytes(struct VFile *file, size_t *len) { +vFileToBytes(struct VFile *file, size_t *len) { unsigned char *result = NULL; const ssize_t bufferLen = 120; ssize_t readLen = 0; @@ -85,15 +85,10 @@ VFileToBytes(struct VFile *file, size_t *len) { file->seek(file, 0, SEEK_SET); while ((readLen = file->read(file, buffer, bufferLen)) && readLen) { *len += readLen; - unsigned char *resultTmp= realloc(result, sizeof *result * *len); - if (!resultTmp) { - free(result); - result = NULL; - goto return_vfile_to_bytes; - } - result = resultTmp; + size_t size = sizeof *result * *len; + result = realloc(result, size); // memcpy_s not available in linux. - memcpy(&result[*len-1-readLen], buffer, readLen); // NOLINT + memcpy(&result[*len - readLen], buffer, readLen); // NOLINT } return_vfile_to_bytes: return result; @@ -128,8 +123,8 @@ unlock_ms_packet_save_request_send_response: return; } saveState = VFileMemChunk (NULL, 0); - mCoreSaveStateNamed(core, saveState, SAVESTATE_SAVEDATA & SAVESTATE_RTC); - save = VFileToBytes(saveState, &saveLen); + mCoreSaveStateNamed(core, saveState, SAVESTATE_ALL); + save = vFileToBytes(saveState, &saveLen); response = msPacketSaveResponseNew(request->identifier, saveLen, save); rawData = msPacketSaveResponseSerialize(response, &rawDataLen); if (!rawData) { @@ -172,6 +167,7 @@ msPacketSaveRequestHandle(const struct msPacket *packet, struct msPacketSaveRequ pthread_mutex_unlock(data->mutexSaveRequests); mCoreThreadRunFunction(&coreController->threadContext, &msPacketSaveRequestSendResponse); + result = true; return_ms_packet_save_request_handle: msPacketSaveRequestDestroy(&self); return result; diff --git a/src/packet/save_response.c b/src/packet/save_response.c index 37f3b41..e26cb2d 100644 --- a/src/packet/save_response.c +++ b/src/packet/save_response.c @@ -1,3 +1,4 @@ +#include #include #include @@ -33,14 +34,15 @@ msPacketSaveResponseSerialize(struct msPacketSaveResponse *const self, size_t *l *len = sizeof identifier + sizeof saveLen + sizeof *result * saveLen; result = malloc(*len); - htobe64(identifier); - htobe64(saveLen); + identifier = htobe64(identifier); + saveLen = htobe64(saveLen); memcpy(&result[currentCursor], &identifier, sizeof identifier); // NOLINT currentCursor += sizeof identifier; memcpy(&result[currentCursor], &saveLen, sizeof saveLen); // NOLINT currentCursor += sizeof saveLen; + saveLen = be64toh(saveLen); memcpy(&result[currentCursor], self->save, sizeof *result * saveLen); // NOLINT diff --git a/src/packet/send_frame.c b/src/packet/send_frame.c index 2ade8cc..0f40733 100644 --- a/src/packet/send_frame.c +++ b/src/packet/send_frame.c @@ -30,7 +30,7 @@ msPacketSendFrameSerialize(struct msPacketSendFrame *const self, size_t *len) { unsigned int stride = self->stride; size_t outputBufferSizeBytes = self->outputBufferSize * sizeof (uint32_t); stride = htobe32(stride); - *len = (sizeof self->stride) + (sizeof self->outputBufferSize) + (outputBufferSizeBytes); + *len = (sizeof stride) + (sizeof outputBufferSizeBytes) + (outputBufferSizeBytes); outputBufferSizeBytes = htobe64(outputBufferSizeBytes); bytes = malloc(*len); #define GOTO_END_SERIALIZE_FAIL() \ @@ -38,7 +38,7 @@ msPacketSendFrameSerialize(struct msPacketSendFrame *const self, size_t *len) { bytes = NULL; \ goto return_ms_packet_send_frame_serialize; FILE *fp = fmemopen(bytes, sizeof *bytes * *len, "w"); - if (fwrite(&self->stride, sizeof self->stride, 1, fp) == -1) { + if (fwrite(&stride, sizeof stride, 1, fp) == -1) { GOTO_END_SERIALIZE_FAIL(); } if (fwrite(&outputBufferSizeBytes, sizeof outputBufferSizeBytes, 1, fp) == -1) {