From b2a5d6cc75df0a91b64be8b5170ad211ff1bb7a8 Mon Sep 17 00:00:00 2001 From: Jorge Bellon-Castro Date: Mon, 2 Jan 2023 15:34:07 +0100 Subject: [PATCH] DBus control: do not query index of item if known The track index is sometimes known when serialising a track's metadata. This moves the index query outside the metadata serialisation function when necessary. --- modules/control/dbus/dbus.c | 5 ++--- modules/control/dbus/dbus_common.h | 2 +- modules/control/dbus/dbus_player.c | 14 ++++++++++---- modules/control/dbus/dbus_tracklist.c | 13 ++++++++++--- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/modules/control/dbus/dbus.c b/modules/control/dbus/dbus.c index 499b8a869c..47405c2d7e 100644 --- a/modules/control/dbus/dbus.c +++ b/modules/control/dbus/dbus.c @@ -1311,7 +1311,7 @@ int DemarshalSetPropertyValue( DBusMessage *p_msg, void *p_arg ) free( psz ); \ } -int GetInputMeta(vlc_playlist_t *playlist, vlc_playlist_item_t *item, DBusMessageIter *args) +int GetInputMeta(size_t index, vlc_playlist_item_t *item, DBusMessageIter *args) { input_item_t *p_input = vlc_playlist_item_GetMedia(item); DBusMessageIter dict, dict_entry, variant, list; @@ -1322,8 +1322,7 @@ int GetInputMeta(vlc_playlist_t *playlist, vlc_playlist_item_t *item, DBusMessag dbus_int64_t i_length = i_mtime / 1000; char *psz_trackid; - if (asprintf(&psz_trackid, MPRIS_TRACKID_FORMAT, - vlc_playlist_IndexOf(playlist, item)) == -1) + if (asprintf(&psz_trackid, MPRIS_TRACKID_FORMAT, index) == -1) return VLC_ENOMEM; const char* ppsz_meta_items[] = diff --git a/modules/control/dbus/dbus_common.h b/modules/control/dbus/dbus_common.h index 28c60d509d..bc931e9433 100644 --- a/modules/control/dbus/dbus_common.h +++ b/modules/control/dbus/dbus_common.h @@ -144,7 +144,7 @@ enum }; int DemarshalSetPropertyValue( DBusMessage *p_msg, void *p_arg ); -int GetInputMeta( vlc_playlist_t *, vlc_playlist_item_t *, +int GetInputMeta( size_t index, vlc_playlist_item_t *, DBusMessageIter *args ); int AddProperty ( intf_thread_t *p_intf, DBusMessageIter *p_container, diff --git a/modules/control/dbus/dbus_player.c b/modules/control/dbus/dbus_player.c index c56de9d745..5fff55b111 100644 --- a/modules/control/dbus/dbus_player.c +++ b/modules/control/dbus/dbus_player.c @@ -525,13 +525,20 @@ static int MarshalMetadata( intf_thread_t *p_intf, DBusMessageIter *container ) { int result = VLC_SUCCESS; + + vlc_playlist_item_t *plitem = NULL; vlc_playlist_t *playlist = p_intf->p_sys->playlist; vlc_playlist_Lock(playlist); ssize_t id = vlc_playlist_GetCurrentIndex(playlist); - if(id != -1) + if (id != -1) { + plitem = vlc_playlist_Get(playlist, id); + vlc_playlist_item_Hold(plitem); + } + vlc_playlist_Unlock(playlist); + if(plitem) { - vlc_playlist_item_t *plitem = vlc_playlist_Get(playlist, id); - result = GetInputMeta(playlist, plitem, container); + result = GetInputMeta(id, plitem, container); + vlc_playlist_item_Release(plitem); } else { // avoid breaking the type marshalling @@ -541,7 +548,6 @@ MarshalMetadata( intf_thread_t *p_intf, DBusMessageIter *container ) !dbus_message_iter_close_container( container, &a ) ) result = VLC_ENOMEM; } - vlc_playlist_Unlock(playlist); return result; } diff --git a/modules/control/dbus/dbus_tracklist.c b/modules/control/dbus/dbus_tracklist.c index a2e4119c2b..f33b9d5ce7 100644 --- a/modules/control/dbus/dbus_tracklist.c +++ b/modules/control/dbus/dbus_tracklist.c @@ -132,13 +132,20 @@ DBUS_METHOD( GetTracksMetadata ) vlc_playlist_Lock(playlist); bool id_valid = i_track_id < vlc_playlist_Count(playlist); + vlc_playlist_item_t *item = NULL; if (id_valid) { - vlc_playlist_item_t *item = vlc_playlist_Get(playlist, i_track_id); - GetInputMeta(playlist, item, &meta); + item = vlc_playlist_Get(playlist, i_track_id); + vlc_playlist_item_Hold(item); } vlc_playlist_Unlock(playlist); - if (!id_valid) + + if (id_valid) + { + GetInputMeta(i_track_id, item, &meta); + vlc_playlist_item_Release(item); + } + else { invalid_track_id: msg_Err( (vlc_object_t*) p_this, "Invalid track id: %s",