diff --git a/.gitignore b/.gitignore index 3ac25b94..cdac1e25 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *build*/ .idea/ roms/ +saves/ *.bin *.sh .cache/ diff --git a/src/backend/Core.hpp b/src/backend/Core.hpp index 5e328bf9..d80a2e00 100644 --- a/src/backend/Core.hpp +++ b/src/backend/Core.hpp @@ -7,7 +7,6 @@ struct Event; namespace n64 { struct Core { - ~Core() { Stop(); } Core(ParallelRDP&); void Stop(); void LoadROM(const std::string&); diff --git a/src/backend/core/mmio/Audio.cpp b/src/backend/core/mmio/Audio.cpp index 85ed0bf5..900924d7 100644 --- a/src/backend/core/mmio/Audio.cpp +++ b/src/backend/core/mmio/Audio.cpp @@ -9,14 +9,22 @@ namespace n64 { void audioCallback(void* user, Uint8* stream, int length) { auto audioDevice = (AudioDevice*)user; - int gotten = 0; - audioDevice->LockMutex(); - int available = SDL_AudioStreamAvailable(audioDevice->GetStream()); + int gotten = 0, available = 0; + if (audioDevice) { + audioDevice->LockMutex(); + } + + if (audioDevice) { + available = SDL_AudioStreamAvailable(audioDevice->GetStream().get()); + } - if (available > 0) { - gotten = SDL_AudioStreamGet(audioDevice->GetStream(), stream, length); + if (available > 0 && audioDevice) { + gotten = SDL_AudioStreamGet(audioDevice->GetStream().get(), stream, length); + } + + if (audioDevice) { + audioDevice->UnlockMutex(); } - audioDevice->UnlockMutex(); int gottenSamples = (int)(gotten / sizeof(float)); auto* out = (float*)stream; @@ -28,13 +36,11 @@ void audioCallback(void* user, Uint8* stream, int length) { } } -AudioDevice::AudioDevice() { +AudioDevice::AudioDevice() : audioStream(SDL_NewAudioStream, SDL_FreeAudioStream, "audioStream", SYSTEM_SAMPLE_FORMAT, 2, AUDIO_SAMPLE_RATE, SYSTEM_SAMPLE_FORMAT, 2, AUDIO_SAMPLE_RATE), + audioStreamMutex(SDL_CreateMutex, SDL_DestroyMutex, "audioStreamMutex") { SDL_InitSubSystem(SDL_INIT_AUDIO); - audioStream = SDL_NewAudioStream(SYSTEM_SAMPLE_FORMAT, 2, AUDIO_SAMPLE_RATE, SYSTEM_SAMPLE_FORMAT, 2, AUDIO_SAMPLE_RATE); - - audioStreamMutex = SDL_CreateMutex(); - if(!audioStreamMutex) { + if(!audioStreamMutex.get()) { Util::panic("Unable to initialize audio mutex: {}", SDL_GetError()); } @@ -59,17 +65,15 @@ void AudioDevice::PushSample(float left, float volumeL, float right, float volum float adjustedR = right * volumeR; float samples[2]{ adjustedL, adjustedR }; - auto availableBytes = (float)SDL_AudioStreamAvailable(audioStream); + auto availableBytes = (float)SDL_AudioStreamAvailable(audioStream.get()); if(availableBytes <= BYTES_PER_HALF_SECOND) { - SDL_AudioStreamPut(audioStream, samples, 2 * sizeof(float)); + SDL_AudioStreamPut(audioStream.get(), samples, 2 * sizeof(float)); } } void AudioDevice::AdjustSampleRate(int sampleRate) { LockMutex(); - if(audioStream) SDL_FreeAudioStream(audioStream); - - audioStream = SDL_NewAudioStream(SYSTEM_SAMPLE_FORMAT, 2, sampleRate, SYSTEM_SAMPLE_FORMAT, 2, AUDIO_SAMPLE_RATE); + audioStream.Construct(SDL_NewAudioStream, SYSTEM_SAMPLE_FORMAT, 2, sampleRate, SYSTEM_SAMPLE_FORMAT, 2, AUDIO_SAMPLE_RATE); UnlockMutex(); } } \ No newline at end of file diff --git a/src/backend/core/mmio/Audio.hpp b/src/backend/core/mmio/Audio.hpp index a29a0f8a..25cc1730 100644 --- a/src/backend/core/mmio/Audio.hpp +++ b/src/backend/core/mmio/Audio.hpp @@ -1,30 +1,28 @@ #pragma once -#include +#include #include namespace n64 { struct AudioDevice { AudioDevice(); - ~AudioDevice() { - SDL_FreeAudioStream(audioStream); - SDL_DestroyMutex(audioStreamMutex); - } void PushSample(float, float, float, float); void AdjustSampleRate(int); void LockMutex() { - if(audioStreamMutex) - SDL_LockMutex(audioStreamMutex); + if(audioStreamMutex.get()) + SDL_LockMutex(audioStreamMutex.get()); } void UnlockMutex() { - if (audioStreamMutex) - SDL_UnlockMutex(audioStreamMutex); + if (audioStreamMutex.get()) + SDL_UnlockMutex(audioStreamMutex.get()); } - SDL_AudioStream* GetStream() { return audioStream; } + Util::AutoRelease& GetStream() { return audioStream; } private: - SDL_AudioStream* audioStream = nullptr; - SDL_mutex* audioStreamMutex = nullptr; + Util::AutoRelease audioStream; + Util::AutoRelease audioStreamMutex; SDL_AudioSpec audioSpec{}; SDL_AudioSpec request{}; SDL_AudioDeviceID handle{}; diff --git a/src/frontend/EmuThread.cpp b/src/frontend/EmuThread.cpp index 112d99ef..61772f07 100644 --- a/src/frontend/EmuThread.cpp +++ b/src/frontend/EmuThread.cpp @@ -6,7 +6,7 @@ EmuThread::EmuThread(std::unique_ptr&& instance_, std::unique_ptr&& wsiPlatform_, std::unique_ptr&& windowInfo_, SettingsWindow& settings) noexcept : instance(std::move(instance_)), wsiPlatform(std::move(wsiPlatform_)), windowInfo(std::move(windowInfo_)), - controller(SDL_GameControllerClose), + controller(SDL_GameControllerClose, "GameController"), core(parallel), settings(settings) {} [[noreturn]] void EmuThread::run() noexcept { diff --git a/src/utils/MemoryHelpers.hpp b/src/utils/MemoryHelpers.hpp index b2f19b65..e9f72ec5 100644 --- a/src/utils/MemoryHelpers.hpp +++ b/src/utils/MemoryHelpers.hpp @@ -8,13 +8,18 @@ namespace Util { template struct AutoRelease { - AutoRelease(void (*dtor)(T*)) : dtor(dtor) { } + AutoRelease(void (*dtor)(T*), const char* name = "") : dtor(dtor), name(name) { } - AutoRelease(T* (*ctor)(Args...), void (*dtor)(T*), Args... args) : dtor(dtor) { + AutoRelease(T* (*ctor)(Args...), void (*dtor)(T*), const char* name = "", Args... args) : dtor(dtor), name(name) { thing = ctor(args...); } - T* get() { return thing; } + T* get() { + if (!thing) { + Util::panic("AutoRelease::{} is null!", name); + } + return thing; + } void Construct(T* (*ctor)(Args...), Args... args) { if(thing) { @@ -36,6 +41,7 @@ struct AutoRelease { } } private: + const char* name = ""; T* thing = nullptr; void (*dtor)(T*) = nullptr; };