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

Commit ba2749ab authored by Arun Mirpuri's avatar Arun Mirpuri Committed by Eric Laurent
Browse files

hal: Add incall stereo capture

Add mixer control to pass channel config to kernel
to support incall stereo capture.

Bug: 79869195
Test: voice call regression

Change-Id: Ic2c9ebfc42cfc7a6e0d1a9facb4d2658f6c343cb
parent 5a333c11
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ ifneq ($(filter sdm845,$(TARGET_BOARD_PLATFORM)),)
  LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
  LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED
  LOCAL_CFLAGS += -DINCALL_MUSIC_ENABLED
  LOCAL_CFLAGS += -DINCALL_STEREO_CAPTURE_ENABLED
  MULTIPLE_HW_VARIANTS_ENABLED := true
endif
endif
+12 −0
Original line number Diff line number Diff line
@@ -5006,6 +5006,18 @@ static int adev_open_input_stream(struct audio_hw_device *dev,
    in->capture_handle = handle;
    in->flags = flags;

    ALOGV("%s: source = %d, config->channel_mask = %d", __func__, source, config->channel_mask);
    if (source == AUDIO_SOURCE_VOICE_UPLINK ||
         source == AUDIO_SOURCE_VOICE_DOWNLINK) {
        /* Force channel config requested to mono if incall
           record is being requested for only uplink/downlink */
        if (config->channel_mask != AUDIO_CHANNEL_IN_MONO) {
            config->channel_mask = AUDIO_CHANNEL_IN_MONO;
            ret = -EINVAL;
            goto err_open;
        }
    }

    if (is_usb_dev && may_use_hifi_record) {
        /* HiFi record selects an appropriate format, channel, rate combo
           depending on sink capabilities*/
+7 −0
Original line number Diff line number Diff line
@@ -2146,6 +2146,13 @@ int platform_set_incall_recording_session_id(void *platform,
    return ret;
}

int platform_set_incall_recording_session_channels(void *platform __unused,
                                             uint32_t channel_count __unused)
{
    return 0;
}


int platform_stop_incall_recording_usecase(void *platform __unused)
{
    return 0;
+29 −0
Original line number Diff line number Diff line
@@ -3259,6 +3259,35 @@ int platform_set_incall_recording_session_id(void *platform,
    return ret;
}

int platform_set_incall_recording_session_channels(void *platform,
                                             uint32_t channel_count)
{
    int ret = 0;
    struct platform_data *my_data = (struct platform_data *)platform;
    struct audio_device *adev = my_data->adev;
    const char *mixer_ctl_name = "Voc Rec Config";
    int num_ctl_values;
    int i;
    struct mixer_ctl *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);
        ret = -EINVAL;
    } else {
        num_ctl_values = mixer_ctl_get_num_values(ctl);
        for (i = 0; i < num_ctl_values; i++) {
            if (mixer_ctl_set_value(ctl, i, channel_count)) {
                ALOGE("Error: invalid channel count: %x", channel_count);
                ret = -EINVAL;
                break;
            }
        }
    }

    return ret;
}

int platform_stop_incall_recording_usecase(void *platform)
{
    int ret = 0;
+2 −0
Original line number Diff line number Diff line
@@ -104,6 +104,8 @@ int64_t platform_render_latency(audio_usecase_t usecase);

int platform_set_incall_recording_session_id(void *platform,
                                             uint32_t session_id, int rec_mode);
int platform_set_incall_recording_session_channels(void *platform,
                                                   uint32_t session_channels);
int platform_stop_incall_recording_usecase(void *platform);
int platform_start_incall_music_usecase(void *platform);
int platform_stop_incall_music_usecase(void *platform);
Loading