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

# SPDX-License-Identifier: Apache-2.0
#

config BT_AUDIO_UNICAST
	bool
	depends on BT_CONN
	select BT_SMP
	select BT_L2CAP_DYNAMIC_CHANNEL
	select BT_ISO_UNICAST
	select BT_L2CAP_ECRED
	select BT_EATT

config BT_AUDIO_UNICAST_SERVER
	bool "Bluetooth Unicast Audio Server Support [EXPERIMENTAL]"
	select EXPERIMENTAL
	select BT_PERIPHERAL
	select BT_AUDIO_UNICAST
	select BT_GATT_DYNAMIC_DB
	select BT_GATT_CACHING
	select BT_PACS
	select BT_ASCS
	help
	  This option enables support for Bluetooth Unicast Audio Server
	  using Isochronous channels.

config BT_AUDIO_UNICAST_CLIENT
	bool "Bluetooth Unicast Audio Client Support [EXPERIMENTAL]"
	select EXPERIMENTAL
	select BT_AUDIO_UNICAST
	select BT_CENTRAL
	select BT_GATT_CLIENT
	select BT_GATT_AUTO_DISCOVER_CCC
	help
	  This option enables support for Bluetooth Unicast Audio Client
	  using Isochronous channels.

if BT_AUDIO_UNICAST

config BT_CODEC_MAX_DATA_COUNT
	int "Codec Capabilities Data Count"
	default 5
	range 1 128
	help
	  This option defines the maximum number of LTV entries a codec can
	  store.

config BT_CODEC_MAX_DATA_LEN
	int "Codec Capabilities Data Length"
	default 4
	range 1 128
	help
	  This option defines the maximum value length of an LTV entry a codec
	  can store.

config BT_CODEC_MAX_METADATA_COUNT
	int "Codec Metadata Count"
	default 2
	range 1 128
	help
	  This option defines the maximum number of LTV entries a metadata can
	  store.

config BT_CODEC_MAX_METADATA_LEN
	int "Codec Metadata Length"
	default 4
	range 1 128
	help
	  This option defines the maximum value length of an LTV entry a
	  metadata can store.

if BT_AUDIO_UNICAST_CLIENT
config BT_AUDIO_UNICAST_CLIENT_GROUP_COUNT
	int "Basic Audio Unicast Group count"
	depends on BT_AUDIO_UNICAST
	default BT_ISO_MAX_CIG
	range 0 BT_ISO_MAX_CIG
	help
	  This option sets the number of connected audio groups to support as
	  the unicast client.

config BT_AUDIO_UNICAST_CLIENT_GROUP_STREAM_COUNT
	int "Basic Audio Unicast Group Stream count"
	depends on BT_AUDIO_UNICAST_CLIENT_GROUP_COUNT > 0
	default 1
	range 0 BT_ISO_MAX_CHAN if BT_ISO_MAX_CHAN < 31
	range 0 31
	help
	  This option sets the maximum number of streams per unicast group
	  to support.

config BT_AUDIO_UNICAST_CLIENT_PAC_COUNT
	int "Basic Audio Profile PAC count"
	default 2
	range 0 4
	help
	  This option enables caching a number of Published Audio Capabilities
	  (PAC) for Basic Audio Profile on a per connection basis.

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

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

endif # BT_AUDIO_UNICAST_CLIENT
endif # BT_AUDIO_UNICAST

config BT_AUDIO_BROADCAST_SOURCE
	bool "Bluetooth Broadcast Source Audio Support [EXPERIMENTAL]"
	select EXPERIMENTAL
	select BT_ISO_BROADCASTER
	help
	  This option enables support for Bluetooth Broadcast Source Audio using
	  Isochronous channels.
if BT_AUDIO_BROADCAST_SOURCE

config BT_AUDIO_BROADCAST_SRC_COUNT
	int "Basic Audio Broadcaster source count"
	default 1
	range 0 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_AUDIO_BROADCAST_SRC_STREAM_COUNT per broadcast source).


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

endif # BT_AUDIO_BROADCAST_SOURCE

config BT_AUDIO_BROADCAST_SINK
	bool "Bluetooth Broadcast Sink Audio Support [EXPERIMENTAL]"
	select EXPERIMENTAL
	select BT_ISO_SYNC_RECEIVER
	help
	  This option enables support for Bluetooth Broadcast Sink Audio using
	  Isochronous channels.

if BT_AUDIO_BROADCAST_SINK

config BT_AUDIO_BROADCAST_SUBGROUP_COUNT
	int # hidden: TODO: Update once the API supports it
	default 1

config BT_AUDIO_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_AUDIO_BROADCAST_SNK_STREAM_COUNT per broadcast sink).

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

endif # BT_AUDIO_BROADCAST_SINK

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_DEBUG_PACS
	bool "Published Audio Capabilities Service debug"
	depends on BT_PACS
	help
	  Use this option to enable Published Audio Capabilities Service debug
	  logs for the Bluetooth Audio functionality.

config BT_AUDIO_DEBUG_STREAM
	bool "Bluetooth Audio Stream debug"
	depends on BT_AUDIO_STREAM
	help
	  Use this option to enable Bluetooth Audio Stream debug logs for the
	  Bluetooth Audio functionality.

config BT_AUDIO_DEBUG_CAPABILITIES
	bool "Bluetooth Audio Capabilities debug"
	depends on BT_AUDIO_CAPABILITIES
	help
	  Use this option to enable Bluetooth Audio Capabilities debug logs for
	  the Bluetooth Audio functionality.

config BT_DEBUG_ASCS
	bool "Audio Stream Control Service debug"
	depends on BT_ASCS
	help
	  Use this option to enable Audio Stream Control Service debug logs for
	  the Bluetooth Audio functionality.

config BT_AUDIO_DEBUG_UNICAST_SERVER
	bool "Bluetooth Audio Unicast Server debug"
	depends on BT_AUDIO_UNICAST_SERVER
	help
	  Use this option to enable Bluetooth Audio Unicast Server debug logs
	  for the Bluetooth Audio functionality.

config BT_AUDIO_DEBUG_UNICAST_CLIENT
	bool "Basic Audio Profile debug"
	depends on BT_AUDIO_UNICAST_CLIENT
	help
	  Use this option to enable Basic Audio Profile debug logs for the
	  Bluetooth Audio functionality.

config BT_AUDIO_DEBUG_BROADCAST_SOURCE
	bool "Bluetooth Audio Broadcast Source debug"
	depends on BT_AUDIO_BROADCAST_SOURCE
	help
	  Use this option to enable Bluetooth Audio Broadcast Source debug logs
	  for the Bluetooth Audio functionality.

config BT_AUDIO_DEBUG_BROADCAST_SINK
	bool "Bluetooth Audio Broadcast Sink debug"
	depends on BT_AUDIO_BROADCAST_SINK
	help
	  Use this option to enable Bluetooth Audio Broadcast Sink debug logs
	  for the Bluetooth Audio functionality.

endif # BT_AUDIO_DEBUG

config BT_AUDIO_STREAM
	# Virtual/hidden option
	bool
	default y if BT_ASCS || BT_AUDIO_UNICAST_CLIENT || \
			BT_AUDIO_BROADCAST_SOURCE || BT_AUDIO_BROADCAST_SINK

config BT_AUDIO_CAPABILITIES
	# Virtual/hidden option
	bool
	default y if BT_ASCS || BT_AUDIO_BROADCAST_SINK

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