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 /Source | |
| parent | a2d0ad6a6405f1297946831f75a92695bc43e817 (diff) | |
| parent | 6d5e8b9ed8ced1ca180b4634fd2d36f35a34d240 (diff) | |
Merge pull request #14107 from jordan-woyak/mGBA-version-bump
Externals: Update mGBA to latest master.
Diffstat (limited to 'Source')
| -rw-r--r-- | Source/Core/Core/HW/GBACore.cpp | 71 | ||||
| -rw-r--r-- | Source/Core/Core/HW/GBACore.h | 4 |
2 files changed, 42 insertions, 33 deletions
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(); |
