From 02c1596ff43c7c7c304f16bc9cf4fb019c2063d9 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 28 Dec 2025 19:31:43 +0000 Subject: [PATCH] Fix WinRT apartment initialization crash Handle case where COM/WinRT apartment is already initialized by Qt or other components. Track whether we initialized the apartment to avoid uninitializing it if we didn't initialize it. Co-authored-by: jonaski <10343810+jonaski@users.noreply.github.com> --- src/core/windowsmediacontroller.cpp | 22 ++++++++++++++++++---- src/core/windowsmediacontroller.h | 1 + 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/core/windowsmediacontroller.cpp b/src/core/windowsmediacontroller.cpp index a795db7c8..b60153967 100644 --- a/src/core/windowsmediacontroller.cpp +++ b/src/core/windowsmediacontroller.cpp @@ -68,11 +68,22 @@ WindowsMediaController::WindowsMediaController(HWND hwnd, player_(player), playlist_manager_(playlist_manager), current_albumcover_loader_(current_albumcover_loader), - smtc_(nullptr) { + smtc_(nullptr), + apartment_initialized_(false) { try { - // Initialize WinRT - winrt::init_apartment(); + // Initialize WinRT apartment if not already initialized + // Qt or other components may have already initialized it + try { + winrt::init_apartment(winrt::apartment_type::single_threaded); + apartment_initialized_ = true; + } + catch (const hresult_error &e) { + // Apartment already initialized - this is fine, continue + if (e.code() != RPC_E_CHANGED_MODE) { + throw; + } + } // Create private implementation auto *priv = new WindowsMediaControllerPrivate(); @@ -153,7 +164,10 @@ WindowsMediaController::~WindowsMediaController() { delete priv; smtc_ = nullptr; } - winrt::uninit_apartment(); + // Only uninit if we initialized the apartment + if (apartment_initialized_) { + winrt::uninit_apartment(); + } } void WindowsMediaController::SetupButtonHandlers() { diff --git a/src/core/windowsmediacontroller.h b/src/core/windowsmediacontroller.h index 3eaceb6a8..4b8fb5aa6 100644 --- a/src/core/windowsmediacontroller.h +++ b/src/core/windowsmediacontroller.h @@ -63,6 +63,7 @@ class WindowsMediaController : public QObject { const SharedPtr current_albumcover_loader_; void *smtc_; // Pointer to SystemMediaTransportControls (opaque to avoid WinRT headers in public header) QString current_song_art_url_; + bool apartment_initialized_; // Track if we initialized the WinRT apartment }; #endif // WINDOWSMEDIACONTROLLER_H