diff options
| author | JosJuice <josjuice@gmail.com> | 2025-11-23 14:38:39 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-11-23 14:38:39 +0100 |
| commit | aeac5f1a580ca3bfd51f2951befebcf7fa606ec2 (patch) | |
| tree | 8a257e66d01fb6e0cd0a28fc487e685c08d91f74 | |
| parent | a2d0ad6a6405f1297946831f75a92695bc43e817 (diff) | |
| parent | 6d5e8b9ed8ced1ca180b4634fd2d36f35a34d240 (diff) | |
Merge pull request #14107 from jordan-woyak/mGBA-version-bump
Externals: Update mGBA to latest master.
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | Externals/mGBA/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | Externals/mGBA/exports.props | 1 | ||||
| m--------- | Externals/mGBA/mgba | 0 | ||||
| -rw-r--r-- | Externals/mGBA/mgba.vcxproj | 15 | ||||
| -rw-r--r-- | Source/Core/Core/HW/GBACore.cpp | 71 | ||||
| -rw-r--r-- | Source/Core/Core/HW/GBACore.h | 4 |
7 files changed, 55 insertions, 40 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index da1a9eec10..2fa3769f8f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -756,7 +756,7 @@ if(NOT ENABLE_QT) set(USE_MGBA 0) endif() if(USE_MGBA) - dolphin_find_optional_system_library(LIBMGBA Externals/mGBA) + dolphin_find_optional_system_library(LIBMGBA Externals/mGBA 0.11) endif() find_package(SYSTEMD) diff --git a/Externals/mGBA/CMakeLists.txt b/Externals/mGBA/CMakeLists.txt index f48231e352..122e484b2d 100644 --- a/Externals/mGBA/CMakeLists.txt +++ b/Externals/mGBA/CMakeLists.txt @@ -3,7 +3,7 @@ set(USE_LZMA ON) add_subdirectory(mgba EXCLUDE_FROM_ALL) dolphin_disable_warnings(mgba) -target_compile_definitions(mgba PUBLIC HAVE_CRC32) +target_compile_definitions(mgba PUBLIC HAVE_CRC32 ENABLE_VFS ENABLE_DIRECTORIES) target_link_libraries(mgba ZLIB::ZLIB) if(NOT MSVC) diff --git a/Externals/mGBA/exports.props b/Externals/mGBA/exports.props index 34e6c4f02d..ddc8446c6d 100644 --- a/Externals/mGBA/exports.props +++ b/Externals/mGBA/exports.props @@ -3,6 +3,7 @@ <ItemDefinitionGroup> <ClCompile> <AdditionalIncludeDirectories>$(ExternalsDir)mGBA\mgba\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <PreprocessorDefinitions>ENABLE_VFS;ENABLE_DIRECTORIES;%(PreprocessorDefinitions)</PreprocessorDefinitions> </ClCompile> </ItemDefinitionGroup> <ItemGroup> diff --git a/Externals/mGBA/mgba b/Externals/mGBA/mgba -Subproject 8739b22fbc90fdf0b4f6612ef9c0520f0ba44a5 +Subproject 0b40863f64d0940f333fa1c638e75f86f8a26a3 diff --git a/Externals/mGBA/mgba.vcxproj b/Externals/mGBA/mgba.vcxproj index d1235246e3..026b9b9267 100644 --- a/Externals/mGBA/mgba.vcxproj +++ b/Externals/mGBA/mgba.vcxproj @@ -18,7 +18,7 @@ <ItemDefinitionGroup> <ClCompile> <AdditionalIncludeDirectories>mgba\include;mgba\src;mgba\src\third-party\lzma;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <PreprocessorDefinitions>BUILD_STATIC;M_CORE_GB;M_CORE_GBA;USE_LZMA;_7ZIP_PPMD_SUPPPORT;HAVE_STRDUP;HAVE_SETLOCALE;HAVE_CHMOD;HAVE_UMASK;HAVE_CRC32;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PreprocessorDefinitions>BUILD_STATIC;M_CORE_GB;M_CORE_GBA;USE_LZMA;_7ZIP_PPMD_SUPPPORT;HAVE_STRDUP;HAVE_SETLOCALE;HAVE_CHMOD;HAVE_UMASK;HAVE_CRC32;ENABLE_VFS;ENABLE_VFS_FD;ENABLE_DIRECTORIES;%(PreprocessorDefinitions)</PreprocessorDefinitions> </ClCompile> <PreBuildEvent> <Command>"$(CScript)" /nologo /E:JScript "make_version.c.js"</Command> @@ -67,7 +67,9 @@ </ClCompile> <ClCompile Include="mgba\src\gb\mbc\pocket-cam.c" /> <ClCompile Include="mgba\src\gb\mbc\tama5.c" /> - <ClCompile Include="mgba\src\gb\mbc\unlicensed.c" /> + <ClCompile Include="mgba\src\gb\mbc\unlicensed.c" > + <ObjectFileName>$(IntDir)obj2\</ObjectFileName> + </ClCompile> <ClCompile Include="mgba\src\gb\memory.c" /> <ClCompile Include="mgba\src\gb\overrides.c" /> <ClCompile Include="mgba\src\gb\serialize.c"> @@ -95,6 +97,7 @@ <ClCompile Include="mgba\src\gba\cart\ereader.c" /> <ClCompile Include="mgba\src\gba\cart\gpio.c" /> <ClCompile Include="mgba\src\gba\cart\matrix.c" /> + <ClCompile Include="mgba\src\gba\cart\unlicensed.c" /> <ClCompile Include="mgba\src\gba\cart\vfame.c" /> <ClCompile Include="mgba\src\gba\cheats.c"> <ObjectFileName>$(IntDir)obj3\</ObjectFileName> @@ -138,13 +141,14 @@ <ObjectFileName>$(IntDir)obj2\</ObjectFileName> </ClCompile> <ClCompile Include="mgba\src\gba\sio\gbp.c" /> - <ClCompile Include="mgba\src\gba\sio\joybus.c" /> <ClCompile Include="mgba\src\gba\timer.c"> <ObjectFileName>$(IntDir)obj2\</ObjectFileName> </ClCompile> <ClCompile Include="mgba\src\gba\video.c"> <ObjectFileName>$(IntDir)obj2\</ObjectFileName> </ClCompile> + <ClCompile Include="mgba\src\util\audio-buffer.c" /> + <ClCompile Include="mgba\src\util\audio-resampler.c" /> <ClCompile Include="mgba\src\util\circle-buffer.c" /> <ClCompile Include="mgba\src\util\configuration.c" /> <ClCompile Include="mgba\src\util\crc32.c" /> @@ -153,6 +157,9 @@ <ClCompile Include="mgba\src\util\geometry.c" /> <ClCompile Include="mgba\src\util\hash.c" /> <ClCompile Include="mgba\src\util\image.c" /> + <ClCompile Include="mgba\src\util\interpolator.c" /> + <ClCompile Include="mgba\src\util\md5.c" /> + <ClCompile Include="mgba\src\util\sha1.c" /> <ClCompile Include="mgba\src\util\string.c" /> <ClCompile Include="mgba\src\util\table.c" /> <ClCompile Include="mgba\src\util\vector.c" /> @@ -177,7 +184,6 @@ <ObjectFileName>$(IntDir)obj3\</ObjectFileName> </ClCompile> <ClCompile Include="mgba\src\third-party\inih\ini.c" /> - <ClCompile Include="mgba\src\third-party\blip_buf\blip_buf.c" /> <ClCompile Include="mgba\src\util\vfs\vfs-lzma.c" /> <ClCompile Include="mgba\src\third-party\lzma\7zAlloc.c" /> <ClCompile Include="mgba\src\third-party\lzma\7zArcIn.c" /> @@ -206,7 +212,6 @@ <ObjectFileName>$(IntDir)obj3\</ObjectFileName> </ClCompile> <ClCompile Include="mgba\src\gb\sio\printer.c" /> - <ClCompile Include="mgba\src\gba\extra\audio-mixer.c" /> <ClCompile Include="mgba\src\gba\extra\battlechip.c" /> <ClCompile Include="mgba\src\gba\extra\proxy.c" /> <ClCompile Include="mgba\src\gb\extra\proxy.c"> diff --git a/Source/Core/Core/HW/GBACore.cpp b/Source/Core/Core/HW/GBACore.cpp index b25414f3b1..272b458fc5 100644 --- a/Source/Core/Core/HW/GBACore.cpp +++ b/Source/Core/Core/HW/GBACore.cpp @@ -9,19 +9,19 @@ #include <mgba/core/interface.h> #undef PYCPARSE #include <mgba-util/vfs.h> -#include <mgba/core/blip_buf.h> #include <mgba/core/log.h> #include <mgba/core/timing.h> #include <mgba/internal/gb/gb.h> #include <mgba/internal/gba/gba.h> + #include <mz.h> #include <mz_strm.h> #include <mz_zip.h> #include <mz_zip_rw.h> #include "AudioCommon/AudioCommon.h" + #include "Common/ChunkFile.h" -#include "Common/CommonPaths.h" #include "Common/CommonTypes.h" #include "Common/Config/Config.h" #include "Common/Crypto/SHA1.h" @@ -30,6 +30,7 @@ #include "Common/MinizipUtil.h" #include "Common/ScopeGuard.h" #include "Common/Thread.h" + #include "Core/Config/MainSettings.h" #include "Core/ConfigManager.h" #include "Core/Core.h" @@ -46,8 +47,7 @@ mLogger s_stub_logger = { [](mLogger*, int category, mLogLevel level, const char* format, va_list args) {}, nullptr}; } // namespace -constexpr auto SAMPLES = 512; -constexpr auto SAMPLE_RATE = 48000; +constexpr size_t AUDIO_BUFFER_SIZE = 512; // libmGBA does not return the correct frequency for some GB models static u32 GetCoreFrequency(mCore* core) @@ -225,9 +225,9 @@ bool Core::Start(u64 gc_ticks) } rom_guard.Dismiss(); - std::array<char, 17> game_title{}; - m_core->getGameTitle(m_core, game_title.data()); - m_game_title = game_title.data(); + mGameInfo info; + m_core->getGameInfo(m_core, &info); + m_game_title = info.title; m_save_path = NetPlay::IsNetPlayRunning() ? NetPlay::GetGBASavePath(m_device_number) : GetSavePath(m_rom_path, m_device_number); @@ -241,7 +241,7 @@ bool Core::Start(u64 gc_ticks) SetSIODriver(); SetVideoBuffer(); - SetSampleRates(); + SetAudioBufferSize(); AddCallbacks(); SetAVStream(); SetupEvent(); @@ -386,18 +386,19 @@ void Core::SetSIODriver() if (m_core->platform(m_core) != mPLATFORM_GBA) return; - GBASIOJOYCreate(&m_sio_driver); - GBASIOSetDriver(&static_cast<::GBA*>(m_core->board)->sio, &m_sio_driver, SIO_JOYBUS); - m_sio_driver.core = this; - m_sio_driver.load = [](GBASIODriver* driver) { + m_sio_driver.init = [](GBASIODriver* driver) { static_cast<SIODriver*>(driver)->core->m_link_enabled = true; return true; }; - m_sio_driver.unload = [](GBASIODriver* driver) { + m_sio_driver.handlesMode = [](GBASIODriver* driver, GBASIOMode mode) { + return mode == GBA_SIO_JOYBUS; + }; + m_sio_driver.deinit = [](GBASIODriver* driver) { static_cast<SIODriver*>(driver)->core->m_link_enabled = false; - return true; }; + + GBASIOSetDriver(&static_cast<::GBA*>(m_core->board)->sio, &m_sio_driver); } void Core::SetVideoBuffer() @@ -410,15 +411,9 @@ void Core::SetVideoBuffer() host->GameChanged(); } -void Core::SetSampleRates() +void Core::SetAudioBufferSize() { - m_core->setAudioBufferSize(m_core, SAMPLES); - blip_set_rates(m_core->getAudioChannel(m_core, 0), m_core->frequency(m_core), SAMPLE_RATE); - blip_set_rates(m_core->getAudioChannel(m_core, 1), m_core->frequency(m_core), SAMPLE_RATE); - - SoundStream* sound_stream = m_system.GetSoundStream(); - sound_stream->GetMixer()->SetGBAInputSampleRateDivisors( - m_device_number, Mixer::FIXED_SAMPLE_RATE_DIVIDEND / SAMPLE_RATE); + m_core->setAudioBufferSize(m_core, AUDIO_BUFFER_SIZE); } void Core::AddCallbacks() @@ -445,14 +440,26 @@ void Core::SetAVStream() auto core = static_cast<AVStream*>(stream)->core; core->SetVideoBuffer(); }; - m_stream.postAudioBuffer = [](mAVStream* stream, blip_t* left, blip_t* right) { - auto core = static_cast<AVStream*>(stream)->core; - std::vector<s16> buffer(SAMPLES * 2); - blip_read_samples(left, &buffer[0], SAMPLES, 1); - blip_read_samples(right, &buffer[1], SAMPLES, 1); + m_stream.audioRateChanged = [](mAVStream* stream, unsigned rate) { + auto* core = static_cast<AVStream*>(stream)->core; + auto* const sound_stream = core->m_system.GetSoundStream(); + sound_stream->GetMixer()->SetGBAInputSampleRateDivisors( + core->m_device_number, Mixer::FIXED_SAMPLE_RATE_DIVIDEND / rate); + }; + m_stream.postAudioBuffer = [](mAVStream* stream, mAudioBuffer* audio_buffer) { + size_t sample_count = mAudioBufferAvailable(audio_buffer); + const size_t required_buffer_size = sample_count * audio_buffer->channels; + + auto* const av_stream = static_cast<AVStream*>(stream); + if (required_buffer_size > av_stream->sample_buffer.size()) + av_stream->sample_buffer.reset(required_buffer_size); + + sample_count = mAudioBufferRead(audio_buffer, av_stream->sample_buffer.data(), sample_count); - SoundStream* sound_stream = core->m_system.GetSoundStream(); - sound_stream->GetMixer()->PushGBASamples(core->m_device_number, &buffer[0], SAMPLES); + auto* const core = av_stream->core; + auto* const sound_stream = core->m_system.GetSoundStream(); + sound_stream->GetMixer()->PushGBASamples(core->m_device_number, av_stream->sample_buffer.data(), + sample_count); }; m_core->setAVStream(m_core, &m_stream); } @@ -733,9 +740,9 @@ bool Core::GetRomInfo(const char* rom_path, std::array<u8, 20>& hash, std::strin return false; } - std::array<char, 17> game_title{}; - core->getGameTitle(core, game_title.data()); - title = game_title.data(); + mGameInfo info; + core->getGameInfo(core, &info); + title = info.title; core->deinit(core); return true; diff --git a/Source/Core/Core/HW/GBACore.h b/Source/Core/Core/HW/GBACore.h index 6fd4b86e0c..72faa1bec5 100644 --- a/Source/Core/Core/HW/GBACore.h +++ b/Source/Core/Core/HW/GBACore.h @@ -21,6 +21,7 @@ #include <mgba/core/core.h> #include <mgba/gba/interface.h> +#include "Common/Buffer.h" #include "Common/CommonTypes.h" class GBAHostInterface; @@ -40,6 +41,7 @@ struct SIODriver : GBASIODriver struct AVStream : mAVStream { Core* core; + Common::UniqueBuffer<s16> sample_buffer; }; struct CoreInfo @@ -106,7 +108,7 @@ private: void SetSIODriver(); void SetVideoBuffer(); - void SetSampleRates(); + void SetAudioBufferSize(); void AddCallbacks(); void SetAVStream(); void SetupEvent(); |
