char *status;
uint32_t position;
GTimer *progress;
- guint process_id;
struct player_callback *cb;
GSList *pending;
GSList *folders;
if (mp->settings)
g_hash_table_unref(mp->settings);
- if (mp->process_id > 0)
- g_source_remove(mp->process_id);
-
if (mp->scope)
g_dbus_unregister_interface(btd_get_dbus_connection(),
mp->path,
g_hash_table_replace(mp->track, g_strdup("Duration"), value);
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
+ g_dbus_emit_property_changed_full(btd_get_dbus_connection(),
mp->path, MEDIA_PLAYER_INTERFACE,
- "Track");
+ "Track",
+ G_DBUS_PROPERTY_CHANGED_FLAG_FLUSH);
}
void media_player_set_position(struct media_player *mp, uint32_t position)
g_timer_start(mp->progress);
}
-static gboolean process_metadata_changed(void *user_data)
+static gboolean remove_metadata(void *key, void *value, void *user_data)
{
- struct media_player *mp = user_data;
- const char *item;
-
- mp->process_id = 0;
-
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- mp->path, MEDIA_PLAYER_INTERFACE,
- "Track");
-
- item = g_hash_table_lookup(mp->track, "Item");
- if (item == NULL)
+ if (!strcmp(key, "Duration"))
return FALSE;
- g_dbus_emit_property_changed(btd_get_dbus_connection(),
- item, MEDIA_ITEM_INTERFACE,
- "Metadata");
+ return strcmp(key, "Item") ? TRUE : FALSE;
+}
- return FALSE;
+void media_player_clear_metadata(struct media_player *mp)
+{
+ if (!mp)
+ return;
+
+ g_hash_table_foreach_remove(mp->track, remove_metadata, NULL);
}
void media_player_set_metadata(struct media_player *mp,
return;
}
#endif
- if (mp->process_id == 0) {
- g_hash_table_remove_all(mp->track);
- mp->process_id = g_idle_add(process_metadata_changed, mp);
- }
g_hash_table_replace(mp->track, g_strdup(key), value);
}
+void media_player_metadata_changed(struct media_player *mp)
+{
+ char *item;
+
+ if (!mp)
+ return;
+
+ g_dbus_emit_property_changed_full(btd_get_dbus_connection(),
+ mp->path, MEDIA_PLAYER_INTERFACE,
+ "Track",
+ G_DBUS_PROPERTY_CHANGED_FLAG_FLUSH);
+
+ item = g_hash_table_lookup(mp->track, "Item");
+ if (item == NULL)
+ return;
+
+ g_dbus_emit_property_changed_full(btd_get_dbus_connection(),
+ item, MEDIA_ITEM_INTERFACE,
+ "Metadata",
+ G_DBUS_PROPERTY_CHANGED_FLAG_FLUSH);
+}
+
void media_player_set_type(struct media_player *mp, const char *type)
{
if (g_strcmp0(mp->type, type) == 0)
{
struct media_folder *folder = mp->playlist;
struct media_item *item;
+ char *path;
DBG("%" PRIu64 "", uid);
mp->track = g_hash_table_ref(item->metadata);
}
- if (item == g_hash_table_lookup(mp->track, "Item"))
+ path = g_hash_table_lookup(mp->track, "Item");
+ if (path && !strcmp(path, item->path))
return item;
- if (mp->process_id == 0) {
- g_hash_table_remove_all(mp->track);
- mp->process_id = g_idle_add(process_metadata_changed, mp);
- }
-
- g_hash_table_replace(mp->track, g_strdup("Item"),
- g_strdup(item->path));
+ g_hash_table_replace(mp->track, g_strdup("Item"), g_strdup(item->path));
return item;
}
const char *value);
const char *media_player_get_status(struct media_player *mp);
void media_player_set_status(struct media_player *mp, const char *status);
+void media_player_clear_metadata(struct media_player *mp);
void media_player_set_metadata(struct media_player *mp,
struct media_item *item, const char *key,
void *data, size_t len);
+void media_player_metadata_changed(struct media_player *mp);
void media_player_set_type(struct media_player *mp, const char *type);
void media_player_set_subtype(struct media_player *mp, const char *subtype);
void media_player_set_name(struct media_player *mp, const char *name);