Line data Source code
1 1 : /**
2 : * @file
3 : * @brief Bluetooth Media Proxy APIs
4 : */
5 :
6 : /*
7 : * Copyright (c) 2019 - 2024 Nordic Semiconductor ASA
8 : *
9 : * SPDX-License-Identifier: Apache-2.0
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MEDIA_PROXY_H_
13 : #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MEDIA_PROXY_H_
14 :
15 : /**
16 : * @brief Media proxy module
17 : *
18 : * @defgroup bt_media_proxy Media Proxy
19 : *
20 : * @since 3.0
21 : * @version 0.8.0
22 : *
23 : * @ingroup bluetooth
24 : * @{
25 : *
26 : * The media proxy module is the connection point between media players
27 : * and media controllers.
28 : *
29 : * A media player has (access to) media content and knows how to
30 : * navigate and play this content. A media controller reads or gets
31 : * information from a player and controls the player by setting player
32 : * parameters and giving the player commands.
33 : *
34 : * The media proxy module allows media player implementations to make
35 : * themselves available to media controllers. And it allows
36 : * controllers to access, and get updates from, any player.
37 : *
38 : * The media proxy module allows both local and remote control of
39 : * local player instances: A media controller may be a local
40 : * application, or it may be a Media Control Service relaying requests
41 : * from a remote Media Control Client. There may be either local or
42 : * remote control, or both, or even multiple instances of each.
43 : */
44 :
45 : #include <stdint.h>
46 : #include <stdbool.h>
47 :
48 : #include <zephyr/bluetooth/bluetooth.h>
49 : #include <zephyr/sys/util_macro.h>
50 :
51 : /* TODO: Remove dependency on mcs.h */
52 : #include "mcs.h"
53 :
54 : #ifdef __cplusplus
55 : extern "C" {
56 : #endif
57 :
58 : /**
59 : * @brief Media player command
60 : */
61 1 : struct mpl_cmd {
62 : /** The opcode. See the MEDIA_PROXY_OP_* values */
63 1 : uint8_t opcode;
64 : /** Whether or not the @ref mpl_cmd.param is used */
65 1 : bool use_param;
66 : /** A 32-bit signed parameter. The parameter value depends on the @ref mpl_cmd.opcode */
67 1 : int32_t param;
68 : };
69 :
70 : /**
71 : * @brief Media command notification
72 : */
73 1 : struct mpl_cmd_ntf {
74 : /** The opcode that was sent */
75 1 : uint8_t requested_opcode;
76 : /** The result of the operation */
77 1 : uint8_t result_code;
78 : };
79 :
80 : /**
81 : * @brief Search control item
82 : */
83 1 : struct mpl_sci {
84 1 : uint8_t len; /**< Length of type and parameter */
85 1 : uint8_t type; /**< MEDIA_PROXY_SEARCH_TYPE_<...> */
86 1 : char param[SEARCH_PARAM_MAX]; /**< Search parameter */
87 : };
88 :
89 : /**
90 : * @brief Search
91 : */
92 1 : struct mpl_search {
93 : /** The length of the @ref mpl_search.search value */
94 1 : uint8_t len;
95 : /** Concatenated search control items - (type, length, param) */
96 1 : char search[SEARCH_LEN_MAX];
97 : };
98 :
99 : /**
100 : * @name Playback speed parameters
101 : *
102 : * All values from -128 to 127 allowed, only some defined
103 : * @{
104 : */
105 : /** Minimum playback speed, resulting in 25 % speed */
106 1 : #define MEDIA_PROXY_PLAYBACK_SPEED_MIN -128
107 : /** Quarter playback speed, resulting in 25 % speed */
108 1 : #define MEDIA_PROXY_PLAYBACK_SPEED_QUARTER -128
109 : /** Half playback speed, resulting in 50 % speed */
110 1 : #define MEDIA_PROXY_PLAYBACK_SPEED_HALF -64
111 : /** Unity playback speed, resulting in 100 % speed */
112 1 : #define MEDIA_PROXY_PLAYBACK_SPEED_UNITY 0
113 : /** Double playback speed, resulting in 200 % speed */
114 1 : #define MEDIA_PROXY_PLAYBACK_SPEED_DOUBLE 64
115 : /** Max playback speed, resulting in 395.7 % speed (nearly 400 %) */
116 1 : #define MEDIA_PROXY_PLAYBACK_SPEED_MAX 127
117 : /** @} */
118 :
119 : /**
120 : * @name Seeking speed factors
121 : *
122 : * The allowed values for seeking speed are the range -64 to -4
123 : * (endpoints included), the value 0, and the range 4 to 64
124 : * (endpoints included).
125 : * @{
126 : */
127 : /** Maximum seeking speed - Can be negated */
128 1 : #define MEDIA_PROXY_SEEKING_SPEED_FACTOR_MAX 64
129 : /** Minimum seeking speed - Can be negated */
130 1 : #define MEDIA_PROXY_SEEKING_SPEED_FACTOR_MIN 4
131 : /** No seeking */
132 1 : #define MEDIA_PROXY_SEEKING_SPEED_FACTOR_ZERO 0
133 : /** @} */
134 :
135 : /**
136 : * @name Playing orders
137 : * @{
138 : */
139 : /** A single track is played once; there is no next track. */
140 1 : #define MEDIA_PROXY_PLAYING_ORDER_SINGLE_ONCE 0x01
141 : /** A single track is played repeatedly; the next track is the current track. */
142 1 : #define MEDIA_PROXY_PLAYING_ORDER_SINGLE_REPEAT 0x02
143 : /** The tracks within a group are played once in track order. */
144 1 : #define MEDIA_PROXY_PLAYING_ORDER_INORDER_ONCE 0x03
145 : /** The tracks within a group are played in track order repeatedly. */
146 1 : #define MEDIA_PROXY_PLAYING_ORDER_INORDER_REPEAT 0x04
147 : /** The tracks within a group are played once only from the oldest first. */
148 1 : #define MEDIA_PROXY_PLAYING_ORDER_OLDEST_ONCE 0x05
149 : /** The tracks within a group are played from the oldest first repeatedly. */
150 1 : #define MEDIA_PROXY_PLAYING_ORDER_OLDEST_REPEAT 0x06
151 : /** The tracks within a group are played once only from the newest first. */
152 1 : #define MEDIA_PROXY_PLAYING_ORDER_NEWEST_ONCE 0x07
153 : /** The tracks within a group are played from the newest first repeatedly. */
154 1 : #define MEDIA_PROXY_PLAYING_ORDER_NEWEST_REPEAT 0x08
155 : /** The tracks within a group are played in random order once. */
156 1 : #define MEDIA_PROXY_PLAYING_ORDER_SHUFFLE_ONCE 0x09
157 : /** The tracks within a group are played in random order repeatedly. */
158 1 : #define MEDIA_PROXY_PLAYING_ORDER_SHUFFLE_REPEAT 0x0a
159 : /** @} */
160 :
161 : /**
162 : * @name Playing orders supported
163 : *
164 : * A bitmap, in the same order as the playing orders above.
165 : * Note that playing order 1 corresponds to bit 0, and so on.
166 : * @{
167 : */
168 : /** A single track is played once; there is no next track. */
169 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SINGLE_ONCE BIT(0)
170 : /** A single track is played repeatedly; the next track is the current track. */
171 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SINGLE_REPEAT BIT(1)
172 : /** The tracks within a group are played once in track order. */
173 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_INORDER_ONCE BIT(2)
174 : /** The tracks within a group are played in track order repeatedly. */
175 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_INORDER_REPEAT BIT(3)
176 : /** The tracks within a group are played once only from the oldest first. */
177 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_OLDEST_ONCE BIT(4)
178 : /** The tracks within a group are played from the oldest first repeatedly. */
179 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_OLDEST_REPEAT BIT(5)
180 : /** The tracks within a group are played once only from the newest first. */
181 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_NEWEST_ONCE BIT(6)
182 : /** The tracks within a group are played from the newest first repeatedly. */
183 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_NEWEST_REPEAT BIT(7)
184 : /** The tracks within a group are played in random order once. */
185 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SHUFFLE_ONCE BIT(8)
186 : /** The tracks within a group are played in random order repeatedly. */
187 1 : #define MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_SHUFFLE_REPEAT BIT(9)
188 : /** @} */
189 :
190 : /**
191 : * @name Media player states
192 : * @{
193 : */
194 : /** The current track is invalid, and no track has been selected. */
195 1 : #define MEDIA_PROXY_STATE_INACTIVE 0x00
196 : /** The media player is playing the current track. */
197 1 : #define MEDIA_PROXY_STATE_PLAYING 0x01
198 : /** The current track is paused. The media player has a current track, but it is not being played */
199 1 : #define MEDIA_PROXY_STATE_PAUSED 0x02
200 : /** The current track is fast forwarding or fast rewinding. */
201 1 : #define MEDIA_PROXY_STATE_SEEKING 0x03
202 : /** Used internally as the last state value */
203 1 : #define MEDIA_PROXY_STATE_LAST 0x04
204 : /** @} */
205 :
206 : /**
207 : * @name Media player command opcodes
208 : * @{
209 : */
210 : /** Start playing the current track. */
211 1 : #define MEDIA_PROXY_OP_PLAY 0x01
212 : /** Pause playing the current track. */
213 1 : #define MEDIA_PROXY_OP_PAUSE 0x02
214 : /** Fast rewind the current track. */
215 1 : #define MEDIA_PROXY_OP_FAST_REWIND 0x03
216 : /** Fast forward the current track. */
217 1 : #define MEDIA_PROXY_OP_FAST_FORWARD 0x04
218 : /**
219 : * Stop current activity and return to the paused state and set the current track position to the
220 : * start of the current track.
221 : */
222 1 : #define MEDIA_PROXY_OP_STOP 0x05
223 :
224 : /** Set a new current track position relative to the current track position. */
225 1 : #define MEDIA_PROXY_OP_MOVE_RELATIVE 0x10
226 :
227 : /**
228 : * Set the current track position to the starting position of the previous segment of the current
229 : * track.
230 : */
231 1 : #define MEDIA_PROXY_OP_PREV_SEGMENT 0x20
232 : /**
233 : * Set the current track position to the starting position of
234 : * the next segment of the current track.
235 : */
236 1 : #define MEDIA_PROXY_OP_NEXT_SEGMENT 0x21
237 : /**
238 : * Set the current track position to the starting position of
239 : * the first segment of the current track.
240 : */
241 1 : #define MEDIA_PROXY_OP_FIRST_SEGMENT 0x22
242 : /**
243 : * Set the current track position to the starting position of
244 : * the last segment of the current track.
245 : */
246 1 : #define MEDIA_PROXY_OP_LAST_SEGMENT 0x23
247 : /**
248 : * Set the current track position to the starting position of
249 : * the nth segment of the current track.
250 : */
251 1 : #define MEDIA_PROXY_OP_GOTO_SEGMENT 0x24
252 :
253 : /** Set the current track to the previous track based on the playing order. */
254 1 : #define MEDIA_PROXY_OP_PREV_TRACK 0x30
255 : /** Set the current track to the next track based on the playing order. */
256 1 : #define MEDIA_PROXY_OP_NEXT_TRACK 0x31
257 : /** Set the current track to the first track based on the playing order. */
258 1 : #define MEDIA_PROXY_OP_FIRST_TRACK 0x32
259 : /** Set the current track to the last track based on the playing order. */
260 1 : #define MEDIA_PROXY_OP_LAST_TRACK 0x33
261 : /** Set the current track to the nth track based on the playing order. */
262 1 : #define MEDIA_PROXY_OP_GOTO_TRACK 0x34
263 :
264 : /** Set the current group to the previous group in the sequence of groups. */
265 1 : #define MEDIA_PROXY_OP_PREV_GROUP 0x40
266 : /** Set the current group to the next group in the sequence of groups. */
267 1 : #define MEDIA_PROXY_OP_NEXT_GROUP 0x41
268 : /** Set the current group to the first group in the sequence of groups. */
269 1 : #define MEDIA_PROXY_OP_FIRST_GROUP 0x42
270 : /** Set the current group to the last group in the sequence of groups. */
271 1 : #define MEDIA_PROXY_OP_LAST_GROUP 0x43
272 : /** Set the current group to the nth group in the sequence of groups. */
273 1 : #define MEDIA_PROXY_OP_GOTO_GROUP 0x44
274 : /** @} */
275 :
276 : /**
277 : * @brief Media player supported opcodes length
278 : */
279 1 : #define MEDIA_PROXY_OPCODES_SUPPORTED_LEN 4
280 :
281 : /**
282 : * @brief Media player supported command opcodes
283 : * @{
284 : */
285 : /** Support the Play opcode */
286 1 : #define MEDIA_PROXY_OP_SUP_PLAY BIT(0)
287 : /** Support the Pause opcode */
288 1 : #define MEDIA_PROXY_OP_SUP_PAUSE BIT(1)
289 : /** Support the Fast Rewind opcode */
290 1 : #define MEDIA_PROXY_OP_SUP_FAST_REWIND BIT(2)
291 : /** Support the Fast Forward opcode */
292 1 : #define MEDIA_PROXY_OP_SUP_FAST_FORWARD BIT(3)
293 : /** Support the Stop opcode */
294 1 : #define MEDIA_PROXY_OP_SUP_STOP BIT(4)
295 :
296 : /** Support the Move Relative opcode */
297 1 : #define MEDIA_PROXY_OP_SUP_MOVE_RELATIVE BIT(5)
298 :
299 : /** Support the Previous Segment opcode */
300 1 : #define MEDIA_PROXY_OP_SUP_PREV_SEGMENT BIT(6)
301 : /** Support the Next Segment opcode */
302 1 : #define MEDIA_PROXY_OP_SUP_NEXT_SEGMENT BIT(7)
303 : /** Support the First Segment opcode */
304 1 : #define MEDIA_PROXY_OP_SUP_FIRST_SEGMENT BIT(8)
305 : /** Support the Last Segment opcode */
306 1 : #define MEDIA_PROXY_OP_SUP_LAST_SEGMENT BIT(9)
307 : /** Support the Goto Segment opcode */
308 1 : #define MEDIA_PROXY_OP_SUP_GOTO_SEGMENT BIT(10)
309 :
310 : /** Support the Previous Track opcode */
311 1 : #define MEDIA_PROXY_OP_SUP_PREV_TRACK BIT(11)
312 : /** Support the Next Track opcode */
313 1 : #define MEDIA_PROXY_OP_SUP_NEXT_TRACK BIT(12)
314 : /** Support the First Track opcode */
315 1 : #define MEDIA_PROXY_OP_SUP_FIRST_TRACK BIT(13)
316 : /** Support the Last Track opcode */
317 1 : #define MEDIA_PROXY_OP_SUP_LAST_TRACK BIT(14)
318 : /** Support the Goto Track opcode */
319 1 : #define MEDIA_PROXY_OP_SUP_GOTO_TRACK BIT(15)
320 :
321 : /** Support the Previous Group opcode */
322 1 : #define MEDIA_PROXY_OP_SUP_PREV_GROUP BIT(16)
323 : /** Support the Next Group opcode */
324 1 : #define MEDIA_PROXY_OP_SUP_NEXT_GROUP BIT(17)
325 : /** Support the First Group opcode */
326 1 : #define MEDIA_PROXY_OP_SUP_FIRST_GROUP BIT(18)
327 : /** Support the Last Group opcode */
328 1 : #define MEDIA_PROXY_OP_SUP_LAST_GROUP BIT(19)
329 : /** Support the Goto Group opcode */
330 1 : #define MEDIA_PROXY_OP_SUP_GOTO_GROUP BIT(20)
331 : /** @} */
332 :
333 : /**
334 : * @name Media player command result codes
335 : * @{
336 : */
337 : /** Action requested by the opcode write was completed successfully. */
338 1 : #define MEDIA_PROXY_CMD_SUCCESS 0x01
339 : /** An invalid or unsupported opcode was used for the Media Control Point write. */
340 1 : #define MEDIA_PROXY_CMD_NOT_SUPPORTED 0x02
341 : /**
342 : * The Media Player State characteristic value is Inactive when the opcode is received or the
343 : * result of the requested action of the opcode results in the Media Player State characteristic
344 : * being set to Inactive.
345 : */
346 1 : #define MEDIA_PROXY_CMD_PLAYER_INACTIVE 0x03
347 : /**
348 : * The requested action of any Media Control Point write cannot be completed successfully because of
349 : * a condition within the player.
350 : */
351 1 : #define MEDIA_PROXY_CMD_CANNOT_BE_COMPLETED 0x04
352 : /** @} */
353 :
354 : /**
355 : * @name Search operation type values
356 : * @{
357 : */
358 : /** Search for Track Name */
359 1 : #define MEDIA_PROXY_SEARCH_TYPE_TRACK_NAME 0x01
360 : /** Search for Artist Name */
361 1 : #define MEDIA_PROXY_SEARCH_TYPE_ARTIST_NAME 0x02
362 : /** Search for Album Name */
363 1 : #define MEDIA_PROXY_SEARCH_TYPE_ALBUM_NAME 0x03
364 : /** Search for Group Name */
365 1 : #define MEDIA_PROXY_SEARCH_TYPE_GROUP_NAME 0x04
366 : /** Search for Earliest Year */
367 1 : #define MEDIA_PROXY_SEARCH_TYPE_EARLIEST_YEAR 0x05
368 : /** Search for Latest Year */
369 1 : #define MEDIA_PROXY_SEARCH_TYPE_LATEST_YEAR 0x06
370 : /** Search for Genre */
371 1 : #define MEDIA_PROXY_SEARCH_TYPE_GENRE 0x07
372 : /** Search for Tracks only */
373 1 : #define MEDIA_PROXY_SEARCH_TYPE_ONLY_TRACKS 0x08
374 : /** Search for Groups only */
375 1 : #define MEDIA_PROXY_SEARCH_TYPE_ONLY_GROUPS 0x09
376 : /** @} */
377 :
378 : /**
379 : * @name Search notification result codes
380 : *
381 : * @{
382 : */
383 : /** Search request was accepted; search has started. */
384 1 : #define MEDIA_PROXY_SEARCH_SUCCESS 0x01
385 : /** Search request was invalid; no search started. */
386 1 : #define MEDIA_PROXY_SEARCH_FAILURE 0x02
387 : /** @} */
388 :
389 : /**
390 : * @name Group object object types
391 : *
392 : * @{
393 : */
394 : /** Group object type is track */
395 1 : #define MEDIA_PROXY_GROUP_OBJECT_TRACK_TYPE 0x00
396 : /** Group object type is group */
397 1 : #define MEDIA_PROXY_GROUP_OBJECT_GROUP_TYPE 0x01
398 : /** @} */
399 :
400 : /**
401 : * @brief Opaque media player instance
402 : */
403 : struct media_player;
404 :
405 : /* PUBLIC API FOR CONTROLLERS */
406 :
407 : /**
408 : * @brief Callbacks to a controller, from the media proxy
409 : *
410 : * Given by a controller when registering
411 : */
412 1 : struct media_proxy_ctrl_cbs {
413 :
414 : /**
415 : * @brief Media Player Instance callback
416 : *
417 : * Called when the local Media Player instance is registered or read (TODO).
418 : * Also called if the local player instance is already registered when
419 : * the controller is registered.
420 : * Provides the controller with the pointer to the local player instance.
421 : *
422 : * @param player Media player instance pointer
423 : * @param err Error value. 0 on success, or errno on negative value.
424 : */
425 1 : void (*local_player_instance)(struct media_player *player, int err);
426 :
427 : #ifdef CONFIG_MCTL_REMOTE_PLAYER_CONTROL
428 : /**
429 : * @brief Discover Player Instance callback
430 : *
431 : * Called when a remote player instance has been discovered.
432 : * The instance has been discovered, and will be accessed, using Bluetooth,
433 : * via media control client and a remote media control service.
434 : *
435 : * @param player Instance pointer to the remote player
436 : * @param err Error value. 0 on success, GATT error on positive value
437 : * or errno on negative value.
438 : */
439 : void (*discover_player)(struct media_player *player, int err);
440 : #endif /* CONFIG_MCTL_REMOTE_PLAYER_CONTROL */
441 :
442 : /**
443 : * @brief Media Player Name receive callback
444 : *
445 : * Called when the Media Player Name is read or changed
446 : * See also media_proxy_ctrl_name_get()
447 : *
448 : * @param player Media player instance pointer
449 : * @param err Error value. 0 on success, GATT error on positive value
450 : * or errno on negative value.
451 : * @param name The name of the media player
452 : */
453 1 : void (*player_name_recv)(struct media_player *player, int err, const char *name);
454 :
455 : /**
456 : * @brief Media Player Icon Object ID receive callback
457 : *
458 : * Called when the Media Player Icon Object ID is read
459 : * See also media_proxy_ctrl_get_icon_id()
460 : *
461 : * @param player Media player instance pointer
462 : * @param err Error value. 0 on success, GATT error on positive value
463 : * or errno on negative value.
464 : * @param id The ID of the Icon object in the Object Transfer Service (48 bits)
465 : */
466 1 : void (*icon_id_recv)(struct media_player *player, int err, uint64_t id);
467 :
468 : /**
469 : * @brief Media Player Icon URL receive callback
470 : *
471 : * Called when the Media Player Icon URL is read
472 : * See also media_proxy_ctrl_get_icon_url()
473 : *
474 : * @param player Media player instance pointer
475 : * @param err Error value. 0 on success, GATT error on positive value
476 : * or errno on negative value.
477 : * @param url The URL of the icon
478 : */
479 1 : void (*icon_url_recv)(struct media_player *player, int err, const char *url);
480 :
481 : /**
482 : * @brief Track changed receive callback
483 : *
484 : * Called when the Current Track is changed
485 : *
486 : * @param player Media player instance pointer
487 : * @param err Error value. 0 on success, GATT error on positive value
488 : * or errno on negative value.
489 : */
490 1 : void (*track_changed_recv)(struct media_player *player, int err);
491 :
492 : /**
493 : * @brief Track Title receive callback
494 : *
495 : * Called when the Track Title is read or changed
496 : * See also media_proxy_ctrl_get_track_title()
497 : *
498 : * @param player Media player instance pointer
499 : * @param err Error value. 0 on success, GATT error on positive value
500 : * or errno on negative value.
501 : * @param title The title of the current track
502 : */
503 1 : void (*track_title_recv)(struct media_player *player, int err, const char *title);
504 :
505 : /**
506 : * @brief Track Duration receive callback
507 : *
508 : * Called when the Track Duration is read or changed
509 : * See also media_proxy_ctrl_get_track_duration()
510 : *
511 : * @param player Media player instance pointer
512 : * @param err Error value. 0 on success, GATT error on positive value
513 : * or errno on negative value.
514 : * @param duration The duration of the current track
515 : */
516 1 : void (*track_duration_recv)(struct media_player *player, int err, int32_t duration);
517 :
518 : /**
519 : * @brief Track Position receive callback
520 : *
521 : * Called when the Track Position is read or changed
522 : * See also media_proxy_ctrl_get_track_position() and
523 : * media_proxy_ctrl_set_track_position()
524 : *
525 : * @param player Media player instance pointer
526 : * @param err Error value. 0 on success, GATT error on positive value
527 : * or errno on negative value.
528 : * @param position The player's position in the track
529 : */
530 1 : void (*track_position_recv)(struct media_player *player, int err, int32_t position);
531 :
532 : /**
533 : * @brief Track Position write callback
534 : *
535 : * Called when the Track Position is written
536 : * See also media_proxy_ctrl_set_track_position().
537 : *
538 : * @param player Media player instance pointer
539 : * @param err Error value. 0 on success, GATT error on positive value
540 : * or errno on negative value.
541 : * @param position The position given attempted to write
542 : */
543 1 : void (*track_position_write)(struct media_player *player, int err, int32_t position);
544 :
545 : /**
546 : * @brief Playback Speed receive callback
547 : *
548 : * Called when the Playback Speed is read or changed
549 : * See also media_proxy_ctrl_get_playback_speed() and
550 : * media_proxy_ctrl_set_playback_speed()
551 : *
552 : * @param player Media player instance pointer
553 : * @param err Error value. 0 on success, GATT error on positive value
554 : * or errno on negative value.
555 : * @param speed The playback speed parameter
556 : */
557 1 : void (*playback_speed_recv)(struct media_player *player, int err, int8_t speed);
558 :
559 : /**
560 : * @brief Playback Speed write callback
561 : *
562 : * Called when the Playback Speed is written
563 : * See also media_proxy_ctrl_set_playback_speed()
564 : *
565 : * @param player Media player instance pointer
566 : * @param err Error value. 0 on success, GATT error on positive value
567 : * or errno on negative value.
568 : * @param speed The playback speed parameter attempted to write
569 : */
570 1 : void (*playback_speed_write)(struct media_player *player, int err, int8_t speed);
571 :
572 : /**
573 : * @brief Seeking Speed receive callback
574 : *
575 : * Called when the Seeking Speed is read or changed
576 : * See also media_proxy_ctrl_get_seeking_speed()
577 : *
578 : * @param player Media player instance pointer
579 : * @param err Error value. 0 on success, GATT error on positive value
580 : * or errno on negative value.
581 : * @param speed The seeking speed factor
582 : */
583 1 : void (*seeking_speed_recv)(struct media_player *player, int err, int8_t speed);
584 :
585 : /**
586 : * @brief Track Segments Object ID receive callback
587 : *
588 : * Called when the Track Segments Object ID is read
589 : * See also media_proxy_ctrl_get_track_segments_id()
590 : *
591 : * @param player Media player instance pointer
592 : * @param err Error value. 0 on success, GATT error on positive value
593 : * or errno on negative value.
594 : * @param id The ID of the track segments object in Object Transfer Service (48 bits)
595 : */
596 1 : void (*track_segments_id_recv)(struct media_player *player, int err, uint64_t id);
597 :
598 : /**
599 : * @brief Current Track Object ID receive callback
600 : *
601 : * Called when the Current Track Object ID is read or changed
602 : * See also media_proxy_ctrl_get_current_track_id() and
603 : * media_proxy_ctrl_set_current_track_id()
604 : *
605 : * @param player Media player instance pointer
606 : * @param err Error value. 0 on success, GATT error on positive value
607 : * or errno on negative value.
608 : * @param id The ID of the current track object in Object Transfer Service (48 bits)
609 : */
610 1 : void (*current_track_id_recv)(struct media_player *player, int err, uint64_t id);
611 :
612 : /**
613 : * @brief Current Track Object ID write callback
614 : *
615 : * Called when the Current Track Object ID is written
616 : * See also media_proxy_ctrl_set_current_track_id()
617 : *
618 : * @param player Media player instance pointer
619 : * @param err Error value. 0 on success, GATT error on positive value
620 : * or errno on negative value.
621 : * @param id The ID (48 bits) attempted to write
622 : */
623 1 : void (*current_track_id_write)(struct media_player *player, int err, uint64_t id);
624 :
625 : /**
626 : * @brief Next Track Object ID receive callback
627 : *
628 : * Called when the Next Track Object ID is read or changed
629 : * See also media_proxy_ctrl_get_next_track_id() and
630 : * media_proxy_ctrl_set_next_track_id()
631 : *
632 : * @param player Media player instance pointer
633 : * @param err Error value. 0 on success, GATT error on positive value
634 : * or errno on negative value.
635 : * @param id The ID of the next track object in Object Transfer Service (48 bits)
636 : */
637 1 : void (*next_track_id_recv)(struct media_player *player, int err, uint64_t id);
638 :
639 : /**
640 : * @brief Next Track Object ID write callback
641 : *
642 : * Called when the Next Track Object ID is written
643 : * See also media_proxy_ctrl_set_next_track_id()
644 : *
645 : * @param player Media player instance pointer
646 : * @param err Error value. 0 on success, GATT error on positive value
647 : * or errno on negative value.
648 : * @param id The ID (48 bits) attempted to write
649 : */
650 1 : void (*next_track_id_write)(struct media_player *player, int err, uint64_t id);
651 :
652 : /**
653 : * @brief Parent Group Object ID receive callback
654 : *
655 : * Called when the Parent Group Object ID is read or changed
656 : * See also media_proxy_ctrl_get_parent_group_id()
657 : *
658 : * @param player Media player instance pointer
659 : * @param err Error value. 0 on success, GATT error on positive value
660 : * or errno on negative value.
661 : * @param id The ID of the parent group object in Object Transfer Service (48 bits)
662 : */
663 1 : void (*parent_group_id_recv)(struct media_player *player, int err, uint64_t id);
664 :
665 : /**
666 : * @brief Current Group Object ID receive callback
667 : *
668 : * Called when the Current Group Object ID is read or changed
669 : * See also media_proxy_ctrl_get_current_group_id() and
670 : * media_proxy_ctrl_set_current_group_id()
671 : *
672 : * @param player Media player instance pointer
673 : * @param err Error value. 0 on success, GATT error on positive value
674 : * or errno on negative value.
675 : * @param id The ID of the current group object in Object Transfer Service (48 bits)
676 : */
677 1 : void (*current_group_id_recv)(struct media_player *player, int err, uint64_t id);
678 :
679 : /**
680 : * @brief Current Group Object ID write callback
681 : *
682 : * Called when the Current Group Object ID is written
683 : * See also media_proxy_ctrl_set_current_group_id()
684 : *
685 : * @param player Media player instance pointer
686 : * @param err Error value. 0 on success, GATT error on positive value
687 : * or errno on negative value.
688 : * @param id The ID (48 bits) attempted to write
689 : */
690 1 : void (*current_group_id_write)(struct media_player *player, int err, uint64_t id);
691 :
692 : /**
693 : * @brief Playing Order receive callback
694 : *
695 : * Called when the Playing Order is read or changed
696 : * See also media_proxy_ctrl_get_playing_order() and
697 : * media_proxy_ctrl_set_playing_order()
698 : *
699 : * @param player Media player instance pointer
700 : * @param err Error value. 0 on success, GATT error on positive value
701 : * or errno on negative value.
702 : * @param order The playing order
703 : */
704 1 : void (*playing_order_recv)(struct media_player *player, int err, uint8_t order);
705 :
706 : /**
707 : * @brief Playing Order write callback
708 : *
709 : * Called when the Playing Order is written
710 : * See also media_proxy_ctrl_set_playing_order()
711 : *
712 : * @param player Media player instance pointer
713 : * @param err Error value. 0 on success, GATT error on positive value
714 : * or errno on negative value.
715 : * @param order The playing order attempted to write
716 : */
717 1 : void (*playing_order_write)(struct media_player *player, int err, uint8_t order);
718 :
719 : /**
720 : * @brief Playing Orders Supported receive callback
721 : *
722 : * Called when the Playing Orders Supported is read
723 : * See also media_proxy_ctrl_get_playing_orders_supported()
724 : *
725 : * @param player Media player instance pointer
726 : * @param err Error value. 0 on success, GATT error on positive value
727 : * or errno on negative value.
728 : * @param orders The playing orders supported
729 : */
730 1 : void (*playing_orders_supported_recv)(struct media_player *player, int err,
731 : uint16_t orders);
732 :
733 : /**
734 : * @brief Media State receive callback
735 : *
736 : * Called when the Media State is read or changed
737 : * See also media_proxy_ctrl_get_media_state() and
738 : * media_proxy_ctrl_send_command()
739 : *
740 : * @param player Media player instance pointer
741 : * @param err Error value. 0 on success, GATT error on positive value
742 : * or errno on negative value.
743 : * @param state The media player state
744 : */
745 1 : void (*media_state_recv)(struct media_player *player, int err, uint8_t state);
746 :
747 : /**
748 : * @brief Command send callback
749 : *
750 : * Called when a command has been sent
751 : * See also media_proxy_ctrl_send_command()
752 : *
753 : * @param player Media player instance pointer
754 : * @param err Error value. 0 on success, GATT error on positive value
755 : * or errno on negative value.
756 : * @param cmd The command sent
757 : */
758 1 : void (*command_send)(struct media_player *player, int err, const struct mpl_cmd *cmd);
759 :
760 : /**
761 : * @brief Command result receive callback
762 : *
763 : * Called when a command result has been received
764 : * See also media_proxy_ctrl_send_command()
765 : *
766 : * @param player Media player instance pointer
767 : * @param err Error value. 0 on success, GATT error on positive value
768 : * or errno on negative value.
769 : * @param result The result received
770 : */
771 1 : void (*command_recv)(struct media_player *player, int err,
772 : const struct mpl_cmd_ntf *result);
773 :
774 : /**
775 : * @brief Commands supported receive callback
776 : *
777 : * Called when the Commands Supported is read or changed
778 : * See also media_proxy_ctrl_get_commands_supported()
779 : *
780 : * @param player Media player instance pointer
781 : * @param err Error value. 0 on success, GATT error on positive value
782 : * or errno on negative value.
783 : * @param opcodes The supported command opcodes (bitmap)
784 : */
785 1 : void (*commands_supported_recv)(struct media_player *player, int err, uint32_t opcodes);
786 :
787 : /**
788 : * @brief Search send callback
789 : *
790 : * Called when a search has been sent
791 : * See also media_proxy_ctrl_send_search()
792 : *
793 : * @param player Media player instance pointer
794 : * @param err Error value. 0 on success, GATT error on positive value
795 : * or errno on negative value.
796 : * @param search The search sent
797 : */
798 1 : void (*search_send)(struct media_player *player, int err, const struct mpl_search *search);
799 :
800 : /**
801 : * @brief Search result code receive callback
802 : *
803 : * Called when a search result code has been received
804 : * See also media_proxy_ctrl_send_search()
805 : *
806 : * The search result code tells whether the search was successful or not.
807 : * For a successful search, the actual results of the search (i.e. what was found
808 : * as a result of the search)can be accessed using the Search Results Object ID.
809 : * The Search Results Object ID has a separate callback - search_results_id_recv().
810 : *
811 : * @param player Media player instance pointer
812 : * @param err Error value. 0 on success, GATT error on positive value
813 : * or errno on negative value.
814 : * @param result_code Search result code
815 : */
816 1 : void (*search_recv)(struct media_player *player, int err, uint8_t result_code);
817 :
818 : /**
819 : * @brief Search Results Object ID receive callback
820 : * See also media_proxy_ctrl_get_search_results_id()
821 : *
822 : * Called when the Search Results Object ID is read or changed
823 : *
824 : * @param player Media player instance pointer
825 : * @param err Error value. 0 on success, GATT error on positive value
826 : * or errno on negative value.
827 : * @param id The ID of the search results object in Object Transfer Service (48 bits)
828 : */
829 1 : void (*search_results_id_recv)(struct media_player *player, int err, uint64_t id);
830 :
831 : /**
832 : * @brief Content Control ID receive callback
833 : *
834 : * Called when the Content Control ID is read
835 : * See also media_proxy_ctrl_get_content_ctrl_id()
836 : *
837 : * @param player Media player instance pointer
838 : * @param err Error value. 0 on success, GATT error on positive value
839 : * or errno on negative value.
840 : * @param ccid The content control ID
841 : */
842 1 : void (*content_ctrl_id_recv)(struct media_player *player, int err, uint8_t ccid);
843 : };
844 :
845 : /**
846 : * @brief Register a controller with the media_proxy
847 : *
848 : * @param ctrl_cbs Callbacks to the controller
849 : *
850 : * @return 0 if success, errno on failure
851 : */
852 1 : int media_proxy_ctrl_register(struct media_proxy_ctrl_cbs *ctrl_cbs);
853 :
854 : /**
855 : * @brief Discover a remote media player
856 : *
857 : * Discover a remote media player instance.
858 : * The remote player instance will be discovered, and accessed, using Bluetooth,
859 : * via the media control client and a remote media control service.
860 : * This call will start a GATT discovery of the Media Control Service on the peer,
861 : * and setup handles and subscriptions.
862 : *
863 : * This shall be called once before any other actions can be executed for the
864 : * remote player. The remote player instance will be returned in the
865 : * discover_player() callback.
866 : *
867 : * @param conn The connection to do discovery for
868 : *
869 : * @return 0 if success, errno on failure
870 : */
871 1 : int media_proxy_ctrl_discover_player(struct bt_conn *conn);
872 :
873 : /**
874 : * @brief Read Media Player Name
875 : *
876 : * @param player Media player instance pointer
877 : *
878 : * @return 0 if success, errno on failure.
879 : */
880 1 : int media_proxy_ctrl_get_player_name(struct media_player *player);
881 :
882 : /**
883 : * @brief Read Icon Object ID
884 : *
885 : * Get an ID (48 bit) that can be used to retrieve the Icon
886 : * Object from an Object Transfer Service
887 : *
888 : * See the Media Control Service spec v1.0 sections 3.2 and
889 : * 4.1 for a description of the Icon Object.
890 : *
891 : * Requires Object Transfer Service
892 : *
893 : * @param player Media player instance pointer
894 : *
895 : * @return 0 if success, errno on failure.
896 : */
897 1 : int media_proxy_ctrl_get_icon_id(struct media_player *player);
898 :
899 : /**
900 : * @brief Read Icon URL
901 : *
902 : * Get a URL to the media player's icon.
903 : *
904 : * @param player Media player instance pointer
905 : */
906 1 : int media_proxy_ctrl_get_icon_url(struct media_player *player);
907 :
908 : /**
909 : * @brief Read Track Title
910 : *
911 : * @param player Media player instance pointer
912 : *
913 : * @return 0 if success, errno on failure.
914 : */
915 1 : int media_proxy_ctrl_get_track_title(struct media_player *player);
916 :
917 : /**
918 : * @brief Read Track Duration
919 : *
920 : * The duration of a track is measured in hundredths of a
921 : * second.
922 : *
923 : * @param player Media player instance pointer
924 : *
925 : * @return 0 if success, errno on failure.
926 : */
927 1 : int media_proxy_ctrl_get_track_duration(struct media_player *player);
928 :
929 : /**
930 : * @brief Read Track Position
931 : *
932 : * The position of the player (the playing position) is
933 : * measured in hundredths of a second from the beginning of
934 : * the track
935 : *
936 : * @param player Media player instance pointer
937 : *
938 : * @return 0 if success, errno on failure.
939 : */
940 1 : int media_proxy_ctrl_get_track_position(struct media_player *player);
941 :
942 : /**
943 : * @brief Set Track Position
944 : *
945 : * Set the playing position of the media player in the current
946 : * track. The position is given in hundredths of a second,
947 : * from the beginning of the track of the track for positive
948 : * values, and (backwards) from the end of the track for
949 : * negative values.
950 : *
951 : * @param player Media player instance pointer
952 : * @param position The track position to set
953 : *
954 : * @return 0 if success, errno on failure.
955 : */
956 1 : int media_proxy_ctrl_set_track_position(struct media_player *player, int32_t position);
957 :
958 : /**
959 : * @brief Get Playback Speed
960 : *
961 : * The playback speed parameter is related to the actual
962 : * playback speed as follows:
963 : * actual playback speed = 2^(speed_parameter/64)
964 : *
965 : * A speed parameter of 0 corresponds to unity speed playback
966 : * (i.e. playback at "normal" speed). A speed parameter of
967 : * -128 corresponds to playback at one fourth of normal speed,
968 : * 127 corresponds to playback at almost four times the normal
969 : * speed.
970 : *
971 : * @param player Media player instance pointer
972 : *
973 : * @return 0 if success, errno on failure.
974 : */
975 1 : int media_proxy_ctrl_get_playback_speed(struct media_player *player);
976 :
977 : /**
978 : * @brief Set Playback Speed
979 : *
980 : * See the get_playback_speed() function for an explanation of
981 : * the playback speed parameter.
982 : *
983 : * Note that the media player may not support all possible
984 : * values of the playback speed parameter. If the value given
985 : * is not supported, and is higher than the current value, the
986 : * player should set the playback speed to the next higher
987 : * supported value. (And correspondingly to the next lower
988 : * supported value for given values lower than the current
989 : * value.)
990 : *
991 : * @param player Media player instance pointer
992 : * @param speed The playback speed parameter to set
993 : *
994 : * @return 0 if success, errno on failure.
995 : */
996 1 : int media_proxy_ctrl_set_playback_speed(struct media_player *player, int8_t speed);
997 :
998 : /**
999 : * @brief Get Seeking Speed
1000 : *
1001 : * The seeking speed gives the speed with which the player is
1002 : * seeking. It is a factor, relative to real-time playback
1003 : * speed - a factor four means seeking happens at four times
1004 : * the real-time playback speed. Positive values are for
1005 : * forward seeking, negative values for backwards seeking.
1006 : *
1007 : * The seeking speed is not settable - a non-zero seeking speed
1008 : * is the result of "fast rewind" of "fast forward" commands.
1009 : *
1010 : * @param player Media player instance pointer
1011 : *
1012 : * @return 0 if success, errno on failure.
1013 : */
1014 1 : int media_proxy_ctrl_get_seeking_speed(struct media_player *player);
1015 :
1016 : /**
1017 : * @brief Read Current Track Segments Object ID
1018 : *
1019 : * Get an ID (48 bit) that can be used to retrieve the Current
1020 : * Track Segments Object from an Object Transfer Service
1021 : *
1022 : * See the Media Control Service spec v1.0 sections 3.10 and
1023 : * 4.2 for a description of the Track Segments Object.
1024 : *
1025 : * Requires Object Transfer Service
1026 : *
1027 : * @param player Media player instance pointer
1028 : *
1029 : * @return 0 if success, errno on failure.
1030 : */
1031 1 : int media_proxy_ctrl_get_track_segments_id(struct media_player *player);
1032 :
1033 : /**
1034 : * @brief Read Current Track Object ID
1035 : *
1036 : * Get an ID (48 bit) that can be used to retrieve the Current
1037 : * Track Object from an Object Transfer Service
1038 : *
1039 : * See the Media Control Service spec v1.0 sections 3.11 and
1040 : * 4.3 for a description of the Current Track Object.
1041 : *
1042 : * Requires Object Transfer Service
1043 : *
1044 : * @param player Media player instance pointer
1045 : *
1046 : * @return 0 if success, errno on failure.
1047 : */
1048 1 : int media_proxy_ctrl_get_current_track_id(struct media_player *player);
1049 :
1050 : /**
1051 : * @brief Set Current Track Object ID
1052 : *
1053 : * Change the player's current track to the track given by the ID.
1054 : * (Behaves similarly to the goto track command.)
1055 : *
1056 : * Requires Object Transfer Service
1057 : *
1058 : * @param player Media player instance pointer
1059 : * @param id The ID of a track object
1060 : *
1061 : * @return 0 if success, errno on failure.
1062 : */
1063 1 : int media_proxy_ctrl_set_current_track_id(struct media_player *player, uint64_t id);
1064 :
1065 : /**
1066 : * @brief Read Next Track Object ID
1067 : *
1068 : * Get an ID (48 bit) that can be used to retrieve the Next
1069 : * Track Object from an Object Transfer Service
1070 : *
1071 : * Requires Object Transfer Service
1072 : *
1073 : * @param player Media player instance pointer
1074 : *
1075 : * @return 0 if success, errno on failure.
1076 : */
1077 1 : int media_proxy_ctrl_get_next_track_id(struct media_player *player);
1078 :
1079 : /**
1080 : * @brief Set Next Track Object ID
1081 : *
1082 : * Change the player's next track to the track given by the ID.
1083 : *
1084 : * Requires Object Transfer Service
1085 : *
1086 : * @param player Media player instance pointer
1087 : * @param id The ID of a track object
1088 : *
1089 : * @return 0 if success, errno on failure.
1090 : */
1091 1 : int media_proxy_ctrl_set_next_track_id(struct media_player *player, uint64_t id);
1092 :
1093 : /**
1094 : * @brief Read Parent Group Object ID
1095 : *
1096 : * Get an ID (48 bit) that can be used to retrieve the Parent
1097 : * Track Object from an Object Transfer Service
1098 : *
1099 : * The parent group is the parent of the current group.
1100 : *
1101 : * See the Media Control Service spec v1.0 sections 3.14 and
1102 : * 4.4 for a description of the Current Track Object.
1103 : *
1104 : * Requires Object Transfer Service
1105 : *
1106 : * @param player Media player instance pointer
1107 : *
1108 : * @return 0 if success, errno on failure.
1109 : */
1110 1 : int media_proxy_ctrl_get_parent_group_id(struct media_player *player);
1111 :
1112 : /**
1113 : * @brief Read Current Group Object ID
1114 : *
1115 : * Get an ID (48 bit) that can be used to retrieve the Current
1116 : * Track Object from an Object Transfer Service
1117 : *
1118 : * See the Media Control Service spec v1.0 sections 3.14 and
1119 : * 4.4 for a description of the Current Group Object.
1120 : *
1121 : * Requires Object Transfer Service
1122 : *
1123 : * @param player Media player instance pointer
1124 : *
1125 : * @return 0 if success, errno on failure.
1126 : */
1127 1 : int media_proxy_ctrl_get_current_group_id(struct media_player *player);
1128 :
1129 : /**
1130 : * @brief Set Current Group Object ID
1131 : *
1132 : * Change the player's current group to the group given by the
1133 : * ID, and the current track to the first track in that group.
1134 : *
1135 : * Requires Object Transfer Service
1136 : *
1137 : * @param player Media player instance pointer
1138 : * @param id The ID of a group object
1139 : *
1140 : * @return 0 if success, errno on failure.
1141 : */
1142 1 : int media_proxy_ctrl_set_current_group_id(struct media_player *player, uint64_t id);
1143 :
1144 : /**
1145 : * @brief Read Playing Order
1146 : *
1147 : * @param player Media player instance pointer
1148 : *
1149 : * @return 0 if success, errno on failure.
1150 : */
1151 1 : int media_proxy_ctrl_get_playing_order(struct media_player *player);
1152 :
1153 : /**
1154 : * @brief Set Playing Order
1155 : *
1156 : * Set the media player's playing order
1157 : *
1158 : * @param player Media player instance pointer
1159 : * @param order The playing order to set
1160 : *
1161 : * @return 0 if success, errno on failure.
1162 : */
1163 1 : int media_proxy_ctrl_set_playing_order(struct media_player *player, uint8_t order);
1164 :
1165 : /**
1166 : * @brief Read Playing Orders Supported
1167 : *
1168 : * Read a bitmap containing the media player's supported
1169 : * playing orders.
1170 : *
1171 : * @param player Media player instance pointer
1172 : *
1173 : * @return 0 if success, errno on failure.
1174 : */
1175 1 : int media_proxy_ctrl_get_playing_orders_supported(struct media_player *player);
1176 :
1177 : /**
1178 : * @brief Read Media State
1179 : *
1180 : * Read the media player's state
1181 : *
1182 : * @param player Media player instance pointer
1183 : *
1184 : * @return 0 if success, errno on failure.
1185 : */
1186 1 : int media_proxy_ctrl_get_media_state(struct media_player *player);
1187 :
1188 : /**
1189 : * @brief Send Command
1190 : *
1191 : * Send a command to the media player.
1192 : * Commands may cause the media player to change its state
1193 : * May result in two callbacks - one for the actual sending of the command to the
1194 : * player, one for the result of the command from the player.
1195 : *
1196 : * @param player Media player instance pointer
1197 : * @param command The command to send
1198 : *
1199 : * @return 0 if success, errno on failure.
1200 : */
1201 1 : int media_proxy_ctrl_send_command(struct media_player *player, const struct mpl_cmd *command);
1202 :
1203 : /**
1204 : * @brief Read Commands Supported
1205 : *
1206 : * Read a bitmap containing the media player's supported
1207 : * command opcodes.
1208 : *
1209 : * @param player Media player instance pointer
1210 : *
1211 : * @return 0 if success, errno on failure.
1212 : */
1213 1 : int media_proxy_ctrl_get_commands_supported(struct media_player *player);
1214 :
1215 : /**
1216 : * @brief Set Search
1217 : *
1218 : * Write a search to the media player.
1219 : * If the search is successful, the search results will be available as a group object
1220 : * in the Object Transfer Service (OTS).
1221 : *
1222 : * May result in up to three callbacks
1223 : * - one for the actual sending of the search to the player
1224 : * - one for the result code for the search from the player
1225 : * - if the search is successful, one for the search results object ID in the OTs
1226 : *
1227 : * Requires Object Transfer Service
1228 : *
1229 : * @param player Media player instance pointer
1230 : * @param search The search to write
1231 : *
1232 : * @return 0 if success, errno on failure.
1233 : */
1234 1 : int media_proxy_ctrl_send_search(struct media_player *player, const struct mpl_search *search);
1235 :
1236 : /**
1237 : * @brief Read Search Results Object ID
1238 : *
1239 : * Get an ID (48 bit) that can be used to retrieve the Search
1240 : * Results Object from an Object Transfer Service
1241 : *
1242 : * The search results object is a group object.
1243 : * The search results object only exists if a successful
1244 : * search operation has been done.
1245 : *
1246 : * Requires Object Transfer Service
1247 : *
1248 : * @param player Media player instance pointer
1249 : *
1250 : * @return 0 if success, errno on failure.
1251 : */
1252 1 : int media_proxy_ctrl_get_search_results_id(struct media_player *player);
1253 :
1254 : /**
1255 : * @brief Read Content Control ID
1256 : *
1257 : * The content control ID identifies a content control service
1258 : * on a device, and links it to the corresponding audio
1259 : * stream.
1260 : *
1261 : * @param player Media player instance pointer
1262 : *
1263 : * @return 0 if success, errno on failure.
1264 : */
1265 1 : uint8_t media_proxy_ctrl_get_content_ctrl_id(struct media_player *player);
1266 :
1267 : /**
1268 : * @brief Available calls in a player, that the media proxy can call
1269 : *
1270 : * Given by a player when registering.
1271 : */
1272 1 : struct media_proxy_pl_calls {
1273 :
1274 : /**
1275 : * @brief Read Media Player Name
1276 : *
1277 : * @return The name of the media player
1278 : */
1279 1 : const char *(*get_player_name)(void);
1280 :
1281 : /**
1282 : * @brief Read Icon Object ID
1283 : *
1284 : * Get an ID (48 bit) that can be used to retrieve the Icon
1285 : * Object from an Object Transfer Service
1286 : *
1287 : * See the Media Control Service spec v1.0 sections 3.2 and
1288 : * 4.1 for a description of the Icon Object.
1289 : *
1290 : * @return The Icon Object ID
1291 : */
1292 1 : uint64_t (*get_icon_id)(void);
1293 :
1294 : /**
1295 : * @brief Read Icon URL
1296 : *
1297 : * Get a URL to the media player's icon.
1298 : *
1299 : * @return The URL of the Icon
1300 : */
1301 1 : const char *(*get_icon_url)(void);
1302 :
1303 : /**
1304 : * @brief Read Track Title
1305 : *
1306 : * @return The title of the current track
1307 : */
1308 1 : const char *(*get_track_title)(void);
1309 :
1310 : /**
1311 : * @brief Read Track Duration
1312 : *
1313 : * The duration of a track is measured in hundredths of a
1314 : * second.
1315 : *
1316 : * @return The duration of the current track
1317 : */
1318 1 : int32_t (*get_track_duration)(void);
1319 :
1320 : /**
1321 : * @brief Read Track Position
1322 : *
1323 : * The position of the player (the playing position) is
1324 : * measured in hundredths of a second from the beginning of
1325 : * the track
1326 : *
1327 : * @return The position of the player in the current track
1328 : */
1329 1 : int32_t (*get_track_position)(void);
1330 :
1331 : /**
1332 : * @brief Set Track Position
1333 : *
1334 : * Set the playing position of the media player in the current
1335 : * track. The position is given in hundredths of a second,
1336 : * from the beginning of the track of the track for positive
1337 : * values, and (backwards) from the end of the track for
1338 : * negative values.
1339 : *
1340 : * @param position The player position to set
1341 : */
1342 1 : void (*set_track_position)(int32_t position);
1343 :
1344 : /**
1345 : * @brief Get Playback Speed
1346 : *
1347 : * The playback speed parameter is related to the actual
1348 : * playback speed as follows:
1349 : * actual playback speed = 2^(speed_parameter/64)
1350 : *
1351 : * A speed parameter of 0 corresponds to unity speed playback
1352 : * (i.e. playback at "normal" speed). A speed parameter of
1353 : * -128 corresponds to playback at one fourth of normal speed,
1354 : * 127 corresponds to playback at almost four times the normal
1355 : * speed.
1356 : *
1357 : * @return The playback speed parameter
1358 : */
1359 1 : int8_t (*get_playback_speed)(void);
1360 :
1361 : /**
1362 : * @brief Set Playback Speed
1363 : *
1364 : * See the get_playback_speed() function for an explanation of
1365 : * the playback speed parameter.
1366 : *
1367 : * Note that the media player may not support all possible
1368 : * values of the playback speed parameter. If the value given
1369 : * is not supported, and is higher than the current value, the
1370 : * player should set the playback speed to the next higher
1371 : * supported value. (And correspondingly to the next lower
1372 : * supported value for given values lower than the current
1373 : * value.)
1374 : *
1375 : * @param speed The playback speed parameter to set
1376 : */
1377 1 : void (*set_playback_speed)(int8_t speed);
1378 :
1379 : /**
1380 : * @brief Get Seeking Speed
1381 : *
1382 : * The seeking speed gives the speed with which the player is
1383 : * seeking. It is a factor, relative to real-time playback
1384 : * speed - a factor four means seeking happens at four times
1385 : * the real-time playback speed. Positive values are for
1386 : * forward seeking, negative values for backwards seeking.
1387 : *
1388 : * The seeking speed is not settable - a non-zero seeking speed
1389 : * is the result of "fast rewind" of "fast forward" commands.
1390 : *
1391 : * @return The seeking speed factor
1392 : */
1393 1 : int8_t (*get_seeking_speed)(void);
1394 :
1395 : /**
1396 : * @brief Read Current Track Segments Object ID
1397 : *
1398 : * Get an ID (48 bit) that can be used to retrieve the Current
1399 : * Track Segments Object from an Object Transfer Service
1400 : *
1401 : * See the Media Control Service spec v1.0 sections 3.10 and
1402 : * 4.2 for a description of the Track Segments Object.
1403 : *
1404 : * @return Current The Track Segments Object ID
1405 : */
1406 1 : uint64_t (*get_track_segments_id)(void);
1407 :
1408 : /**
1409 : * @brief Read Current Track Object ID
1410 : *
1411 : * Get an ID (48 bit) that can be used to retrieve the Current
1412 : * Track Object from an Object Transfer Service
1413 : *
1414 : * See the Media Control Service spec v1.0 sections 3.11 and
1415 : * 4.3 for a description of the Current Track Object.
1416 : *
1417 : * @return The Current Track Object ID
1418 : */
1419 1 : uint64_t (*get_current_track_id)(void);
1420 :
1421 : /**
1422 : * @brief Set Current Track Object ID
1423 : *
1424 : * Change the player's current track to the track given by the ID.
1425 : * (Behaves similarly to the goto track command.)
1426 : *
1427 : * @param id The ID of a track object
1428 : */
1429 1 : void (*set_current_track_id)(uint64_t id);
1430 :
1431 : /**
1432 : * @brief Read Next Track Object ID
1433 : *
1434 : * Get an ID (48 bit) that can be used to retrieve the Next
1435 : * Track Object from an Object Transfer Service
1436 : *
1437 : * @return The Next Track Object ID
1438 : */
1439 1 : uint64_t (*get_next_track_id)(void);
1440 :
1441 : /**
1442 : * @brief Set Next Track Object ID
1443 : *
1444 : * Change the player's next track to the track given by the ID.
1445 : *
1446 : * @param id The ID of a track object
1447 : */
1448 1 : void (*set_next_track_id)(uint64_t id);
1449 :
1450 : /**
1451 : * @brief Read Parent Group Object ID
1452 : *
1453 : * Get an ID (48 bit) that can be used to retrieve the Parent
1454 : * Track Object from an Object Transfer Service
1455 : *
1456 : * The parent group is the parent of the current group.
1457 : *
1458 : * See the Media Control Service spec v1.0 sections 3.14 and
1459 : * 4.4 for a description of the Current Track Object.
1460 : *
1461 : * @return The Current Group Object ID
1462 : */
1463 1 : uint64_t (*get_parent_group_id)(void);
1464 :
1465 : /**
1466 : * @brief Read Current Group Object ID
1467 : *
1468 : * Get an ID (48 bit) that can be used to retrieve the Current
1469 : * Track Object from an Object Transfer Service
1470 : *
1471 : * See the Media Control Service spec v1.0 sections 3.14 and
1472 : * 4.4 for a description of the Current Group Object.
1473 : *
1474 : * @return The Current Group Object ID
1475 : */
1476 1 : uint64_t (*get_current_group_id)(void);
1477 :
1478 : /**
1479 : * @brief Set Current Group Object ID
1480 : *
1481 : * Change the player's current group to the group given by the
1482 : * ID, and the current track to the first track in that group.
1483 : *
1484 : * @param id The ID of a group object
1485 : */
1486 1 : void (*set_current_group_id)(uint64_t id);
1487 :
1488 : /**
1489 : * @brief Read Playing Order
1490 : *
1491 : * return The media player's current playing order
1492 : */
1493 1 : uint8_t (*get_playing_order)(void);
1494 :
1495 : /**
1496 : * @brief Set Playing Order
1497 : *
1498 : * Set the media player's playing order.
1499 : * See the MEDIA_PROXY_PLAYING_ORDER_* defines.
1500 : *
1501 : * @param order The playing order to set
1502 : */
1503 1 : void (*set_playing_order)(uint8_t order);
1504 :
1505 : /**
1506 : * @brief Read Playing Orders Supported
1507 : *
1508 : * Read a bitmap containing the media player's supported
1509 : * playing orders.
1510 : * See the MEDIA_PROXY_PLAYING_ORDERS_SUPPORTED_* defines.
1511 : *
1512 : * @return The media player's supported playing orders
1513 : */
1514 1 : uint16_t (*get_playing_orders_supported)(void);
1515 :
1516 : /**
1517 : * @brief Read Media State
1518 : *
1519 : * Read the media player's state
1520 : * See the MEDIA_PROXY_MEDIA_STATE_* defines.
1521 : *
1522 : * @return The media player's state
1523 : */
1524 1 : uint8_t (*get_media_state)(void);
1525 :
1526 : /**
1527 : * @brief Send Command
1528 : *
1529 : * Send a command to the media player.
1530 : * For command opcodes (play, pause, ...) - see the MEDIA_PROXY_OP_*
1531 : * defines.
1532 : *
1533 : * @param command The command to send
1534 : */
1535 1 : void (*send_command)(const struct mpl_cmd *command);
1536 :
1537 : /**
1538 : * @brief Read Commands Supported
1539 : *
1540 : * Read a bitmap containing the media player's supported
1541 : * command opcodes.
1542 : * See the MEDIA_PROXY_OP_SUP_* defines.
1543 : *
1544 : * @return The media player's supported command opcodes
1545 : */
1546 1 : uint32_t (*get_commands_supported)(void);
1547 :
1548 : /**
1549 : * @brief Set Search
1550 : *
1551 : * Write a search to the media player.
1552 : * (For the formatting of a search, see the Media Control
1553 : * Service spec and the mcs.h file.)
1554 : *
1555 : * @param search The search to write
1556 : */
1557 1 : void (*send_search)(const struct mpl_search *search);
1558 :
1559 : /**
1560 : * @brief Read Search Results Object ID
1561 : *
1562 : * Get an ID (48 bit) that can be used to retrieve the Search
1563 : * Results Object from an Object Transfer Service
1564 : *
1565 : * The search results object is a group object.
1566 : * The search results object only exists if a successful
1567 : * search operation has been done.
1568 : *
1569 : * @return The Search Results Object ID
1570 : */
1571 1 : uint64_t (*get_search_results_id)(void);
1572 :
1573 : /**
1574 : * @brief Read Content Control ID
1575 : *
1576 : * The content control ID identifies a content control service
1577 : * on a device, and links it to the corresponding audio
1578 : * stream.
1579 : *
1580 : * @return The content control ID for the media player
1581 : */
1582 1 : uint8_t (*get_content_ctrl_id)(void);
1583 : };
1584 :
1585 : /**
1586 : * @brief Register a player with the media proxy
1587 : *
1588 : * Register a player with the media proxy module, for use by media
1589 : * controllers.
1590 : *
1591 : * The media proxy may call any non-NULL function pointers in the
1592 : * supplied media_proxy_pl_calls structure.
1593 : *
1594 : * @param pl_calls Function pointers to the media player's calls
1595 : *
1596 : * @return 0 if success, errno on failure
1597 : */
1598 1 : int media_proxy_pl_register(struct media_proxy_pl_calls *pl_calls);
1599 :
1600 : /**
1601 : * @brief Initialize player
1602 : *
1603 : * TODO: Move to player header file
1604 : */
1605 1 : int media_proxy_pl_init(void);
1606 :
1607 : /**
1608 : * @brief Get the pointer of the Object Transfer Service used by the Media Control Service
1609 : *
1610 : * TODO: Find best location for this call, and move this one also
1611 : */
1612 1 : struct bt_ots *bt_mcs_get_ots(void);
1613 :
1614 : /**
1615 : * @brief Player name changed callback
1616 : *
1617 : * To be called when the player's name is changed.
1618 : *
1619 : * @param name The name of the player
1620 : */
1621 1 : void media_proxy_pl_name_cb(const char *name);
1622 :
1623 : /**
1624 : * @brief Player icon URL changed callback
1625 : *
1626 : * To be called when the player's icon URL is changed.
1627 : *
1628 : * @param url The URL of the player's icon
1629 : */
1630 1 : void media_proxy_pl_icon_url_cb(const char *url);
1631 :
1632 : /**
1633 : * @brief Track changed callback
1634 : *
1635 : * To be called when the player's current track is changed
1636 : */
1637 1 : void media_proxy_pl_track_changed_cb(void);
1638 :
1639 : /**
1640 : * @brief Track title callback
1641 : *
1642 : * To be called when the player's current track is changed
1643 : *
1644 : * @param title The title of the track
1645 : */
1646 1 : void media_proxy_pl_track_title_cb(char *title);
1647 :
1648 : /**
1649 : * @brief Track duration callback
1650 : *
1651 : * To be called when the current track's duration is changed (e.g. due
1652 : * to a track change)
1653 : *
1654 : * The track duration is given in hundredths of a second.
1655 : *
1656 : * @param duration The track duration
1657 : */
1658 1 : void media_proxy_pl_track_duration_cb(int32_t duration);
1659 :
1660 : /**
1661 : * @brief Track position callback
1662 : *
1663 : * To be called when the media player's position in the track is
1664 : * changed, or when the player is paused or similar.
1665 : *
1666 : * Exception: This callback should not be called when the position
1667 : * changes during regular playback, i.e. while the player is playing
1668 : * and playback happens at a constant speed.
1669 : *
1670 : * The track position is given in hundredths of a second from the
1671 : * start of the track.
1672 : *
1673 : * @param position The media player's position in the track
1674 : */
1675 1 : void media_proxy_pl_track_position_cb(int32_t position);
1676 :
1677 : /**
1678 : * @brief Playback speed callback
1679 : *
1680 : * To be called when the playback speed is changed.
1681 : *
1682 : * @param speed The playback speed parameter
1683 : */
1684 1 : void media_proxy_pl_playback_speed_cb(int8_t speed);
1685 :
1686 : /**
1687 : * @brief Seeking speed callback
1688 : *
1689 : * To be called when the seeking speed is changed.
1690 : *
1691 : * @param speed The seeking speed factor
1692 : */
1693 1 : void media_proxy_pl_seeking_speed_cb(int8_t speed);
1694 :
1695 : /**
1696 : * @brief Current track object ID callback
1697 : *
1698 : * To be called when the ID of the current track is changed (e.g. due
1699 : * to a track change).
1700 : *
1701 : * @param id The ID of the current track object in the OTS
1702 : */
1703 1 : void media_proxy_pl_current_track_id_cb(uint64_t id);
1704 :
1705 : /**
1706 : * @brief Next track object ID callback
1707 : *
1708 : * To be called when the ID of the current track is changes
1709 : *
1710 : * @param id The ID of the next track object in the OTS
1711 : */
1712 1 : void media_proxy_pl_next_track_id_cb(uint64_t id);
1713 :
1714 : /**
1715 : * @brief Parent group object ID callback
1716 : *
1717 : * To be called when the ID of the parent group is changed
1718 : *
1719 : * @param id The ID of the parent group object in the OTS
1720 : */
1721 1 : void media_proxy_pl_parent_group_id_cb(uint64_t id);
1722 :
1723 : /**
1724 : * @brief Current group object ID callback
1725 : *
1726 : * To be called when the ID of the current group is changed
1727 : *
1728 : * @param id The ID of the current group object in the OTS
1729 : */
1730 1 : void media_proxy_pl_current_group_id_cb(uint64_t id);
1731 :
1732 : /**
1733 : * @brief Playing order callback
1734 : *
1735 : * To be called when the playing order is changed
1736 : *
1737 : * @param order The playing order
1738 : */
1739 1 : void media_proxy_pl_playing_order_cb(uint8_t order);
1740 :
1741 : /**
1742 : * @brief Media state callback
1743 : *
1744 : * To be called when the media state is changed
1745 : *
1746 : * @param state The media player's state
1747 : */
1748 1 : void media_proxy_pl_media_state_cb(uint8_t state);
1749 :
1750 : /**
1751 : * @brief Command callback
1752 : *
1753 : * To be called when a command has been sent, to notify whether the
1754 : * command was successfully performed or not.
1755 : * See the MEDIA_PROXY_CMD_* result code defines.
1756 : *
1757 : * @param cmd_ntf The result of the command
1758 : */
1759 1 : void media_proxy_pl_command_cb(const struct mpl_cmd_ntf *cmd_ntf);
1760 :
1761 : /**
1762 : * @brief Commands supported callback
1763 : *
1764 : * To be called when the set of commands supported is changed
1765 : *
1766 : * @param opcodes The supported commands opcodes
1767 : */
1768 1 : void media_proxy_pl_commands_supported_cb(uint32_t opcodes);
1769 :
1770 : /**
1771 : * @brief Search callback
1772 : *
1773 : * To be called when a search has been set to notify whether the
1774 : * search was successfully performed or not.
1775 : * See the MEDIA_PROXY_SEARCH_* result code defines.
1776 : *
1777 : * The actual results of the search, if successful, can be found in
1778 : * the search results object.
1779 : *
1780 : * @param result_code The result (success or failure) of the search
1781 : */
1782 1 : void media_proxy_pl_search_cb(uint8_t result_code);
1783 :
1784 : /**
1785 : * @brief Search Results object ID callback
1786 : *
1787 : * To be called when the ID of the search results is changed
1788 : * (typically as the result of a new successful search).
1789 : *
1790 : * @param id The ID of the search results object in the OTS
1791 : */
1792 1 : void media_proxy_pl_search_results_id_cb(uint64_t id);
1793 :
1794 : #ifdef __cplusplus
1795 : }
1796 : #endif
1797 :
1798 : /** @} */ /* End of group bt_media_proxy */
1799 :
1800 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MEDIA_PROXY_H_ */
|