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

Commit c6d28bad authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "hal: add Dolby DD+ support for AC3/EAC3"

parents b616a42f 90310105
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -87,6 +87,11 @@ ifneq ($(strip $(AUDIO_FEATURE_DISABLED_COMPRESS_CAPTURE)),true)
    LOCAL_SRC_FILES += audio_extn/compress_capture.c
endif

ifneq ($(strip $(AUDIO_FEATURE_DISABLED_DS1_DOLBY_DDP)),true)
    LOCAL_CFLAGS += -DDS1_DOLBY_DDP_ENABLED
    LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
endif

LOCAL_SHARED_LIBRARIES := \
	liblog \
	libcutils \
+56 −0
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@
#include "audio_hw.h"
#include "audio_extn.h"

#include "sound/compress_params.h"

#define MAX_SLEEP_RETRY 100
#define WIFI_INIT_WAIT_SLEEP 50

@@ -256,3 +258,57 @@ int32_t audio_extn_read_xml(struct audio_device *adev, uint32_t mixer_card,
    return 0;
}
#endif /* AUXPCM_BT_ENABLED */


#ifdef DS1_DOLBY_DDP_ENABLED

bool audio_extn_dolby_is_supported_format(audio_format_t format)
{
    if (format == AUDIO_FORMAT_AC3 ||
            format == AUDIO_FORMAT_EAC3)
        return true;
    else
        return false;
}

int audio_extn_dolby_get_snd_codec_id(audio_format_t format)
{
    int id = 0;

    switch (format) {
    case AUDIO_FORMAT_AC3:
        id = SND_AUDIOCODEC_AC3;
        break;
    case AUDIO_FORMAT_EAC3:
        id = SND_AUDIOCODEC_EAC3;
        break;
    default:
        ALOGE("%s: Unsupported audio format :%x", __func__, format);
    }

    return id;
}

int audio_extn_dolby_set_DMID(struct audio_device *adev)
{
    struct mixer_ctl *ctl;
    const char *mixer_ctl_name = "DS1 Security";
    char c_dmid[128] = {0};
    int i_dmid, ret;

    property_get("dmid",c_dmid,"0");
    i_dmid = atoi(c_dmid);

    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
    if (!ctl) {
        ALOGE("%s: Could not get ctl for mixer cmd - %s",
              __func__, mixer_ctl_name);
        return -EINVAL;
    }
    ALOGV("%s Dolby device manufacturer id is:%d",__func__,i_dmid);
    ret = mixer_ctl_set_value(ctl, 0, i_dmid);

    return ret;
}
#endif /* DS1_DOLBY_DDP_ENABLED */
+10 −0
Original line number Diff line number Diff line
@@ -157,4 +157,14 @@ size_t audio_extn_compr_cap_read(struct stream_in *in,
void audio_extn_compr_cap_deinit();
#endif

#ifndef DS1_DOLBY_DDP_ENABLED
#define audio_extn_dolby_is_supported_format(format)    (0)
#define audio_extn_dolby_get_snd_codec_id(format)       (0)
#define audio_extn_dolby_set_DMID(adev)                 (0)
#else
bool audio_extn_dolby_is_supported_format(audio_format_t format);
int audio_extn_dolby_get_snd_codec_id(audio_format_t format);
int audio_extn_dolby_set_DMID(struct audio_device *adev);
#endif

#endif /* AUDIO_EXTN_H */
+18 −3
Original line number Diff line number Diff line
@@ -165,7 +165,7 @@ static int get_snd_codec_id(audio_format_t format)
        id = SND_AUDIOCODEC_AAC;
        break;
    default:
        ALOGE("%s: Unsupported audio format", __func__);
        ALOGE("%s: Unsupported audio format :%x", __func__, format);
    }

    return id;
@@ -2022,7 +2022,8 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
            ret = -EINVAL;
            goto error_open;
        }
        if (!is_supported_format(config->offload_info.format)) {
        if (!is_supported_format(config->offload_info.format) &&
                !audio_extn_dolby_is_supported_format(config->offload_info.format)) {
            ALOGE("%s: Unsupported audio format", __func__);
            ret = -EINVAL;
            goto error_open;
@@ -2045,6 +2046,10 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
        out->stream.drain = out_drain;
        out->stream.flush = out_flush;

        if (audio_extn_dolby_is_supported_format(config->offload_info.format))
            out->compr_config.codec->id =
                audio_extn_dolby_get_snd_codec_id(config->offload_info.format);
        else
            out->compr_config.codec->id =
                get_snd_codec_id(config->offload_info.format);
        out->compr_config.fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
@@ -2065,6 +2070,16 @@ static int adev_open_output_stream(struct audio_hw_device *dev,
        ALOGV("%s: offloaded output offload_info version %04x bit rate %d",
                __func__, config->offload_info.version,
                config->offload_info.bit_rate);

        if (audio_extn_dolby_is_supported_format(out->format)) {
            ret = audio_extn_dolby_set_DMID(adev);
            if (ret != 0) {
                ALOGE("%s: Dolby DMID cannot be set error:%d",
                      __func__, ret);
                goto error_open;
            }
        }

    } else if (out->flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) {
        ret = voice_check_and_set_incall_music_usecase(adev, out);
        if (ret != 0) {