Skip to content

API Reference

walinsky edited this page Nov 11, 2025 · 2 revisions

API Reference

Complete API documentation for the a2dpSinkHfpClient component.

Table of Contents


Initialization

a2dpSinkHfpHf_init()

Initialize the Bluetooth A2DP sink and HFP hands-free client.

esp_err_t a2dpSinkHfpHf_init(const a2dpSinkHfpHf_config_t *config);

Parameters:

  • config: Pointer to configuration structure

Returns:

  • ESP_OK: Success
  • ESP_FAIL: Initialization failed

Example:

a2dpSinkHfpHf_config_t config = {
    .device_name = "ESP32-Speaker",
    .i2s_tx_bck = 26,
    .i2s_tx_ws = 25,
    .i2s_tx_dout = 22,
    .i2s_rx_bck = 32,
    .i2s_rx_ws = 33,
    .i2s_rx_din = 34
};

esp_err_t ret = a2dpSinkHfpHf_init(&config);

a2dpSinkHfpHf_deinit()

Deinitialize and clean up all resources.

esp_err_t a2dpSinkHfpHf_deinit(void);

Returns:

  • ESP_OK: Success

Configuration

a2dpSinkHfpHf_set_pin()

Set custom PIN code for Bluetooth pairing.

esp_err_t a2dpSinkHfpHf_set_pin(const char *pin_code, uint8_t pin_len);

Parameters:

  • pin_code: PIN code string (e.g., "1234")
  • pin_len: Length of PIN code (1-16)

Returns:

  • ESP_OK: Success
  • ESP_ERR_INVALID_ARG: Invalid parameters

Note: Must be called before a2dpSinkHfpHf_init().

a2dpSinkHfpHf_set_country_code()

Set country code for phone number formatting.

esp_err_t a2dpSinkHfpHf_set_country_code(const char *country_code);

Parameters:

  • country_code: Country code string (e.g., "1" for USA, "44" for UK)

Returns:

  • ESP_OK: Success
  • ESP_ERR_INVALID_ARG: Invalid country code

A2DP Functions

A2DP audio streaming is handled automatically when a device connects. No manual functions needed for basic operation.


HFP Call Control

a2dpSinkHfpHf_answer_call()

Answer an incoming call.

esp_err_t a2dpSinkHfpHf_answer_call(void);

Returns:

  • ESP_OK: Command sent successfully
  • ESP_FAIL: Not connected or error

Example:

if (a2dpSinkHfpHf_answer_call() == ESP_OK) {
    printf("Answering call\n");
}

a2dpSinkHfpHf_reject_call()

Reject an incoming call.

esp_err_t a2dpSinkHfpHf_reject_call(void);

Returns:

  • ESP_OK: Command sent successfully
  • ESP_FAIL: Not connected or error

a2dpSinkHfpHf_hangup_call()

Hang up active call.

esp_err_t a2dpSinkHfpHf_hangup_call(void);

Returns:

  • ESP_OK: Command sent successfully
  • ESP_FAIL: Not connected or error

a2dpSinkHfpHf_dial_number()

Dial a phone number.

esp_err_t a2dpSinkHfpHf_dial_number(const char *number);

Parameters:

  • number: Phone number string (e.g., "1234567890")

Returns:

  • ESP_OK: Command sent successfully
  • ESP_ERR_INVALID_ARG: NULL pointer
  • ESP_FAIL: Not connected

Example:

a2dpSinkHfpHf_dial_number("5551234567");

a2dpSinkHfpHf_redial()

Redial the last dialed number.

esp_err_t a2dpSinkHfpHf_redial(void);

Returns:

  • ESP_OK: Command sent successfully
  • ESP_FAIL: Not connected

a2dpSinkHfpHf_dial_memory()

Dial from speed dial memory location.

esp_err_t a2dpSinkHfpHf_dial_memory(int location);

Parameters:

  • location: Memory location number (1-99, phone-dependent)

Returns:

  • ESP_OK: Command sent successfully
  • ESP_FAIL: Not connected

HFP Voice Recognition

a2dpSinkHfpHf_start_voice_recognition()

Start voice recognition (Siri, Google Assistant, etc.).

esp_err_t a2dpSinkHfpHf_start_voice_recognition(void);

Returns:

  • ESP_OK: Command sent successfully
  • ESP_FAIL: Not connected or not supported

Example:

// Trigger Siri/Google Assistant
a2dpSinkHfpHf_start_voice_recognition();

a2dpSinkHfpHf_stop_voice_recognition()

Stop voice recognition.

esp_err_t a2dpSinkHfpHf_stop_voice_recognition(void);

Returns:

  • ESP_OK: Command sent successfully
  • ESP_FAIL: Not connected

HFP Volume Control

a2dpSinkHfpHf_volume_update()

Update speaker or microphone volume on the phone.

esp_err_t a2dpSinkHfpHf_volume_update(const char *target, int volume);

Parameters:

  • target: "spk" for speaker, "mic" for microphone
  • volume: Volume level (0-15)

Returns:

  • ESP_OK: Command sent successfully
  • ESP_ERR_INVALID_ARG: Invalid target or volume
  • ESP_FAIL: Not connected

Example:

// Set speaker volume to maximum
a2dpSinkHfpHf_volume_update("spk", 15);

// Set microphone volume to mid-level
a2dpSinkHfpHf_volume_update("mic", 8);

HFP Query Functions

a2dpSinkHfpHf_query_operator()

Query the current network operator name.

esp_err_t a2dpSinkHfpHf_query_operator(void);

Returns:

  • ESP_OK: Query sent (check HFP event logs for response)
  • ESP_FAIL: Not connected

a2dpSinkHfpHf_query_current_calls()

Query list of current calls.

esp_err_t a2dpSinkHfpHf_query_current_calls(void);

Returns:

  • ESP_OK: Query sent (check HFP event logs for response)
  • ESP_FAIL: Not connected

a2dpSinkHfpHf_retrieve_subscriber_info()

Retrieve subscriber info (own phone number).

esp_err_t a2dpSinkHfpHf_retrieve_subscriber_info(void);

Returns:

  • ESP_OK: Query sent (check HFP event logs for response)
  • ESP_FAIL: Not connected

HFP Advanced Features

a2dpSinkHfpHf_send_btrh()

Send response and hold command.

esp_err_t a2dpSinkHfpHf_send_btrh(int btrh);

Parameters:

  • btrh:
    • 0: Put incoming call on hold
    • 1: Accept held call
    • 2: Reject held call

Returns:

  • ESP_OK: Command sent successfully
  • ESP_ERR_INVALID_ARG: Invalid value (not 0-2)
  • ESP_FAIL: Not connected

a2dpSinkHfpHf_send_xapl()

Send iPhone XAPL (accessory protocol) features.

esp_err_t a2dpSinkHfpHf_send_xapl(const char *features);

Parameters:

  • features: Feature string (e.g., "iPhone-6.3.0,2")

Returns:

  • ESP_OK: Command sent successfully
  • ESP_ERR_INVALID_ARG: Invalid format
  • ESP_FAIL: Not connected

a2dpSinkHfpHf_send_iphoneaccev()

Send iPhone accessory event (battery level, docked state).

esp_err_t a2dpSinkHfpHf_send_iphoneaccev(int bat_level, int docked);

Parameters:

  • bat_level: Battery level (0-9), or -1 to skip
  • docked: Docked state (0=not docked, 1=docked), or -1 to skip

Returns:

  • ESP_OK: Command sent successfully
  • ESP_ERR_INVALID_ARG: Invalid parameters
  • ESP_FAIL: Not connected

Example:

// Report 80% battery, not docked
a2dpSinkHfpHf_send_iphoneaccev(8, 0);

AVRC Control

a2dpSinkHfpHf_avrc_play()

Send play command.

bool a2dpSinkHfpHf_avrc_play(void);

Returns:

  • true: Command sent
  • false: AVRC not connected

a2dpSinkHfpHf_avrc_pause()

Send pause command.

bool a2dpSinkHfpHf_avrc_pause(void);

Returns:

  • true: Command sent
  • false: AVRC not connected

a2dpSinkHfpHf_avrc_next()

Skip to next track.

bool a2dpSinkHfpHf_avrc_next(void);

Returns:

  • true: Command sent
  • false: AVRC not connected

a2dpSinkHfpHf_avrc_prev()

Skip to previous track.

bool a2dpSinkHfpHf_avrc_prev(void);

Returns:

  • true: Command sent
  • false: AVRC not connected

AVRC Metadata

a2dpSinkHfpHf_get_avrc_metadata()

Get current track metadata.

const bt_avrc_metadata_t* a2dpSinkHfpHf_get_avrc_metadata(void);

Returns:

  • Pointer to metadata structure
  • NULL: No metadata available

Metadata Structure:

typedef struct {
    char title[128];
    char artist[128];
    char album[128];
    char genre[32];
    bool valid;
} bt_avrc_metadata_t;

Example:

const bt_avrc_metadata_t *metadata = a2dpSinkHfpHf_get_avrc_metadata();
if (metadata && metadata->valid) {
    printf("Now Playing: %s - %s\n", metadata->artist, metadata->title);
}

Status Functions

a2dpSinkHfpHf_is_connected()

Check if Bluetooth device is connected.

bool a2dpSinkHfpHf_is_connected(void);

Returns:

  • true: Device connected
  • false: No device connected

a2dpSinkHfpHf_is_avrc_connected()

Check if AVRC (remote control) is connected.

bool a2dpSinkHfpHf_is_avrc_connected(void);

Returns:

  • true: AVRC connected
  • false: AVRC not connected

Callbacks

a2dpSinkHfpHf_register_avrc_metadata_callback()

Register callback for track metadata updates.

void a2dpSinkHfpHf_register_avrc_metadata_callback(bt_avrc_metadata_cb_t callback);

Callback Signature:

void metadata_callback(const bt_avrc_metadata_t *metadata);

Example:

void my_metadata_callback(const bt_avrc_metadata_t *metadata) {
    if (metadata && metadata->valid) {
        printf("Track: %s\n", metadata->title);
        printf("Artist: %s\n", metadata->artist);
    }
}

a2dpSinkHfpHf_register_avrc_metadata_callback(my_metadata_callback);

a2dpSinkHfpHf_register_avrc_playback_callback()

Register callback for playback status changes.

void a2dpSinkHfpHf_register_avrc_playback_callback(bt_avrc_playback_status_cb_t callback);

Callback Signature:

void playback_callback(const bt_avrc_playback_status_t *status);

Status Structure:

typedef struct {
    esp_avrc_playback_stat_t status;  // STOPPED, PLAYING, PAUSED
} bt_avrc_playback_status_t;

a2dpSinkHfpHf_register_avrc_volume_callback()

Register callback for volume changes.

void a2dpSinkHfpHf_register_avrc_volume_callback(bt_avrc_volume_cb_t callback);

Callback Signature:

void volume_callback(uint8_t volume);

Parameters:

  • volume: Volume level (0-127)

See Also

Clone this wiki locally