Line data Source code
1 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 1 : #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 1 : #define BT_MCS_PLAYBACK_SPEED_MIN -128 51 : /** Quarter playback speed, resulting in 25 % speed */ 52 1 : #define BT_MCS_PLAYBACK_SPEED_QUARTER -128 53 : /** Half playback speed, resulting in 50 % speed */ 54 1 : #define BT_MCS_PLAYBACK_SPEED_HALF -64 55 : /** Unity playback speed, resulting in 100 % speed */ 56 1 : #define BT_MCS_PLAYBACK_SPEED_UNITY 0 57 : /** Double playback speed, resulting in 200 % speed */ 58 1 : #define BT_MCS_PLAYBACK_SPEED_DOUBLE 64 59 : /** Max playback speed, resulting in 395.7 % speed (nearly 400 %) */ 60 1 : #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 1 : #define BT_MCS_SEEKING_SPEED_FACTOR_MAX 64 73 : /** Minimum seeking speed - Can be negated */ 74 1 : #define BT_MCS_SEEKING_SPEED_FACTOR_MIN 4 75 : /** No seeking */ 76 1 : #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 1 : #define BT_MCS_PLAYING_ORDER_SINGLE_ONCE 0X01 85 : /** A single track is played repeatedly; the next track is the current track. */ 86 1 : #define BT_MCS_PLAYING_ORDER_SINGLE_REPEAT 0x02 87 : /** The tracks within a group are played once in track order. */ 88 1 : #define BT_MCS_PLAYING_ORDER_INORDER_ONCE 0x03 89 : /** The tracks within a group are played in track order repeatedly. */ 90 1 : #define BT_MCS_PLAYING_ORDER_INORDER_REPEAT 0x04 91 : /** The tracks within a group are played once only from the oldest first. */ 92 1 : #define BT_MCS_PLAYING_ORDER_OLDEST_ONCE 0x05 93 : /** The tracks within a group are played from the oldest first repeatedly. */ 94 1 : #define BT_MCS_PLAYING_ORDER_OLDEST_REPEAT 0x06 95 : /** The tracks within a group are played once only from the newest first. */ 96 1 : #define BT_MCS_PLAYING_ORDER_NEWEST_ONCE 0x07 97 : /** The tracks within a group are played from the newest first repeatedly. */ 98 1 : #define BT_MCS_PLAYING_ORDER_NEWEST_REPEAT 0x08 99 : /** The tracks within a group are played in random order once. */ 100 1 : #define BT_MCS_PLAYING_ORDER_SHUFFLE_ONCE 0x09 101 : /** The tracks within a group are played in random order repeatedly. */ 102 1 : #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 1 : #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 1 : #define BT_MCS_PLAYING_ORDERS_SUPPORTED_SINGLE_REPEAT BIT(1) 115 : /** The tracks within a group are played once in track order. */ 116 1 : #define BT_MCS_PLAYING_ORDERS_SUPPORTED_INORDER_ONCE BIT(2) 117 : /** The tracks within a group are played in track order repeatedly. */ 118 1 : #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 1 : #define BT_MCS_PLAYING_ORDERS_SUPPORTED_OLDEST_ONCE BIT(4) 121 : /** The tracks within a group are played from the oldest first repeatedly. */ 122 1 : #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 1 : #define BT_MCS_PLAYING_ORDERS_SUPPORTED_NEWEST_ONCE BIT(6) 125 : /** The tracks within a group are played from the newest first repeatedly. */ 126 1 : #define BT_MCS_PLAYING_ORDERS_SUPPORTED_NEWEST_REPEAT BIT(7) 127 : /** The tracks within a group are played in random order once. */ 128 1 : #define BT_MCS_PLAYING_ORDERS_SUPPORTED_SHUFFLE_ONCE BIT(8) 129 : /** The tracks within a group are played in random order repeatedly. */ 130 1 : #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 1 : #define BT_MCS_MEDIA_STATE_INACTIVE 0x00 139 : /** The media player is playing the current track. */ 140 1 : #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 1 : #define BT_MCS_MEDIA_STATE_PAUSED 0x02 143 : /** The current track is fast forwarding or fast rewinding. */ 144 1 : #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 1 : #define BT_MCS_OPC_PLAY 0x01 153 : /** Pause playing the current track. */ 154 1 : #define BT_MCS_OPC_PAUSE 0x02 155 : /** Fast rewind the current track. */ 156 1 : #define BT_MCS_OPC_FAST_REWIND 0x03 157 : /** Fast forward the current track. */ 158 1 : #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 1 : #define BT_MCS_OPC_STOP 0x05 164 : 165 : /** Set a new current track position relative to the current track position. */ 166 1 : #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 1 : #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 1 : #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 1 : #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 1 : #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 1 : #define BT_MCS_OPC_GOTO_SEGMENT 0x24 193 : 194 : /** Set the current track to the previous track based on the playing order. */ 195 1 : #define BT_MCS_OPC_PREV_TRACK 0x30 196 : /** Set the current track to the next track based on the playing order. */ 197 1 : #define BT_MCS_OPC_NEXT_TRACK 0x31 198 : /** Set the current track to the first track based on the playing order. */ 199 1 : #define BT_MCS_OPC_FIRST_TRACK 0x32 200 : /** Set the current track to the last track based on the playing order. */ 201 1 : #define BT_MCS_OPC_LAST_TRACK 0x33 202 : /** Set the current track to the nth track based on the playing order. */ 203 1 : #define BT_MCS_OPC_GOTO_TRACK 0x34 204 : 205 : /** Set the current group to the previous group in the sequence of groups. */ 206 1 : #define BT_MCS_OPC_PREV_GROUP 0x40 207 : /** Set the current group to the next group in the sequence of groups. */ 208 1 : #define BT_MCS_OPC_NEXT_GROUP 0x41 209 : /** Set the current group to the first group in the sequence of groups. */ 210 1 : #define BT_MCS_OPC_FIRST_GROUP 0x42 211 : /** Set the current group to the last group in the sequence of groups. */ 212 1 : #define BT_MCS_OPC_LAST_GROUP 0x43 213 : /** Set the current group to the nth group in the sequence of groups. */ 214 1 : #define BT_MCS_OPC_GOTO_GROUP 0x44 215 : /** @} */ 216 : 217 : /** Media control point supported opcodes length */ 218 1 : #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 1 : #define BT_MCS_OPC_SUP_PLAY BIT(0) 226 : /** Support the Pause opcode */ 227 1 : #define BT_MCS_OPC_SUP_PAUSE BIT(1) 228 : /** Support the Fast Rewind opcode */ 229 1 : #define BT_MCS_OPC_SUP_FAST_REWIND BIT(2) 230 : /** Support the Fast Forward opcode */ 231 1 : #define BT_MCS_OPC_SUP_FAST_FORWARD BIT(3) 232 : /** Support the Stop opcode */ 233 1 : #define BT_MCS_OPC_SUP_STOP BIT(4) 234 : 235 : /** Support the Move Relative opcode */ 236 1 : #define BT_MCS_OPC_SUP_MOVE_RELATIVE BIT(5) 237 : 238 : /** Support the Previous Segment opcode */ 239 1 : #define BT_MCS_OPC_SUP_PREV_SEGMENT BIT(6) 240 : /** Support the Next Segment opcode */ 241 1 : #define BT_MCS_OPC_SUP_NEXT_SEGMENT BIT(7) 242 : /** Support the First Segment opcode */ 243 1 : #define BT_MCS_OPC_SUP_FIRST_SEGMENT BIT(8) 244 : /** Support the Last Segment opcode */ 245 1 : #define BT_MCS_OPC_SUP_LAST_SEGMENT BIT(9) 246 : /** Support the Goto Segment opcode */ 247 1 : #define BT_MCS_OPC_SUP_GOTO_SEGMENT BIT(10) 248 : 249 : /** Support the Previous Track opcode */ 250 1 : #define BT_MCS_OPC_SUP_PREV_TRACK BIT(11) 251 : /** Support the Next Track opcode */ 252 1 : #define BT_MCS_OPC_SUP_NEXT_TRACK BIT(12) 253 : /** Support the First Track opcode */ 254 1 : #define BT_MCS_OPC_SUP_FIRST_TRACK BIT(13) 255 : /** Support the Last Track opcode */ 256 1 : #define BT_MCS_OPC_SUP_LAST_TRACK BIT(14) 257 : /** Support the Goto Track opcode */ 258 1 : #define BT_MCS_OPC_SUP_GOTO_TRACK BIT(15) 259 : 260 : /** Support the Previous Group opcode */ 261 1 : #define BT_MCS_OPC_SUP_PREV_GROUP BIT(16) 262 : /** Support the Next Group opcode */ 263 1 : #define BT_MCS_OPC_SUP_NEXT_GROUP BIT(17) 264 : /** Support the First Group opcode */ 265 1 : #define BT_MCS_OPC_SUP_FIRST_GROUP BIT(18) 266 : /** Support the Last Group opcode */ 267 1 : #define BT_MCS_OPC_SUP_LAST_GROUP BIT(19) 268 : /** Support the Goto Group opcode */ 269 1 : #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 1 : #define BT_MCS_OPC_NTF_SUCCESS 0x01 278 : /** An invalid or unsupported opcode was used for the Media Control Point write. */ 279 1 : #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 1 : #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 1 : #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 1 : #define BT_MCS_SEARCH_TYPE_TRACK_NAME 0x01 301 : /** Search for Artist Name */ 302 1 : #define BT_MCS_SEARCH_TYPE_ARTIST_NAME 0x02 303 : /** Search for Album Name */ 304 1 : #define BT_MCS_SEARCH_TYPE_ALBUM_NAME 0x03 305 : /** Search for Group Name */ 306 1 : #define BT_MCS_SEARCH_TYPE_GROUP_NAME 0x04 307 : /** Search for Earliest Year */ 308 1 : #define BT_MCS_SEARCH_TYPE_EARLIEST_YEAR 0x05 309 : /** Search for Latest Year */ 310 1 : #define BT_MCS_SEARCH_TYPE_LATEST_YEAR 0x06 311 : /** Search for Genre */ 312 1 : #define BT_MCS_SEARCH_TYPE_GENRE 0x07 313 : /** Search for Tracks only */ 314 1 : #define BT_MCS_SEARCH_TYPE_ONLY_TRACKS 0x08 315 : /** Search for Groups only */ 316 1 : #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 1 : #define SEARCH_LEN_MIN 2 326 : 327 : /** Search control point maximum length */ 328 1 : #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 1 : */ 340 : 341 : /** Search parameters maximum length */ 342 1 : #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 1 : #define BT_MCS_SCP_NTF_SUCCESS 0x01 352 : /** Search request was invalid; no search started. */ 353 1 : #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 1 : #define BT_MCS_GROUP_OBJECT_TRACK_TYPE 0x00 364 : /** Group object type is group */ 365 1 : #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_ */