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

Commit 21a850aa authored by Manish Dewangan's avatar Manish Dewangan Committed by Garmond Leung
Browse files

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
parent 2672dca6
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -270,7 +270,7 @@ int32_t release_loopback_session(loopback_patch_t *active_loopback_patch)

    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 @@ int32_t release_loopback_session(loopback_patch_t *active_loopback_patch)
        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 @@ int create_loopback_session(loopback_patch_t *active_loopback_patch)
        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 @@ int create_loopback_session(loopback_patch_t *active_loopback_patch)
        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) {
+13 −5
Original line number Diff line number Diff line
@@ -117,12 +117,20 @@ struct rtic_event {
    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) &&

    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))))
             ((format & AUDIO_FORMAT_MAIN_MASK) == AUDIO_FORMAT_AC3)))
        return true;
    else
        return false;
+4 −2
Original line number Diff line number Diff line
@@ -38,7 +38,9 @@ int audio_extn_ip_hdlr_intf_close(void *handle, bool is_dsp_decode, void *aud_se
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 @@ bool audio_extn_ip_hdlr_intf_supported(audio_format_t format, bool is_direct_pas
#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

+7 −5
Original line number Diff line number Diff line
@@ -2544,7 +2544,7 @@ static int stop_output_stream(struct stream_out *out)
    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 @@ int start_output_stream(struct stream_out *out)
    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 adev_open_output_stream(struct audio_hw_device *dev,
    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 @@ int adev_open_output_stream(struct audio_hw_device *dev,
        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 @@ int adev_open_output_stream(struct audio_hw_device *dev,
            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 @@ void adev_close_output_stream(struct audio_hw_device *dev __unused,
        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;
    }