diff options
| author | Ravi Kumar Alamanda <ralama@codeaurora.org> | 2014-05-19 18:14:57 -0700 |
|---|---|---|
| committer | Vineeta Srivastava <vsrivastava@google.com> | 2014-05-23 08:39:35 -0700 |
| commit | 83281a951af159ca00517f6132fab39727b293f5 (patch) | |
| tree | eccbed023ea3b278a8ed6eb3044f37d25ef1bd4e | |
| parent | aeac395b9fef46d9e80c3838d42f9b6c75d38618 (diff) | |
| download | android_hardware_qcom_audio-83281a951af159ca00517f6132fab39727b293f5.tar.gz android_hardware_qcom_audio-83281a951af159ca00517f6132fab39727b293f5.tar.bz2 android_hardware_qcom_audio-83281a951af159ca00517f6132fab39727b293f5.zip | |
hal: Add voice call support for msm8084 target
Update platform file to load CSD libraries to enable voice calls.
Change-Id: Ie2aa194a2addc82a5121f92eb39c8d434cc42f26
| -rw-r--r-- | hal/Android.mk | 9 | ||||
| -rw-r--r-- | hal/audio_hw.c | 18 | ||||
| -rw-r--r-- | hal/msm8960/platform.c | 14 | ||||
| -rw-r--r-- | hal/msm8974/platform.c | 336 | ||||
| -rw-r--r-- | hal/msm8974/platform.h | 60 | ||||
| -rw-r--r-- | hal/platform_api.h | 6 |
6 files changed, 426 insertions, 17 deletions
diff --git a/hal/Android.mk b/hal/Android.mk index 69f46f93..67d7443f 100644 --- a/hal/Android.mk +++ b/hal/Android.mk @@ -10,6 +10,9 @@ AUDIO_PLATFORM := $(TARGET_BOARD_PLATFORM) ifneq ($(filter msm8974 msm8226 msm8084,$(TARGET_BOARD_PLATFORM)),) # B-family platform uses msm8974 code base AUDIO_PLATFORM = msm8974 +ifneq ($(filter msm8084,$(TARGET_BOARD_PLATFORM)),) + LOCAL_CFLAGS := -DPLATFORM_MSM8084 +endif endif LOCAL_SRC_FILES := \ @@ -24,7 +27,6 @@ LOCAL_SHARED_LIBRARIES := \ libaudioroute \ libdl - LOCAL_C_INCLUDES += \ external/tinyalsa/include \ external/tinycompress/include \ @@ -32,6 +34,11 @@ LOCAL_C_INCLUDES += \ $(call include-path-for, audio-effects) \ $(LOCAL_PATH)/$(AUDIO_PLATFORM) +ifneq ($(filter msm8084,$(TARGET_BOARD_PLATFORM)),) + LOCAL_SHARED_LIBRARIES += libmdmdetect + LOCAL_C_INCLUDES += $(TARGET_OUT_HEADERS)/libmdmdetect/inc +endif + LOCAL_MODULE := audio.primary.$(TARGET_BOARD_PLATFORM) LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw diff --git a/hal/audio_hw.c b/hal/audio_hw.c index 4a15874c..712b0027 100644 --- a/hal/audio_hw.c +++ b/hal/audio_hw.c @@ -520,6 +520,15 @@ static int select_devices(struct audio_device *adev, disable_snd_device(adev, usecase->in_snd_device); } + /* Applicable only on the targets that has external modem. + * New device information should be sent to modem before enabling + * the devices to reduce in-call device switch time. + */ + if (usecase->type == VOICE_CALL) + status = platform_switch_voice_call_enable_device_config(adev->platform, + out_snd_device, + in_snd_device); + /* Enable new sound devices */ if (out_snd_device != SND_DEVICE_NONE) { if (usecase->devices & AUDIO_DEVICE_OUT_ALL_CODEC_BACKEND) @@ -542,6 +551,15 @@ static int select_devices(struct audio_device *adev, enable_audio_route(adev, usecase); + /* Applicable only on the targets that has external modem. + * Enable device command should be sent to modem only after + * enabling voice call mixer controls + */ + if (usecase->type == VOICE_CALL) + status = platform_switch_voice_call_usecase_route_post(adev->platform, + out_snd_device, + in_snd_device); + return status; } diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c index e9c205a6..ae551b97 100644 --- a/hal/msm8960/platform.c +++ b/hal/msm8960/platform.c @@ -923,3 +923,17 @@ int64_t platform_render_latency(audio_usecase_t usecase) return 0; } } + +int platform_switch_voice_call_enable_device_config(void *platform, + snd_device_t out_snd_device, + snd_device_t in_snd_device) +{ + return 0; +} + +int platform_switch_voice_call_usecase_route_post(void *platform, + snd_device_t out_snd_device, + snd_device_t in_snd_device) +{ + return 0; +} diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c index ed125c1a..52337055 100644 --- a/hal/msm8974/platform.c +++ b/hal/msm8974/platform.c @@ -26,6 +26,9 @@ #include <audio_hw.h> #include <platform_api.h> #include "platform.h" +#ifdef PLATFORM_MSM8084 +#include "mdm_detect.h" +#endif #define MIXER_XML_PATH "/system/etc/mixer_paths.xml" #define LIB_ACDB_LOADER "libacdbloader.so" @@ -63,10 +66,16 @@ struct audio_block_header int length; }; +/* Audio calibration related functions */ typedef void (*acdb_deallocate_t)(); +#ifdef PLATFORM_MSM8084 +typedef int (*acdb_init_t)(char *); +#else typedef int (*acdb_init_t)(); +#endif typedef void (*acdb_send_audio_cal_t)(int, int); typedef void (*acdb_send_voice_cal_t)(int, int); +typedef int (*acdb_reload_vocvoltable_t)(int); /* Audio calibration related functions */ struct platform_data { @@ -80,16 +89,25 @@ struct platform_data { acdb_deallocate_t acdb_deallocate; acdb_send_audio_cal_t acdb_send_audio_cal; acdb_send_voice_cal_t acdb_send_voice_cal; + acdb_reload_vocvoltable_t acdb_reload_vocvoltable; + struct csd_data *csd; }; static const int pcm_device_table[AUDIO_USECASE_MAX][2] = { - [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {0, 0}, - [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {15, 15}, - [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {1, 1}, - [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {9, 9}, - [USECASE_AUDIO_RECORD] = {0, 0}, - [USECASE_AUDIO_RECORD_LOW_LATENCY] = {15, 15}, - [USECASE_VOICE_CALL] = {2, 2}, + [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE, + DEEP_BUFFER_PCM_DEVICE}, + [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE, + LOWLATENCY_PCM_DEVICE}, + [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE, + MULTIMEDIA2_PCM_DEVICE}, + [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {PLAYBACK_OFFLOAD_DEVICE, + PLAYBACK_OFFLOAD_DEVICE}, + [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, + AUDIO_RECORD_PCM_DEVICE}, + [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE, + LOWLATENCY_PCM_DEVICE}, + [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, + VOICE_CALL_PCM_DEVICE}, }; /* Array to store sound devices */ @@ -156,7 +174,7 @@ static const int acdb_device_table[SND_DEVICE_MAX] = { [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 15, [SND_DEVICE_OUT_BT_SCO] = 22, [SND_DEVICE_OUT_BT_SCO_WB] = 39, - [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = 88, + [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = ACDB_ID_VOICE_HANDSET_TMUS, [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17, [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17, [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37, @@ -175,7 +193,7 @@ static const int acdb_device_table[SND_DEVICE_MAX] = { [SND_DEVICE_IN_CAMCORDER_MIC] = 61, [SND_DEVICE_IN_VOICE_DMIC_EF] = 41, [SND_DEVICE_IN_VOICE_DMIC_BS] = 5, - [SND_DEVICE_IN_VOICE_DMIC_EF_TMUS] = 89, + [SND_DEVICE_IN_VOICE_DMIC_EF_TMUS] = ACDB_ID_VOICE_DMIC_EF_TMUS, [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_EF] = 43, [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BS] = 12, [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16, @@ -265,11 +283,176 @@ static int set_echo_reference(struct mixer *mixer, const char* ec_ref) return 0; } +static struct csd_data *open_csd_client(bool i2s_ext_modem) +{ + struct csd_data *csd = calloc(1, sizeof(struct csd_data)); + + csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW); + if (csd->csd_client == NULL) { + ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT); + goto error; + } else { + ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT); + + csd->deinit = (deinit_t)dlsym(csd->csd_client, + "csd_client_deinit"); + if (csd->deinit == NULL) { + ALOGE("%s: dlsym error %s for csd_client_deinit", __func__, + dlerror()); + goto error; + } + csd->disable_device = (disable_device_t)dlsym(csd->csd_client, + "csd_client_disable_device"); + if (csd->disable_device == NULL) { + ALOGE("%s: dlsym error %s for csd_client_disable_device", + __func__, dlerror()); + goto error; + } + csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client, + "csd_client_enable_device_config"); + if (csd->enable_device_config == NULL) { + ALOGE("%s: dlsym error %s for csd_client_enable_device_config", + __func__, dlerror()); + goto error; + } + csd->enable_device = (enable_device_t)dlsym(csd->csd_client, + "csd_client_enable_device"); + if (csd->enable_device == NULL) { + ALOGE("%s: dlsym error %s for csd_client_enable_device", + __func__, dlerror()); + goto error; + } + csd->start_voice = (start_voice_t)dlsym(csd->csd_client, + "csd_client_start_voice"); + if (csd->start_voice == NULL) { + ALOGE("%s: dlsym error %s for csd_client_start_voice", + __func__, dlerror()); + goto error; + } + csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client, + "csd_client_stop_voice"); + if (csd->stop_voice == NULL) { + ALOGE("%s: dlsym error %s for csd_client_stop_voice", + __func__, dlerror()); + goto error; + } + csd->volume = (volume_t)dlsym(csd->csd_client, + "csd_client_volume"); + if (csd->volume == NULL) { + ALOGE("%s: dlsym error %s for csd_client_volume", + __func__, dlerror()); + goto error; + } + csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client, + "csd_client_mic_mute"); + if (csd->mic_mute == NULL) { + ALOGE("%s: dlsym error %s for csd_client_mic_mute", + __func__, dlerror()); + goto error; + } + csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client, + "csd_client_slow_talk"); + if (csd->slow_talk == NULL) { + ALOGE("%s: dlsym error %s for csd_client_slow_talk", + __func__, dlerror()); + goto error; + } + csd->start_playback = (start_playback_t)dlsym(csd->csd_client, + "csd_client_start_playback"); + if (csd->start_playback == NULL) { + ALOGE("%s: dlsym error %s for csd_client_start_playback", + __func__, dlerror()); + goto error; + } + csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client, + "csd_client_stop_playback"); + if (csd->stop_playback == NULL) { + ALOGE("%s: dlsym error %s for csd_client_stop_playback", + __func__, dlerror()); + goto error; + } + csd->start_record = (start_record_t)dlsym(csd->csd_client, + "csd_client_start_record"); + if (csd->start_record == NULL) { + ALOGE("%s: dlsym error %s for csd_client_start_record", + __func__, dlerror()); + goto error; + } + csd->stop_record = (stop_record_t)dlsym(csd->csd_client, + "csd_client_stop_record"); + if (csd->stop_record == NULL) { + ALOGE("%s: dlsym error %s for csd_client_stop_record", + __func__, dlerror()); + goto error; + } + + csd->get_sample_rate = (get_sample_rate_t)dlsym(csd->csd_client, + "csd_client_get_sample_rate"); + if (csd->get_sample_rate == NULL) { + ALOGE("%s: dlsym error %s for csd_client_get_sample_rate", + __func__, dlerror()); + + goto error; + } + + csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init"); + + if (csd->init == NULL) { + ALOGE("%s: dlsym error %s for csd_client_init", + __func__, dlerror()); + goto error; + } else { + csd->init(i2s_ext_modem); + } + } + return csd; + +error: + free(csd); + csd = NULL; + return csd; +} + +void close_csd_client(struct csd_data *csd) +{ + if (csd != NULL) { + csd->deinit(); + dlclose(csd->csd_client); + free(csd); + csd = NULL; + } +} + +static void platform_csd_init(struct platform_data *my_data) +{ +#ifdef PLATFORM_MSM8084 + struct dev_info mdm_detect_info; + int ret = 0; + + /* Call ESOC API to get the number of modems. + * If the number of modems is not zero, load CSD Client specific + * symbols. Voice call is handled by MDM and apps processor talks to + * MDM through CSD Client + */ + ret = get_system_info(&mdm_detect_info); + if (ret > 0) { + ALOGE("%s: Failed to get system info, ret %d", __func__, ret); + } + ALOGD("%s: num_modems %d\n", __func__, mdm_detect_info.num_modems); + + if (mdm_detect_info.num_modems > 0) + my_data->csd = open_csd_client(false /*is_i2s_ext_modem*/); +#else + my_data->csd = NULL; +#endif +} + void *platform_init(struct audio_device *adev) { char value[PROPERTY_VALUE_MAX]; struct platform_data *my_data; int retry_num = 0; + const char *snd_card_name; adev->mixer = mixer_open(MIXER_CARD); @@ -284,6 +467,9 @@ void *platform_init(struct audio_device *adev) return NULL; } + snd_card_name = mixer_get_name(adev->mixer); + ALOGD("%s: snd_card_name: %s", __func__, snd_card_name); + adev->audio_route = audio_route_init(MIXER_CARD, MIXER_XML_PATH); if (!adev->audio_route) { ALOGE("%s: Failed to init audio route controls, aborting.", __func__); @@ -331,21 +517,47 @@ void *platform_init(struct audio_device *adev) ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER); my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle, "acdb_loader_deallocate_ACDB"); + if (!my_data->acdb_deallocate) + ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s", + __func__, LIB_ACDB_LOADER); + my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle, "acdb_loader_send_audio_cal"); if (!my_data->acdb_send_audio_cal) - ALOGW("%s: Could not find the symbol acdb_send_audio_cal from %s", + ALOGE("%s: Could not find the symbol acdb_send_audio_cal from %s", __func__, LIB_ACDB_LOADER); + my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle, "acdb_loader_send_voice_cal"); + if (!my_data->acdb_send_voice_cal) + ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s", + __func__, LIB_ACDB_LOADER); + + my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle, + "acdb_loader_reload_vocvoltable"); + if (!my_data->acdb_reload_vocvoltable) + ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s", + __func__, LIB_ACDB_LOADER); +#ifdef PLATFORM_MSM8084 + my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle, + "acdb_loader_init_v2"); + if (my_data->acdb_init == NULL) + ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror()); + else + my_data->acdb_init(snd_card_name); +#else my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle, "acdb_loader_init_ACDB"); if (my_data->acdb_init == NULL) ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror()); else my_data->acdb_init(); +#endif } + /* load csd client */ + platform_csd_init(my_data); + return my_data; } @@ -413,7 +625,48 @@ int platform_send_audio_calibration(void *platform, snd_device_t snd_device) int platform_switch_voice_call_device_pre(void *platform) { - return 0; + struct platform_data *my_data = (struct platform_data *)platform; + int ret = 0; + + if (my_data->csd != NULL && + my_data->adev->mode == AUDIO_MODE_IN_CALL) { + /* This must be called before disabling mixer controls on APQ side */ + ret = my_data->csd->disable_device(); + if (ret < 0) { + ALOGE("%s: csd_client_disable_device, failed, error %d", + __func__, ret); + } + } + return ret; +} + +int platform_switch_voice_call_enable_device_config(void *platform, + snd_device_t out_snd_device, + snd_device_t in_snd_device) +{ + struct platform_data *my_data = (struct platform_data *)platform; + int acdb_rx_id, acdb_tx_id; + int ret = 0; + + if (my_data->csd == NULL) + return ret; + + acdb_rx_id = acdb_device_table[out_snd_device]; + + acdb_tx_id = acdb_device_table[in_snd_device]; + + if (acdb_rx_id > 0 && acdb_tx_id > 0) { + ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id); + if (ret < 0) { + ALOGE("%s: csd_enable_device_config, failed, error %d", + __func__, ret); + } + } else { + ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__, + acdb_rx_id, acdb_tx_id); + } + + return ret; } int platform_switch_voice_call_device_post(void *platform, @@ -439,14 +692,61 @@ int platform_switch_voice_call_device_post(void *platform, return 0; } +int platform_switch_voice_call_usecase_route_post(void *platform, + snd_device_t out_snd_device, + snd_device_t in_snd_device) +{ + struct platform_data *my_data = (struct platform_data *)platform; + int acdb_rx_id, acdb_tx_id; + int ret = 0; + + if (my_data->csd == NULL) + return ret; + + acdb_rx_id = acdb_device_table[out_snd_device]; + + acdb_tx_id = acdb_device_table[in_snd_device]; + + if (acdb_rx_id > 0 && acdb_tx_id > 0) { + ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id, + my_data->adev->acdb_settings); + if (ret < 0) { + ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret); + } + } else { + ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__, + acdb_rx_id, acdb_tx_id); + } + + return ret; +} + int platform_start_voice_call(void *platform) { - return 0; + struct platform_data *my_data = (struct platform_data *)platform; + int ret = 0; + + if (my_data->csd != NULL) { + ret = my_data->csd->start_voice(VOICE_VSID); + if (ret < 0) { + ALOGE("%s: csd_start_voice error %d\n", __func__, ret); + } + } + return ret; } int platform_stop_voice_call(void *platform) { - return 0; + struct platform_data *my_data = (struct platform_data *)platform; + int ret = 0; + + if (my_data->csd != NULL) { + ret = my_data->csd->stop_voice(VOICE_VSID); + if (ret < 0) { + ALOGE("%s: csd_stop_voice error %d\n", __func__, ret); + } + } + return ret; } int platform_set_voice_volume(void *platform, int volume) @@ -479,8 +779,14 @@ int platform_set_voice_volume(void *platform, int volume) ALOGV("%s: failed set mixer ctl by %d", __func__, ret); return -EINVAL; } - - return 0; + if (my_data->csd != NULL) { + ret = my_data->csd->volume(ALL_SESSION_VSID, volume, + DEFAULT_VOLUME_RAMP_DURATION_MS); + if (ret < 0) { + ALOGE("%s: csd_volume error %d", __func__, ret); + } + } + return ret; } int platform_set_mic_mute(void *platform, bool state) diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h index 558c91c6..c4f2a474 100644 --- a/hal/msm8974/platform.h +++ b/hal/msm8974/platform.h @@ -97,12 +97,19 @@ enum { #define DEFAULT_OUTPUT_SAMPLING_RATE 48000 #define ALL_SESSION_VSID 0xFFFFFFFF -#define DEFAULT_MUTE_RAMP_DURATION 500 +#define DEFAULT_MUTE_RAMP_DURATION 20 #define DEFAULT_VOLUME_RAMP_DURATION_MS 20 #define VOLUME_SET 0 #define MUTE_SET 1 #define VOLUME_CTL_PARAM_NUM 3 +#ifdef MSM8084 +#define ACDB_ID_VOICE_HANDSET_TMUS 88 +#define ACDB_ID_VOICE_DMIC_EF_TMUS 89 +#else +#define ACDB_ID_VOICE_HANDSET_TMUS 7 +#define ACDB_ID_VOICE_DMIC_EF_TMUS 41 +#endif /* * tinyAlsa library interprets period size as number of frames * one frame = channel_count * sizeof (pcm sample) @@ -124,4 +131,55 @@ enum { #define AUDIO_CAPTURE_PERIOD_DURATION_MSEC 20 #define AUDIO_CAPTURE_PERIOD_COUNT 2 +#define DEEP_BUFFER_PCM_DEVICE 0 +#define AUDIO_RECORD_PCM_DEVICE 0 +#define MULTIMEDIA2_PCM_DEVICE 1 +#define PLAYBACK_OFFLOAD_DEVICE 9 +#define LOWLATENCY_PCM_DEVICE 15 +#define VOICE_VSID 0x10C01000 +#ifdef PLATFORM_MSM8084 +#define VOICE_CALL_PCM_DEVICE 20 +#else +#define VOICE_CALL_PCM_DEVICE 2 +#endif + +#define LIB_CSD_CLIENT "libcsd-client.so" +#define LIB_MDM_DETECT "libmdmdetect.so" + +/* CSD-CLIENT related functions */ +typedef int (*init_t)(bool); +typedef int (*deinit_t)(); +typedef int (*disable_device_t)(); +typedef int (*enable_device_config_t)(int, int); +typedef int (*enable_device_t)(int, int, uint32_t); +typedef int (*volume_t)(uint32_t, int, uint16_t); +typedef int (*mic_mute_t)(uint32_t, int, uint16_t); +typedef int (*slow_talk_t)(uint32_t, uint8_t); +typedef int (*start_voice_t)(uint32_t); +typedef int (*stop_voice_t)(uint32_t); +typedef int (*start_playback_t)(uint32_t); +typedef int (*stop_playback_t)(uint32_t); +typedef int (*start_record_t)(uint32_t, int); +typedef int (*stop_record_t)(uint32_t); +typedef int (*get_sample_rate_t)(uint32_t *); +/* CSD Client structure */ +struct csd_data { + void *csd_client; + init_t init; + deinit_t deinit; + disable_device_t disable_device; + enable_device_config_t enable_device_config; + enable_device_t enable_device; + volume_t volume; + mic_mute_t mic_mute; + slow_talk_t slow_talk; + start_voice_t start_voice; + stop_voice_t stop_voice; + start_playback_t start_playback; + stop_playback_t stop_playback; + start_record_t start_record; + stop_record_t stop_record; + get_sample_rate_t get_sample_rate; +}; + #endif // QCOM_AUDIO_PLATFORM_H diff --git a/hal/platform_api.h b/hal/platform_api.h index afd2ee41..7079e8c1 100644 --- a/hal/platform_api.h +++ b/hal/platform_api.h @@ -24,9 +24,15 @@ void platform_add_backend_name(char *mixer_path, snd_device_t snd_device); int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type); int platform_send_audio_calibration(void *platform, snd_device_t snd_device); int platform_switch_voice_call_device_pre(void *platform); +int platform_switch_voice_call_enable_device_config(void *platform, + snd_device_t out_snd_device, + snd_device_t in_snd_device); int platform_switch_voice_call_device_post(void *platform, snd_device_t out_snd_device, snd_device_t in_snd_device); +int platform_switch_voice_call_usecase_route_post(void *platform, + snd_device_t out_snd_device, + snd_device_t in_snd_device); int platform_start_voice_call(void *platform); int platform_stop_voice_call(void *platform); int platform_set_voice_volume(void *platform, int volume); |
