blob: dcb1df9d3408c2e2b1aa2b9e5260456f29e6206d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#ifndef H_BLE_AUDIO_CODEC_
#define H_BLE_AUDIO_CODEC_
/**
* @file ble_audio_codec.h
*
* @brief Bluetooth LE Audio Codec
*
* This header file provides the public API for managing LE Audio Codecs
*
* @defgroup ble_audio_codec Bluetooth LE Audio Codec
* @ingroup bt_host
* @{
*
* This API allows to create and manage list of LE Audio codecs with their capabilities and
* metadata. This list can be used by higher level services, like PACS. Memory management of
* codec entries is left to application and neither static nor dynamic allocation is enforced.
*
*/
#include "stdint.h"
#include "ble_audio.h"
/** Bit describing direction of codec configuration - source */
#define BLE_AUDIO_CODEC_DIR_SOURCE_BIT (1 << 0)
/** Bit describing direction of codec configuration - sink */
#define BLE_AUDIO_CODEC_DIR_SINK_BIT (1 << 1)
/** Codec list entry */
struct ble_audio_codec_record {
/* Pointer to next codec list entry */
STAILQ_ENTRY(ble_audio_codec_record) next;
/* Codec ID */
struct ble_audio_codec_id codec_id;
/* Length of Codec Specific Capabilities */
uint8_t codec_spec_caps_len;
/* Codec Specific Capabilities data */
const uint8_t *codec_spec_caps;
/* Metadata length */
uint8_t metadata_len;
/* Metadata */
const uint8_t *metadata;
/* Bitfield describing direction that codec is acting on. It is a logical OR of:
* - BLE_AUDIO_CODEC_DIR_SOURCE_BIT
* - BLE_AUDIO_CODEC_DIR_SINK_BIT
*/
uint8_t direction;
};
/** Type definition codec iteration callback function. */
typedef int ble_audio_codec_foreach_fn(const struct ble_audio_codec_record *record, void *arg);
struct ble_audio_codec_register_params {
/* Codec ID structure */
struct ble_audio_codec_id codec_id;
/* Codec Specific Capabilities length */
uint8_t codec_spec_caps_len;
/* Codec Specific Capabilities data */
uint8_t *codec_spec_caps;
/* Metadata length */
uint8_t metadata_len;
/* Metadata */
uint8_t *metadata;
/* Bitfield describing direction that codec is acting on. It is a logical OR of:
* - BLE_AUDIO_CODEC_DIR_SOURCE_BIT
* - BLE_AUDIO_CODEC_DIR_SINK_BIT
*/
uint8_t direction;
};
/**
* @brief Register codec entry
*
* @param[in] params Pointer to a `ble_audio_codec_register_params`
* structure that defines Codec Specific Capabilities
* @param[out] out_record Pointer to registered codec entry.
*
* @return 0 on success;
* A non-zero value on failure.
*/
int ble_audio_codec_register(const struct ble_audio_codec_register_params
*params,
struct ble_audio_codec_record *out_record);
/**
* @brief Remove codec entry from register
*
* @param[in] codec_record Pointer to registered codec entry.
*
* @return 0 on success;
* A non-zero value on failure.
*/
int ble_audio_codec_unregister(struct ble_audio_codec_record *codec_record);
/**
* @brief Iterate through all registered codecs and call function on every
* one of them.
*
* @param[in] direction Codec entry direction. It is any
* combination of following bits:
* - BLE_AUDIO_CODEC_DIR_SOURCE_BIT
* - BLE_AUDIO_CODEC_DIR_SINK_BIT
* This filters entries so the callback is called
* only on these have matching direction bit set.
* @param[in] cb Callback to be called on codec entries.
* @param[in] arg Optional callback argument.
*
* @return 0 on success;
* A non-zero value on failure.
*/
int ble_audio_codec_foreach(uint8_t direction, ble_audio_codec_foreach_fn *cb, void *arg);
/**
* @}
*/
#endif /* H_BLE_AUDIO_CODEC_ */