audio: hal: Fix for non dolby clip playback issue
-Non dolby clip followed by dolby clips are not playing as
ip handler is getting initialized two times, first in
audio_extn_qaf_init and second in adev_open_output_stream.
Ip handler init from adev_open_output_stream should not be called
from adev_open_output_stream for MS12 decode.
-Fix this by avoiding ip handler init from adev_open_output_stream
if qaf enabled.
Change-Id: Ib813eec306f4cb78d6a31a62c46b10719ae47a85
diff --git a/hal/audio_extn/hw_loopback.c b/hal/audio_extn/hw_loopback.c
index ae27b6a..64f5ae6 100644
--- a/hal/audio_extn/hw_loopback.c
+++ b/hal/audio_extn/hw_loopback.c
@@ -270,7 +270,7 @@
adev->active_input = get_next_active_input(adev);
- if (audio_extn_ip_hdlr_intf_supported(source_patch_config->format, false) && inout->ip_hdlr_handle) {
+ if (inout->ip_hdlr_handle) {
ret = audio_extn_ip_hdlr_intf_close(inout->ip_hdlr_handle, true, inout);
if (ret < 0)
ALOGE("%s: audio_extn_ip_hdlr_intf_close failed %d",__func__, ret);
@@ -284,8 +284,7 @@
inout->adsp_hdlr_stream_handle = NULL;
}
- if (audio_extn_ip_hdlr_intf_supported(source_patch_config->format, false) &&
- inout->ip_hdlr_handle) {
+ if (inout->ip_hdlr_handle) {
audio_extn_ip_hdlr_intf_deinit(inout->ip_hdlr_handle);
inout->ip_hdlr_handle = NULL;
}
@@ -381,7 +380,7 @@
inout->adsp_hdlr_stream_handle = NULL;
goto exit;
}
- if (audio_extn_ip_hdlr_intf_supported(source_patch_config->format, false)) {
+ if (audio_extn_ip_hdlr_intf_supported(source_patch_config->format,false, true)) {
ret = audio_extn_ip_hdlr_intf_init(&inout->ip_hdlr_handle, NULL, NULL, adev,
USECASE_AUDIO_TRANSCODE_LOOPBACK);
if (ret < 0) {
@@ -468,7 +467,7 @@
ret = -EINVAL;
goto exit;
}
- if (audio_extn_ip_hdlr_intf_supported(source_patch_config->format, false) && inout->ip_hdlr_handle) {
+ if (inout->ip_hdlr_handle) {
ret = audio_extn_ip_hdlr_intf_open(inout->ip_hdlr_handle, true, inout,
USECASE_AUDIO_TRANSCODE_LOOPBACK);
if (ret < 0) {
diff --git a/hal/audio_extn/ip_hdlr_intf.c b/hal/audio_extn/ip_hdlr_intf.c
index 6ee06d4..a94e6de 100644
--- a/hal/audio_extn/ip_hdlr_intf.c
+++ b/hal/audio_extn/ip_hdlr_intf.c
@@ -117,12 +117,20 @@
uint8_t payload[0];
};
-bool audio_extn_ip_hdlr_intf_supported(audio_format_t format,bool is_direct_passthru)
+bool audio_extn_ip_hdlr_intf_supported(audio_format_t format,
+ bool is_direct_passthrough,
+ bool is_transcode_loopback)
{
- if (((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_DOLBY_TRUEHD) ||
- ((!is_direct_passthru) &&
- (((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_E_AC3) ||
- ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AC3))))
+
+ if ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_DOLBY_TRUEHD)
+ return true;
+ else if (!is_direct_passthrough && !audio_extn_qaf_is_enabled() &&
+ (((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_E_AC3) ||
+ ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AC3)))
+ return true;
+ else if (is_transcode_loopback &&
+ (((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_E_AC3) ||
+ ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AC3)))
return true;
else
return false;
diff --git a/hal/audio_extn/ip_hdlr_intf.h b/hal/audio_extn/ip_hdlr_intf.h
index b381d7e..6040620 100644
--- a/hal/audio_extn/ip_hdlr_intf.h
+++ b/hal/audio_extn/ip_hdlr_intf.h
@@ -38,7 +38,9 @@
int audio_extn_ip_hdlr_intf_init(void **handle, char *lib_path, void **lib_handle,
struct audio_device *dev, audio_usecase_t usecase);
int audio_extn_ip_hdlr_intf_deinit(void *handle);
-bool audio_extn_ip_hdlr_intf_supported(audio_format_t format, bool is_direct_passthru);
+bool audio_extn_ip_hdlr_intf_supported(audio_format_t format,
+ bool is_direct_passthru,
+ bool is_transcode_loopback);
#else
@@ -46,7 +48,7 @@
#define audio_extn_ip_hdlr_intf_close(handle, is_dsp_decode, aud_sess_handle) (0)
#define audio_extn_ip_hdlr_intf_init(handle, lib_path, lib_handlei, adev, usecase) (0)
#define audio_extn_ip_hdlr_intf_deinit(handle) (0)
-#define audio_extn_ip_hdlr_intf_supported(format, is_direct_passthru) (0)
+#define audio_extn_ip_hdlr_intf_supported(format, is_direct_passthru, is_loopback) (0)
#endif
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 82d95e5..23f4d7d 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2544,7 +2544,7 @@
if (out->devices & AUDIO_DEVICE_OUT_AUX_DIGITAL)
audio_extn_keep_alive_start();
- if (audio_extn_ip_hdlr_intf_supported(out->format, audio_extn_passthru_is_direct_passthrough(out)) && out->ip_hdlr_handle) {
+ if (out->ip_hdlr_handle) {
ret = audio_extn_ip_hdlr_intf_close(out->ip_hdlr_handle, true, out);
if (ret < 0)
ALOGE("%s: audio_extn_ip_hdlr_intf_close failed %d",__func__, ret);
@@ -2799,7 +2799,7 @@
audio_extn_perf_lock_release(&adev->perf_lock_handle);
ALOGD("%s: exit", __func__);
- if (audio_extn_ip_hdlr_intf_supported(out->format, audio_extn_passthru_is_direct_passthrough(out)) && out->ip_hdlr_handle) {
+ if (out->ip_hdlr_handle) {
ret = audio_extn_ip_hdlr_intf_open(out->ip_hdlr_handle, true, out, out->usecase);
if (ret < 0)
ALOGE("%s: audio_extn_ip_hdlr_intf_open failed %d",__func__, ret);
@@ -4963,6 +4963,7 @@
int ret = 0;
audio_format_t format;
struct adsp_hdlr_stream_cfg hdlr_stream_cfg;
+ bool is_direct_passthough = false;
*stream_out = NULL;
@@ -5496,9 +5497,10 @@
audio_extn_dts_notify_playback_state(out->usecase, 0, out->sample_rate,
popcount(out->channel_mask), out->playback_started);
/* setup a channel for client <--> adsp communication for stream events */
+ is_direct_passthough = audio_extn_passthru_is_direct_passthrough(out);
if ((out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) ||
(out->flags & AUDIO_OUTPUT_FLAG_DIRECT_PCM) ||
- (audio_extn_ip_hdlr_intf_supported(config->format, audio_extn_passthru_is_direct_passthrough(out)))) {
+ (audio_extn_ip_hdlr_intf_supported(config->format, is_direct_passthough, false))) {
hdlr_stream_cfg.pcm_device_id = platform_get_pcm_device_id(
out->usecase, PCM_PLAYBACK);
hdlr_stream_cfg.flags = out->flags;
@@ -5510,7 +5512,7 @@
out->adsp_hdlr_stream_handle = NULL;
}
}
- if (audio_extn_ip_hdlr_intf_supported(config->format, audio_extn_passthru_is_direct_passthrough(out))) {
+ if (audio_extn_ip_hdlr_intf_supported(config->format, is_direct_passthough, false)) {
ret = audio_extn_ip_hdlr_intf_init(&out->ip_hdlr_handle, NULL, NULL, adev, out->usecase);
if (ret < 0) {
ALOGE("%s: audio_extn_ip_hdlr_intf_init failed %d",__func__, ret);
@@ -5550,7 +5552,7 @@
out->adsp_hdlr_stream_handle = NULL;
}
- if (audio_extn_ip_hdlr_intf_supported(out->format, audio_extn_passthru_is_direct_passthrough(out)) && out->ip_hdlr_handle) {
+ if (out->ip_hdlr_handle) {
audio_extn_ip_hdlr_intf_deinit(out->ip_hdlr_handle);
out->ip_hdlr_handle = NULL;
}