From 588e82f03c6c759b47cdf0b91b52c5a1d3e1aae8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ed=C3=AAnis=20Freindorfer=20Azevedo?= Date: Mon, 6 Jan 2020 20:33:14 -0300 Subject: [PATCH 1/2] Cleanup from PR 586. --- src/common/Patch.cpp | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/src/common/Patch.cpp b/src/common/Patch.cpp index 7b2ea06d..546f734f 100644 --- a/src/common/Patch.cpp +++ b/src/common/Patch.cpp @@ -116,7 +116,7 @@ static int64_t readSignVarPtr(FILE* f) { int64_t offset = readVarPtr(f); bool sign = offset & 1; - + offset = offset >> 1; if (sign) { offset = -offset; @@ -325,7 +325,7 @@ static bool patchApplyBPS(const char* patchname, uint8_t** rom, int* size) fseeko64(f, 0, SEEK_SET); uint32_t crc = computePatchCRC(f, patchSize - 4); - + if (crc != patchCRC) { fclose(f); return false; @@ -357,13 +357,13 @@ static bool patchApplyBPS(const char* patchname, uint8_t** rom, int* size) fclose(f); return false; } - + uint8_t* new_rom = (uint8_t*)calloc(1, dataSize); - + int64_t length = 0; uint8_t action = 0; uint32_t outputOffset = 0, sourceRelativeOffset = 0, targetRelativeOffset = 0; - + while (ftello64(f) < patchSize - 12) { length = readVarPtr(f); action = length & 3 ; @@ -389,30 +389,23 @@ static bool patchApplyBPS(const char* patchname, uint8_t** rom, int* size) case 3: // targetCopy targetRelativeOffset += readSignVarPtr(f); while(length--) { // yes, copy from alredy patched rom, and only 1 byte at time (pseudo-rle) - new_rom[outputOffset++] = new_rom[targetRelativeOffset++]; + new_rom[outputOffset++] = new_rom[targetRelativeOffset++]; } break; } } - + crc = crc32(0L, Z_NULL, 0); crc = crc32(crc, new_rom, dataSize); - - // TODO - if(crc == dstCRC) { -#if 1 + + if(crc == dstCRC) + { if (dataSize > *size) { - // SIGSEGV in /src/gba/GBA.cpp:3313 [*((uint16_t*)&rom[0x1fe209c]) = 0xdffa; // SWI 0xFA] *rom = (uint8_t*)realloc(*rom, dataSize); - } + } memcpy(*rom, new_rom, dataSize); *size = dataSize; free(new_rom); -#else - free(*rom); - *rom = new_rom; - *size = dataSize; -#endif } fclose(f); @@ -602,10 +595,6 @@ static bool patchApplyPPF(const char* patchname, uint8_t** rom, int* size) #endif -// HINT: new format(.ext) => aditional changes in -// sdl/SDL.cpp>>>main (~1600) -// wx/panel.cpp>>>GameArea::LoadGame (~130) - bool applyPatch(const char* patchname, uint8_t** rom, int* size) { #ifndef __LIBRETRO__ From f69febfd71a4bd1e9420844cef603f4256a0c098 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ed=C3=AAnis=20Freindorfer=20Azevedo?= Date: Wed, 22 Jan 2020 13:50:27 -0300 Subject: [PATCH 2/2] Add `.wav` support for sound recording. WAV is also set to be the default extension for audio recording. --- src/common/ffmpeg.cpp | 22 ++++++++++++++++++---- src/wx/cmdevents.cpp | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/common/ffmpeg.cpp b/src/common/ffmpeg.cpp index 1b366912..6c2cd315 100644 --- a/src/common/ffmpeg.cpp +++ b/src/common/ffmpeg.cpp @@ -12,7 +12,8 @@ struct supportedCodecs { const supportedCodecs audioSupported[] = { { AV_CODEC_ID_MP3, "MP3 (MPEG audio layer 3)", "mp3" }, - { AV_CODEC_ID_AAC, "ADTS AAC (Advanced Audio Coding)", "aac,adts" } + { AV_CODEC_ID_AAC, "ADTS AAC (Advanced Audio Coding)", "aac,adts" }, + { AV_CODEC_ID_PCM_S16LE, "WAV / WAVE (Waveform Audio)", "wav" } }; const supportedCodecs videoSupported[] = { @@ -120,7 +121,7 @@ recording::MediaRet recording::MediaRecorder::setup_audio_stream() } } } - if (!isSupported) return MRET_ERR_NOCODEC; + if (!isSupported && acodec->supported_samplerates) return MRET_ERR_NOCODEC; aenc->channels = av_get_channel_layout_nb_channels(aenc->channel_layout); aenc->channel_layout = AV_CH_LAYOUT_STEREO; if (acodec->channel_layouts) @@ -143,7 +144,10 @@ recording::MediaRet recording::MediaRecorder::setup_audio_stream() return MRET_ERR_BUFSIZE; // number of samples per frame if (aenc->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE) - nb_samples = 10000; + { + //nb_samples = 10000; // can be any value, but we use our aud buffer size + nb_samples = 1470; + } else nb_samples = aenc->frame_size; // audio frame for input @@ -552,6 +556,16 @@ recording::MediaRet recording::MediaRecorder::AddFrame(const uint16_t *aud, int int realLength = length / sizeof *aud; bool isMissing = false; int cp = -1; + + if (c->frame_size == 0) // no compression/limit for audio frames + { + int maxCopy = realLength; + memcpy(audioBuffer + posInAudioBuffer, aud, maxCopy * 2); + posInAudioBuffer += maxCopy; + samplesInAudioBuffer += (maxCopy / 2); + aud += maxCopy; + } + if (samplesInAudioBuffer < c->frame_size) { int missingSamples = (c->frame_size - samplesInAudioBuffer); @@ -568,7 +582,7 @@ recording::MediaRet recording::MediaRecorder::AddFrame(const uint16_t *aud, int cp = realLength - maxCopy; } } - if (samplesInAudioBuffer != c->frame_size) // not enough samples + if (samplesInAudioBuffer != c->frame_size && (c->frame_size > 0 || samplesInAudioBuffer != realLength)) // not enough samples { return MRET_OK; } diff --git a/src/wx/cmdevents.cpp b/src/wx/cmdevents.cpp index 75b08721..796b9ceb 100644 --- a/src/wx/cmdevents.cpp +++ b/src/wx/cmdevents.cpp @@ -1197,7 +1197,7 @@ EVT_HANDLER_MASK(RecordSoundStartRecording, "Start sound recording...", CMDEN_NS ext.Replace(wxT(","), wxT(";*.")); ext.insert(0, wxT("*.")); - if (sound_extno < 0 && ext.find(wxT("*.mp3")) != wxString::npos) + if (sound_extno < 0 && ext.find(wxT("*.wav")) != wxString::npos) sound_extno = extno; sound_exts.append(ext);