diff --git a/doc/media-api.txt b/doc/media-api.txt
index 699affa..6bafd47 100644
--- a/doc/media-api.txt
+++ b/doc/media-api.txt
by using MediaLibrary interface but it might interfere
in the playback of other players.
+ object Playlist
+
+ Playlist object path.
+
MediaFolder1 hierarchy
======================
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index 110910d..b8cc8f6 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
if (features[7] & 0x10)
media_player_set_searchable(mp, true);
- if (features[8] & 0x02)
+ if (features[8] & 0x02) {
media_player_create_folder(mp, "/NowPlaying",
PLAYER_FOLDER_TYPE_MIXED);
+ media_player_set_playlist(mp, "/NowPlaying");
+ }
}
static void avrcp_parse_media_player_item(struct avrcp *session,
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
index 8e6636b..50492fa 100644
--- a/profiles/audio/player.c
+++ b/profiles/audio/player.c
char *subtype; /* Player subtype */
bool browsable; /* Player browsing feature */
bool searchable; /* Player searching feature */
- struct media_folder *folder; /* Player currenct folder */
+ struct media_folder *folder; /* Player current folder */
+ struct media_item *playlist; /* Player current playlist */
char *path; /* Player object path */
GHashTable *settings; /* Player settings */
GHashTable *track; /* Player current track */
return TRUE;
}
+static gboolean playlist_exists(const GDBusPropertyTable *property,
+ void *data)
+{
+ struct media_player *mp = data;
+
+ return mp->playlist != NULL;
+}
+
+static gboolean get_playlist(const GDBusPropertyTable *property,
+ DBusMessageIter *iter, void *data)
+{
+ struct media_player *mp = data;
+ struct media_item *playlist = mp->playlist;
+
+ if (playlist == NULL)
+ return FALSE;
+
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_OBJECT_PATH,
+ &playlist->path);
+
+ return TRUE;
+}
+
static DBusMessage *media_player_play(DBusConnection *conn, DBusMessage *msg,
void *data)
{
G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
{ "Searchable", "b", get_searchable, NULL, searchable_exists,
G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
+ { "Playlist", "o", get_playlist, NULL, playlist_exists,
+ G_DBUS_PROPERTY_FLAG_EXPERIMENTAL },
{ }
};
media_player_set_folder_item(mp, item, number_of_items);
}
+void media_player_set_playlist(struct media_player *mp, const char *name)
+{
+ struct media_item *item;
+
+ DBG("%s", name);
+
+ item = media_player_find_folder(mp, name);
+ if (item == NULL) {
+ error("Unknown folder: %s", name);
+ return;
+ }
+
+ mp->playlist = item;
+
+ g_dbus_emit_property_changed(btd_get_dbus_connection(), mp->path,
+ MEDIA_PLAYER_INTERFACE, "Playlist");
+}
+
static DBusMessage *media_item_play(DBusConnection *conn, DBusMessage *msg,
void *data)
{
diff --git a/profiles/audio/player.h b/profiles/audio/player.h
index bdf0501..8d6aa36 100644
--- a/profiles/audio/player.h
+++ b/profiles/audio/player.h
void media_player_set_searchable(struct media_player *mp, bool enabled);
void media_player_set_folder(struct media_player *mp, const char *path,
uint32_t items);
+void media_player_set_playlist(struct media_player *mp, const char *name);
int media_player_create_folder(struct media_player *mp, const char *name,
player_folder_type_t type);