hal: update to add BE channel configuration for USB capture
Update to add BE channel configuration for USB capture and more
BE configuration options for sample rate and channel number.
Change-Id: I1e0af7a19a67aecba5afae95ecc62eec4a2d650b
CRs-Fixed: 1071868
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 47f251f..c949e7f 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -244,7 +244,6 @@
bool edid_valid;
int ext_disp_type;
codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
- codec_backend_cfg_t current_tx_backend_cfg[MAX_CODEC_TX_BACKENDS];
char ec_ref_mixer_path[64];
char codec_version[CODEC_VERSION_MAX_LENGTH];
int hw_dep_fd;
@@ -1897,16 +1896,13 @@
my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
+ if (idx > MAX_RX_CODEC_BACKENDS)
+ my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
}
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].sample_rate =
- CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].bit_width =
- CODEC_BACKEND_DEFAULT_BIT_WIDTH;
-
if (is_external_codec) {
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
strdup("SLIM_0_RX Format");
@@ -1923,9 +1919,9 @@
my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
strdup("SLIM_6_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[SLIMBUS_0_TX].bitwidth_mixer_ctl =
strdup("SLIM_0_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[SLIMBUS_0_TX].samplerate_mixer_ctl =
strdup("SLIM_0_TX SampleRate");
} else {
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
@@ -1933,16 +1929,17 @@
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
strdup("MI2S_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
strdup("MI2S_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
strdup("MI2S_TX SampleRate");
-
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
- strdup("USB_AUDIO_TX Format");
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
- strdup("USB_AUDIO_TX SampleRate");
}
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
+ strdup("USB_AUDIO_TX Format");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
+ strdup("USB_AUDIO_TX SampleRate");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
+ strdup("USB_AUDIO_TX Channels");
my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].bitwidth_mixer_ctl =
strdup("USB_AUDIO_RX Format");
@@ -2485,7 +2482,7 @@
{
int32_t port = DEFAULT_CODEC_BACKEND;
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
if (backend_tag_table[snd_device] != NULL) {
if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
sizeof("headphones-44.1")) == 0)
@@ -2500,29 +2497,17 @@
else if (strcmp(backend_tag_table[snd_device], "usb-headphones") == 0)
port = USB_AUDIO_RX_BACKEND;
}
- } else {
- ALOGV("%s:napb: Invalid device - %d ", __func__, snd_device);
- }
-
- ALOGV("%s:napb: backend port - %d device - %d ", __func__, port,
- snd_device);
- return port;
-}
-
-static int platform_get_capture_backend_index(snd_device_t snd_device)
-{
- int32_t port = DEFAULT_CODEC_TX_BACKEND;
-
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
+ port = DEFAULT_CODEC_TX_BACKEND;
if (backend_tag_table[snd_device] != NULL) {
if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
port = USB_AUDIO_TX_BACKEND;
}
} else {
- ALOGW("%s: Invalid device - %d ", __func__, snd_device);
+ ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
}
- ALOGV("%s: backend port - %d snd_device %d", __func__, port, snd_device);
+ ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
return port;
}
@@ -4239,7 +4224,7 @@
if (bit_width !=
my_data->current_backend_cfg[backend_idx].bit_width) {
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
ctl = mixer_get_ctl_by_name(adev->mixer,
my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
if (!ctl) {
@@ -4296,14 +4281,24 @@
rate_str = "KHZ_44P1";
break;
case 64000:
- case 88200:
case 96000:
rate_str = "KHZ_96";
break;
+ case 88200:
+ rate_str = "KHZ_88P2";
+ break;
case 176400:
+ rate_str = "KHZ_176P4";
+ break;
case 192000:
rate_str = "KHZ_192";
break;
+ case 352800:
+ rate_str = "KHZ_352P8";
+ break;
+ case 384000:
+ rate_str = "KHZ_384";
+ break;
default:
rate_str = "KHZ_48";
break;
@@ -4343,6 +4338,9 @@
channel_cnt_str = "Four"; break;
case 3:
channel_cnt_str = "Three"; break;
+ case 1:
+ channel_cnt_str = "One"; break;
+ case 2:
default:
channel_cnt_str = "Two"; break;
}
@@ -4695,127 +4693,6 @@
}
/*
- * configures afe with bit width and Sample Rate
- */
-
-static int platform_set_capture_codec_backend_cfg(struct audio_device* adev,
- snd_device_t snd_device,
- struct audio_backend_cfg backend_cfg)
-{
- int ret = 0;
- int backend_idx = platform_get_capture_backend_index(snd_device);
- struct platform_data *my_data = (struct platform_data *)adev->platform;
-
- ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, backend_idx %d device (%s)",
- __func__, backend_cfg.bit_width, backend_cfg.sample_rate, backend_idx,
- platform_get_snd_device_name(snd_device));
-
- if (backend_cfg.bit_width !=
- my_data->current_tx_backend_cfg[backend_idx].bit_width) {
-
- struct mixer_ctl *ctl = NULL;
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- if (!ctl) {
- ALOGE("%s:txbecf: afe: Could not get ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- if (backend_cfg.bit_width == 24) {
- if (backend_cfg.format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
- else
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
- } else {
- ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
- }
-
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].bit_width = backend_cfg.bit_width;
- ALOGD("%s:txbecf: afe: %s mixer set to %d bit", __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl,
- backend_cfg.bit_width);
- }
-
- /*
- * Backend sample rate configuration follows:
- * 16 bit record - 48khz for streams at any valid sample rate
- * 24 bit record - 48khz for stream sample rate less than 48khz
- * 24 bit record - 96khz for sample rate range of 48khz to 96khz
- * 24 bit record - 192khz for sample rate range of 96khz to 192 khz
- * Upper limit is inclusive in the sample rate range.
- */
- // TODO: This has to be more dynamic based on policy file
-
- if (backend_cfg.sample_rate !=
- my_data->current_tx_backend_cfg[(int)backend_idx].sample_rate) {
- /*
- * sample rate update is needed only for hifi audio enabled platforms
- */
- char *rate_str = NULL;
- struct mixer_ctl *ctl = NULL;
-
- switch (backend_cfg.sample_rate) {
- case 8000:
- case 11025:
- case 16000:
- case 22050:
- case 32000:
- case 44100:
- case 48000:
- rate_str = "KHZ_48";
- break;
- case 64000:
- case 88200:
- case 96000:
- rate_str = "KHZ_96";
- break;
- case 176400:
- case 192000:
- rate_str = "KHZ_192";
- break;
- default:
- rate_str = "KHZ_48";
- break;
- }
-
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
-
- if (ctl < 0) {
- ALOGE("%s:txbecf: afe: Could not get ctl to set the Sample Rate for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- ALOGD("%s:txbecf: afe: %s set to %s", __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl,
- rate_str);
- ret = mixer_ctl_set_enum_by_string(ctl, rate_str);
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].sample_rate =
- backend_cfg.sample_rate;
- }
-
- return ret;
-}
-
-/*
* goes through all the current usecases and picks the highest
* bitwidth & samplerate
*/
@@ -4834,7 +4711,8 @@
channels = backend_cfg->channels;
ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
- "sample rate: %d",__func__,backend_idx, bit_width, sample_rate);
+ "sample rate: %d, channels %d",__func__,backend_idx, bit_width,
+ sample_rate, channels);
// For voice calls use default configuration i.e. 16b/48K, only applicable to
// default backend
@@ -4856,14 +4734,17 @@
"sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
// Force routing if the expected bitwdith or samplerate
// is not same as current backend comfiguration
- if ((bit_width != my_data->current_tx_backend_cfg[backend_idx].bit_width) ||
- (sample_rate != my_data->current_tx_backend_cfg[backend_idx].sample_rate)) {
+ if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
+ (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
+ (channels != my_data->current_backend_cfg[backend_idx].channels)) {
backend_cfg->bit_width = bit_width;
backend_cfg->sample_rate= sample_rate;
+ backend_cfg->channels = channels;
backend_change = true;
ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
- "new sample rate: %d", __func__, backend_cfg->bit_width,
- backend_cfg->sample_rate);
+ "new sample rate: %d new channel: %d",
+ __func__, backend_cfg->bit_width,
+ backend_cfg->sample_rate, backend_cfg->channels);
}
return backend_change;
@@ -4872,7 +4753,7 @@
bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
struct audio_usecase *usecase, snd_device_t snd_device)
{
- int backend_idx = platform_get_capture_backend_index(snd_device);
+ int backend_idx = platform_get_backend_index(snd_device);
int ret = 0;
struct audio_backend_cfg backend_cfg;
@@ -4898,8 +4779,8 @@
platform_get_snd_device_name(snd_device));
if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
&backend_cfg)) {
- ret = platform_set_capture_codec_backend_cfg(adev, snd_device,
- backend_cfg);
+ ret = platform_set_codec_backend_cfg(adev, snd_device,
+ backend_cfg);
if(!ret)
return true;
}