# Bluetooth Audio configuration options

#
# Copyright (c) 2020 Intel Corporation
#
# SPDX-License-Identifier: Apache-2.0
#

menuconfig BT_AUDIO
	bool "Bluetooth Audio support [Experimental]"
	help
	  This option enables Bluetooth Audio support. The specific
	  features that are available may depend on other features
	  that have been enabled in the stack, such as Periodic
	  Advertisement for Broadcast and L2CAP Dynamic Channel
	  for Unicast.

if BT_AUDIO

config BT_ISO
	bool

if BT_CONN

config BT_AUDIO_UNICAST
	bool "Bluetooth Unicast Audio Support"
	select BT_SMP
	select BT_L2CAP_DYNAMIC_CHANNEL
	select BT_ISO
	select BT_GATT_DYNAMIC_DB
	select BT_GATT_CACHING
	select BT_L2CAP_ECRED
	select BT_EATT
	help
	  This option enables support for Bluetooth Unicast Audio using
	  Isochronous channels.

if BT_AUDIO_UNICAST

config BT_MAX_ISO_CONN
	int "Maximum number of simultaneous ISO connections"
	depends on BT_ISO
	default BT_MAX_CONN
	range 1 64
	help
	  Maximum number of simultaneous Bluetooth isochronous connections
	  supported.

config BT_ISO_TX_BUF_COUNT
	int "Numer of Isochronous TX buffers"
	default 1
	range 1 255
	help
	  Number of buffers available for outgoing Isochronous channel packets.

config BT_ISO_TX_FRAG_COUNT
	int "Number of ISO TX fragment buffers"
	default 2
	range 0 255
	help
	  Number of buffers available for fragments of TX buffers. Warning:
	  setting this to 0 means that the application must ensure that
	  queued TX buffers never need to be fragmented, i.e. that the
	  controller's buffer size is large enough. If this is not ensured,
	  and there are no dedicated fragment buffers, a deadlock may occur.
	  In most cases the default value of 2 is a safe bet.

config BT_ISO_TX_MTU
	int "Maximum supported MTU for Isochronous TX buffers"
	default 251
	range 23 2000
	help
	  Maximum MTU for Isochronous channels TX buffers.

config BT_ISO_RX_BUF_COUNT
	int "Numer of Isochronous RX buffers"
	default 1
	range 1 255
	help
	  Number of buffers available for incoming Isochronous channel packets.

config BT_ISO_RX_MTU
	int "Maximum supported MTU for Isochronous RX buffers"
	default 251
	range 23 2000
	help
	  Maximum MTU for Isochronous channels RX buffers.

endif # BT_AUDIO_UNICAST
endif # BT_CONN

config BT_AUDIO_DEBUG
	bool "Enable debug logs"
	depends on BT_DEBUG
	help
	  Use this option to enable debug logs for the Bluetooth
	  Audio functionality.

if BT_AUDIO_DEBUG

config BT_AUDIO_DEBUG_ISO
	bool "ISO channel debug"
	help
	  Use this option to enable ISO channels debug logs for the
	  Bluetooth Audio functionality.

endif # BT_AUDIO_DEBUG
endif # BT_AUDIO
