mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-12-03 11:05:40 +00:00
FrontendCommon: Use SDL_InitSubSystem() for lazy initialization
This commit is contained in:
parent
78a6666439
commit
06f4d72631
|
@ -783,7 +783,7 @@ void QtHostInterface::threadEntryPoint()
|
|||
m_worker_thread_event_loop = new QEventLoop();
|
||||
|
||||
// set up controller interface and immediate poll to pick up the controller attached events
|
||||
g_sdl_controller_interface.Initialize(this, true);
|
||||
g_sdl_controller_interface.Initialize(this);
|
||||
g_sdl_controller_interface.PumpSDLEvents();
|
||||
|
||||
doUpdateInputMap();
|
||||
|
|
|
@ -2,18 +2,12 @@
|
|||
#include "common/log.h"
|
||||
#include "core/system.h"
|
||||
#include "sdl_host_interface.h"
|
||||
#include "frontend-common/sdl_initializer.h"
|
||||
#include <SDL.h>
|
||||
#include <cstdio>
|
||||
|
||||
static int Run(int argc, char* argv[])
|
||||
{
|
||||
// init sdl
|
||||
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) < 0)
|
||||
{
|
||||
Panic("SDL initialization failed");
|
||||
return -1;
|
||||
}
|
||||
|
||||
// parameters
|
||||
std::optional<s32> state_index;
|
||||
const char* boot_filename = nullptr;
|
||||
|
@ -82,6 +76,8 @@ int main(int argc, char* argv[])
|
|||
// Log::SetFilterLevel(LOGLEVEL_DEV);
|
||||
#endif
|
||||
|
||||
FrontendCommon::EnsureSDLInitialized();
|
||||
|
||||
// return NoGUITest();
|
||||
return Run(argc, argv);
|
||||
}
|
||||
|
|
|
@ -7,6 +7,8 @@ add_library(frontend-common
|
|||
sdl_audio_stream.h
|
||||
sdl_controller_interface.cpp
|
||||
sdl_controller_interface.h
|
||||
sdl_initializer.cpp
|
||||
sdl_initializer.h
|
||||
)
|
||||
|
||||
target_include_directories(frontend-common PRIVATE ${SDL2_INCLUDE_DIRS})
|
||||
|
|
|
@ -50,12 +50,14 @@
|
|||
<ClCompile Include="imgui_styles.cpp" />
|
||||
<ClCompile Include="sdl_audio_stream.cpp" />
|
||||
<ClCompile Include="sdl_controller_interface.cpp" />
|
||||
<ClCompile Include="sdl_initializer.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="icon.h" />
|
||||
<ClInclude Include="imgui_styles.h" />
|
||||
<ClInclude Include="sdl_audio_stream.h" />
|
||||
<ClInclude Include="sdl_controller_interface.h" />
|
||||
<ClInclude Include="sdl_initializer.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="font_roboto_regular.inl" />
|
||||
|
|
|
@ -5,12 +5,14 @@
|
|||
<ClCompile Include="imgui_styles.cpp" />
|
||||
<ClCompile Include="sdl_audio_stream.cpp" />
|
||||
<ClCompile Include="sdl_controller_interface.cpp" />
|
||||
<ClCompile Include="sdl_initializer.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="icon.h" />
|
||||
<ClInclude Include="imgui_styles.h" />
|
||||
<ClInclude Include="sdl_audio_stream.h" />
|
||||
<ClInclude Include="sdl_controller_interface.h" />
|
||||
<ClInclude Include="sdl_initializer.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="font_roboto_regular.inl" />
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "sdl_audio_stream.h"
|
||||
#include "sdl_initializer.h"
|
||||
#include "common/assert.h"
|
||||
#include "common/log.h"
|
||||
#include <SDL.h>
|
||||
|
@ -21,6 +22,14 @@ bool SDLAudioStream::OpenDevice()
|
|||
{
|
||||
DebugAssert(!m_is_open);
|
||||
|
||||
FrontendCommon::EnsureSDLInitialized();
|
||||
|
||||
if (SDL_InitSubSystem(SDL_INIT_AUDIO) < 0)
|
||||
{
|
||||
Log_ErrorPrintf("SDL_InitSubSystem(SDL_INIT_AUDIO) failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
SDL_AudioSpec spec = {};
|
||||
spec.freq = m_output_sample_rate;
|
||||
spec.channels = static_cast<Uint8>(m_channels);
|
||||
|
@ -32,6 +41,7 @@ bool SDLAudioStream::OpenDevice()
|
|||
if (SDL_OpenAudio(&spec, nullptr) < 0)
|
||||
{
|
||||
Log_ErrorPrintf("SDL_OpenAudio failed");
|
||||
SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -48,6 +58,7 @@ void SDLAudioStream::CloseDevice()
|
|||
{
|
||||
DebugAssert(m_is_open);
|
||||
SDL_CloseAudio();
|
||||
SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
||||
m_is_open = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "core/controller.h"
|
||||
#include "core/host_interface.h"
|
||||
#include "core/system.h"
|
||||
#include "sdl_initializer.h"
|
||||
#include <SDL.h>
|
||||
Log_SetChannel(SDLControllerInterface);
|
||||
|
||||
|
@ -16,19 +17,19 @@ SDLControllerInterface::~SDLControllerInterface()
|
|||
Assert(m_controllers.empty());
|
||||
}
|
||||
|
||||
bool SDLControllerInterface::Initialize(HostInterface* host_interface, bool init_sdl)
|
||||
bool SDLControllerInterface::Initialize(HostInterface* host_interface)
|
||||
{
|
||||
if (init_sdl)
|
||||
FrontendCommon::EnsureSDLInitialized();
|
||||
|
||||
if (SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) < 0)
|
||||
{
|
||||
if (SDL_Init(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) < 0)
|
||||
{
|
||||
Log_ErrorPrintf("SDL_Init() failed");
|
||||
Log_ErrorPrintf("SDL_InitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC) failed");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// we should open the controllers as the connected events come in, so no need to do any more here
|
||||
m_host_interface = host_interface;
|
||||
m_initialized = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -37,10 +38,10 @@ void SDLControllerInterface::Shutdown()
|
|||
while (!m_controllers.empty())
|
||||
CloseGameController(m_controllers.begin()->first);
|
||||
|
||||
if (m_sdl_initialized_by_us)
|
||||
if (m_initialized)
|
||||
{
|
||||
SDL_Quit();
|
||||
m_sdl_initialized_by_us = false;
|
||||
SDL_QuitSubSystem(SDL_INIT_GAMECONTROLLER | SDL_INIT_HAPTIC);
|
||||
m_initialized = false;
|
||||
}
|
||||
|
||||
m_host_interface = nullptr;
|
||||
|
|
|
@ -26,7 +26,7 @@ public:
|
|||
SDLControllerInterface();
|
||||
~SDLControllerInterface();
|
||||
|
||||
bool Initialize(HostInterface* host_interface, bool init_sdl);
|
||||
bool Initialize(HostInterface* host_interface);
|
||||
void Shutdown();
|
||||
|
||||
// Removes all bindings. Call before setting new bindings.
|
||||
|
@ -101,7 +101,7 @@ private:
|
|||
std::mutex m_event_intercept_mutex;
|
||||
Hook::Callback m_event_intercept_callback;
|
||||
|
||||
bool m_sdl_initialized_by_us = false;
|
||||
bool m_initialized = false;
|
||||
};
|
||||
|
||||
extern SDLControllerInterface g_sdl_controller_interface;
|
||||
|
|
21
src/frontend-common/sdl_initializer.cpp
Normal file
21
src/frontend-common/sdl_initializer.cpp
Normal file
|
@ -0,0 +1,21 @@
|
|||
#include "sdl_initializer.h"
|
||||
#include "common/assert.h"
|
||||
#include <SDL.h>
|
||||
|
||||
namespace FrontendCommon {
|
||||
static bool s_sdl_initialized = false;
|
||||
|
||||
void EnsureSDLInitialized()
|
||||
{
|
||||
if (s_sdl_initialized)
|
||||
return;
|
||||
|
||||
if (SDL_Init(0) < 0)
|
||||
{
|
||||
Panic("SDL_Init(0) failed");
|
||||
return;
|
||||
}
|
||||
|
||||
s_sdl_initialized = true;
|
||||
}
|
||||
} // namespace FrontendCommon
|
5
src/frontend-common/sdl_initializer.h
Normal file
5
src/frontend-common/sdl_initializer.h
Normal file
|
@ -0,0 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
namespace FrontendCommon {
|
||||
void EnsureSDLInitialized();
|
||||
}
|
Loading…
Reference in a new issue