# Bluetooth Audio - Basic Audio Profile configuration options
#
# Copyright (c) 2020 Intel Corporation
# Copyright (c) 2022-2023 Nordic Semiconductor ASA

# SPDX-License-Identifier: Apache-2.0
#

config BT_BAP_UNICAST
	def_bool BT_BAP_UNICAST_SERVER || BT_BAP_UNICAST_CLIENT

config BT_BAP_UNICAST_SERVER
	bool "Bluetooth Unicast Audio Server Support"
	depends on BT_GATT_DYNAMIC_DB
	depends on BT_GATT_CACHING
	depends on BT_PERIPHERAL
	depends on BT_ISO_PERIPHERAL
	depends on BT_ASCS
	depends on BT_BONDABLE
	select BT_PAC_SRC if BT_ASCS_ASE_SNK
	select BT_PAC_SNK if BT_ASCS_ASE_SRC
	help
	  This option enables support for Bluetooth Unicast Audio Server
	  using Isochronous channels.

config BT_BAP_UNICAST_CLIENT
	bool "Bluetooth Unicast Audio Client Support"
	depends on BT_GATT_CLIENT
	depends on BT_GATT_AUTO_DISCOVER_CCC
	depends on BT_GATT_AUTO_UPDATE_MTU
	depends on BT_CENTRAL
	depends on BT_ISO_CENTRAL
	depends on BT_BONDABLE
	help
	  This option enables support for Bluetooth Unicast Audio Client
	  using Isochronous channels.

config BT_AUDIO_CODEC_CFG_MAX_DATA_SIZE
	int "Codec Specific Configuration Data Size"
	default 19
	range 0 $(UINT8_MAX)
	help
	  Number of octets to support for Codec Specific Configuration data.
	  The default value 19 matches the required fields for the LC3 codec.

config BT_AUDIO_CODEC_CFG_MAX_METADATA_SIZE
	int "Codec Specific Configuration Metadata Size"
	default 4
	range 0 $(UINT8_MAX)
	help
	  Number of octets to support for Codec Specific Configuration metadata.

config BT_BAP_BASS_MAX_SUBGROUPS
	int "Maximum number of subgroups supported for the BASS receive states"
	default 1
	range 1 24
	help
	  This option sets the maximum number of subgroups supported.
	  Due to limitations in advertising data, the maximum size of all subgroups are 249.
	  The minimum size of a subgroup is 10 octets.
	  So effectively there can be a maximum of 24 subgroups in a BASE.

config BT_AUDIO_CODEC_CAP_MAX_DATA_SIZE
	int "Codec Capabilities Data Size"
	default 19
	range 0 $(UINT8_MAX)
	help
	  Number of octets to support for Codec Specific Capabilities data.
	  The default value 19 matches the required fields for the LC3 codec.

config BT_AUDIO_CODEC_CAP_MAX_METADATA_SIZE
	int "Codec Capabilities Metadata Size"
	default 4
	range 0 $(UINT8_MAX)
	help
	  Number of octets to support for Codec Specific Capabilities metadata.

if BT_BAP_UNICAST_CLIENT
config BT_BAP_UNICAST_CLIENT_GROUP_COUNT
	int "Basic Audio Unicast Group count"
	default BT_ISO_MAX_CIG
	range 1 BT_ISO_MAX_CIG
	help
	  This option sets the number of connected audio groups to support as
	  the unicast client.

config BT_BAP_UNICAST_CLIENT_GROUP_STREAM_COUNT
	int "Basic Audio Profile Unicast Group Connected Isochronous Stream (CIS) count"
	depends on BT_BAP_UNICAST_CLIENT_GROUP_COUNT > 0
	default 1
	range 1 BT_ISO_MAX_CHAN if BT_ISO_MAX_CHAN < 31
	range 1 31
	help
	  This option sets the maximum number of CIS per unicast group to support.
	  Since BAP streams are unidirectional, two BAP streams may use a single CIS, the number of
	  BAP audio streams per group may be up to twice of this value.

config BT_BAP_UNICAST_CLIENT_ASE_SNK_COUNT
	int "Basic Audio Profile ASE Sink count"
	default 2
	range 0 $(UINT8_MAX)
	help
	  This option enables caching a number of Audio Stream Endpoint Sink
	  instances for Basic Audio Profile on a per connection basis.

config BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT
	int "Basic Audio Profile ASE Source count"
	default 2
	range 0 $(UINT8_MAX)
	help
	  This option enables caching a number of Audio Stream Endpoint Source
	  instances for Basic Audio Profile on a per connection basis.

config BT_BAP_UNICAST_CLIENT_ASE_SNK
	def_bool BT_BAP_UNICAST_CLIENT_ASE_SNK_COUNT > 0

config BT_BAP_UNICAST_CLIENT_ASE_SRC
	def_bool BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT > 0

endif # BT_BAP_UNICAST_CLIENT

config BT_BAP_BROADCAST_SOURCE
	bool "Bluetooth Broadcast Source Audio Support"
	depends on BT_ISO_BROADCASTER
	help
	  This option enables support for Bluetooth Broadcast Source Audio using
	  Isochronous channels.
if BT_BAP_BROADCAST_SOURCE

config BT_BAP_BROADCAST_SRC_SUBGROUP_COUNT
	int "Basic Audio Broadcast Source subgroup count"
	default 1
	range 1 BT_ISO_MAX_CHAN if BT_ISO_MAX_CHAN < 31
	range 1 31
	help
	  This option sets the maximum number of subgroups per broadcast source
	  to support.

config BT_BAP_BROADCAST_SRC_COUNT
	int "Basic Audio Broadcaster source count"
	default 1
	range 1 BT_ISO_MAX_BIG
	help
	  This option sets the number of broadcast sources to support.
	  One broadcast source can send multiple streams
	  (up to BT_BAP_BROADCAST_SRC_STREAM_COUNT per broadcast source).


config BT_BAP_BROADCAST_SRC_STREAM_COUNT
	int "Basic Audio Broadcast Source Stream count"
	default 1
	range 1 BT_ISO_MAX_CHAN if BT_ISO_MAX_CHAN < 31
	range 1 31
	help
	  This option sets the maximum number of streams per broadcast source
	  to support.

endif # BT_BAP_BROADCAST_SOURCE

config BT_BAP_BROADCAST_SINK
	bool "Bluetooth Broadcast Sink Audio Support"
	depends on BT_ISO_SYNC_RECEIVER
	depends on BT_PAC_SNK
	depends on BT_PERIPHERAL
	depends on BT_BAP_SCAN_DELEGATOR
	help
	  This option enables support for Bluetooth Broadcast Sink Audio using
	  Isochronous channels.

if BT_BAP_BROADCAST_SINK

config BT_BAP_BROADCAST_SNK_SUBGROUP_COUNT
	int "Basic Audio Profile Broadcast Sink subgroup count"
	default 1
	range 1 BT_ISO_MAX_CHAN if BT_ISO_MAX_CHAN < 31
	range 1 31
	help
	  This option sets the maximum number of subgroups per broadcast sink
	  to support.

config BT_BAP_BROADCAST_SNK_COUNT
	int "Basic Audio Broadcaster Sink count"
	default 1
	range 0 BT_ISO_MAX_BIG
	help
	  This option sets the number of broadcast sinks to support.
	  One broadcast sink can receive multiple streams
	  (up to BT_BAP_BROADCAST_SNK_STREAM_COUNT per broadcast sink).

config BT_BAP_BROADCAST_SNK_STREAM_COUNT
	int "Basic Audio Broadcast Sink Stream count"
	depends on BT_BAP_BROADCAST_SNK_COUNT > 0
	default 1
	range 1 BT_ISO_MAX_CHAN if BT_ISO_MAX_CHAN < 31
	range 1 31
	help
	  This option sets the maximum number of streams per broadcast sink
	  to support.

endif # BT_BAP_BROADCAST_SINK

config BT_BAP_SCAN_DELEGATOR
	bool "Basic Audio Profile Scan Delegator role support"
	depends on BT_EXT_ADV
	depends on BT_PER_ADV_SYNC
	depends on BT_ISO_SYNC_RECEIVER
	depends on BT_OBSERVER
	depends on BT_GATT_DYNAMIC_DB
	depends on BT_BONDABLE
	help
	  This option enables support for the Scan Delegator role and the
	  Broadcast Audio Scan Service (BASS).

if BT_BAP_SCAN_DELEGATOR

config BT_BAP_SCAN_DELEGATOR_RECV_STATE_COUNT
	int "Scan Delegator Receive State Count"
	default 1
	range 1 3
	help
	  Sets the number of receive state characteristics present on the
	  server. Each characteristic may hold information to sync to a
	  periodic advertise or a broadcast isochronous stream.

config BT_BAP_SCAN_DELEGATOR_BUF_TIMEOUT
	int "Milliseconds of timeout when handle concurrent access to the long read ASE buffer"
	range 0 1000
	default 50
	help
	  The maximum number of milliseconds that the scan delegator implementation will wait
	  before rejecting a read or dropping a notification if the scan delegator state is
	  being accessed by another thread.

endif # BT_BAP_SCAN_DELEGATOR

config BT_BAP_BROADCAST_ASSISTANT
	bool "Basic Audio Profile Broadcast Assistant role support"
	depends on BT_EXT_ADV
	depends on BT_PER_ADV_SYNC
	depends on BT_ISO_SYNC_RECEIVER
	depends on BT_GATT_CLIENT
	depends on BT_GATT_AUTO_DISCOVER_CCC
	depends on BT_GATT_AUTO_UPDATE_MTU
	depends on BT_OBSERVER
	depends on BT_BONDABLE
	help
	  This option enables support for the Broadcast Assistant role.

if BT_BAP_BROADCAST_ASSISTANT

config BT_BAP_BROADCAST_ASSISTANT_RECV_STATE_COUNT
	int "Broadcast Assistant Max Receive State Count"
	default 1
	range 1 $(UINT8_MAX)
	help
	  Sets the number of maximum receive stat characteristics that will be
	  discovered and ready to use. Each characteristic may hold information
	  to sync to a periodic advertise or a broadcast isochronous stream.

endif # BT_BAP_BROADCAST_ASSISTANT

config BT_BAP_DEBUG_STREAM_DATA
	bool "Bluetooth Audio Stream data debug"
	depends on BT_BAP_STREAM_LOG_LEVEL_DBG
	help
	  Use this option to enable Bluetooth Audio Stream data debug logs for
	  the Bluetooth Audio functionality. This will enable debug logs for all
	  audio data received and sent.

config BT_BAP_STREAM
	# Virtual/hidden option
	bool
	default y if BT_ASCS || BT_BAP_UNICAST_CLIENT || \
			BT_BAP_BROADCAST_SOURCE || BT_BAP_BROADCAST_SINK

config BT_BAP_DEBUG_STREAM_SEQ_NUM
	bool "Bluetooth Audio Stream sequence number debug"
	depends on BT_BAP_STREAM_LOG_LEVEL >= BT_BAP_STREAM_LOG_LEVEL_WRN
	default y
	help
	  Use this option to enable Bluetooth Audio Stream sequence number debugging logs for
	  the Bluetooth Audio functionality. This will provide a warning if the application
	  provides unexpected sequence numbers.

config BT_BAP_BASE
	def_bool BT_BAP_BROADCAST_SINK || BT_BAP_BROADCAST_ASSISTANT || BT_BAP_SCAN_DELEGATOR

rsource "Kconfig.pacs"
rsource "Kconfig.ascs"
