Message ID | 20240607121522.1255175-1-yauhen.kharuzhy@softeq.com |
---|---|
State | New |
Headers | show |
Series | [BlueZ] mcp: Implement Next Track and Previous Track commands | expand |
Hi Yauhen, On Fri, Jun 7, 2024 at 8:15 AM Yauhen Kharuzhy <yauhen.kharuzhy@softeq.com> wrote: > > Add implementation of Next/Previous Track commands to audio/mcp profile > and shared/mcp.{c,h} code. > --- > profiles/audio/mcp.c | 18 ++++++++++++++++-- > src/shared/mcp.c | 20 ++++++++++++++++++++ > src/shared/mcp.h | 2 ++ Please have the changes to src/shared split from other changes, they have different licenses and shared may actually be subject to unit testing. > 3 files changed, 38 insertions(+), 2 deletions(-) > > diff --git a/profiles/audio/mcp.c b/profiles/audio/mcp.c > index b410b3d2a..8d1b7588e 100644 > --- a/profiles/audio/mcp.c > +++ b/profiles/audio/mcp.c > @@ -224,13 +224,27 @@ static int ct_stop(struct media_player *mp, void *user_data) > return bt_mcp_stop(mcp); > } > > +static int ct_next(struct media_player *mp, void *user_data) > +{ > + struct bt_mcp *mcp = user_data; > + > + return bt_mcp_next_track(mcp); > +} > + > +static int ct_previous(struct media_player *mp, void *user_data) > +{ > + struct bt_mcp *mcp = user_data; > + > + return bt_mcp_previous_track(mcp); > +} > + > static const struct media_player_callback ct_cbs = { > .set_setting = NULL, > .play = &ct_play, > .pause = &ct_pause, > .stop = &ct_stop, > - .next = NULL, > - .previous = NULL, > + .next = &ct_next, > + .previous = &ct_previous, > .fast_forward = NULL, > .rewind = NULL, > .press = NULL, > diff --git a/src/shared/mcp.c b/src/shared/mcp.c > index b3726ebae..71fc2d151 100644 > --- a/src/shared/mcp.c > +++ b/src/shared/mcp.c > @@ -628,6 +628,26 @@ unsigned int bt_mcp_stop(struct bt_mcp *mcp) > return mcp_send(mcp, BT_MCS_CMD_STOP); > } > > +unsigned int bt_mcp_next_track(struct bt_mcp *mcp) > +{ > + if (!(mcp->session.cp_op_supported & BT_MCS_CMD_NEXT_TRACK_SUPPORTED)) > + return -ENOTSUP; > + > + DBG(mcp, "mcp %p", mcp); > + > + return mcp_send(mcp, BT_MCS_CMD_NEXT_TRACK); > +} > + > +unsigned int bt_mcp_previous_track(struct bt_mcp *mcp) > +{ > + if (!(mcp->session.cp_op_supported & BT_MCS_CMD_PREV_TRACK_SUPPORTED)) > + return -ENOTSUP; > + > + DBG(mcp, "mcp %p", mcp); > + > + return mcp_send(mcp, BT_MCS_CMD_PREV_TRACK); > +} > + > static void mcp_mp_set_player_name(struct bt_mcp *mcp, const uint8_t *value, > uint16_t length) > { > diff --git a/src/shared/mcp.h b/src/shared/mcp.h > index a2cd6fc45..ee57ed4bf 100644 > --- a/src/shared/mcp.h > +++ b/src/shared/mcp.h > @@ -59,3 +59,5 @@ void *bt_mcp_get_user_data(struct bt_mcp *mcp); > unsigned int bt_mcp_play(struct bt_mcp *mcp); > unsigned int bt_mcp_pause(struct bt_mcp *mcp); > unsigned int bt_mcp_stop(struct bt_mcp *mcp); > +unsigned int bt_mcp_next_track(struct bt_mcp *mcp); > +unsigned int bt_mcp_previous_track(struct bt_mcp *mcp); > -- > 2.45.1 > >
diff --git a/profiles/audio/mcp.c b/profiles/audio/mcp.c index b410b3d2a..8d1b7588e 100644 --- a/profiles/audio/mcp.c +++ b/profiles/audio/mcp.c @@ -224,13 +224,27 @@ static int ct_stop(struct media_player *mp, void *user_data) return bt_mcp_stop(mcp); } +static int ct_next(struct media_player *mp, void *user_data) +{ + struct bt_mcp *mcp = user_data; + + return bt_mcp_next_track(mcp); +} + +static int ct_previous(struct media_player *mp, void *user_data) +{ + struct bt_mcp *mcp = user_data; + + return bt_mcp_previous_track(mcp); +} + static const struct media_player_callback ct_cbs = { .set_setting = NULL, .play = &ct_play, .pause = &ct_pause, .stop = &ct_stop, - .next = NULL, - .previous = NULL, + .next = &ct_next, + .previous = &ct_previous, .fast_forward = NULL, .rewind = NULL, .press = NULL, diff --git a/src/shared/mcp.c b/src/shared/mcp.c index b3726ebae..71fc2d151 100644 --- a/src/shared/mcp.c +++ b/src/shared/mcp.c @@ -628,6 +628,26 @@ unsigned int bt_mcp_stop(struct bt_mcp *mcp) return mcp_send(mcp, BT_MCS_CMD_STOP); } +unsigned int bt_mcp_next_track(struct bt_mcp *mcp) +{ + if (!(mcp->session.cp_op_supported & BT_MCS_CMD_NEXT_TRACK_SUPPORTED)) + return -ENOTSUP; + + DBG(mcp, "mcp %p", mcp); + + return mcp_send(mcp, BT_MCS_CMD_NEXT_TRACK); +} + +unsigned int bt_mcp_previous_track(struct bt_mcp *mcp) +{ + if (!(mcp->session.cp_op_supported & BT_MCS_CMD_PREV_TRACK_SUPPORTED)) + return -ENOTSUP; + + DBG(mcp, "mcp %p", mcp); + + return mcp_send(mcp, BT_MCS_CMD_PREV_TRACK); +} + static void mcp_mp_set_player_name(struct bt_mcp *mcp, const uint8_t *value, uint16_t length) { diff --git a/src/shared/mcp.h b/src/shared/mcp.h index a2cd6fc45..ee57ed4bf 100644 --- a/src/shared/mcp.h +++ b/src/shared/mcp.h @@ -59,3 +59,5 @@ void *bt_mcp_get_user_data(struct bt_mcp *mcp); unsigned int bt_mcp_play(struct bt_mcp *mcp); unsigned int bt_mcp_pause(struct bt_mcp *mcp); unsigned int bt_mcp_stop(struct bt_mcp *mcp); +unsigned int bt_mcp_next_track(struct bt_mcp *mcp); +unsigned int bt_mcp_previous_track(struct bt_mcp *mcp);