/* @file
 * @brief Internal APIs for Audio Stream handling

 * Copyright (c) 2020 Intel Corporation
 * Copyright (c) 2021-2022 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/** Life-span states of ASE. Used only by internal APIs
 *  dealing with setting ASE to proper state depending on operational
 *  context.
 *
 * The values are defined by the ASCS spec and shall not be changed.
 */
enum bt_audio_state {
	/** Audio Stream Endpoint Idle state */
	BT_AUDIO_EP_STATE_IDLE =             0x00,
	/** Audio Stream Endpoint Codec Configured state */
	BT_AUDIO_EP_STATE_CODEC_CONFIGURED = 0x01,
	/** Audio Stream Endpoint QoS Configured state */
	BT_AUDIO_EP_STATE_QOS_CONFIGURED =   0x02,
	/** Audio Stream Endpoint Enabling state */
	BT_AUDIO_EP_STATE_ENABLING =         0x03,
	/** Audio Stream Endpoint Streaming state */
	BT_AUDIO_EP_STATE_STREAMING =        0x04,
	/** Audio Stream Endpoint Disabling state */
	BT_AUDIO_EP_STATE_DISABLING =        0x05,
	/** Audio Stream Endpoint Streaming state */
	BT_AUDIO_EP_STATE_RELEASING =        0x06,
};

/* Connect ISO channel */
int bt_audio_stream_connect(struct bt_audio_stream *stream);

/* Disconnect ISO channel */
int bt_audio_stream_disconnect(struct bt_audio_stream *stream);

void bt_audio_stream_reset(struct bt_audio_stream *stream);

void bt_audio_stream_attach(struct bt_conn *conn, struct bt_audio_stream *stream,
			    struct bt_audio_ep *ep,
			    struct bt_codec *codec);

void bt_audio_codec_qos_to_iso_qos(struct bt_iso_chan_io_qos *io,
				   const struct bt_codec_qos *codec);

void bt_audio_stream_detach(struct bt_audio_stream *stream);

bool bt_audio_valid_qos(const struct bt_codec_qos *qos);

bool bt_audio_valid_stream_qos(const struct bt_audio_stream *stream,
			     const struct bt_codec_qos *qos);

int bt_audio_stream_iso_listen(struct bt_audio_stream *stream);
