@@ -3043,6 +3043,14 @@ static int ct_rewind(struct media_player *mp, void *user_data)
return ct_press(player, AVC_REWIND);
}
+static int ct_press_key(struct media_player *mp, uint8_t avc_key,
+ void *user_data)
+{
+ struct avrcp_player *player = user_data;
+
+ return ct_press(player, avc_key);
+}
+
static int ct_list_items(struct media_player *mp, const char *name,
uint32_t start, uint32_t end, void *user_data)
{
@@ -3388,6 +3396,7 @@ static const struct media_player_callback ct_cbs = {
.previous = ct_previous,
.fast_forward = ct_fast_forward,
.rewind = ct_rewind,
+ .press = ct_press_key,
.list_items = ct_list_items,
.change_folder = ct_change_folder,
.search = ct_search,
@@ -570,6 +570,28 @@ static DBusMessage *media_player_rewind(DBusConnection *conn, DBusMessage *msg,
return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
}
+static DBusMessage *media_player_press(DBusConnection *conn, DBusMessage *msg,
+ void *data)
+{
+ struct media_player *mp = data;
+ struct player_callback *cb = mp->cb;
+ int err;
+ uint8_t avc_key;
+
+ if (cb->cbs->press == NULL)
+ return btd_error_not_supported(msg);
+
+ if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BYTE, &avc_key,
+ DBUS_TYPE_INVALID))
+ return btd_error_invalid_args(msg);
+
+ err = cb->cbs->press(mp, avc_key, cb->user_data);
+ if (err < 0)
+ return btd_error_failed(msg, strerror(-err));
+
+ return g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
+}
+
static void parse_folder_list(gpointer data, gpointer user_data)
{
struct media_item *item = data;
@@ -704,6 +726,8 @@ 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("Press", GDBUS_ARGS({"avc_key", "y"}), NULL,
+ media_player_press) },
{ }
};
@@ -45,26 +45,28 @@ struct media_player;
struct media_item;
struct media_player_callback {
- bool (*set_setting) (struct media_player *mp, const char *key,
+ bool (*set_setting)(struct media_player *mp, const char *key,
const char *value, void *user_data);
- int (*play) (struct media_player *mp, void *user_data);
- int (*pause) (struct media_player *mp, void *user_data);
- int (*stop) (struct media_player *mp, void *user_data);
- int (*next) (struct media_player *mp, void *user_data);
- int (*previous) (struct media_player *mp, void *user_data);
- int (*fast_forward) (struct media_player *mp, void *user_data);
- int (*rewind) (struct media_player *mp, void *user_data);
- int (*list_items) (struct media_player *mp, const char *name,
+ int (*play)(struct media_player *mp, void *user_data);
+ int (*pause)(struct media_player *mp, void *user_data);
+ int (*stop)(struct media_player *mp, void *user_data);
+ int (*next)(struct media_player *mp, void *user_data);
+ int (*previous)(struct media_player *mp, void *user_data);
+ int (*fast_forward)(struct media_player *mp, void *user_data);
+ int (*rewind)(struct media_player *mp, void *user_data);
+ int (*press)(struct media_player *mp, uint8_t avc_key,
+ void *user_data);
+ int (*list_items)(struct media_player *mp, const char *name,
uint32_t start, uint32_t end, void *user_data);
- int (*change_folder) (struct media_player *mp, const char *path,
+ int (*change_folder)(struct media_player *mp, const char *path,
uint64_t uid, void *user_data);
- int (*search) (struct media_player *mp, const char *string,
+ int (*search)(struct media_player *mp, const char *string,
void *user_data);
- int (*play_item) (struct media_player *mp, const char *name,
+ int (*play_item)(struct media_player *mp, const char *name,
uint64_t uid, void *user_data);
- int (*add_to_nowplaying) (struct media_player *mp, const char *name,
+ int (*add_to_nowplaying)(struct media_player *mp, const char *name,
uint64_t uid, void *user_data);
- int (*total_items) (struct media_player *mp, const char *name,
+ int (*total_items)(struct media_player *mp, const char *name,
void *user_data);
};