diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2019-04-16 08:21:20 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-04-16 08:21:20 -0700 |
commit | 05d2b62f9eeff75874c83507485d4ca4eaa34a98 (patch) | |
tree | 815cfc981cd7d5fe2a99b51fce767edd9baed82b /hal | |
parent | fb122f754c6a8aa4ba24707e0f0e2352521b96e4 (diff) | |
parent | 2e0395640a546ca2733b81b00d5df32fd776c2a6 (diff) | |
download | hardware_qcom_audio-05d2b62f9eeff75874c83507485d4ca4eaa34a98.tar.gz hardware_qcom_audio-05d2b62f9eeff75874c83507485d4ca4eaa34a98.tar.bz2 hardware_qcom_audio-05d2b62f9eeff75874c83507485d4ca4eaa34a98.zip |
Merge "hal: Add support for Backend port specific channel map"
Diffstat (limited to 'hal')
-rw-r--r-- | hal/msm8916/platform.c | 16 | ||||
-rw-r--r-- | hal/msm8974/platform.c | 44 | ||||
-rw-r--r-- | hal/platform_api.h | 5 |
3 files changed, 46 insertions, 19 deletions
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c index 3bf7628a..63191a04 100644 --- a/hal/msm8916/platform.c +++ b/hal/msm8916/platform.c @@ -6029,7 +6029,7 @@ static int platform_set_codec_backend_cfg(struct audio_device* adev, my_data->current_backend_cfg[backend_idx].channels = channels; if (backend_idx == HDMI_RX_BACKEND) - platform_set_edid_channels_configuration(adev->platform, channels, HDMI_RX_BACKEND); + platform_set_edid_channels_configuration(adev->platform, channels, HDMI_RX_BACKEND, snd_device); ALOGD("%s:becf: afe: %s set to %s", __func__, my_data->current_backend_cfg[backend_idx].channels_mixer_ctl, channel_cnt_str); @@ -6403,6 +6403,8 @@ static bool platform_check_codec_backend_cfg(struct audio_device* adev, if (channels != my_data->current_backend_cfg[backend_idx].channels) channels_updated = true; + + platform_set_edid_channels_configuration(adev->platform, channels, backend_idx, snd_device); } //check if mulitchannel clip needs to be down sampled to 48k @@ -7064,7 +7066,7 @@ int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel return -1; } } - ret = platform_set_channel_map(platform, channels, channel_map, snd_id); + ret = platform_set_channel_map(platform, channels, channel_map, snd_id, -1); return ret; } @@ -7204,7 +7206,7 @@ int platform_set_channel_allocation(void *platform, int channel_alloc) return ret; } -int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd_id) +int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd_id, int be_idx __unused) { struct mixer_ctl *ctl; char mixer_ctl_name[44] = {0}; // max length of name is 44 as defined @@ -7366,7 +7368,7 @@ bool platform_is_edid_supported_sample_rate(void *platform, int sample_rate) return false; } -int platform_set_edid_channels_configuration(void *platform, int channels, int backend_idx __unused) { +int platform_set_edid_channels_configuration(void *platform, int channels, int backend_idx __unused, snd_device_t snd_device __unused) { struct platform_data *my_data = (struct platform_data *)platform; struct audio_device *adev = my_data->adev; @@ -7399,9 +7401,9 @@ int platform_set_edid_channels_configuration(void *platform, int channels, int b */ if (adev_device_cfg_ptr->use_client_dev_cfg) { platform_set_channel_map(platform, adev_device_cfg_ptr->dev_cfg_params.channels, - (char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1); + (char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1, -1); } else { - platform_set_channel_map(platform, channel_count, info->channel_map, -1); + platform_set_channel_map(platform, channel_count, info->channel_map, -1, -1); } if (adev_device_cfg_ptr->use_client_dev_cfg) { @@ -7420,7 +7422,7 @@ int platform_set_edid_channels_configuration(void *platform, int channels, int b default_channelMap[0] = PCM_CHANNEL_FL; default_channelMap[1] = PCM_CHANNEL_FR; } - platform_set_channel_map(platform,2,default_channelMap,-1); + platform_set_channel_map(platform, 2, default_channelMap, -1, -1); platform_set_channel_allocation(platform,0); } } diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c index f5c9861c..72a1b412 100644 --- a/hal/msm8974/platform.c +++ b/hal/msm8974/platform.c @@ -6199,7 +6199,7 @@ static int platform_set_codec_backend_cfg(struct audio_device* adev, if ((backend_idx == HDMI_RX_BACKEND) || (backend_idx == DISP_PORT_RX_BACKEND)) - platform_set_edid_channels_configuration(adev->platform, channels, backend_idx); + platform_set_edid_channels_configuration(adev->platform, channels, backend_idx, snd_device); ALOGD("%s:becf: afe: %s set to %s ", __func__, my_data->current_backend_cfg[backend_idx].channels_mixer_ctl, @@ -6598,6 +6598,8 @@ static bool platform_check_codec_backend_cfg(struct audio_device* adev, if (channels != my_data->current_backend_cfg[backend_idx].channels) channels_updated = true; + + platform_set_edid_channels_configuration(adev->platform, channels, backend_idx, snd_device); } ALOGI("%s:becf: afe: Codec selected backend: %d updated bit width: %d and sample rate: %d", @@ -7243,7 +7245,7 @@ int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel return -1; } } - ret = platform_set_channel_map(platform, channels, channel_map, snd_id); + ret = platform_set_channel_map(platform, channels, channel_map, snd_id, -1); return ret; } @@ -7357,13 +7359,15 @@ int platform_set_channel_allocation(void *platform, int channel_alloc) return ret; } -int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd_id) +int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd_id, int be_idx) { - struct mixer_ctl *ctl; + struct mixer_ctl *ctl, *be_ctl = NULL; char mixer_ctl_name[44] = {0}; // max length of name is 44 as defined + char be_mixer_ctl_name[] = "Backend Device Channel Map"; int ret; unsigned int i; long set_values[FCC_8] = {0}; + long be_set_values[FCC_8 + 1] = {0}; struct platform_data *my_data = (struct platform_data *)platform; struct audio_device *adev = my_data->adev; ALOGV("%s channel_count:%d",__func__, ch_count); @@ -7379,7 +7383,19 @@ int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd if (snd_id >= 0) { snprintf(mixer_ctl_name, sizeof(mixer_ctl_name), "Playback Channel Map%d", snd_id); } else { - strlcpy(mixer_ctl_name, "Playback Device Channel Map", sizeof(mixer_ctl_name)); + if (be_idx >=0) { + be_ctl = mixer_get_ctl_by_name(adev->mixer, be_mixer_ctl_name); + if (!be_ctl) { + ALOGD("%s: Could not get ctl for mixer cmd - %s, using default control", + __func__, be_mixer_ctl_name); + strlcpy(mixer_ctl_name, "Playback Device Channel Map", sizeof(mixer_ctl_name)); + be_idx = -1; + } else { + strlcpy(mixer_ctl_name, "Backend Device Channel Map", sizeof(mixer_ctl_name)); + } + } else { + strlcpy(mixer_ctl_name, "Playback Device Channel Map", sizeof(mixer_ctl_name)); + } } ALOGD("%s mixer_ctl_name:%s", __func__, mixer_ctl_name); @@ -7398,7 +7414,13 @@ int platform_set_channel_map(void *platform, int ch_count, char *ch_map, int snd set_values[0], set_values[1], set_values[2], set_values[3], set_values[4], set_values[5], set_values[6], set_values[7], ch_count); - ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values)); + if (be_idx >= 0) { + be_set_values[0] = be_idx; + memcpy(&be_set_values[1], set_values, sizeof(long) * ch_count); + ret = mixer_ctl_set_array(ctl, be_set_values, ARRAY_SIZE(be_set_values)); + } else { + ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values)); + } if (ret < 0) { ALOGE("%s: Could not set ctl, error:%d ch_count:%d", __func__, ret, ch_count); @@ -7563,7 +7585,7 @@ int platform_edid_get_highest_supported_sr(void *platform) return 0; } -int platform_set_edid_channels_configuration(void *platform, int channels, int backend_idx) { +int platform_set_edid_channels_configuration(void *platform, int channels, int backend_idx, snd_device_t snd_device) { struct platform_data *my_data = (struct platform_data *)platform; struct audio_device *adev = my_data->adev; @@ -7572,6 +7594,7 @@ int platform_set_edid_channels_configuration(void *platform, int channels, int b int i, ret; char default_channelMap[MAX_CHANNELS_SUPPORTED] = {0}; struct audio_device_config_param *adev_device_cfg_ptr = adev->device_cfg_params; + int be_idx = -1; if ((backend_idx != HDMI_RX_BACKEND) && (backend_idx != DISP_PORT_RX_BACKEND)) { @@ -7579,6 +7602,7 @@ int platform_set_edid_channels_configuration(void *platform, int channels, int b return -EINVAL; } + be_idx = platform_get_snd_device_backend_index(snd_device); ret = platform_get_edid_info(platform); info = (edid_audio_info *)my_data->edid_info; adev_device_cfg_ptr += backend_idx; @@ -7601,9 +7625,9 @@ int platform_set_edid_channels_configuration(void *platform, int channels, int b */ if (adev_device_cfg_ptr->use_client_dev_cfg) { platform_set_channel_map(platform, adev_device_cfg_ptr->dev_cfg_params.channels, - (char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1); + (char *)adev_device_cfg_ptr->dev_cfg_params.channel_map, -1, be_idx); } else { - platform_set_channel_map(platform, channel_count, info->channel_map, -1); + platform_set_channel_map(platform, channel_count, info->channel_map, -1, be_idx); } if (adev_device_cfg_ptr->use_client_dev_cfg) { @@ -7622,7 +7646,7 @@ int platform_set_edid_channels_configuration(void *platform, int channels, int b default_channelMap[0] = PCM_CHANNEL_FL; default_channelMap[1] = PCM_CHANNEL_FR; } - platform_set_channel_map(platform,2,default_channelMap,-1); + platform_set_channel_map(platform, 2, default_channelMap, -1, be_idx); platform_set_channel_allocation(platform,0); } } diff --git a/hal/platform_api.h b/hal/platform_api.h index 80138c87..17afefce 100644 --- a/hal/platform_api.h +++ b/hal/platform_api.h @@ -225,7 +225,7 @@ int platform_set_channel_allocation(void *platform, int channel_alloc); int platform_get_edid_info(void *platform); int platform_get_supported_copp_sampling_rate(uint32_t stream_sr); int platform_set_channel_map(void *platform, int ch_count, char *ch_map, - int snd_id); + int snd_id, int be_idx); int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask, int snd_id, uint8_t *input_channel_map); int platform_set_stream_pan_scale_params(void *platform, @@ -235,7 +235,8 @@ int platform_set_stream_downmix_params(void *platform, int snd_id, snd_device_t snd_device, struct mix_matrix_params mm_params); -int platform_set_edid_channels_configuration(void *platform, int channels, int backend_idx); +int platform_set_edid_channels_configuration(void *platform, int channels, + int backend_idx, snd_device_t snd_device); unsigned char platform_map_to_edid_format(int format); bool platform_is_edid_supported_format(void *platform, int format); bool platform_is_edid_supported_sample_rate(void *platform, int sample_rate); |