From 0cea9c10c2620e3f6ef9ab671de9b708bcf3eebd Mon Sep 17 00:00:00 2001 From: Alex Oxorn Date: Fri, 25 Apr 2025 15:02:32 -0400 Subject: [PATCH] Check all active players for "Playing" Status --- UnleashedRecomp/os/linux/media_linux.cpp | 67 +++--------------------- 1 file changed, 8 insertions(+), 59 deletions(-) diff --git a/UnleashedRecomp/os/linux/media_linux.cpp b/UnleashedRecomp/os/linux/media_linux.cpp index 45a29ea..352c4db 100644 --- a/UnleashedRecomp/os/linux/media_linux.cpp +++ b/UnleashedRecomp/os/linux/media_linux.cpp @@ -1,10 +1,10 @@ #include #include -#include #include #include #include #include +#include #include #include #include @@ -25,10 +25,8 @@ static const char* MPRIS2Path = "/org/mpris/MediaPlayer2"; static const char* MPRIS2PlayerctldBus = "org.mpris.MediaPlayer2.playerctld"; static std::optional g_dbusThread; -static std::string g_playerctldBus; static std::unordered_map g_playerStatus; -static std::list g_activePlayers; -static std::atomic g_activeStatus; +static std::atomic g_isPlaying = false; static PlaybackStatus PlaybackStatusFromString(const char* str) { @@ -47,35 +45,14 @@ static bool ContainerHas(const auto& container, const auto& value) static void UpdateActiveStatus() { - if (!g_activePlayers.empty()) - g_activeStatus = g_playerStatus[g_activePlayers.front()]; - else - g_activeStatus = PlaybackStatus::Stopped; + g_isPlaying = std::ranges::any_of( + g_playerStatus | std::views::values, + [](PlaybackStatus status) { return status == PlaybackStatus::Playing; } + ); } static void UpdateActivePlayers(const char* name, PlaybackStatus status) { - if (status == PlaybackStatus::Stopped) - { - // Don't remove playerctld from the queue, we want to prefer it for as long as it's available - if (!g_str_equal(name, g_playerctldBus.c_str())) - { - g_activePlayers.remove(name); - } - } - else if (!ContainerHas(g_activePlayers, name)) - { - // Prioritise playerctld if and when it appears - if (g_str_equal(name, g_playerctldBus.c_str())) - { - g_activePlayers.emplace_front(name); - } - else - { - g_activePlayers.emplace_back(name); - } - } - g_playerStatus.insert_or_assign(name, status); UpdateActiveStatus(); } @@ -137,7 +114,7 @@ static void DBusConnectionClosed(GDBusConnection* connection, gpointer userData) { LOG_ERROR("D-Bus connection closed"); - g_activeStatus = PlaybackStatus::Stopped; + g_isPlaying = false; g_main_loop_quit((GMainLoop*)userData); } @@ -157,15 +134,9 @@ static void DBusNameOwnerChanged(GDBusConnection* connection, if (g_str_has_prefix(name, MPRIS2Interface)) { - if (g_str_equal(name, MPRIS2PlayerctldBus)) - { - g_playerctldBus = newOwner; - } - if (oldOwner[0]) { g_playerStatus.erase(oldOwner); - g_activePlayers.remove(oldOwner); } UpdateActiveStatus(); @@ -221,13 +192,11 @@ static void DBusListNamesReceived(GObject* object, GAsyncResult* res, gpointer u GVariant* tupleChild; GVariantIter iter; const gchar* name; - bool foundPlayerctld; std::list pausedPlayers; connection = G_DBUS_CONNECTION(object); error = NULL; response = g_dbus_connection_call_finish(connection, res, &error); - foundPlayerctld = false; if (!response) { @@ -274,31 +243,11 @@ static void DBusListNamesReceived(GObject* object, GAsyncResult* res, gpointer u g_variant_get(ownerResponse, "(&s)", &ownerName); status = MPRISGetPlaybackStatus(connection, ownerName); - // Prioritise playerctld, even if current playback status is stopped - if (!foundPlayerctld && g_str_equal(name, MPRIS2PlayerctldBus)) - { - foundPlayerctld = true; - g_playerctldBus = ownerName; - g_activePlayers.emplace_front(ownerName); - } - else if (status != PlaybackStatus::Stopped) - { - if (status == PlaybackStatus::Playing) - { - g_activePlayers.emplace_back(ownerName); - } - else - { - pausedPlayers.emplace_back(ownerName); - } - } - g_playerStatus.insert_or_assign(ownerName, status); g_variant_unref(ownerResponse); } // Put all the paused players at the end of the queue - g_activePlayers.splice(g_activePlayers.end(), pausedPlayers); UpdateActiveStatus(); g_variant_unref(tupleChild); @@ -385,5 +334,5 @@ bool os::media::IsExternalMediaPlaying() g_dbusThread->detach(); } - return g_activeStatus == PlaybackStatus::Playing; + return g_isPlaying; } -- 2.34.1