blob: d211a3ea8c1b57283442c722ebf0f89d2496307d [file] [log] [blame]
/** @file
* @brief Internal APIs for Bluetooth MCP.
*/
/*
* Copyright (c) 2019 - 2021 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCP_INTERNAL_
#define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCP_INTERNAL_
#include <stdbool.h>
#include <stdint.h>
#include <zephyr/autoconf.h>
#include <zephyr/bluetooth/audio/mcs.h>
#include <zephyr/bluetooth/conn.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/services/ots.h>
#include <zephyr/sys/atomic.h>
#include <zephyr/types.h>
struct mcs_instance_t *lookup_inst_by_conn(struct bt_conn *conn);
enum mcc_flag {
MCC_FLAG_BUSY,
MCC_FLAG_NUM_FLAGS, /* keep as last */
};
struct mcs_instance_t {
struct bt_conn *conn;
uint16_t start_handle;
uint16_t end_handle;
uint16_t player_name_handle;
#ifdef CONFIG_BT_MCC_OTS
uint16_t icon_obj_id_handle;
#endif /* CONFIG_BT_MCC_OTS */
#if defined(CONFIG_BT_MCC_READ_MEDIA_PLAYER_ICON_URL)
uint16_t icon_url_handle;
#endif /* defined(CONFIG_BT_MCC_READ_MEDIA_PLAYER_ICON_URL) */
uint16_t track_changed_handle;
#if defined(CONFIG_BT_MCC_READ_TRACK_TITLE)
uint16_t track_title_handle;
#endif /* defined(CONFIG_BT_MCC_READ_TRACK_TITLE) */
#if defined(CONFIG_BT_MCC_READ_TRACK_DURATION)
uint16_t track_duration_handle;
#endif /* defined(CONFIG_BT_MCC_READ_TRACK_DURATION) */
#if defined(CONFIG_BT_MCC_READ_TRACK_POSITION) || defined(CONFIG_BT_MCC_SET_TRACK_POSITION)
uint16_t track_position_handle;
#endif /* defined(CONFIG_BT_MCC_READ_TRACK_POSITION) || defined(CONFIG_BT_MCC_SET_TRACK_POSITION) */
#if defined(CONFIG_BT_MCC_READ_PLAYBACK_SPEED) || defined(CONFIG_BT_MCC_SET_PLAYBACK_SPEED)
uint16_t playback_speed_handle;
#endif /* defined (CONFIG_BT_MCC_READ_PLAYBACK_SPEED) || */
/* defined (CONFIG_BT_MCC_SET_PLAYBACK_SPEED) */
#if defined(CONFIG_BT_MCC_READ_SEEKING_SPEED)
uint16_t seeking_speed_handle;
#endif /* defined (CONFIG_BT_MCC_READ_SEEKING_SPEED) */
#ifdef CONFIG_BT_MCC_OTS
uint16_t segments_obj_id_handle;
uint16_t current_track_obj_id_handle;
uint16_t next_track_obj_id_handle;
uint16_t current_group_obj_id_handle;
uint16_t parent_group_obj_id_handle;
#endif /* CONFIG_BT_MCC_OTS */
#if defined(CONFIG_BT_MCC_READ_PLAYING_ORDER) || defined(CONFIG_BT_MCC_SET_PLAYING_ORDER)
uint16_t playing_order_handle;
#endif /* defined(CONFIG_BT_MCC_READ_PLAYING_ORDER) || defined(CONFIG_BT_MCC_SET_PLAYING_ORDER) */
#if defined(CONFIG_BT_MCC_READ_PLAYING_ORDER_SUPPORTED)
uint16_t playing_orders_supported_handle;
#endif /* defined(CONFIG_BT_MCC_READ_PLAYING_ORDER_SUPPORTED) */
#if defined(CONFIG_BT_MCC_READ_MEDIA_STATE)
uint16_t media_state_handle;
#endif /* defined(CONFIG_BT_MCC_READ_MEDIA_STATE) */
uint16_t cp_handle;
#if defined(CONFIG_BT_MCC_READ_MEDIA_CONTROL_POINT_OPCODES_SUPPORTED)
uint16_t opcodes_supported_handle;
#endif /* defined(CONFIG_BT_MCC_READ_MEDIA_CONTROL_POINT_OPCODES_SUPPORTED) */
#ifdef CONFIG_BT_MCC_OTS
uint16_t scp_handle;
uint16_t search_results_obj_id_handle;
#endif /* CONFIG_BT_MCC_OTS */
#if defined(CONFIG_BT_MCC_READ_CONTENT_CONTROL_ID)
uint16_t content_control_id_handle;
#endif /* defined(CONFIG_BT_MCC_READ_CONTENT_CONTROL_ID) */
/* The write buffer is used for
* - track position (4 octets)
* - playback speed (1 octet)
* - playing order (1 octet)
* - the control point (5 octets)
* (1 octet opcode + optionally 4 octet param)
* (mpl_cmd.opcode + mpl_cmd.param)
* If the object transfer client is included, it is also used for
* - object IDs (6 octets - BT_OTS_OBJ_ID_SIZE) and
* - the search control point (64 octets - SEARCH_LEN_MAX)
*
* If there is no OTC, the largest is control point
* If OTC is included, the largest is the search control point
*/
#ifdef CONFIG_BT_MCC_OTS
char write_buf[SEARCH_LEN_MAX];
#else
/* Trick to be able to use sizeof on members of a struct type */
/* TODO: Rewrite the mpl_cmd to have the "use_param" parameter */
/* separately, and the opcode and param alone as a struct */
char write_buf[sizeof(((struct mpl_cmd *)0)->opcode) +
sizeof(((struct mpl_cmd *)0)->param)];
#endif /* CONFIG_BT_MCC_OTS */
struct bt_gatt_discover_params discover_params;
struct bt_gatt_read_params read_params;
struct bt_gatt_write_params write_params;
/** Any fields below here cannot be memset as part of a reset */
struct bt_gatt_subscribe_params player_name_sub_params;
struct bt_gatt_subscribe_params track_changed_sub_params;
#if defined(CONFIG_BT_MCC_READ_TRACK_TITLE_ENABLE_SUBSCRIPTION)
struct bt_gatt_subscribe_params track_title_sub_params;
#endif /* defined(CONFIG_BT_MCC_READ_TRACK_TITLE_ENABLE_SUBSCRIPTION) */
#if defined(CONFIG_BT_MCC_READ_TRACK_DURATION)
struct bt_gatt_subscribe_params track_duration_sub_params;
#endif /* defined(CONFIG_BT_MCC_READ_TRACK_DURATION) */
#if defined(CONFIG_BT_MCC_READ_TRACK_POSITION)
struct bt_gatt_subscribe_params track_position_sub_params;
#endif /* defined(CONFIG_BT_MCC_READ_TRACK_POSITION)*/
#if defined(CONFIG_BT_MCC_READ_PLAYBACK_SPEED)
struct bt_gatt_subscribe_params playback_speed_sub_params;
#endif /* defined (CONFIG_BT_MCC_READ_PLAYBACK_SPEED) */
#if defined(CONFIG_BT_MCC_READ_SEEKING_SPEED)
struct bt_gatt_subscribe_params seeking_speed_sub_params;
#endif /* defined (CONFIG_BT_MCC_READ_SEEKING_SPEED) */
#ifdef CONFIG_BT_MCC_OTS
struct bt_gatt_subscribe_params current_track_obj_sub_params;
struct bt_gatt_subscribe_params next_track_obj_sub_params;
struct bt_gatt_subscribe_params parent_group_obj_sub_params;
struct bt_gatt_subscribe_params current_group_obj_sub_params;
#endif /* CONFIG_BT_MCC_OTS */
#if defined(CONFIG_BT_MCC_READ_PLAYING_ORDER)
struct bt_gatt_subscribe_params playing_order_sub_params;
#endif /* defined(CONFIG_BT_MCC_READ_PLAYING_ORDER) */
#if defined(CONFIG_BT_MCC_READ_MEDIA_STATE)
struct bt_gatt_subscribe_params media_state_sub_params;
#endif /* defined(CONFIG_BT_MCC_READ_MEDIA_STATE) */
struct bt_gatt_subscribe_params cp_sub_params;
#if defined(CONFIG_BT_MCC_READ_MEDIA_CONTROL_POINT_OPCODES_SUPPORTED)
struct bt_gatt_subscribe_params opcodes_supported_sub_params;
#endif /* defined(CONFIG_BT_MCC_READ_MEDIA_CONTROL_POINT_OPCODES_SUPPORTED) */
#ifdef CONFIG_BT_MCC_OTS
struct bt_gatt_subscribe_params scp_sub_params;
struct bt_gatt_subscribe_params search_results_obj_sub_params;
#endif /* CONFIG_BT_MCC_OTS */
#ifdef CONFIG_BT_MCC_OTS
struct bt_ots_client otc;
#endif /* CONFIG_BT_MCC_OTS */
ATOMIC_DEFINE(flags, MCC_FLAG_NUM_FLAGS);
};
#endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_MCP_INTERNAL_ */