# Bluetooth Audio - Media control configuration options

#
# Copyright (c) 2020-2022 Nordic Semiconductor
#
# SPDX-License-Identifier: Apache-2.0
#

#### Media Control Service ################################

config BT_MCS
	bool "Media Control Service Support"
	depends on MCTL_LOCAL_PLAYER_REMOTE_CONTROL
	depends on UTF8
	depends on BT_GATT_DYNAMIC_DB
	help
	  This option enables support for the Media Control Service.

#### Media Control Client ################################

config BT_MCC
	bool "Media Control Client Support"
	depends on BT_GATT_CLIENT
	depends on BT_GATT_AUTO_DISCOVER_CCC
	help
	  This option enables support for the Media Control Client.

if BT_MCC

config BT_MCC_MEDIA_PLAYER_NAME_MAX
	int "Max length of media player name"
	default 20
	range 1 $(UINT8_MAX)
	help
	  Sets the maximum number of bytes (including the null termination) of
	  the name of the media player. If the name is longer, the media
	  control client will truncate the name when reading it.

config BT_MCC_ICON_URL_MAX
	int "Max length of media player icon URL"
	default 40
	range 1 $(UINT8_MAX)
	help
	  Sets the maximum number of bytes (including the null termination) of
	  the media player icon URL. If the URL is longer, the media control
	  client will truncate the name when reading it.

config BT_MCC_TRACK_TITLE_MAX
	int "Max length of the title of a track"
	default 40
	range 1 $(UINT8_MAX)
	help
	  Sets the maximum number of bytes (including the null termination) of
	  the title of any track in the media player. If the title is longer,
	  the media control client will truncate the title when reading it.

config BT_MCC_SEGMENT_NAME_MAX
	int "Max length of the name of a track segment"
	default 25
	range 1 $(UINT8_MAX)
	help
	  Sets the maximum number of bytes (including the null termination)
	  of the name of any track segment in the media player. If the name is
	  longer, the media control client will truncate the name when reading
	  it.

config BT_MCC_OTS
	bool "Media Control Client support for Object Transfer Service"
	depends on BT_OTS_CLIENT
	help
	  Use this option to configure support in the Media Control Client for
	  an included Object Transfer Service in the Media Control Service.

if BT_MCC_OTS

config BT_MCC_OTC_OBJ_BUF_SIZE
	int "The size of the buffer used for OTC object in MCC"
	default 512
	range 1 65536
	help
	  Sets the size (in octets) of the buffer used for receiving the content
	  of objects.
	  Should be set large enough to fit any expected object.

config BT_MCC_TOTAL_OBJ_CONTENT_MEM
	int "Total memory size to use for storing the content of objects"
	default 1
	range 0 65536
	help
	  Sets the total memory size (in octets) to use for storing the content
	  of objects.
	  This is used for the total memory pool buffer size from which memory
	  is allocated when reading object content.

config BT_MCC_TRACK_SEGS_MAX_CNT
	int "Maximum number of tracks segments in a track segment object"
	default 25
	range 0 500
	help
	  Sets the maximum number of tracks segments in a track segment object.
	  If the received object is bigger, the remaining data in the object
	  will be ignored.

config BT_MCC_GROUP_RECORDS_MAX
	int "Maximum number of records in a group object"
	default 25
	range 0 500
	help
	  Sets the maximum number of records in a group object. If the received
	  group object has more records than this, the remaining records in the
	  object will be ignored.

endif # BT_MCC_OTS

config BT_MCC_SHELL
	bool "Media Control Client Shell Support"
	default y if BT_SHELL
	help
	  This option enables shell support for the Media Control Client.

config BT_MCC_MINIMAL
	bool "Minimal Media Control Client without optional procedures"
	help
	  This option disables all optional procedures in the Media Control Client.

config BT_MCC_READ_MEDIA_PLAYER_ICON_URL
	bool "Support reading Media Player Icon URL"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for Read Media Information procedure
	  optionally read the Media Player Icon URL.

config BT_MCC_READ_TRACK_TITLE
	bool "Support reading Track Title"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Track Title.

config BT_MCC_READ_TRACK_TITLE_ENABLE_SUBSCRIPTION
	bool "Support to enable or disable the subscription of Track Title"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for the subscription of Track Title.

config BT_MCC_READ_TRACK_DURATION
	bool "Support reading Track Duration"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Track Duration.

config BT_MCC_READ_TRACK_POSITION
	bool "Support reading Track Position"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Track Position.

config BT_MCC_SET_TRACK_POSITION
	bool "Support setting Track Position"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for setting Track Position.

config BT_MCC_READ_PLAYBACK_SPEED
	bool "Support reading Playback Speed"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Playback Speed.

config BT_MCC_SET_PLAYBACK_SPEED
	bool "Support setting Playback Speed"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for setting Playback Speed.

config BT_MCC_READ_SEEKING_SPEED
	bool "Support reading Seeking Speed"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Seeking Speed.

config BT_MCC_READ_PLAYING_ORDER
	bool "Support reading Playing Order"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Playing Order.

config BT_MCC_SET_PLAYING_ORDER
	bool "Support setting Playing Order"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for setting Playing Order.

config BT_MCC_READ_PLAYING_ORDER_SUPPORTED
	bool "Support reading Playing Order Supported"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Playing Order Supported.

config BT_MCC_READ_MEDIA_STATE
	bool "Support reading Media State"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Media State.

config BT_MCC_SET_MEDIA_CONTROL_POINT
	bool "Support setting Media Control Point"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for setting Media Control Point.

config BT_MCC_READ_MEDIA_CONTROL_POINT_OPCODES_SUPPORTED
	bool "Support reading Media Control Point Opcodes Supported"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Media Control Point Opcodes Supported.

config BT_MCC_READ_CONTENT_CONTROL_ID
	bool "Support reading Content Control ID"
	default !BT_MCC_MINIMAL
	help
	  This option enables support for reading Content Control ID.

endif # BT_MCC
