1 /**
2  * @file
3  * @brief Bluetooth Media Control Service (MCS) APIs.
4  */
5 /*
6  * Copyright (c) 2019 - 2024 Nordic Semiconductor ASA
7  *
8  * SPDX-License-Identifier: Apache-2.0
9  */
10 
11 #ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCS_H_
12 #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCS_H_
13 
14 /**
15  * @brief Media Control Service (MCS)
16  *
17  * @defgroup bt_mcs Media Control Service (MCS)
18  *
19  * @since 3.0
20  * @version 0.8.0
21  *
22  * @ingroup bluetooth
23  * @{
24  *
25  * Definitions and types related to the Media Control Service and Media Control
26  * Profile specifications.
27  */
28 
29 #include <zephyr/sys/util.h>
30 #include <zephyr/sys/util_macro.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 /**
37  * A characteristic value has changed while a Read Long Value Characteristic sub-procedure is in
38  * progress.
39  */
40 #define BT_MCS_ERR_LONG_VAL_CHANGED     0x80
41 
42 /**
43  * @name Playback speeds
44  *
45  * The playback speed (s) is calculated by the value of 2 to the power of p divided by 64.
46  * All values from -128 to 127 allowed, only some examples defined.
47  * @{
48  */
49 /** Minimum playback speed, resulting in 25 % speed */
50 #define BT_MCS_PLAYBACK_SPEED_MIN     -128
51 /** Quarter playback speed, resulting in 25 % speed */
52 #define BT_MCS_PLAYBACK_SPEED_QUARTER -128
53 /** Half playback speed, resulting in 50 % speed */
54 #define BT_MCS_PLAYBACK_SPEED_HALF     -64
55 /** Unity playback speed, resulting in 100 % speed */
56 #define BT_MCS_PLAYBACK_SPEED_UNITY      0
57 /** Double playback speed, resulting in 200 % speed */
58 #define BT_MCS_PLAYBACK_SPEED_DOUBLE    64
59 /** Max playback speed, resulting in 395.7 % speed (nearly 400 %) */
60 #define BT_MCS_PLAYBACK_SPEED_MAX      127
61 /** @} */
62 
63 /**
64  * @name Seeking speed
65  *
66  * The allowed values for seeking speed are the range -64 to -4
67  * (endpoints included), the value 0, and the range 4 to 64
68  * (endpoints included).
69  * @{
70  */
71 /** Maximum seeking speed - Can be negated */
72 #define BT_MCS_SEEKING_SPEED_FACTOR_MAX  64
73 /** Minimum seeking speed - Can be negated */
74 #define BT_MCS_SEEKING_SPEED_FACTOR_MIN   4
75 /** No seeking */
76 #define BT_MCS_SEEKING_SPEED_FACTOR_ZERO  0
77 /** @} */
78 
79 /**
80  * @name Playing orders
81  * @{
82  */
83 /** A single track is played once; there is no next track. */
84 #define BT_MCS_PLAYING_ORDER_SINGLE_ONCE    0X01
85 /** A single track is played repeatedly; the next track is the current track. */
86 #define BT_MCS_PLAYING_ORDER_SINGLE_REPEAT  0x02
87 /** The tracks within a group are played once in track order. */
88 #define BT_MCS_PLAYING_ORDER_INORDER_ONCE   0x03
89 /** The tracks within a group are played in track order repeatedly. */
90 #define BT_MCS_PLAYING_ORDER_INORDER_REPEAT 0x04
91 /** The tracks within a group are played once only from the oldest first. */
92 #define BT_MCS_PLAYING_ORDER_OLDEST_ONCE    0x05
93 /** The tracks within a group are played from the oldest first repeatedly. */
94 #define BT_MCS_PLAYING_ORDER_OLDEST_REPEAT  0x06
95 /** The tracks within a group are played once only from the newest first. */
96 #define BT_MCS_PLAYING_ORDER_NEWEST_ONCE    0x07
97 /** The tracks within a group are played from the newest first repeatedly. */
98 #define BT_MCS_PLAYING_ORDER_NEWEST_REPEAT  0x08
99 /** The tracks within a group are played in random order once. */
100 #define BT_MCS_PLAYING_ORDER_SHUFFLE_ONCE   0x09
101 /** The tracks within a group are played in random order repeatedly. */
102 #define BT_MCS_PLAYING_ORDER_SHUFFLE_REPEAT 0x0a
103 /** @} */
104 
105 /** @name Playing orders supported
106  *
107  * A bitmap, in the same order as the playing orders above.
108  * Note that playing order 1 corresponds to bit 0, and so on.
109  * @{
110  */
111 /** A single track is played once; there is no next track. */
112 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_SINGLE_ONCE    BIT(0)
113 /** A single track is played repeatedly; the next track is the current track. */
114 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_SINGLE_REPEAT  BIT(1)
115 /** The tracks within a group are played once in track order. */
116 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_INORDER_ONCE   BIT(2)
117 /** The tracks within a group are played in track order repeatedly. */
118 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_INORDER_REPEAT BIT(3)
119 /** The tracks within a group are played once only from the oldest first. */
120 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_OLDEST_ONCE    BIT(4)
121 /** The tracks within a group are played from the oldest first repeatedly. */
122 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_OLDEST_REPEAT  BIT(5)
123 /** The tracks within a group are played once only from the newest first. */
124 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_NEWEST_ONCE    BIT(6)
125 /** The tracks within a group are played from the newest first repeatedly. */
126 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_NEWEST_REPEAT  BIT(7)
127 /** The tracks within a group are played in random order once. */
128 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_SHUFFLE_ONCE   BIT(8)
129 /** The tracks within a group are played in random order repeatedly. */
130 #define BT_MCS_PLAYING_ORDERS_SUPPORTED_SHUFFLE_REPEAT BIT(9)
131 /** @} */
132 
133 /**
134  * @name Media states
135  * @{
136  */
137 /** The current track is invalid, and no track has been selected. */
138 #define BT_MCS_MEDIA_STATE_INACTIVE 0x00
139 /** The media player is playing the current track. */
140 #define BT_MCS_MEDIA_STATE_PLAYING  0x01
141 /** The current track is paused. The media player has a current track, but it is not being played */
142 #define BT_MCS_MEDIA_STATE_PAUSED   0x02
143 /** The current track is fast forwarding or fast rewinding. */
144 #define BT_MCS_MEDIA_STATE_SEEKING  0x03
145 /** @} */
146 
147 /**
148  * @name Media control point opcodes
149  * @{
150  */
151 /** Start playing the current track. */
152 #define BT_MCS_OPC_PLAY          0x01
153 /** Pause playing the current track. */
154 #define BT_MCS_OPC_PAUSE         0x02
155 /** Fast rewind the current track. */
156 #define BT_MCS_OPC_FAST_REWIND   0x03
157 /** Fast forward the current track. */
158 #define BT_MCS_OPC_FAST_FORWARD  0x04
159 /**
160  * Stop current activity and return to the paused state and set the current track position to the
161  * start of the current track.
162  */
163 #define BT_MCS_OPC_STOP          0x05
164 
165 /** Set a new current track position relative to the current track position. */
166 #define BT_MCS_OPC_MOVE_RELATIVE 0x10
167 
168 /**
169  * Set the current track position to the starting position of the previous segment of the current
170  * track.
171  */
172 #define BT_MCS_OPC_PREV_SEGMENT  0x20
173 /**
174  * Set the current track position to the starting position of
175  * the next segment of the current track.
176  */
177 #define BT_MCS_OPC_NEXT_SEGMENT  0x21
178 /**
179  * Set the current track position to the starting position of
180  * the first segment of the current track.
181  */
182 #define BT_MCS_OPC_FIRST_SEGMENT 0x22
183 /**
184  * Set the current track position to the starting position of
185  * the last segment of the current track.
186  */
187 #define BT_MCS_OPC_LAST_SEGMENT  0x23
188 /**
189  * Set the current track position to the starting position of
190  * the nth segment of the current track.
191  */
192 #define BT_MCS_OPC_GOTO_SEGMENT  0x24
193 
194 /** Set the current track to the previous track based on the playing order. */
195 #define BT_MCS_OPC_PREV_TRACK    0x30
196 /** Set the current track to the next track based on the playing order. */
197 #define BT_MCS_OPC_NEXT_TRACK    0x31
198 /** Set the current track to the first track based on the playing order. */
199 #define BT_MCS_OPC_FIRST_TRACK   0x32
200 /** Set the current track to the last track based on the playing order. */
201 #define BT_MCS_OPC_LAST_TRACK    0x33
202 /** Set the current track to the nth track based on the playing order. */
203 #define BT_MCS_OPC_GOTO_TRACK    0x34
204 
205 /** Set the current group to the previous group in the sequence of groups. */
206 #define BT_MCS_OPC_PREV_GROUP    0x40
207 /** Set the current group to the next group in the sequence of groups. */
208 #define BT_MCS_OPC_NEXT_GROUP    0x41
209 /** Set the current group to the first group in the sequence of groups. */
210 #define BT_MCS_OPC_FIRST_GROUP   0x42
211 /** Set the current group to the last group in the sequence of groups. */
212 #define BT_MCS_OPC_LAST_GROUP    0x43
213 /** Set the current group to the nth group in the sequence of groups. */
214 #define BT_MCS_OPC_GOTO_GROUP    0x44
215 /** @} */
216 
217 /** Media control point supported opcodes length */
218 #define BT_MCS_OPCODES_SUPPORTED_LEN 4
219 
220 /**
221  * @name Media control point supported opcodes values
222  * @{
223  */
224 /** Support the Play opcode */
225 #define BT_MCS_OPC_SUP_PLAY          BIT(0)
226 /** Support the Pause opcode */
227 #define BT_MCS_OPC_SUP_PAUSE         BIT(1)
228 /** Support the Fast Rewind opcode */
229 #define BT_MCS_OPC_SUP_FAST_REWIND   BIT(2)
230 /** Support the Fast Forward opcode */
231 #define BT_MCS_OPC_SUP_FAST_FORWARD  BIT(3)
232 /** Support the Stop opcode */
233 #define BT_MCS_OPC_SUP_STOP          BIT(4)
234 
235 /** Support the Move Relative opcode */
236 #define BT_MCS_OPC_SUP_MOVE_RELATIVE BIT(5)
237 
238 /** Support the Previous Segment opcode */
239 #define BT_MCS_OPC_SUP_PREV_SEGMENT  BIT(6)
240 /** Support the Next Segment opcode */
241 #define BT_MCS_OPC_SUP_NEXT_SEGMENT  BIT(7)
242 /** Support the First Segment opcode */
243 #define BT_MCS_OPC_SUP_FIRST_SEGMENT BIT(8)
244 /** Support the Last Segment opcode */
245 #define BT_MCS_OPC_SUP_LAST_SEGMENT  BIT(9)
246 /** Support the Goto Segment opcode */
247 #define BT_MCS_OPC_SUP_GOTO_SEGMENT  BIT(10)
248 
249 /** Support the Previous Track opcode */
250 #define BT_MCS_OPC_SUP_PREV_TRACK    BIT(11)
251 /** Support the Next Track opcode */
252 #define BT_MCS_OPC_SUP_NEXT_TRACK    BIT(12)
253 /** Support the First Track opcode */
254 #define BT_MCS_OPC_SUP_FIRST_TRACK   BIT(13)
255 /** Support the Last Track opcode */
256 #define BT_MCS_OPC_SUP_LAST_TRACK    BIT(14)
257 /** Support the Goto Track opcode */
258 #define BT_MCS_OPC_SUP_GOTO_TRACK    BIT(15)
259 
260 /** Support the Previous Group opcode */
261 #define BT_MCS_OPC_SUP_PREV_GROUP    BIT(16)
262 /** Support the Next Group opcode */
263 #define BT_MCS_OPC_SUP_NEXT_GROUP    BIT(17)
264 /** Support the First Group opcode */
265 #define BT_MCS_OPC_SUP_FIRST_GROUP   BIT(18)
266 /** Support the Last Group opcode */
267 #define BT_MCS_OPC_SUP_LAST_GROUP    BIT(19)
268 /** Support the Goto Group opcode */
269 #define BT_MCS_OPC_SUP_GOTO_GROUP    BIT(20)
270 /** @} */
271 
272 /**
273  * @name Media control point notification result codes
274  * @{
275  */
276 /** Action requested by the opcode write was completed successfully. */
277 #define BT_MCS_OPC_NTF_SUCCESS             0x01
278 /** An invalid or unsupported opcode was used for the Media Control Point write. */
279 #define BT_MCS_OPC_NTF_NOT_SUPPORTED       0x02
280 /**
281  * The Media Player State characteristic value is Inactive when the opcode is received or the
282  * result of the requested action of the opcode results in the Media Player State characteristic
283  * being set to Inactive.
284  */
285 #define BT_MCS_OPC_NTF_PLAYER_INACTIVE     0x03
286 /**
287  * The requested action of any Media Control Point write cannot be completed successfully because of
288  * a condition within the player.
289  */
290 #define BT_MCS_OPC_NTF_CANNOT_BE_COMPLETED 0x04
291 /** @} */
292 
293 /**
294  * @name Search control point type values
295  *
296  * Reference: Media Control Service spec v1.0 section 3.20.2
297  * @{
298  */
299 /** Search for Track Name */
300 #define BT_MCS_SEARCH_TYPE_TRACK_NAME    0x01
301 /** Search for Artist Name */
302 #define BT_MCS_SEARCH_TYPE_ARTIST_NAME   0x02
303 /** Search for Album Name */
304 #define BT_MCS_SEARCH_TYPE_ALBUM_NAME    0x03
305 /** Search for Group Name */
306 #define BT_MCS_SEARCH_TYPE_GROUP_NAME    0x04
307 /** Search for Earliest Year */
308 #define BT_MCS_SEARCH_TYPE_EARLIEST_YEAR 0x05
309 /** Search for Latest Year */
310 #define BT_MCS_SEARCH_TYPE_LATEST_YEAR   0x06
311 /** Search for Genre */
312 #define BT_MCS_SEARCH_TYPE_GENRE         0x07
313 /** Search for Tracks only */
314 #define BT_MCS_SEARCH_TYPE_ONLY_TRACKS   0x08
315 /** Search for Groups only */
316 #define BT_MCS_SEARCH_TYPE_ONLY_GROUPS   0x09
317 /** @} */
318 
319 /**
320  * @brief Search control point minimum length
321  *
322  * At least one search control item (SCI), consisting of the length octet and the type octet.
323  * (The * parameter field may be empty.)
324  */
325 #define SEARCH_LEN_MIN 2
326 
327 /** Search control point maximum length */
328 #define SEARCH_LEN_MAX 64
329 
330 /**
331  * @brief Search control point item (SCI) minimum length
332  *
333  * An SCI length can be as little as one byte, for an SCI that has only the type field.
334  * (The SCI len is the length of type + param.)
335  */
336 #define SEARCH_SCI_LEN_MIN 1   /* An SCI length can be as little as one byte,
337 				* for an SCI that has only the type field.
338 				* (The SCI len is the length of type + param.)
339 				*/
340 
341 /** Search parameters maximum length  */
342 #define SEARCH_PARAM_MAX 62
343 
344 /**
345  * @name Search notification result codes
346  *
347  * Reference: Media Control Service spec v1.0 section 3.20.2
348  * @{
349  */
350 /** Search request was accepted; search has started. */
351 #define BT_MCS_SCP_NTF_SUCCESS  0x01
352 /** Search request was invalid; no search started. */
353 #define BT_MCS_SCP_NTF_FAILURE  0x02
354 /** @} */
355 
356 /**
357  * @name Group object object types
358  *
359  * Reference: Media Control Service spec v1.0 section 4.4.1
360  * @{
361  */
362 /** Group object type is track */
363 #define BT_MCS_GROUP_OBJECT_TRACK_TYPE 0x00
364 /** Group object type is group */
365 #define BT_MCS_GROUP_OBJECT_GROUP_TYPE 0x01
366 /** @} */
367 
368 #ifdef __cplusplus
369 }
370 #endif
371 
372 /**
373  * @}
374  */
375 
376 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCS_H_ */
377