Bluetooth® Low Energy audio - Content Control

Revision as of 11:05, 3 July 2024 by Registered User (→‎Roles)


1. Introduction

The Bluetooth® LE Audio Content Control section regroups :

  • the Call Control Profile (CCP)
  • the Generic Telephony Bearer Service (GTBS)
  • the Telephony Bearer Service (TBS)
  • the Media Control Profile (MCP)
  • the Generic Media Control Service (GMCS)
  • the Media Control Service (MCS)

These profiles and services are used to either control or provide status information on Call features and Media features.

Connectivity BLE Content Control Architecture.png

Figure 1.1 STM32WBA Bluetooth® Low Energy - Content Control

As specified in the in the section 2.2 of the Common Audio Profile[1], the CAP Acceptor or the CAP Commander can operate in the MCP Client role and the CCP Client role, and the CAP Initiator can operate in the CCP Server role and the MCP Server role.


The GTBS, the TBS, the GMCS and the MCS are defined as Content Control services.

2. Call Control Profile

The Call Control profile defines roles and procedures to handle call control for bearers on device that can make and receive phone calls. It's specified by the Bluetooth® SIG and the full specification is accessible on their website[2].

2.1. Roles

The CCP introduces 2 roles:

  • Call Control Server: handles calls on one or more telephone call bearers. This role can be used by cell phones or tablets.
  • Call Control Client: makes requests to the server to make, receive, and manage calls. This role can be used by an headset and speaker that have microphones, or devices like a watch that might not have a speaker or microphone but can manage telephony calls.

The section 3 Bluetooth® Low Energy audio stack configuration of the wiki page [3] describes how to configure and initialize the CCP role and allocate required ROM, RAM and GATT resources.

2.2. Telephone Bearer

Within a Call Control Server, there can be zero or multiple instances of Telephone Bearer Service (TBS) and there is a single, mandatory, instance of Generic Telephone Bearer Service.
The BLE Audio Stack provides two APIs declared in cap.h header file to register the Telephony Bearer Instance associated to the Telephone Bearer Service and the Generic Telephone Bearer Service(Table 2.1)

Table 2.1 CAP functions dedicated to Telephony Bearer Instance registration
Functions Description Header File
CAP_RegisterGenericTelephonyBearer() Register the Generic Telephone Bearer. cap.h
CAP_RegisterTelephonyBearerInstance() Register the Generic Telephone Instance. cap.h


In case of Call Feature is supported, the CAP_RegisterGenericTelephonyBearer() function shall be called (mandatory to expose a Generic Telepne Bearer) and the CAP_RegisterTelephonyBearerInstance() function could be called according to the number of separate bearer instances.

Each registered Telephony Bearer instance is identified by a unique identifier value named Content Control Identifier (CCID).The CCID value identifies a Content Control service (GTBS or TBS) and is unique for that service instance across all instances of Content Control services on a device.

2.3. Call Control Profile Linkup

The linkup operation of the Call Control Profile could be initialized by the CAP Acceptor or the CAP Commander supporting the Call Control Client role, thanks to the CAP_Linkup() function. This process is described in section 4.1 Audio profiles linkup of the wiki page [3]

During linkup of the Call Control Profile, the CCP META Event CCP_CLT_GTBS_INFO_EVT and CCP_CLT_TBS_INFO_EVT are reported in CAP Callback when Generic Telephone Bearer Service and Telephony Bearer Service Instances are discovered in remote CAP Client supporting CCP Server role. Once the Call Control Profile link is up, the CAP_CCP_LINKUP_EVT event is notified.

2.4. Call Control Profile Functions

All the Call Control Profile functions, defined in the header file ccp.h, are used to control the Call features in CCP Server and CCP Client role.

All the structures, types, callback events related to the Call Control feature are defined in the ccp_types.h header file.

2.4.1. Call State Management

The Call Control Client and the Call Control Server support functions dedicated to manage call state transition.

The Telephone Bearer Service Specification[4] describes the Call State Transition represented by the following Figure 2.1.

Connectivity BLE Call State Machine.png

Figure 2.1 STM32WBA Bluetooth® Low Energy - Call State Machine


The Table 2.2 lists the Call Control functions supported by the Call Control Server.
When the state of a Call changes in Call Control Server role, the CCP META Event CCP_SRV_CALL_STATE_EVT is notified.

Table 2.2 CCP functions dedicated to Call State management in CCP Server role
Functions Description
CCP_SERVER_SetupIncomingCall() Setup an Incoming Call.

Could be associated to the CCP_SERVER_SetIncomingCallTargetURI() function used to set the Incoming Call Target Bearer URI of the incoming call.
Could be associated to the CCP_SERVER_SetCallFriendlyName() function used to set the Call Friendly Name of the incoming call.

CCP_SERVER_SetupOutgoingCall() Setup an Outgoing Call.

Could be associated to the CCP_SERVER_SetCallFriendlyName() function used to set the Call Friendly Name of the outgoing call.

CCP_SERVER_SetAlertingCall() Set an outgoing Call in alerting state.
CCP_SERVER_TerminateCall() Terminate a Call.
CCP_SERVER_SetActiveCall() Set a Call in Active State.
CCP_SERVER_SetLocalHoldCall() Place a call in Locally Held state.
CCP_SERVER_SetRemoteHoldCall() Place a call in Remotely Held state.
CCP_SERVER_RetrieveCall() Retrieve a call in Locally Held or Locally and Remotely Held state.
CCP_SERVER_JoinCalls() Join multiple calls in Active state.


The Table 2.3 lists the Call Control functions supported by the Call Control Client. Once associated operation is transmitted, the CCP META Event CCP_CLT_OPERATION_TRANSMITTED_EVT is notified.
When the state of a Call changes in Call Control Client role, the CCP META Event CCP_CLT_CALL_STATE_EVT is notified.

Table 2.3 CCP functions dedicated to Call State management in CCP Client role
Functions Description
CCP_CLIENT_AnswerIncomingCall() Answer an incoming call.
CCP_CLIENT_TerminateCall() End an active, alerting (outgoing), dialing (outgoing), incoming, or held (locally or remotely) Call.
CCP_CLIENT_LocalHoldCall() Place an active or incoming call on local hold.

Place a remotely held call on locally and remotely hold.

CCP_CLIENT_ActivateLocalHeldCall() Move a call that is being locally held to an active call.
CCP_CLIENT_RetrieveLocallyAndRemotelyHeldCall() Move a Call that is being locally and remotely held to a remotely held call.
CCP_CLIENT_OriginateCall() Make an outgoing call.
CCP_CLIENT_JoinCalls() Join multiple calls.

Note that each functions listed above manage the state transition of a call associated to a specific Content Control ID of a Telephone Bearer Instance.

2.4.2. Telephone Bearer Information

The Call Control Client and the Call Control Server support functions dedicated to set (Server) and get (Client) information related to a specific Telephone Bearer Instance.

The Table 2.4 lists the Call Control functions supported by the Call Control Server.

Table 2.4 CCP functions dedicated to Bearer Information settings in CCP Server role
Functions Description
CCP_SERVER_SetProviderName() Set the Telephone Bearer Provider Name.
CCP_SERVER_SetBearerTechnology() Set the Telephone Bearer Technology.
CCP_SERVER_SetURISchemesSupportedList() Set the list of the supported URI schemes.
CCP_SERVER_SetBearerSignalStrength() Set the current Signal Strength.
CCP_SERVER_SetFeaturesStatus() Set the current status of features that the server device supports.
CCP_SERVER_SetCallControlOptions() Set the Call Control Options supported or not by the CCP Server.
CCP_SERVER_SetIncomingCallTargetURI() Set the Incoming Call Target Bearer URI.
CCP_SERVER_SetCallFriendlyName() Set the Call Friendly Name.


The Table 2.5 lists the Call Control functions supported by the Call Control Client and the CCP_META Event notified when response is received from remote CCP Server. Once the associated operation is transmitted to the remote CCP Server, the CCP_META event CCP_CLT_OPERATION_COMPLETE_EVT is notified. The CCP_CLIENT_ConfigureSignalStrengthNotification() and CCP_CLIENT_ConfigureCurrentCallsListNotification() functions are used by CCP Client to enable/disable Signal Strength Update Notification (CCP_CLT_SIGNAL_STRENGTH_EVT) and Bearer Current Calls List Update Notification (CCP_CLT_CURRENT_CALL_EVT)

Table 2.5 CCP functions dedicated to Bearer Information settings in CCP Client role
Functions Description Event
CCP_CLIENT_ReadProviderName() Read the Bearer Provider Name. CCP_CLT_PROVIDER_NAME_EVT
CCP_CLIENT_ReadUCI() Read the Bearer Uniform Caller Identifier. CCP_CLT_UCI_EVT
CCP_CLIENT_ReadTechnology() Read the Bearer Technology. CCP_CLT_TECHNOLOGY_EVT
CCP_CLIENT_ReadSupportedURISchemesList() Read the Bearer URI Schemes Supported List. CCP_CLT_URI_SCHEMES_LIST_EVT
CCP_CLIENT_ReadSignalStrength() Read the Bearer Signal Strength. CCP_CLT_SIGNAL_STRENGTH_EVT
CCP_CLIENT_ReadSSRInterval() Read the Bearer Signal Strength Reporting Interval. CCP_CLT_SSR_INTERVAL_EVT
CCP_CLIENT_SetSSRInterval() Set the Bearer Signal Strength Reporting Interval.
No CCP_CLT_OPERATION_COMPLETE_EVT is notified for this function.
CCP_CLIENT_ReadListCurrentCalls() Read the Bearer List Current Calls. CCP_CLT_CURRENT_CALL_EVT
CCP_CLT_NO_CURRENT_CALL_EVT
CCP_CLIENT_ReadIncomingCallTargetURI() Read the Incoming Call Target Bearer URI. CCP_CLT_INC_CALL_TARGET_URI_EVT
CCP_CLIENT_ReadFeaturesStatus() Read the Feature (Inband RingTone and Silente Mode) status. CCP_CLT_FEATURES_STATUS_EVT
CCP_CLIENT_ReadCallState() Read the different states that telephone calls are in. CCP_CLT_CALL_STATE_EVT
CCP_CLIENT_ReadCallCtrlOptions() Read the Call Control Point Optional Opcodes. CCP_CLT_CALL_CTRL_OPTIONS_EVT
CCP_CLIENT_ReadIncomingCall() Read the Incoming Call. CCP_CLT_INCOMING_CALL_EVT
CCP_CLIENT_ReadCallFriendlyName() Read the Call Friendly Name CCP_CLT_CALL_FRIENDLY_NAME_EVT


3. Media Control Profile

The Media Control profile defines roles and procedures to handle media control and status of Media Playback entities on device. It's specified by the Bluetooth® SIG and the full specification is accessible on their website[5].

3.1. Roles

The MCP introduces 2 roles:

  • Media Control Server: interacts with a Media Control Client for the management of media tracks and conveys the various states and settings to the Media Control Client. This role can be used by cell phones or tablets.
  • Call Control Client: initiates playing and pausing, determines playing order, and collects search results from the Media Control Server. This role can be used by an headset and speaker.

The section 3 Bluetooth® Low Energy audio stack configuration of the wiki page [3] describes how to configure and initialize the MCP role and to allocate required ROM, RAM and GATT resources.

3.2. Media Player

Within a Media Control Server, there can be zero or multiple instances of Media Control Service (MCS) and there is a single, mandatory, instance of Generic Media Control Service. Each of them describes a single Media Player.
A device (Media Control Server) could implement many Media Player instances to allow a Media Control Client to access to separate internal media player entities such as many end-user applications playing music on a phone or a computer..

4. Content Control Procedure

As specified in the Common Audio Profile specification, the Content Control service instances (Media and/or Call) could be associate to an Audio Stream by using their CCID values, when the Audio Stream carries content controlled by these Content Control service instances.

To inform a remote CAP Acceptor or CAP Commander that an Audio Stream is associated with one or more Content Control service instances, the CAP Initiator specifies the corresponding CCIDs in the CCID_List LTV structure in the Audio Stream's Metadata.

In Unicast procedures, when a remote CAP Initiator indicates that a Media Content Control instance or a Call Content Control instance is activated/deactivated through the metadata associated to an Audio Stream Endpoint in ENABLING/STREAMING state, the Bluetooth® Low Energy audio stack reports the CAP events listed in the Table 4.1 :

Events Description Header File
CAP_CCP_INST_ACTIVATED_EVT Event notified when a telephone bearer instance of the call control profile is activated and associated to an audio stream. cap_types.h
CAP_CCP_INST_DEACTIVATED_EVT Event notified when a telephone bearer instance of the call control profile is deactivated. cap_types.h
CAP_MCP_INST_ACTIVATED_EVT Event notified when a media player instance of the media control profile is activated and associated to an audio stream. cap_types.h
CAP_MCP_INST_DEACTIVATED_EVT Event notified when a media player instance of the media control profile is deactivated. cap_types.h

Table 4.1 Content Control events

The CAP Acceptor/Commander could perform Call control operation and Media control operation on active CCP instance or MCP instance thanks to functions declared in ccp.h and mcp.h header files.
The Generic Audio Framework reports call control events (see CCP_NotCode_t in ccp_types.h) and media control events (see MCP_NotCode_t in mcp_types.h) trough dedicated CAP_CCP_META_EVT and CAP_MCP_META_EVT events

5. References


No categories assignedEdit