Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit da256de8 authored by Aniket Kumar Lata's avatar Aniket Kumar Lata Committed by Andy Hung
Browse files

hal: Query A2DP sink latency from bthost_ipc

Enable support for delay report feature.
Obtain sink latency from bthost_ipc which
queries it from BT stack for the connected
sink device.

Test: BT pcm play music, check latency in audioflinger dumpsys
Bug: 111812274
Change-Id: Iaec851de7d4e3ec7a45de2b6a5f73f5e3bd851f8
parent 52d0e0e5
Loading
Loading
Loading
Loading
+25 −15
Original line number Diff line number Diff line
@@ -141,6 +141,7 @@ typedef void * (*audio_get_codec_config_t)(uint8_t *multicast_status, uint8_t *n
                               enc_codec_t *codec_type);
typedef int (*audio_check_a2dp_ready_t)(void);
typedef int (*audio_is_scrambling_enabled_t)(void);
typedef uint16_t (*audio_get_a2dp_sink_latency_t)(void);

enum A2DP_STATE {
    A2DP_STATE_CONNECTED,
@@ -221,6 +222,8 @@ struct a2dp_data {
    audio_check_a2dp_ready_t audio_check_a2dp_ready;
    /* Check if scrambling is enabled on BTSoC */
    audio_is_scrambling_enabled_t audio_is_scrambling_enabled;
    /* Get sink latency from Bluetooth stack */
    audio_get_a2dp_sink_latency_t audio_get_a2dp_sink_latency;
    /* Internal A2DP state identifier */
    enum A2DP_STATE bt_state;
    /* A2DP codec type configured */
@@ -713,6 +716,8 @@ static int open_a2dp_output()
                        dlsym(a2dp.bt_lib_handle,"audio_check_a2dp_ready");
            a2dp.audio_is_scrambling_enabled = (audio_is_scrambling_enabled_t)
                        dlsym(a2dp.bt_lib_handle,"audio_is_scrambling_enabled");
            a2dp.audio_get_a2dp_sink_latency = (audio_get_a2dp_sink_latency_t)
                        dlsym(a2dp.bt_lib_handle,"audio_get_a2dp_sink_latency");
        }
    }

@@ -1717,7 +1722,7 @@ void audio_extn_a2dp_init(void *adev)

uint32_t audio_extn_a2dp_get_encoder_latency()
{
    uint32_t latency = 0;
    uint32_t latency_ms = 0;
    int avsync_runtime_prop = 0;
    int sbc_offset = 0, aptx_offset = 0, aptxhd_offset = 0,
        aac_offset = 0, ldac_offset = 0;
@@ -1734,36 +1739,41 @@ uint32_t audio_extn_a2dp_get_encoder_latency()
        }
    }

    uint32_t slatency_ms = 0;
    if (a2dp.audio_get_a2dp_sink_latency && a2dp.bt_state != A2DP_STATE_DISCONNECTED) {
        slatency_ms = a2dp.audio_get_a2dp_sink_latency();
    }

    switch (a2dp.bt_encoder_format) {
        case ENC_CODEC_TYPE_SBC:
            latency = (avsync_runtime_prop > 0) ? sbc_offset : ENCODER_LATENCY_SBC;
            latency += DEFAULT_SINK_LATENCY_SBC;
            latency_ms = (avsync_runtime_prop > 0) ? sbc_offset : ENCODER_LATENCY_SBC;
            latency_ms += (slatency_ms == 0) ? DEFAULT_SINK_LATENCY_SBC : slatency_ms;
            break;
        case ENC_CODEC_TYPE_APTX:
            latency = (avsync_runtime_prop > 0) ? aptx_offset : ENCODER_LATENCY_APTX;
            latency += DEFAULT_SINK_LATENCY_APTX;
            latency_ms = (avsync_runtime_prop > 0) ? aptx_offset : ENCODER_LATENCY_APTX;
            latency_ms += (slatency_ms == 0) ? DEFAULT_SINK_LATENCY_APTX : slatency_ms;
            break;
        case ENC_CODEC_TYPE_APTX_HD:
            latency = (avsync_runtime_prop > 0) ? aptxhd_offset : ENCODER_LATENCY_APTX_HD;
            latency += DEFAULT_SINK_LATENCY_APTX_HD;
            latency_ms = (avsync_runtime_prop > 0) ? aptxhd_offset : ENCODER_LATENCY_APTX_HD;
            latency_ms += (slatency_ms == 0) ? DEFAULT_SINK_LATENCY_APTX_HD : slatency_ms;
            break;
        case ENC_CODEC_TYPE_AAC:
            latency = (avsync_runtime_prop > 0) ? aac_offset : ENCODER_LATENCY_AAC;
            latency += DEFAULT_SINK_LATENCY_AAC;
            latency_ms = (avsync_runtime_prop > 0) ? aac_offset : ENCODER_LATENCY_AAC;
            latency_ms += (slatency_ms == 0) ? DEFAULT_SINK_LATENCY_AAC : slatency_ms;
            break;
        case ENC_CODEC_TYPE_LDAC:
            latency = (avsync_runtime_prop > 0) ? ldac_offset : ENCODER_LATENCY_LDAC;
            latency += DEFAULT_SINK_LATENCY_LDAC;
            latency_ms = (avsync_runtime_prop > 0) ? ldac_offset : ENCODER_LATENCY_LDAC;
            latency_ms += (slatency_ms == 0) ? DEFAULT_SINK_LATENCY_LDAC : slatency_ms;
            break;
        case ENC_CODEC_TYPE_PCM:
            latency = ENCODER_LATENCY_PCM;
            latency += DEFAULT_SINK_LATENCY_PCM;
            latency_ms = ENCODER_LATENCY_PCM;
            latency_ms += DEFAULT_SINK_LATENCY_PCM;
            break;
        default:
            latency = DEFAULT_ENCODER_LATENCY;
            latency_ms = DEFAULT_ENCODER_LATENCY;
            break;
    }
    return latency;
    return latency_ms;
}

int audio_extn_a2dp_get_parameters(struct str_parms *query,