summaryrefslogtreecommitdiffstats
path: root/hal
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2019-04-16 08:21:20 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-04-16 08:21:20 -0700
commit05d2b62f9eeff75874c83507485d4ca4eaa34a98 (patch)
tree815cfc981cd7d5fe2a99b51fce767edd9baed82b /hal
parentfb122f754c6a8aa4ba24707e0f0e2352521b96e4 (diff)
parent2e0395640a546ca2733b81b00d5df32fd776c2a6 (diff)
downloadhardware_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.c16
-rw-r--r--hal/msm8974/platform.c44
-rw-r--r--hal/platform_api.h5
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);