Line data Source code
1 1 : /** 2 : * @file 3 : * @brief Bluetooth Volume Offset Control Service (VOCS) APIs. 4 : */ 5 : 6 : /* 7 : * Copyright (c) 2020-2024 Nordic Semiconductor ASA 8 : * 9 : * SPDX-License-Identifier: Apache-2.0 10 : */ 11 : 12 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_VOCS_H_ 13 : #define ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_VOCS_H_ 14 : 15 : /** 16 : * @brief Volume Offset Control Service (VOCS) 17 : * 18 : * @defgroup bt_vocs Volume Offset Control Service (VOCS) 19 : * 20 : * @since 2.6 21 : * @version 0.8.0 22 : * 23 : * @ingroup bluetooth 24 : * @{ 25 : * 26 : * The Volume Offset Control Service is a secondary service, and as such should not be used own its 27 : * own, but rather in the context of another (primary) service. 28 : * 29 : * This API implements both the server and client functionality. 30 : * Note that the API abstracts away the change counter in the volume offset control state and will 31 : * automatically handle any changes to that. If out of date, the client implementation will 32 : * autonomously read the change counter value when executing a write request. 33 : */ 34 : 35 : #include <stdint.h> 36 : #include <stdbool.h> 37 : 38 : #include <zephyr/bluetooth/conn.h> 39 : 40 : #ifdef __cplusplus 41 : extern "C" { 42 : #endif 43 : 44 : /** 45 : * @name Volume Offset Control Service Error codes 46 : * @{ 47 : */ 48 : /** 49 : * The Change_Counter operand value does not match the Change_Counter field value of the Volume 50 : * Offset State characteristic. 51 : */ 52 1 : #define BT_VOCS_ERR_INVALID_COUNTER 0x80 53 : /** An invalid opcode has been used in a control point procedure. */ 54 1 : #define BT_VOCS_ERR_OP_NOT_SUPPORTED 0x81 55 : /** An operand value used in a control point procedure is outside the permissible range. */ 56 1 : #define BT_VOCS_ERR_OUT_OF_RANGE 0x82 57 : /** @} */ 58 : 59 : /** 60 : * @name Volume Offset Control Service offset limits 61 : * @{ 62 : */ 63 : /** Minimum offset value */ 64 1 : #define BT_VOCS_MIN_OFFSET -255 65 : /** Maximum offset value */ 66 1 : #define BT_VOCS_MAX_OFFSET 255 67 : /** @} */ 68 : 69 : /** @brief Opaque Volume Offset Control Service instance. */ 70 : struct bt_vocs; 71 : 72 : /** @brief Structure for registering a Volume Offset Control Service instance. */ 73 1 : struct bt_vocs_register_param { 74 : /** Audio Location bitmask */ 75 1 : uint32_t location; 76 : 77 : /** Boolean to set whether the location is writable by clients */ 78 1 : bool location_writable; 79 : 80 : /** Initial volume offset (-255 to 255) */ 81 1 : int16_t offset; 82 : 83 : /** Initial audio output description */ 84 1 : char *output_desc; 85 : 86 : /** Boolean to set whether the description is writable by clients */ 87 1 : bool desc_writable; 88 : 89 : /** Pointer to the callback structure. */ 90 1 : struct bt_vocs_cb *cb; 91 : }; 92 : 93 : /** @brief Structure for discovering a Volume Offset Control Service instance. */ 94 1 : struct bt_vocs_discover_param { 95 : /** 96 : * @brief The start handle of the discovering. 97 : * 98 : * Typically the @p start_handle of a @ref bt_gatt_include. 99 : */ 100 1 : uint16_t start_handle; 101 : /** 102 : * @brief The end handle of the discovering. 103 : * 104 : * Typically the @p end_handle of a @ref bt_gatt_include. 105 : */ 106 1 : uint16_t end_handle; 107 : }; 108 : 109 : /** 110 : * @brief Get a free service instance of Volume Offset Control Service from the pool. 111 : * 112 : * @return Volume Offset Control Service instance in case of success or NULL in case of error. 113 : */ 114 1 : struct bt_vocs *bt_vocs_free_instance_get(void); 115 : 116 : /** 117 : * @brief Get the service declaration attribute. 118 : * 119 : * The first service attribute returned can be included in any other GATT service. 120 : * 121 : * @param vocs Volume Offset Control Service instance. 122 : * 123 : * @return Pointer to the attributes of the service. 124 : */ 125 1 : void *bt_vocs_svc_decl_get(struct bt_vocs *vocs); 126 : 127 : /** 128 : * @brief Get the connection pointer of a client instance 129 : * 130 : * Get the Bluetooth connection pointer of a Audio Input Control Service 131 : * client instance. 132 : * 133 : * @param vocs Audio Input Control Service client instance pointer. 134 : * @param conn Connection pointer. 135 : * 136 : * @return 0 if success, errno on failure. 137 : */ 138 1 : int bt_vocs_client_conn_get(const struct bt_vocs *vocs, struct bt_conn **conn); 139 : 140 : /** 141 : * @brief Register the Volume Offset Control Service instance. 142 : * 143 : * @param vocs Volume Offset Control Service instance. 144 : * @param param Volume Offset Control Service register parameters. 145 : * 146 : * @return 0 if success, errno on failure. 147 : */ 148 1 : int bt_vocs_register(struct bt_vocs *vocs, 149 : const struct bt_vocs_register_param *param); 150 : 151 : /** 152 : * @brief Callback function for the offset state. 153 : * 154 : * Called when the value is read, or if the value is changed by either the server or client. 155 : * 156 : * @param inst The instance pointer. 157 : * @param err Error value. 0 on success, GATT error on positive value 158 : * or errno on negative value. 159 : * For notifications, this will always be 0. 160 : * @param offset The offset value. 161 : */ 162 1 : typedef void (*bt_vocs_state_cb)(struct bt_vocs *inst, int err, int16_t offset); 163 : 164 : /** 165 : * @brief Callback function for setting offset. 166 : * 167 : * @param inst The instance pointer. 168 : * @param err Error value. 0 on success, GATT error on positive value 169 : * or errno on negative value. 170 : */ 171 1 : typedef void (*bt_vocs_set_offset_cb)(struct bt_vocs *inst, int err); 172 : 173 : /** 174 : * @brief Callback function for the location. 175 : * 176 : * Called when the value is read, or if the value is changed by either the server or client. 177 : * 178 : * @param inst The instance pointer. 179 : * @param err Error value. 0 on success, GATT error on positive value 180 : * or errno on negative value. 181 : * For notifications, this will always be 0. 182 : * @param location The location value. 183 : */ 184 1 : typedef void (*bt_vocs_location_cb)(struct bt_vocs *inst, int err, 185 : uint32_t location); 186 : 187 : /** 188 : * @brief Callback function for the description. 189 : * 190 : * Called when the value is read, or if the value is changed by either the server or client. 191 : * 192 : * @param inst The instance pointer. 193 : * @param err Error value. 0 on success, GATT error on positive value 194 : * or errno on negative value. 195 : * For notifications, this will always be 0. 196 : * @param description The description as an UTF-8 encoded string. 197 : */ 198 1 : typedef void (*bt_vocs_description_cb)(struct bt_vocs *inst, int err, 199 : char *description); 200 : 201 : /** 202 : * @brief Callback function for bt_vocs_discover. 203 : * 204 : * This callback should be overwritten by the primary service that 205 : * includes the Volume Control Offset Service client, and should thus not be 206 : * set by the application. 207 : * 208 : * @param inst The instance pointer. 209 : * @param err Error value. 0 on success, GATT error on positive value 210 : * or errno on negative value. 211 : * For notifications, this will always be 0. 212 : */ 213 1 : typedef void (*bt_vocs_discover_cb)(struct bt_vocs *inst, int err); 214 : 215 : /** 216 : * @brief Struct to hold the Volume Offset Control Service callbacks 217 : * 218 : * These can be registered for usage with bt_vocs_client_cb_register() or bt_vocs_register() 219 : * depending on the role. 220 : */ 221 1 : struct bt_vocs_cb { 222 : /** The offset state has changed */ 223 1 : bt_vocs_state_cb state; 224 : /** The location has changed */ 225 1 : bt_vocs_location_cb location; 226 : /** The Description has changed */ 227 1 : bt_vocs_description_cb description; 228 : 229 : #if defined(CONFIG_BT_VOCS_CLIENT) || defined(__DOXYGEN__) 230 : /** 231 : * The discovery procedure has completed 232 : * 233 : * Only settable for the client and requires enabling@kconfig{CONFIG_BT_VOCS_CLIENT}. 234 : */ 235 1 : bt_vocs_discover_cb discover; 236 : /** 237 : * The set offset procedure has completed 238 : * 239 : * Only settable for the client and requires enabling@kconfig{CONFIG_BT_VOCS_CLIENT}. 240 : */ 241 1 : bt_vocs_set_offset_cb set_offset; 242 : #endif /* CONFIG_BT_VOCS_CLIENT */ 243 : }; 244 : 245 : /** 246 : * @brief Read the Volume Offset Control Service offset state. 247 : * 248 : * The value is returned in the bt_vocs_cb.state callback. 249 : * 250 : * @param inst Pointer to the Volume Offset Control Service instance. 251 : * 252 : * @return 0 on success, GATT error value on fail. 253 : */ 254 1 : int bt_vocs_state_get(struct bt_vocs *inst); 255 : 256 : /** 257 : * @brief Set the Volume Offset Control Service offset state. 258 : * 259 : * @param inst Pointer to the Volume Offset Control Service instance. 260 : * @param offset The offset to set (-255 to 255). 261 : * 262 : * @return 0 on success, GATT error value on fail. 263 : */ 264 1 : int bt_vocs_state_set(struct bt_vocs *inst, int16_t offset); 265 : 266 : /** 267 : * @brief Read the Volume Offset Control Service location. 268 : * 269 : * The value is returned in the bt_vocs_cb.location callback. 270 : * 271 : * @param inst Pointer to the Volume Offset Control Service instance. 272 : * 273 : * @return 0 on success, GATT error value on fail. 274 : */ 275 1 : int bt_vocs_location_get(struct bt_vocs *inst); 276 : 277 : /** 278 : * @brief Set the Volume Offset Control Service location. 279 : * 280 : * @param inst Pointer to the Volume Offset Control Service instance. 281 : * @param location The location to set. 282 : * 283 : * @return 0 on success, GATT error value on fail. 284 : */ 285 1 : int bt_vocs_location_set(struct bt_vocs *inst, uint32_t location); 286 : 287 : /** 288 : * @brief Read the Volume Offset Control Service output description. 289 : * 290 : * The value is returned in the bt_vocs_cb.description callback. 291 : * 292 : * @param inst Pointer to the Volume Offset Control Service instance. 293 : * 294 : * @return 0 on success, GATT error value on fail. 295 : */ 296 1 : int bt_vocs_description_get(struct bt_vocs *inst); 297 : 298 : /** 299 : * @brief Set the Volume Offset Control Service description. 300 : * 301 : * @param inst Pointer to the Volume Offset Control Service instance. 302 : * @param description The UTF-8 encoded string description to set. 303 : * 304 : * @return 0 on success, GATT error value on fail. 305 : */ 306 1 : int bt_vocs_description_set(struct bt_vocs *inst, const char *description); 307 : 308 : /** 309 : * @brief Registers the callbacks for the Volume Offset Control Service client. 310 : * 311 : * @param inst Pointer to the Volume Offset Control Service client instance. 312 : * @param cb Pointer to the callback structure. 313 : */ 314 1 : void bt_vocs_client_cb_register(struct bt_vocs *inst, struct bt_vocs_cb *cb); 315 : 316 : /** 317 : * @brief Returns a pointer to a Volume Offset Control Service client instance. 318 : * 319 : * @return Pointer to the instance, or NULL if no free instances are left. 320 : */ 321 1 : struct bt_vocs *bt_vocs_client_free_instance_get(void); 322 : 323 : /** 324 : * @brief Discover a Volume Offset Control Service. 325 : * 326 : * Attempts to discover a Volume Offset Control Service on a server given the @p param. 327 : * 328 : * @param conn Connection to the peer with the Volume Offset Control Service. 329 : * @param inst Pointer to the Volume Offset Control Service client instance. 330 : * @param param Pointer to the parameters. 331 : * 332 : * @return 0 on success, errno on fail. 333 : */ 334 1 : int bt_vocs_discover(struct bt_conn *conn, struct bt_vocs *inst, 335 : const struct bt_vocs_discover_param *param); 336 : 337 : #ifdef __cplusplus 338 : } 339 : #endif 340 : 341 : /** 342 : * @} 343 : */ 344 : 345 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_VOCS_H_ */