Browse Source

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.
pull/141/head
Jorge Bellon-Castro 4 years ago
committed by Felix Paul Kühne
parent
commit
b2a5d6cc75
  1. 5
      modules/control/dbus/dbus.c
  2. 2
      modules/control/dbus/dbus_common.h
  3. 14
      modules/control/dbus/dbus_player.c
  4. 13
      modules/control/dbus/dbus_tracklist.c

5
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[] =

2
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,

14
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;
}

13
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",

Loading…
Cancel
Save