LCOV - code coverage report
Current view: top level - zephyr/bluetooth/audio - aics.h Coverage Total Hit
Test: new.info Lines: 100.0 % 78 78
Test Date: 2025-09-05 20:47:19

            Line data    Source code
       1            1 : /**
       2              :  * @file
       3              :  * @brief Bluetooth Audio Input Control Service 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_AICS_H_
      13              : #define ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_AICS_H_
      14              : 
      15              : /**
      16              :  * @brief Audio Input Control Service (AICS)
      17              :  *
      18              :  * @defgroup bt_aics Audio Input Control Service (AICS)
      19              :  *
      20              :  * @since 2.6
      21              :  * @version 0.8.0
      22              :  *
      23              :  * @ingroup bluetooth
      24              :  * @{
      25              :  *
      26              :  * The Audio Input Control Service is a secondary service, and as such should not be used on 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 audio input 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/autoconf.h>
      39              : #include <zephyr/bluetooth/bluetooth.h>
      40              : 
      41              : #ifdef __cplusplus
      42              : extern "C" {
      43              : #endif
      44              : 
      45              : /**
      46              :  * @name Audio Input Control Service mute states
      47              :  * @{
      48              :  */
      49              : /** The mute state is unmuted */
      50            1 : #define BT_AICS_STATE_UNMUTED                      0x00
      51              : /** The mute state is muted */
      52            1 : #define BT_AICS_STATE_MUTED                        0x01
      53              : /** The mute state is disabled */
      54            1 : #define BT_AICS_STATE_MUTE_DISABLED                0x02
      55              : /** @} */
      56              : 
      57              : /**
      58              :  * @name Audio Input Control Service input modes
      59              :  * @{
      60              :  */
      61              : /**
      62              :  * @brief The gain mode is manual only and cannot be changed to automatic.
      63              :  *
      64              :  * The gain can be controlled by the client.
      65              :  */
      66            1 : #define BT_AICS_MODE_MANUAL_ONLY                   0x00
      67              : /**
      68              :  * @brief The gain mode is automatic only and cannot be changed to manual.
      69              :  *
      70              :  * The gain cannot be controlled by the client.
      71              :  */
      72            1 : #define BT_AICS_MODE_AUTO_ONLY                     0x01
      73              : /**
      74              :  * @brief The gain mode is manual.
      75              :  *
      76              :  * The gain can be controlled by the client.
      77              :  */
      78            1 : #define BT_AICS_MODE_MANUAL                        0x02
      79              : /**
      80              :  * @brief The gain mode is automatic.
      81              :  *
      82              :  * The gain cannot be controlled by the client.
      83              :  */
      84            1 : #define BT_AICS_MODE_AUTO                          0x03
      85              : /** @} */
      86              : 
      87              : /**
      88              :  * @name Audio Input Control Service input types
      89              :  * @{
      90              :  */
      91              : /** The input is unspecified */
      92            1 : #define BT_AICS_INPUT_TYPE_UNSPECIFIED             0x00
      93              : /** The input is a Bluetooth Audio Stream */
      94            1 : #define BT_AICS_INPUT_TYPE_BLUETOOTH               0x01
      95              : /** The input is a microphone */
      96            1 : #define BT_AICS_INPUT_TYPE_MICROPHONE              0x02
      97              : /** The input is analog */
      98            1 : #define BT_AICS_INPUT_TYPE_ANALOG                  0x03
      99              : /** The input is digital */
     100            1 : #define BT_AICS_INPUT_TYPE_DIGITAL                 0x04
     101              : /** The input is a radio (AM/FM/XM/etc.) */
     102            1 : #define BT_AICS_INPUT_TYPE_RADIO                   0x05
     103              : /** The input is a Streaming Audio Source */
     104            1 : #define BT_AICS_INPUT_TYPE_STREAMING               0x06
     105              : /** The input is transparent / pass-through */
     106            1 : #define BT_AICS_INPUT_TYPE_AMBIENT                 0x07
     107              : /** @} */
     108              : 
     109              : /**
     110              :  * @name Audio Input Control Service Error codes
     111              :  * @{
     112              :  */
     113              : /**
     114              :  * The Change_Counter operand value does not match the Change_Counter field value of the
     115              :  * Audio Input State characteristic.
     116              :  */
     117            1 : #define BT_AICS_ERR_INVALID_COUNTER                0x80
     118              : /** An invalid opcode has been used in a control point procedure */
     119            1 : #define BT_AICS_ERR_OP_NOT_SUPPORTED               0x81
     120              : /** Mute/unmute commands are disabled.(see @ref BT_AICS_STATE_MUTE_DISABLED) */
     121            1 : #define BT_AICS_ERR_MUTE_DISABLED                  0x82
     122              : /** An operand value used in a control point procedure is outside the permissible range */
     123            1 : #define BT_AICS_ERR_OUT_OF_RANGE                   0x83
     124              : /** A requested gain mode change is not allowed */
     125            1 : #define BT_AICS_ERR_GAIN_MODE_NOT_ALLOWED          0x84
     126              : /** @} */
     127              : 
     128              : /** @brief Opaque Audio Input Control Service instance. */
     129              : struct bt_aics;
     130              : 
     131              : /** @brief Structure for initializing a Audio Input Control Service instance. */
     132            1 : struct bt_aics_register_param {
     133              :         /** Initial audio input gain (-128 to 127) */
     134            1 :         int8_t gain;
     135              : 
     136              :         /** Initial audio input mute state */
     137            1 :         uint8_t mute;
     138              : 
     139              :         /** Initial audio input mode */
     140            1 :         uint8_t gain_mode;
     141              : 
     142              :         /** Initial audio input gain units (N * 0.1 dB) */
     143            1 :         uint8_t units;
     144              : 
     145              :         /** Initial audio input minimum gain */
     146            1 :         int8_t min_gain;
     147              : 
     148              :         /** Initial audio input maximum gain */
     149            1 :         int8_t max_gain;
     150              : 
     151              :         /** Initial audio input type */
     152            1 :         uint8_t type;
     153              : 
     154              :         /** Initial audio input status (active/inactive) */
     155            1 :         bool status;
     156              : 
     157              :         /** Boolean to set whether the description is writable by clients */
     158            1 :         bool desc_writable;
     159              : 
     160              :         /** Initial audio input description */
     161            1 :         char *description;
     162              : 
     163              :         /** Pointer to the callback structure. */
     164            1 :         struct bt_aics_cb *cb;
     165              : };
     166              : 
     167              : /** @brief Structure for discovering a Audio Input Control Service instance. */
     168            1 : struct bt_aics_discover_param {
     169              :         /**
     170              :          * @brief The start handle of the discovering.
     171              :          *
     172              :          * Typically the @p start_handle of a @ref bt_gatt_include.
     173              :          */
     174            1 :         uint16_t start_handle;
     175              :         /**
     176              :          * @brief The end handle of the discovering.
     177              :          *
     178              :          * Typically the @p end_handle of a @ref bt_gatt_include.
     179              :          */
     180            1 :         uint16_t end_handle;
     181              : };
     182              : 
     183              : /**
     184              :  * @brief Get a free instance of Audio Input Control Service from the pool.
     185              :  *
     186              :  * @return Audio Input Control Service instance in case of success or NULL in case of error.
     187              :  */
     188            1 : struct bt_aics *bt_aics_free_instance_get(void);
     189              : 
     190              : /**
     191              :  * @brief Get the service declaration attribute.
     192              :  *
     193              :  * The first service attribute returned can be included in any other GATT service.
     194              :  *
     195              :  * @param aics Audio Input Control Service instance.
     196              :  *
     197              :  * @return Pointer to the attributes of the service.
     198              :  */
     199            1 : void *bt_aics_svc_decl_get(struct bt_aics *aics);
     200              : 
     201              : /**
     202              :  * @brief Get the connection pointer of a client instance
     203              :  *
     204              :  * Get the Bluetooth connection pointer of a Audio Input Control Service
     205              :  * client instance.
     206              :  *
     207              :  * @param aics    Audio Input Control Service client instance pointer.
     208              :  * @param conn    Connection pointer.
     209              :  *
     210              :  * @return 0 if success, errno on failure.
     211              :  */
     212            1 : int bt_aics_client_conn_get(const struct bt_aics *aics, struct bt_conn **conn);
     213              : 
     214              : /**
     215              :  * @brief Initialize the Audio Input Control Service instance.
     216              :  *
     217              :  * @param aics      Audio Input Control Service instance.
     218              :  * @param param     Audio Input Control Service register parameters.
     219              :  *
     220              :  * @return 0 if success, errno on failure.
     221              :  */
     222            1 : int bt_aics_register(struct bt_aics *aics, struct bt_aics_register_param *param);
     223              : 
     224              : /**
     225              :  * @brief Callback function for writes.
     226              :  *
     227              :  * @param inst         The instance pointer.
     228              :  * @param err          Error value. 0 on success, GATT error on positive value
     229              :  *                     or errno on negative value.
     230              :  */
     231            1 : typedef void (*bt_aics_write_cb)(struct bt_aics *inst, int err);
     232              : 
     233              : /**
     234              :  * @brief Callback function for the input state.
     235              :  *
     236              :  * Called when the value is read,
     237              :  * or if the value is changed by either the server or client.
     238              :  *
     239              :  * @param inst         The instance pointer.
     240              :  * @param err          Error value. 0 on success, GATT error on positive value
     241              :  *                     or errno on negative value.
     242              :  *                     For notifications, this will always be 0.
     243              :  * @param gain         The gain setting value.
     244              :  * @param mute         The mute value.
     245              :  * @param mode         The mode value.
     246              :  */
     247            1 : typedef void (*bt_aics_state_cb)(struct bt_aics *inst, int err, int8_t gain,
     248              :                                  uint8_t mute, uint8_t mode);
     249              : 
     250              : /**
     251              :  * @brief Callback function for the gain settings.
     252              :  *
     253              :  * Called when the value is read,
     254              :  * or if the value is changed by either the server or client.
     255              :  *
     256              :  * @param inst         The instance pointer.
     257              :  * @param err          Error value. 0 on success, GATT error on positive value
     258              :  *                     or errno on negative value.
     259              :  *                     For notifications, this will always be 0.
     260              :  * @param units        The value that reflect the size of a single increment or decrement of the
     261              :  *                     Gain Setting value in 0.1 decibel units.
     262              :  * @param minimum      The minimum gain allowed for the gain setting.
     263              :  * @param maximum      The maximum gain allowed for the gain setting.
     264              :  */
     265            1 : typedef void (*bt_aics_gain_setting_cb)(struct bt_aics *inst, int err,
     266              :                                         uint8_t units, int8_t minimum,
     267              :                                         int8_t maximum);
     268              : 
     269              : /**
     270              :  * @brief Callback function for the input type.
     271              :  *
     272              :  * Called when the value is read, or if the value is changed by either the server or client.
     273              :  *
     274              :  * @param inst         The instance pointer.
     275              :  * @param err          Error value. 0 on success, GATT error on positive value
     276              :  *                     or errno on negative value.
     277              :  *                     For notifications, this will always be 0.
     278              :  * @param type   The input type.
     279              :  */
     280            1 : typedef void (*bt_aics_type_cb)(struct bt_aics *inst, int err, uint8_t type);
     281              : 
     282              : /**
     283              :  * @brief Callback function for the input status.
     284              :  *
     285              :  * Called when the value is read, or if the value is changed by either the server or client.
     286              :  *
     287              :  * @param inst         The instance pointer.
     288              :  * @param err          Error value. 0 on success, GATT error on positive value
     289              :  *                     or errno on negative value.
     290              :  *                     For notifications, this will always be 0.
     291              :  * @param active       Whether the instance is active or inactive.
     292              :  */
     293            1 : typedef void (*bt_aics_status_cb)(struct bt_aics *inst, int err, bool active);
     294              : 
     295              : /**
     296              :  * @brief Callback function for the description.
     297              :  *
     298              :  * Called when the value is read, or if the value is changed by either the server or client.
     299              :  *
     300              :  * @param inst         The instance pointer.
     301              :  * @param err          Error value. 0 on success, GATT error on positive value
     302              :  *                     or errno on negative value.
     303              :  *                     For notifications, this will always be 0.
     304              :  * @param description  The description as an UTF-8 encoded string (may have been clipped).
     305              :  */
     306            1 : typedef void (*bt_aics_description_cb)(struct bt_aics *inst, int err,
     307              :                                        char *description);
     308              : 
     309              : /**
     310              :  * @brief Callback function for bt_aics_discover.
     311              :  *
     312              :  * This callback will usually be overwritten by the primary service that
     313              :  * includes the Audio Input Control Service client.
     314              :  *
     315              :  * @param inst         The instance pointer.
     316              :  * @param err          Error value. 0 on success, GATT error on positive value
     317              :  *                     or errno on negative value.
     318              :  *                     For notifications, this will always be 0.
     319              :  */
     320            1 : typedef void (*bt_aics_discover_cb)(struct bt_aics *inst, int err);
     321              : 
     322              : /**
     323              :  * @brief Struct to hold callbacks for the Audio Input Control Service.
     324              :  *
     325              :  * Used by both clients and servers
     326              :  */
     327            1 : struct bt_aics_cb {
     328              :         /** The audio input state has changed */
     329            1 :         bt_aics_state_cb                 state;
     330              :         /** The gain setting has changed */
     331            1 :         bt_aics_gain_setting_cb          gain_setting;
     332              :         /** The audio input type has changed */
     333            1 :         bt_aics_type_cb                  type;
     334              :         /** The audio input status has changed */
     335            1 :         bt_aics_status_cb                status;
     336              :         /** The audio input decscription has changed */
     337            1 :         bt_aics_description_cb           description;
     338              : 
     339              : #if defined(CONFIG_BT_AICS_CLIENT) || defined(__DOXYGEN__)
     340              :         /** The discovery has completed */
     341            1 :         bt_aics_discover_cb              discover;
     342              :         /** The set gain operation has completed */
     343            1 :         bt_aics_write_cb                 set_gain;
     344              :         /** The unmute operation has completed */
     345            1 :         bt_aics_write_cb                 unmute;
     346              :         /** The mut operation has completed */
     347            1 :         bt_aics_write_cb                 mute;
     348              :         /** The set manual mode operation has completed */
     349            1 :         bt_aics_write_cb                 set_manual_mode;
     350              :         /** The set automatic mode has completed */
     351            1 :         bt_aics_write_cb                 set_auto_mode;
     352              : #endif /* CONFIG_BT_AICS_CLIENT */
     353              : };
     354              : 
     355              : 
     356              : /**
     357              :  * @brief Discover a Audio Input Control Service.
     358              :  *
     359              :  * Attempts to discover a Audio Input Control Service on a server given the
     360              :  * @p param.
     361              :  *
     362              :  * @param conn      Connection to the peer with the Audio Input Control Service.
     363              :  * @param inst      The instance pointer.
     364              :  * @param param     Pointer to the parameters.
     365              :  *
     366              :  * @return 0 on success, errno on fail.
     367              :  */
     368            1 : int bt_aics_discover(struct bt_conn *conn, struct bt_aics *inst,
     369              :                      const struct bt_aics_discover_param *param);
     370              : 
     371              : /**
     372              :  * @brief Deactivates a Audio Input Control Service instance.
     373              :  *
     374              :  * Audio Input Control Services are activated by default, but this will allow
     375              :  * the server to deactivate an Audio Input Control Service.
     376              :  *
     377              :  * @param inst         The instance pointer.
     378              :  *
     379              :  * @return 0 if success, errno on failure.
     380              :  */
     381            1 : int bt_aics_deactivate(struct bt_aics *inst);
     382              : 
     383              : /**
     384              :  * @brief Activates a Audio Input Control Service instance.
     385              :  *
     386              :  * Audio Input Control Services are activated by default, but this will allow
     387              :  * the server reactivate a Audio Input Control Service instance after it has
     388              :  * been deactivated with @ref bt_aics_deactivate.
     389              :  *
     390              :  * @param inst         The instance pointer.
     391              :  *
     392              :  * @return 0 if success, errno on failure.
     393              :  */
     394            1 : int bt_aics_activate(struct bt_aics *inst);
     395              : 
     396              : /**
     397              :  * @brief Read the Audio Input Control Service input state.
     398              :  *
     399              :  * @param inst          The instance pointer.
     400              :  *
     401              :  * @return 0 on success, GATT error value on fail.
     402              :  */
     403            1 : int bt_aics_state_get(struct bt_aics *inst);
     404              : 
     405              : /**
     406              :  * @brief Read the Audio Input Control Service gain settings.
     407              :  *
     408              :  * @param inst          The instance pointer.
     409              :  *
     410              :  * @return 0 on success, GATT error value on fail.
     411              :  */
     412            1 : int bt_aics_gain_setting_get(struct bt_aics *inst);
     413              : 
     414              : /**
     415              :  * @brief Read the Audio Input Control Service input type.
     416              :  *
     417              :  * @param inst          The instance pointer.
     418              :  *
     419              :  * @return 0 on success, GATT error value on fail.
     420              :  */
     421            1 : int bt_aics_type_get(struct bt_aics *inst);
     422              : 
     423              : /**
     424              :  * @brief Read the Audio Input Control Service input status.
     425              :  *
     426              :  * @param inst          The instance pointer.
     427              :  *
     428              :  * @return 0 on success, GATT error value on fail.
     429              :  */
     430            1 : int bt_aics_status_get(struct bt_aics *inst);
     431              : 
     432              : /**
     433              :  * @brief Disable mute in the Audio Input Control Service.
     434              :  *
     435              :  * Calling bt_aics_unmute() or bt_aics_mute() will enable
     436              :  * mute again and set the mute state to either unmuted or muted.
     437              :  *
     438              :  * @param inst          The instance pointer.
     439              :  *
     440              :  * @return 0 on success, errno value on fail.
     441              :  */
     442            1 : int bt_aics_disable_mute(struct bt_aics *inst);
     443              : 
     444              : /**
     445              :  * @brief Unmute the Audio Input Control Service input.
     446              :  *
     447              :  * @param inst          The instance pointer.
     448              :  *
     449              :  * @return 0 on success, GATT error value on fail.
     450              :  */
     451            1 : int bt_aics_unmute(struct bt_aics *inst);
     452              : 
     453              : /**
     454              :  * @brief Mute the Audio Input Control Service input.
     455              :  *
     456              :  * @param inst          The instance pointer.
     457              :  *
     458              :  * @return 0 on success, GATT error value on fail.
     459              :  */
     460            1 : int bt_aics_mute(struct bt_aics *inst);
     461              : 
     462              : /**
     463              :  * @brief Set manual only gain mode in Audio Input Control Service.
     464              :  *
     465              :  * @param inst          The instance pointer.
     466              :  *
     467              :  * @return 0 on success, errno value on fail.
     468              :  */
     469            1 : int bt_aics_gain_set_manual_only(struct bt_aics *inst);
     470              : 
     471              : /**
     472              :  * @brief Set automatic only gain mode in Audio Input Control Service.
     473              :  *
     474              :  * Using this function and enabling automatic only gain disables
     475              :  * setting the gain with bt_aics_gain_set
     476              :  *
     477              :  * @param inst          The instance pointer.
     478              :  *
     479              :  * @return 0 on success, errno value on fail.
     480              :  */
     481            1 : int bt_aics_gain_set_auto_only(struct bt_aics *inst);
     482              : 
     483              : /**
     484              :  * @brief Set input gain to manual.
     485              :  *
     486              :  * @param inst          The instance pointer.
     487              :  *
     488              :  * @return 0 on success, GATT error value on fail.
     489              :  */
     490            1 : int bt_aics_manual_gain_set(struct bt_aics *inst);
     491              : 
     492              : /**
     493              :  * @brief Set the input gain to automatic.
     494              :  *
     495              :  * @param inst          The instance pointer.
     496              :  *
     497              :  * @return 0 on success, GATT error value on fail.
     498              :  */
     499            1 : int bt_aics_automatic_gain_set(struct bt_aics *inst);
     500              : 
     501              : /**
     502              :  * @brief Set the input gain.
     503              :  *
     504              :  * @param inst          The instance pointer.
     505              :  * @param gain          The gain to set (-128 to 127) in gain setting units
     506              :  *                      (see @ref bt_aics_gain_setting_cb).
     507              :  *
     508              :  * @return 0 on success, GATT error value on fail.
     509              :  */
     510            1 : int bt_aics_gain_set(struct bt_aics *inst, int8_t gain);
     511              : 
     512              : /**
     513              :  * @brief Read the Audio Input Control Service description.
     514              :  *
     515              :  * @param inst          The instance pointer.
     516              :  *
     517              :  * @return 0 on success, GATT error value on fail.
     518              :  */
     519            1 : int bt_aics_description_get(struct bt_aics *inst);
     520              : 
     521              : /**
     522              :  * @brief Set the Audio Input Control Service description.
     523              :  *
     524              :  * @param inst          The instance pointer.
     525              :  * @param description   The description as an UTF-8 encoded string.
     526              :  *
     527              :  * @return 0 on success, GATT error value on fail.
     528              :  */
     529            1 : int bt_aics_description_set(struct bt_aics *inst, const char *description);
     530              : 
     531              : /**
     532              :  * @brief Get a new Audio Input Control Service client instance.
     533              :  *
     534              :  * @return Pointer to the instance, or NULL if no free instances are left.
     535              :  */
     536            1 : struct bt_aics *bt_aics_client_free_instance_get(void);
     537              : 
     538              : /**
     539              :  * @brief Registers the callbacks for the Audio Input Control Service client.
     540              :  *
     541              :  * @param inst      The instance pointer.
     542              :  * @param cb        Pointer to the callback structure.
     543              :  */
     544            1 : void bt_aics_client_cb_register(struct bt_aics *inst, struct bt_aics_cb *cb);
     545              : 
     546              : #ifdef __cplusplus
     547              : }
     548              : #endif
     549              : 
     550              : /**
     551              :  * @}
     552              :  */
     553              : 
     554              : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_SERVICES_AICS_H_ */
        

Generated by: LCOV version 2.0-1