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

Commit 5a10aea1 authored by Shiv Maliyappanahalli's avatar Shiv Maliyappanahalli Committed by Gerrit - the friendly Code Review server
Browse files

hal: Add support for 3-mic surround sound recording

Add support for stereo surround sound recording using 3 mics.

Change-Id: I741dd5507d72ac45dff8006d3875abe8dbdc2df2
parent 7c131ef8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ ifeq ($(strip $(AUDIO_FEATURE_ENABLED_SSR)),true)
    LOCAL_CFLAGS += -DSSR_ENABLED
    LOCAL_SRC_FILES += audio_extn/ssr.c
    LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/mm-audio/surround_sound/
    LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/mm-audio/surround_sound_3mic/
    LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/common/inc/
endif

+2 −0
Original line number Diff line number Diff line
@@ -565,6 +565,7 @@ void audio_extn_set_parameters(struct audio_device *adev,
   audio_extn_fm_set_parameters(adev, parms);
   audio_extn_sound_trigger_set_parameters(adev, parms);
   audio_extn_listen_set_parameters(adev, parms);
   audio_extn_ssr_set_parameters(adev, parms);
   audio_extn_hfp_set_parameters(adev, parms);
   audio_extn_dts_eagle_set_parameters(adev, parms);
   audio_extn_ddp_set_parameters(adev, parms);
@@ -584,6 +585,7 @@ void audio_extn_get_parameters(const struct audio_device *adev,
    char *kv_pairs = NULL;
    audio_extn_get_afe_proxy_parameters(query, reply);
    audio_extn_get_fluence_parameters(adev, query, reply);
    audio_extn_ssr_get_parameters(adev, query, reply);
    get_active_offload_usecases(adev, query, reply);
    audio_extn_dts_eagle_get_parameters(adev, query, reply);
    audio_extn_hpx_get_parameters(query, reply);
+12 −2
Original line number Diff line number Diff line
@@ -175,18 +175,28 @@ bool audio_extn_usb_is_proxy_inuse();
#endif

#ifndef SSR_ENABLED
#define audio_extn_ssr_init(in)                       (0)
#define audio_extn_ssr_init(in, num_out_chan)         (0)
#define audio_extn_ssr_deinit()                       (0)
#define audio_extn_ssr_update_enabled()               (0)
#define audio_extn_ssr_get_enabled()                  (0)
#define audio_extn_ssr_read(stream, buffer, bytes)    (0)
#define audio_extn_ssr_set_parameters(adev, parms)    (0)
#define audio_extn_ssr_get_parameters(adev, parms, reply) (0)
#define audio_extn_ssr_get_stream()                   (0)
#else
int32_t audio_extn_ssr_init(struct stream_in *in);
int32_t audio_extn_ssr_init(struct stream_in *in,
                            int num_out_chan);
int32_t audio_extn_ssr_deinit();
void audio_extn_ssr_update_enabled();
bool audio_extn_ssr_get_enabled();
int32_t audio_extn_ssr_read(struct audio_stream_in *stream,
                       void *buffer, size_t bytes);
void audio_extn_ssr_set_parameters(struct audio_device *adev,
                                   struct str_parms *parms);
void audio_extn_ssr_get_parameters(const struct audio_device *adev,
                                   struct str_parms *query,
                                   struct str_parms *reply);
struct stream_in *audio_extn_ssr_get_stream();
#endif

#ifndef HW_VARIANTS_ENABLED
+647 −53

File changed.

Preview size limit exceeded, changes collapsed.

+24 −10
Original line number Diff line number Diff line
@@ -1057,6 +1057,10 @@ static int stop_input_stream(struct stream_in *in)
    /* 2. Disable the tx device */
    disable_snd_device(adev, uc_info->in_snd_device);

    if (audio_extn_ssr_get_stream() == in) {
        audio_extn_ssr_deinit();
    }

    list_remove(&uc_info->list);
    free(uc_info);

@@ -2781,8 +2785,7 @@ static ssize_t in_read(struct audio_stream_in *stream, void *buffer,
        adev->adm_request_focus(adev->adm_data, in->capture_handle);

    if (in->pcm) {
        if (audio_extn_ssr_get_enabled() &&
                audio_channel_count_from_in_mask(in->channel_mask) == 6)
        if (audio_extn_ssr_get_stream() == in)
            ret = audio_extn_ssr_read(stream, buffer, bytes);
        else if (audio_extn_compr_cap_usecase_supported(in->usecase))
            ret = audio_extn_compr_cap_read(in, buffer, bytes);
@@ -3650,15 +3653,27 @@ static int adev_open_input_stream(struct audio_hw_device *dev,
        in->config = pcm_config_afe_proxy_record;
        in->config.channels = channel_count;
        in->config.rate = config->sample_rate;
    } else if (channel_count == 6) {
        if(audio_extn_ssr_get_enabled()) {
            if(audio_extn_ssr_init(in)) {
    } else if (audio_extn_ssr_get_enabled() &&
               ((channel_count == 2) || (channel_count == 6)) &&
               ((AUDIO_SOURCE_MIC == source) || (AUDIO_SOURCE_CAMCORDER == source))) {
        ALOGD("%s: Found SSR use case starting SSR lib with channel_count :%d",
               __func__, channel_count);
        if (audio_extn_ssr_init(in, channel_count)) {
            ALOGE("%s: audio_extn_ssr_init failed", __func__);
            if (channel_count == 2) {
                ALOGD("%s: falling back to default record usecase", __func__);
                in->config.channels = channel_count;
                frame_size = audio_stream_in_frame_size(&in->stream);
                buffer_size = get_input_buffer_size(config->sample_rate,
                                        config->format,
                                        channel_count,
                                        is_low_latency);
                in->config.period_size = buffer_size / frame_size;
            } else {
                ALOGD("%s: unable to start SSR record session for 6 channel input", __func__);
                ret = -EINVAL;
                goto err_open;
            }
        } else {
            ALOGW("%s: surround sound recording is not supported", __func__);
        }
    } else if (audio_extn_compr_cap_enabled() &&
            audio_extn_compr_cap_format_supported(config->format) &&
@@ -3717,8 +3732,7 @@ static void adev_close_input_stream(struct audio_hw_device *dev,
    } else
        in_standby(&stream->common);

    if (audio_extn_ssr_get_enabled() &&
            (audio_channel_count_from_in_mask(in->channel_mask) == 6)) {
    if (audio_extn_ssr_get_stream() == in) {
        audio_extn_ssr_deinit();
    }

Loading