summaryrefslogtreecommitdiff
path: root/profiles/audio
diff options
context:
space:
mode:
Diffstat (limited to 'profiles/audio')
-rw-r--r--profiles/audio/avrcp.c4
-rw-r--r--profiles/audio/player.c74
-rw-r--r--profiles/audio/player.h2
3 files changed, 45 insertions, 35 deletions
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 5eb182b76..80f34c7a7 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -2402,6 +2402,8 @@ static void avrcp_parse_attribute_list(struct avrcp_player *player,
struct media_item *item;
int i;
+ media_player_clear_metadata(mp);
+
item = media_player_set_playlist_item(mp, player->uid);
for (i = 0; count > 0; count--) {
@@ -2428,6 +2430,8 @@ static void avrcp_parse_attribute_list(struct avrcp_player *player,
i += len;
}
+
+ media_player_metadata_changed(mp);
}
static gboolean avrcp_get_element_attributes_rsp(struct avctp *conn,
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
index d34b39168..c995697fe 100644
--- a/profiles/audio/player.c
+++ b/profiles/audio/player.c
@@ -85,7 +85,6 @@ struct media_player {
char *status;
uint32_t position;
GTimer *progress;
- guint process_id;
struct player_callback *cb;
GSList *pending;
GSList *folders;
@@ -1233,9 +1232,6 @@ void media_player_destroy(struct media_player *mp)
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,
@@ -1308,9 +1304,10 @@ void media_player_set_duration(struct media_player *mp, uint32_t duration)
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)
@@ -1395,26 +1392,20 @@ void media_player_set_status(struct media_player *mp, const char *status)
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;
+}
+
+void media_player_clear_metadata(struct media_player *mp)
+{
+ if (!mp)
+ return;
- return FALSE;
+ g_hash_table_foreach_remove(mp->track, remove_metadata, NULL);
}
void media_player_set_metadata(struct media_player *mp,
@@ -1433,14 +1424,31 @@ void media_player_set_metadata(struct media_player *mp,
return;
}
- 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)
@@ -1962,6 +1970,7 @@ struct media_item *media_player_set_playlist_item(struct media_player *mp,
{
struct media_folder *folder = mp->playlist;
struct media_item *item;
+ char *path;
DBG("%" PRIu64 "", uid);
@@ -1980,16 +1989,11 @@ struct media_item *media_player_set_playlist_item(struct media_player *mp,
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;
}
diff --git a/profiles/audio/player.h b/profiles/audio/player.h
index 69f08735b..74fb7d771 100644
--- a/profiles/audio/player.h
+++ b/profiles/audio/player.h
@@ -70,9 +70,11 @@ void media_player_set_setting(struct media_player *mp, const char *key,
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);