From 893afa95ca5bdc462b5ef44dbc928634f262b155 Mon Sep 17 00:00:00 2001
|
From: ctf <ctf@rock-chips.com>
|
Date: Mon, 29 Jul 2019 03:47:58 +0000
|
Subject: [PATCH 07/19] profiles: audio: add GetPlayStatus and PosChange api
|
|
Signed-off-by: ctf <ctf@rock-chips.com>
|
---
|
profiles/audio/avrcp.c | 18 ++++++++++++++++
|
profiles/audio/player.c | 47 +++++++++++++++++++++++++++++++++++++++++
|
profiles/audio/player.h | 2 ++
|
3 files changed, 67 insertions(+)
|
|
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
|
index d5eba39..d0f7f0c 100644
|
--- a/profiles/audio/avrcp.c
|
+++ b/profiles/audio/avrcp.c
|
@@ -3002,6 +3002,17 @@ static int ct_list_items(struct media_player *mp, const char *name,
|
return 0;
|
}
|
|
+static int ct_get_play_status(struct media_player *mp, void *user_data)
|
+{
|
+ struct avrcp_player *player = user_data;
|
+ struct avrcp *session;
|
+
|
+ session = player->sessions->data;
|
+ avrcp_get_play_status(session);
|
+
|
+ return 0;
|
+}
|
+
|
static void avrcp_change_path(struct avrcp *session, uint8_t direction,
|
uint64_t uid)
|
{
|
@@ -3321,6 +3332,7 @@ static const struct media_player_callback ct_cbs = {
|
.play_item = ct_play_item,
|
.add_to_nowplaying = ct_add_to_nowplaying,
|
.total_items = ct_get_total_numberofitems,
|
+ .get_play_status = ct_get_play_status,
|
};
|
|
static struct avrcp_player *create_ct_player(struct avrcp *session,
|
@@ -3813,6 +3825,12 @@ static gboolean avrcp_get_capabilities_resp(struct avctp *conn, uint8_t code,
|
if (!session->controller || !session->controller->player)
|
return FALSE;
|
|
+ if ((events & (1 << AVRCP_EVENT_PLAYBACK_POS_CHANGED))) {
|
+ struct avrcp_player *player = session->controller->player;
|
+ struct media_player *mp = player->user_data;
|
+ media_player_set_poschange(mp, true);
|
+ }
|
+
|
if (!(events & (1 << AVRCP_EVENT_SETTINGS_CHANGED)))
|
avrcp_list_player_attributes(session);
|
|
diff --git a/profiles/audio/player.c b/profiles/audio/player.c
|
index 048f98f..eaaa54c 100644
|
--- a/profiles/audio/player.c
|
+++ b/profiles/audio/player.c
|
@@ -101,6 +101,7 @@ struct media_player {
|
struct player_callback *cb;
|
GSList *pending;
|
GSList *folders;
|
+ bool pos_change;
|
};
|
|
static void append_track(void *key, void *value, void *user_data)
|
@@ -450,6 +451,36 @@ static gboolean get_playlist(const GDBusPropertyTable *property,
|
return TRUE;
|
}
|
|
+static gboolean get_position_change(const GDBusPropertyTable *property,
|
+ DBusMessageIter *iter, void *data)
|
+{
|
+ struct media_player *mp = data;
|
+ dbus_bool_t pos_change;
|
+
|
+ pos_change = mp->pos_change;
|
+
|
+ dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &pos_change);
|
+
|
+ return TRUE;
|
+}
|
+
|
+static DBusMessage *media_player_getstatus(DBusConnection *conn, DBusMessage *msg,
|
+ void *data)
|
+{
|
+ struct media_player *mp = data;
|
+ struct player_callback *cb = mp->cb;
|
+ int err;
|
+
|
+ if (cb->cbs->get_play_status == NULL)
|
+ return btd_error_not_supported(msg);
|
+
|
+ err = cb->cbs->get_play_status(mp, cb->user_data);
|
+ if (err < 0)
|
+ return btd_error_failed(msg, strerror(-err));
|
+
|
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
|
+}
|
+
|
static DBusMessage *media_player_play(DBusConnection *conn, DBusMessage *msg,
|
void *data)
|
{
|
@@ -703,6 +734,7 @@ static const GDBusMethodTable media_player_methods[] = {
|
{ GDBUS_METHOD("Previous", NULL, NULL, media_player_previous) },
|
{ GDBUS_METHOD("FastForward", NULL, NULL, media_player_fast_forward) },
|
{ GDBUS_METHOD("Rewind", NULL, NULL, media_player_rewind) },
|
+ { GDBUS_METHOD("GetPlayStatus", NULL, NULL, media_player_getstatus) },
|
{ }
|
};
|
|
@@ -725,6 +757,7 @@ static const GDBusPropertyTable media_player_properties[] = {
|
{ "Browsable", "b", get_browsable, NULL, browsable_exists },
|
{ "Searchable", "b", get_searchable, NULL, searchable_exists },
|
{ "Playlist", "o", get_playlist, NULL, playlist_exists },
|
+ { "PosChange", "b", get_position_change, NULL, NULL },
|
{ }
|
};
|
|
@@ -1516,6 +1549,20 @@ static struct media_item *media_folder_find_item(struct media_folder *folder,
|
return NULL;
|
}
|
|
+void media_player_set_poschange(struct media_player *mp, bool enabled)
|
+{
|
+ if (mp->pos_change == enabled)
|
+ return;
|
+
|
+ DBG("%s", enabled ? "true" : "false");
|
+
|
+ mp->pos_change = enabled;
|
+
|
+ g_dbus_emit_property_changed(btd_get_dbus_connection(),
|
+ mp->path, MEDIA_PLAYER_INTERFACE,
|
+ "PosChange");
|
+}
|
+
|
static DBusMessage *media_item_play(DBusConnection *conn, DBusMessage *msg,
|
void *data)
|
{
|
diff --git a/profiles/audio/player.h b/profiles/audio/player.h
|
index 536394c..70c89b6 100644
|
--- a/profiles/audio/player.h
|
+++ b/profiles/audio/player.h
|
@@ -66,6 +66,7 @@ struct media_player_callback {
|
uint64_t uid, void *user_data);
|
int (*total_items) (struct media_player *mp, const char *name,
|
void *user_data);
|
+ int (*get_play_status) (struct media_player *mp, void *user_data);
|
};
|
|
struct media_player *media_player_controller_create(const char *path,
|
@@ -90,6 +91,7 @@ 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);
|
+void media_player_set_poschange(struct media_player *mp, bool enabled);
|
struct media_item *media_player_set_playlist_item(struct media_player *mp,
|
uint64_t uid);
|
|
--
|
2.20.1
|