hal: Add pcm format support for a2dp playback
On some platforms encoding happens on BT SoC and
not in ADSP, in such cases BT Host returns raw pcm format
as encoder type. Add pcm format support for a2dp playback
path.
Bug: 31285615
Test: Compile test for 8974 platform and 8916.
Change-Id: I59f419a8254647b4a7caf437645ee8a898748f92
diff --git a/hal/audio_extn/a2dp.c b/hal/audio_extn/a2dp.c
index bb44172..d1671a8 100644
--- a/hal/audio_extn/a2dp.c
+++ b/hal/audio_extn/a2dp.c
@@ -92,6 +92,7 @@
#define ENCODER_LATENCY_APTX_HD 20
#define ENCODER_LATENCY_LDAC 40
#define ENCODER_LATENCY_SBC 10
+#define ENCODER_LATENCY_PCM 50
// Default A2DP sink latency offset
#define DEFAULT_SINK_LATENCY_AAC 180
@@ -99,6 +100,7 @@
#define DEFAULT_SINK_LATENCY_APTX_HD 180
#define DEFAULT_SINK_LATENCY_LDAC 180
#define DEFAULT_SINK_LATENCY_SBC 140
+#define DEFAULT_SINK_LATENCY_PCM 140
// Slimbus Tx sample rate for ABR feedback channel
#define ABR_TX_SAMPLE_RATE "KHZ_8"
@@ -125,6 +127,7 @@
ENC_CODEC_TYPE_APTX = AUDIO_FORMAT_APTX, // 0x20000000UL
ENC_CODEC_TYPE_APTX_HD = AUDIO_FORMAT_APTX_HD, // 0x21000000UL
ENC_CODEC_TYPE_LDAC = AUDIO_FORMAT_LDAC, // 0x23000000UL
+ ENC_CODEC_TYPE_PCM = AUDIO_FORMAT_PCM_16_BIT, // 0x1u
} enc_codec_t;
typedef int (*audio_stream_open_t)(void);
@@ -770,7 +773,10 @@
(sampling_rate_rx == 48000 || sampling_rate_rx == 44100 )) {
sampling_rate_rx *= 2;
}
-
+ // No need to configure backend for PCM format.
+ if (a2dp.bt_encoder_format == ENC_CODEC_TYPE_PCM) {
+ return 0;
+ }
// Set Rx backend sample rate
switch (sampling_rate_rx) {
case 44100:
@@ -1340,6 +1346,11 @@
(configure_ldac_enc_format((audio_ldac_encoder_config *)codec_info) &&
configure_a2dp_decoder_format(ENC_CODEC_TYPE_LDAC));
break;
+ case ENC_CODEC_TYPE_PCM:
+ ALOGD("Received PCM format for BT device");
+ a2dp.bt_encoder_format = ENC_CODEC_TYPE_PCM;
+ is_configured = true;
+ break;
default:
ALOGD("%s: Received unsupported encoder format", __func__);
is_configured = false;
@@ -1698,6 +1709,10 @@
latency = (avsync_runtime_prop > 0) ? ldac_offset : ENCODER_LATENCY_LDAC;
latency += DEFAULT_SINK_LATENCY_LDAC;
break;
+ case ENC_CODEC_TYPE_PCM:
+ latency = ENCODER_LATENCY_PCM;
+ latency += DEFAULT_SINK_LATENCY_PCM;
+ break;
default:
latency = DEFAULT_ENCODER_LATENCY;
break;