Loading hal/audio_extn/ext_hw_plugin.c +52 −16 Original line number Diff line number Diff line Loading @@ -47,6 +47,11 @@ typedef int32_t (*audio_hal_plugin_deinit_t)(void); typedef int32_t (*audio_hal_plugin_send_msg_t)(audio_hal_plugin_msg_type_t, void *, uint32_t); struct hostless_module { struct pcm *pcm_tx; struct pcm *pcm_rx; }; struct ext_hw_plugin_data { struct audio_device *adev; void *plugin_handle; Loading @@ -57,23 +62,32 @@ struct ext_hw_plugin_data { snd_device_t out_snd_dev[AUDIO_HAL_PLUGIN_USECASE_MAX]; snd_device_t in_snd_dev[AUDIO_HAL_PLUGIN_USECASE_MAX]; bool mic_mute; struct hostless_module adev_hostless; }; /* This can be defined in platform specific file or use compile flag */ #define LIB_PLUGIN_DRIVER "libaudiohalplugin.so" /* Note: Due to ADP H/W design, SoC TERT/SEC TDM CLK and FSYNC lines are both connected * with CODEC and a single master is needed to provide consistent CLK and FSYNC to slaves, * hence configuring SoC TERT TDM as single master and bring up a dummy hostless from TERT * to SEC to ensure both slave SoC SEC TDM and CODEC are driven upon system boot. */ static void audio_extn_ext_hw_plugin_enable_adev_hostless(struct audio_device *adev) /* Note: Due to ADP H/W design, SoC TERT/SEC TDM CLK and FSYNC lines are * both connected with CODEC and a single master is needed to provide * consistent CLK and FSYNC to slaves, hence configuring SoC TERT TDM as * single master and bring up a dummy hostless from TERT to SEC to ensure * both slave SoC SEC TDM and CODEC are driven upon system boot. */ static void audio_extn_ext_hw_plugin_enable_adev_hostless(void *plugin) { struct ext_hw_plugin_data *my_plugin = (struct ext_hw_plugin_data *)plugin; char mixer_path[MIXER_PATH_MAX_LENGTH]; ALOGI("%s: Enable TERT -> SEC Hostless", __func__); char mixer_path[MIXER_PATH_MAX_LENGTH]; strlcpy(mixer_path, "dummy-hostless", MIXER_PATH_MAX_LENGTH); ALOGD("%s: apply mixer and update path: %s", __func__, mixer_path); audio_route_apply_and_update_path(adev->audio_route, mixer_path); if (audio_route_apply_and_update_path(my_plugin->adev->audio_route, mixer_path)) { ALOGE("%s: %s not supported, continue", __func__, mixer_path); return; } /* TERT TDM TX 7 HOSTLESS to SEC TDM RX 7 HOSTLESS */ int pcm_dev_rx = 48, pcm_dev_tx = 49; Loading @@ -88,31 +102,51 @@ static void audio_extn_ext_hw_plugin_enable_adev_hostless(struct audio_device *a .avail_min = 0, }; struct pcm *pcm_tx = pcm_open(adev->snd_card, my_plugin->adev_hostless.pcm_tx = pcm_open(my_plugin->adev->snd_card, pcm_dev_tx, PCM_IN, &pcm_config_lb); if (pcm_tx && !pcm_is_ready(pcm_tx)) { ALOGE("%s: %s", __func__, pcm_get_error(pcm_tx)); if (my_plugin->adev_hostless.pcm_tx && !pcm_is_ready(my_plugin->adev_hostless.pcm_tx)) { ALOGE("%s: %s", __func__, pcm_get_error(my_plugin->adev_hostless.pcm_tx)); return; } struct pcm *pcm_rx = pcm_open(adev->snd_card, my_plugin->adev_hostless.pcm_rx = pcm_open(my_plugin->adev->snd_card, pcm_dev_rx, PCM_OUT, &pcm_config_lb); if (pcm_rx && !pcm_is_ready(pcm_rx)) { ALOGE("%s: %s", __func__, pcm_get_error(pcm_rx)); if (my_plugin->adev_hostless.pcm_rx && !pcm_is_ready(my_plugin->adev_hostless.pcm_rx)) { ALOGE("%s: %s", __func__, pcm_get_error(my_plugin->adev_hostless.pcm_rx)); return; } if (pcm_start(pcm_tx) < 0) { if (pcm_start(my_plugin->adev_hostless.pcm_tx) < 0) { ALOGE("%s: pcm start for pcm tx failed", __func__); return; } if (pcm_start(pcm_rx) < 0) { if (pcm_start(my_plugin->adev_hostless.pcm_rx) < 0) { ALOGE("%s: pcm start for pcm rx failed", __func__); return; } } static void audio_extn_ext_hw_plugin_disable_adev_hostless(void *plugin) { struct ext_hw_plugin_data *my_plugin = (struct ext_hw_plugin_data *)plugin; ALOGI("%s: Disable TERT -> SEC Hostless", __func__); if (my_plugin->adev_hostless.pcm_tx) { pcm_close(my_plugin->adev_hostless.pcm_tx); my_plugin->adev_hostless.pcm_tx = NULL; } if (my_plugin->adev_hostless.pcm_rx) { pcm_close(my_plugin->adev_hostless.pcm_rx); my_plugin->adev_hostless.pcm_rx = NULL; } } void* audio_extn_ext_hw_plugin_init(struct audio_device *adev) { int32_t ret = 0; Loading Loading @@ -165,7 +199,7 @@ void* audio_extn_ext_hw_plugin_init(struct audio_device *adev) } } audio_extn_ext_hw_plugin_enable_adev_hostless(adev); audio_extn_ext_hw_plugin_enable_adev_hostless(my_plugin); my_plugin->mic_mute = false; return my_plugin; Loading @@ -187,6 +221,8 @@ int32_t audio_extn_ext_hw_plugin_deinit(void *plugin) return -EINVAL; } audio_extn_ext_hw_plugin_disable_adev_hostless(my_plugin); if (my_plugin->audio_hal_plugin_deinit) { ret = my_plugin->audio_hal_plugin_deinit(); if (ret) { Loading Loading
hal/audio_extn/ext_hw_plugin.c +52 −16 Original line number Diff line number Diff line Loading @@ -47,6 +47,11 @@ typedef int32_t (*audio_hal_plugin_deinit_t)(void); typedef int32_t (*audio_hal_plugin_send_msg_t)(audio_hal_plugin_msg_type_t, void *, uint32_t); struct hostless_module { struct pcm *pcm_tx; struct pcm *pcm_rx; }; struct ext_hw_plugin_data { struct audio_device *adev; void *plugin_handle; Loading @@ -57,23 +62,32 @@ struct ext_hw_plugin_data { snd_device_t out_snd_dev[AUDIO_HAL_PLUGIN_USECASE_MAX]; snd_device_t in_snd_dev[AUDIO_HAL_PLUGIN_USECASE_MAX]; bool mic_mute; struct hostless_module adev_hostless; }; /* This can be defined in platform specific file or use compile flag */ #define LIB_PLUGIN_DRIVER "libaudiohalplugin.so" /* Note: Due to ADP H/W design, SoC TERT/SEC TDM CLK and FSYNC lines are both connected * with CODEC and a single master is needed to provide consistent CLK and FSYNC to slaves, * hence configuring SoC TERT TDM as single master and bring up a dummy hostless from TERT * to SEC to ensure both slave SoC SEC TDM and CODEC are driven upon system boot. */ static void audio_extn_ext_hw_plugin_enable_adev_hostless(struct audio_device *adev) /* Note: Due to ADP H/W design, SoC TERT/SEC TDM CLK and FSYNC lines are * both connected with CODEC and a single master is needed to provide * consistent CLK and FSYNC to slaves, hence configuring SoC TERT TDM as * single master and bring up a dummy hostless from TERT to SEC to ensure * both slave SoC SEC TDM and CODEC are driven upon system boot. */ static void audio_extn_ext_hw_plugin_enable_adev_hostless(void *plugin) { struct ext_hw_plugin_data *my_plugin = (struct ext_hw_plugin_data *)plugin; char mixer_path[MIXER_PATH_MAX_LENGTH]; ALOGI("%s: Enable TERT -> SEC Hostless", __func__); char mixer_path[MIXER_PATH_MAX_LENGTH]; strlcpy(mixer_path, "dummy-hostless", MIXER_PATH_MAX_LENGTH); ALOGD("%s: apply mixer and update path: %s", __func__, mixer_path); audio_route_apply_and_update_path(adev->audio_route, mixer_path); if (audio_route_apply_and_update_path(my_plugin->adev->audio_route, mixer_path)) { ALOGE("%s: %s not supported, continue", __func__, mixer_path); return; } /* TERT TDM TX 7 HOSTLESS to SEC TDM RX 7 HOSTLESS */ int pcm_dev_rx = 48, pcm_dev_tx = 49; Loading @@ -88,31 +102,51 @@ static void audio_extn_ext_hw_plugin_enable_adev_hostless(struct audio_device *a .avail_min = 0, }; struct pcm *pcm_tx = pcm_open(adev->snd_card, my_plugin->adev_hostless.pcm_tx = pcm_open(my_plugin->adev->snd_card, pcm_dev_tx, PCM_IN, &pcm_config_lb); if (pcm_tx && !pcm_is_ready(pcm_tx)) { ALOGE("%s: %s", __func__, pcm_get_error(pcm_tx)); if (my_plugin->adev_hostless.pcm_tx && !pcm_is_ready(my_plugin->adev_hostless.pcm_tx)) { ALOGE("%s: %s", __func__, pcm_get_error(my_plugin->adev_hostless.pcm_tx)); return; } struct pcm *pcm_rx = pcm_open(adev->snd_card, my_plugin->adev_hostless.pcm_rx = pcm_open(my_plugin->adev->snd_card, pcm_dev_rx, PCM_OUT, &pcm_config_lb); if (pcm_rx && !pcm_is_ready(pcm_rx)) { ALOGE("%s: %s", __func__, pcm_get_error(pcm_rx)); if (my_plugin->adev_hostless.pcm_rx && !pcm_is_ready(my_plugin->adev_hostless.pcm_rx)) { ALOGE("%s: %s", __func__, pcm_get_error(my_plugin->adev_hostless.pcm_rx)); return; } if (pcm_start(pcm_tx) < 0) { if (pcm_start(my_plugin->adev_hostless.pcm_tx) < 0) { ALOGE("%s: pcm start for pcm tx failed", __func__); return; } if (pcm_start(pcm_rx) < 0) { if (pcm_start(my_plugin->adev_hostless.pcm_rx) < 0) { ALOGE("%s: pcm start for pcm rx failed", __func__); return; } } static void audio_extn_ext_hw_plugin_disable_adev_hostless(void *plugin) { struct ext_hw_plugin_data *my_plugin = (struct ext_hw_plugin_data *)plugin; ALOGI("%s: Disable TERT -> SEC Hostless", __func__); if (my_plugin->adev_hostless.pcm_tx) { pcm_close(my_plugin->adev_hostless.pcm_tx); my_plugin->adev_hostless.pcm_tx = NULL; } if (my_plugin->adev_hostless.pcm_rx) { pcm_close(my_plugin->adev_hostless.pcm_rx); my_plugin->adev_hostless.pcm_rx = NULL; } } void* audio_extn_ext_hw_plugin_init(struct audio_device *adev) { int32_t ret = 0; Loading Loading @@ -165,7 +199,7 @@ void* audio_extn_ext_hw_plugin_init(struct audio_device *adev) } } audio_extn_ext_hw_plugin_enable_adev_hostless(adev); audio_extn_ext_hw_plugin_enable_adev_hostless(my_plugin); my_plugin->mic_mute = false; return my_plugin; Loading @@ -187,6 +221,8 @@ int32_t audio_extn_ext_hw_plugin_deinit(void *plugin) return -EINVAL; } audio_extn_ext_hw_plugin_disable_adev_hostless(my_plugin); if (my_plugin->audio_hal_plugin_deinit) { ret = my_plugin->audio_hal_plugin_deinit(); if (ret) { Loading