Loading hal/audio_extn/audio_extn.c +67 −39 Original line number Diff line number Diff line Loading @@ -373,20 +373,48 @@ static int update_custom_mtmx_coefficients(struct audio_device *adev, char mixer_ctl_name[128] = {0}; struct audio_custom_mtmx_params_info *pinfo = ¶ms->info; int i = 0, err = 0; int cust_ch_mixer_cfg[128], len = 0; ALOGI("%s: ip_channels %d, op_channels %d, pcm_device_id %d", __func__, pinfo->ip_channels, pinfo->op_channels, pcm_device_id); if (adev->use_old_pspd_mix_ctrl) { /* * Below code is to ensure backward compatibilty with older * kernel version. Use old mixer control to set mixer coefficients */ snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Audio Stream %d Channel Mix Cfg", pcm_device_id); ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); if (!ctl) { ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name); return -EINVAL; } cust_ch_mixer_cfg[len++] = pinfo->ip_channels; cust_ch_mixer_cfg[len++] = pinfo->op_channels; for (i = 0; i < (int) (pinfo->op_channels * pinfo->ip_channels); i++) { ALOGV("%s: coeff[%d] %d", __func__, i, params->coeffs[i]); cust_ch_mixer_cfg[len++] = params->coeffs[i]; } err = mixer_ctl_set_array(ctl, cust_ch_mixer_cfg, len); if (err) { ALOGE("%s: ERROR. Mixer ctl set failed", __func__); return -EINVAL; } ALOGD("%s: Mixer ctl set for %s success", __func__, mixer_ctl_name); } else { for (i = 0; i < (int)pinfo->op_channels; i++) { snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "%s %d %s %d", mixer_name_prefix, pcm_device_id, mixer_name_suffix, i+1); ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); if (!ctl) { ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name); return -EINVAL; } err = mixer_ctl_set_array(ctl, ¶ms->coeffs[pinfo->ip_channels * i], pinfo->ip_channels); Loading @@ -395,6 +423,7 @@ static int update_custom_mtmx_coefficients(struct audio_device *adev, return -EINVAL; } } } return 0; } Loading Loading @@ -500,7 +529,6 @@ void audio_extn_set_custom_mtmx_params(struct audio_device *adev, info.op_channels = audio_channel_count_from_in_mask( usecase->stream.in->channel_mask); } params = platform_get_custom_mtmx_params(adev->platform, &info); if (params) { if (enable) Loading hal/audio_hw.c +37 −0 Original line number Diff line number Diff line Loading @@ -1107,6 +1107,8 @@ int disable_audio_route(struct audio_device *adev, audio_extn_sound_trigger_update_stream_status(usecase, ST_EVENT_STREAM_FREE); audio_extn_listen_update_stream_status(usecase, LISTEN_EVENT_STREAM_FREE); audio_extn_set_custom_mtmx_params(adev, usecase, false); if (usecase->stream.out != NULL) usecase->stream.out->pspd_coeff_sent = false; ALOGV("%s: exit", __func__); return 0; } Loading Loading @@ -4915,6 +4917,7 @@ static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, int channels = 0; const size_t frame_size = audio_stream_out_frame_size(stream); const size_t frames = (frame_size != 0) ? bytes / frame_size : bytes; struct audio_usecase *usecase = NULL; ATRACE_BEGIN("out_write"); lock_output_stream(out); Loading Loading @@ -5037,6 +5040,20 @@ static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, adev->is_channel_status_set = true; } if ((adev->use_old_pspd_mix_ctrl == true) && (out->pspd_coeff_sent == false)) { /* * Need to resend pspd coefficients after stream started for * older kernel version as it does not save the coefficients * and also stream has to be started for coeff to apply. */ usecase = get_usecase_from_list(adev, out->usecase); if (usecase != NULL) { audio_extn_set_custom_mtmx_params(adev, usecase, true); out->pspd_coeff_sent = true; } } if (is_offload_usecase(out->usecase)) { ALOGVV("copl(%p): writing buffer (%zu bytes) to compress device", out, bytes); if (out->send_new_metadata) { Loading Loading @@ -6617,6 +6634,7 @@ int adev_open_output_stream(struct audio_hw_device *dev, out->dynamic_pm_qos_config_supported = 0; out->set_dual_mono = false; out->prev_card_status_offline = false; out->pspd_coeff_sent = false; if ((flags & AUDIO_OUTPUT_FLAG_BD) && (property_get_bool("vendor.audio.matrix.limiter.enable", false))) Loading Loading @@ -8742,6 +8760,8 @@ static int adev_open(const hw_module_t *module, const char *name, { int ret; char value[PROPERTY_VALUE_MAX] = {0}; char mixer_ctl_name[128] = {0}; struct mixer_ctl *ctl = NULL; ALOGD("%s: enter", __func__); if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL; Loading Loading @@ -8830,6 +8850,7 @@ static int adev_open(const hw_module_t *module, const char *name, adev->perf_lock_opts_size = 2; adev->dsp_bit_width_enforce_mode = 0; adev->enable_hfp = false; adev->use_old_pspd_mix_ctrl = false; /* Loads platform specific libraries dynamically */ adev->platform = platform_init(adev); Loading Loading @@ -9030,6 +9051,22 @@ static int adev_open(const hw_module_t *module, const char *name, if (adev->device_cfg_params == NULL) ALOGE("%s: Memory allocation failed for Device config params", __func__); /* * Check if new PSPD matrix mixer control is supported. If not * supported, then set flag so that old mixer ctrl is sent while * sending pspd coefficients on older kernel version. Query mixer * control for default pcm id and channel value one. */ snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "AudStr %d ChMixer Weight Ch %d", 0, 1); ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); if (!ctl) { ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name); adev->use_old_pspd_mix_ctrl = true; } ALOGV("%s: exit", __func__); return 0; } Loading hal/audio_hw.h +2 −1 Original line number Diff line number Diff line Loading @@ -375,6 +375,7 @@ struct stream_out { bool prev_card_status_offline; error_log_t *error_log; bool pspd_coeff_sent; }; struct stream_in { Loading Loading @@ -599,9 +600,9 @@ struct audio_device { * or other capabilities are present for the device corresponding to that usecase. */ struct pcm_params *use_case_table[AUDIO_USECASE_MAX]; struct listnode active_inputs_list; struct listnode active_outputs_list; bool use_old_pspd_mix_ctrl; }; int select_devices(struct audio_device *adev, Loading hal/msm8974/platform.c +2 −1 Original line number Diff line number Diff line Loading @@ -3225,6 +3225,8 @@ acdb_init_fail: strdup("SLIM_0_RX Format"); my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl = strdup("SLIM_0_RX SampleRate"); my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].channels_mixer_ctl = strdup("SLIM_0_RX Channels"); my_data->current_backend_cfg[DSD_NATIVE_BACKEND].bitwidth_mixer_ctl = strdup("SLIM_2_RX Format"); Loading Loading @@ -10067,4 +10069,3 @@ int platform_get_license_by_product(void *platform __unused, { return -ENOSYS; } Loading
hal/audio_extn/audio_extn.c +67 −39 Original line number Diff line number Diff line Loading @@ -373,20 +373,48 @@ static int update_custom_mtmx_coefficients(struct audio_device *adev, char mixer_ctl_name[128] = {0}; struct audio_custom_mtmx_params_info *pinfo = ¶ms->info; int i = 0, err = 0; int cust_ch_mixer_cfg[128], len = 0; ALOGI("%s: ip_channels %d, op_channels %d, pcm_device_id %d", __func__, pinfo->ip_channels, pinfo->op_channels, pcm_device_id); if (adev->use_old_pspd_mix_ctrl) { /* * Below code is to ensure backward compatibilty with older * kernel version. Use old mixer control to set mixer coefficients */ snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Audio Stream %d Channel Mix Cfg", pcm_device_id); ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); if (!ctl) { ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name); return -EINVAL; } cust_ch_mixer_cfg[len++] = pinfo->ip_channels; cust_ch_mixer_cfg[len++] = pinfo->op_channels; for (i = 0; i < (int) (pinfo->op_channels * pinfo->ip_channels); i++) { ALOGV("%s: coeff[%d] %d", __func__, i, params->coeffs[i]); cust_ch_mixer_cfg[len++] = params->coeffs[i]; } err = mixer_ctl_set_array(ctl, cust_ch_mixer_cfg, len); if (err) { ALOGE("%s: ERROR. Mixer ctl set failed", __func__); return -EINVAL; } ALOGD("%s: Mixer ctl set for %s success", __func__, mixer_ctl_name); } else { for (i = 0; i < (int)pinfo->op_channels; i++) { snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "%s %d %s %d", mixer_name_prefix, pcm_device_id, mixer_name_suffix, i+1); ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); if (!ctl) { ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name); return -EINVAL; } err = mixer_ctl_set_array(ctl, ¶ms->coeffs[pinfo->ip_channels * i], pinfo->ip_channels); Loading @@ -395,6 +423,7 @@ static int update_custom_mtmx_coefficients(struct audio_device *adev, return -EINVAL; } } } return 0; } Loading Loading @@ -500,7 +529,6 @@ void audio_extn_set_custom_mtmx_params(struct audio_device *adev, info.op_channels = audio_channel_count_from_in_mask( usecase->stream.in->channel_mask); } params = platform_get_custom_mtmx_params(adev->platform, &info); if (params) { if (enable) Loading
hal/audio_hw.c +37 −0 Original line number Diff line number Diff line Loading @@ -1107,6 +1107,8 @@ int disable_audio_route(struct audio_device *adev, audio_extn_sound_trigger_update_stream_status(usecase, ST_EVENT_STREAM_FREE); audio_extn_listen_update_stream_status(usecase, LISTEN_EVENT_STREAM_FREE); audio_extn_set_custom_mtmx_params(adev, usecase, false); if (usecase->stream.out != NULL) usecase->stream.out->pspd_coeff_sent = false; ALOGV("%s: exit", __func__); return 0; } Loading Loading @@ -4915,6 +4917,7 @@ static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, int channels = 0; const size_t frame_size = audio_stream_out_frame_size(stream); const size_t frames = (frame_size != 0) ? bytes / frame_size : bytes; struct audio_usecase *usecase = NULL; ATRACE_BEGIN("out_write"); lock_output_stream(out); Loading Loading @@ -5037,6 +5040,20 @@ static ssize_t out_write(struct audio_stream_out *stream, const void *buffer, adev->is_channel_status_set = true; } if ((adev->use_old_pspd_mix_ctrl == true) && (out->pspd_coeff_sent == false)) { /* * Need to resend pspd coefficients after stream started for * older kernel version as it does not save the coefficients * and also stream has to be started for coeff to apply. */ usecase = get_usecase_from_list(adev, out->usecase); if (usecase != NULL) { audio_extn_set_custom_mtmx_params(adev, usecase, true); out->pspd_coeff_sent = true; } } if (is_offload_usecase(out->usecase)) { ALOGVV("copl(%p): writing buffer (%zu bytes) to compress device", out, bytes); if (out->send_new_metadata) { Loading Loading @@ -6617,6 +6634,7 @@ int adev_open_output_stream(struct audio_hw_device *dev, out->dynamic_pm_qos_config_supported = 0; out->set_dual_mono = false; out->prev_card_status_offline = false; out->pspd_coeff_sent = false; if ((flags & AUDIO_OUTPUT_FLAG_BD) && (property_get_bool("vendor.audio.matrix.limiter.enable", false))) Loading Loading @@ -8742,6 +8760,8 @@ static int adev_open(const hw_module_t *module, const char *name, { int ret; char value[PROPERTY_VALUE_MAX] = {0}; char mixer_ctl_name[128] = {0}; struct mixer_ctl *ctl = NULL; ALOGD("%s: enter", __func__); if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0) return -EINVAL; Loading Loading @@ -8830,6 +8850,7 @@ static int adev_open(const hw_module_t *module, const char *name, adev->perf_lock_opts_size = 2; adev->dsp_bit_width_enforce_mode = 0; adev->enable_hfp = false; adev->use_old_pspd_mix_ctrl = false; /* Loads platform specific libraries dynamically */ adev->platform = platform_init(adev); Loading Loading @@ -9030,6 +9051,22 @@ static int adev_open(const hw_module_t *module, const char *name, if (adev->device_cfg_params == NULL) ALOGE("%s: Memory allocation failed for Device config params", __func__); /* * Check if new PSPD matrix mixer control is supported. If not * supported, then set flag so that old mixer ctrl is sent while * sending pspd coefficients on older kernel version. Query mixer * control for default pcm id and channel value one. */ snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "AudStr %d ChMixer Weight Ch %d", 0, 1); ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name); if (!ctl) { ALOGE("%s: ERROR. Could not get ctl for mixer cmd - %s", __func__, mixer_ctl_name); adev->use_old_pspd_mix_ctrl = true; } ALOGV("%s: exit", __func__); return 0; } Loading
hal/audio_hw.h +2 −1 Original line number Diff line number Diff line Loading @@ -375,6 +375,7 @@ struct stream_out { bool prev_card_status_offline; error_log_t *error_log; bool pspd_coeff_sent; }; struct stream_in { Loading Loading @@ -599,9 +600,9 @@ struct audio_device { * or other capabilities are present for the device corresponding to that usecase. */ struct pcm_params *use_case_table[AUDIO_USECASE_MAX]; struct listnode active_inputs_list; struct listnode active_outputs_list; bool use_old_pspd_mix_ctrl; }; int select_devices(struct audio_device *adev, Loading
hal/msm8974/platform.c +2 −1 Original line number Diff line number Diff line Loading @@ -3225,6 +3225,8 @@ acdb_init_fail: strdup("SLIM_0_RX Format"); my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl = strdup("SLIM_0_RX SampleRate"); my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].channels_mixer_ctl = strdup("SLIM_0_RX Channels"); my_data->current_backend_cfg[DSD_NATIVE_BACKEND].bitwidth_mixer_ctl = strdup("SLIM_2_RX Format"); Loading Loading @@ -10067,4 +10069,3 @@ int platform_get_license_by_product(void *platform __unused, { return -ENOSYS; }