Loading hal/audio_hw.c +4 −0 Original line number Diff line number Diff line Loading @@ -734,6 +734,9 @@ static int stop_input_stream(struct stream_in *in) return -EINVAL; } /* Close in-call recording streams */ voice_check_and_stop_incall_rec_usecase(adev, in); /* 1. Disable stream specific mixer controls */ disable_audio_route(adev, uc_info, true); Loading Loading @@ -2338,6 +2341,7 @@ static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) int ret; pthread_mutex_lock(&adev->lock); ALOGD("%s state %d\n", __func__, state); ret = voice_set_mic_mute((struct audio_device *)dev, state); pthread_mutex_unlock(&adev->lock); Loading hal/msm8974/platform.c +58 −2 Original line number Diff line number Diff line Loading @@ -1326,8 +1326,8 @@ int platform_set_parameters(void *platform, struct str_parms *parms) return ret; } int platform_set_incall_recoding_session_id(void *platform, uint32_t session_id) int platform_set_incall_recording_session_id(void *platform, uint32_t session_id, int rec_mode) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; Loading @@ -1353,6 +1353,62 @@ int platform_set_incall_recoding_session_id(void *platform, } } if (my_data->csd != NULL) { ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode); if (ret < 0) { ALOGE("%s: csd_client_start_record failed, error %d", __func__, ret); } } return ret; } int platform_stop_incall_recording_usecase(void *platform) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->csd != NULL) { ret = my_data->csd->stop_record(ALL_SESSION_VSID); if (ret < 0) { ALOGE("%s: csd_client_stop_record failed, error %d", __func__, ret); } } return ret; } int platform_start_incall_music_usecase(void *platform) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->csd != NULL) { ret = my_data->csd->start_playback(ALL_SESSION_VSID); if (ret < 0) { ALOGE("%s: csd_client_start_playback failed, error %d", __func__, ret); } } return ret; } int platform_stop_incall_music_usecase(void *platform) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->csd != NULL) { ret = my_data->csd->stop_playback(ALL_SESSION_VSID); if (ret < 0) { ALOGE("%s: csd_client_stop_playback failed, error %d", __func__, ret); } } return ret; } Loading hal/msm8974/platform.h +1 −1 Original line number Diff line number Diff line Loading @@ -219,7 +219,7 @@ 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, int); typedef int (*stop_record_t)(uint32_t); /* CSD Client structure */ struct csd_data { void *csd_client; Loading hal/platform_api.h +5 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,11 @@ int platform_edid_get_max_channels(void *platform); void platform_get_parameters(void *platform, struct str_parms *query, struct str_parms *reply); int platform_set_parameters(void *platform, struct str_parms *parms); int platform_set_incall_recoding_session_id(void *platform, uint32_t session_id); int platform_set_incall_recording_session_id(void *platform, uint32_t session_id, int rec_mode); int platform_stop_incall_recording_usecase(void *platform); int platform_start_incall_music_usecase(void *platform); int platform_stop_incall_music_usecase(void *platform); /* returns the latency for a usecase in Us */ int64_t platform_render_latency(audio_usecase_t usecase); int platform_update_usecase_from_source(int source, audio_usecase_t usecase); Loading hal/voice.c +32 −3 Original line number Diff line number Diff line Loading @@ -207,17 +207,21 @@ int voice_check_and_set_incall_rec_usecase(struct audio_device *adev, int ret = 0; uint32_t session_id; int usecase_id; int rec_mode = INCALL_REC_NONE; if (voice_is_in_call(adev)) { switch (in->source) { case AUDIO_SOURCE_VOICE_UPLINK: in->usecase = USECASE_INCALL_REC_UPLINK; rec_mode = INCALL_REC_UPLINK; break; case AUDIO_SOURCE_VOICE_DOWNLINK: in->usecase = USECASE_INCALL_REC_DOWNLINK; rec_mode = INCALL_REC_DOWNLINK; break; case AUDIO_SOURCE_VOICE_CALL: in->usecase = USECASE_INCALL_REC_UPLINK_AND_DOWNLINK; rec_mode = INCALL_REC_UPLINK_AND_DOWNLINK; break; default: ALOGV("%s: Source type %d doesnt match incall recording criteria", Loading @@ -226,8 +230,8 @@ int voice_check_and_set_incall_rec_usecase(struct audio_device *adev, } session_id = voice_get_active_session_id(adev); ret = platform_set_incall_recoding_session_id(adev->platform, session_id); ret = platform_set_incall_recording_session_id(adev->platform, session_id, rec_mode); ALOGV("%s: Update usecase to %d",__func__, in->usecase); } else { ALOGV("%s: voice call not active", __func__); Loading @@ -236,6 +240,21 @@ int voice_check_and_set_incall_rec_usecase(struct audio_device *adev, return ret; } int voice_check_and_stop_incall_rec_usecase(struct audio_device *adev, struct stream_in *in) { int ret = 0; if (in->source == AUDIO_SOURCE_VOICE_UPLINK || in->source == AUDIO_SOURCE_VOICE_DOWNLINK || in->source == AUDIO_SOURCE_VOICE_CALL) { ret = platform_stop_incall_recording_usecase(adev->platform); ALOGV("%s: Stop In-call recording", __func__); } return ret; } int voice_check_and_set_incall_music_usecase(struct audio_device *adev, struct stream_out *out) { Loading Loading @@ -358,6 +377,16 @@ int voice_set_parameters(struct audio_device *adev, struct str_parms *parms) } } ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_INCALLMUSIC, value, sizeof(value)); if (ret >= 0) { str_parms_del(parms, AUDIO_PARAMETER_KEY_INCALLMUSIC); if (strcmp(value, AUDIO_PARAMETER_VALUE_TRUE) == 0) platform_start_incall_music_usecase(adev->platform); else platform_stop_incall_music_usecase(adev->platform); } done: ALOGV("%s: exit with code(%d)", __func__, ret); return ret; Loading Loading
hal/audio_hw.c +4 −0 Original line number Diff line number Diff line Loading @@ -734,6 +734,9 @@ static int stop_input_stream(struct stream_in *in) return -EINVAL; } /* Close in-call recording streams */ voice_check_and_stop_incall_rec_usecase(adev, in); /* 1. Disable stream specific mixer controls */ disable_audio_route(adev, uc_info, true); Loading Loading @@ -2338,6 +2341,7 @@ static int adev_set_mic_mute(struct audio_hw_device *dev, bool state) int ret; pthread_mutex_lock(&adev->lock); ALOGD("%s state %d\n", __func__, state); ret = voice_set_mic_mute((struct audio_device *)dev, state); pthread_mutex_unlock(&adev->lock); Loading
hal/msm8974/platform.c +58 −2 Original line number Diff line number Diff line Loading @@ -1326,8 +1326,8 @@ int platform_set_parameters(void *platform, struct str_parms *parms) return ret; } int platform_set_incall_recoding_session_id(void *platform, uint32_t session_id) int platform_set_incall_recording_session_id(void *platform, uint32_t session_id, int rec_mode) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; Loading @@ -1353,6 +1353,62 @@ int platform_set_incall_recoding_session_id(void *platform, } } if (my_data->csd != NULL) { ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode); if (ret < 0) { ALOGE("%s: csd_client_start_record failed, error %d", __func__, ret); } } return ret; } int platform_stop_incall_recording_usecase(void *platform) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->csd != NULL) { ret = my_data->csd->stop_record(ALL_SESSION_VSID); if (ret < 0) { ALOGE("%s: csd_client_stop_record failed, error %d", __func__, ret); } } return ret; } int platform_start_incall_music_usecase(void *platform) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->csd != NULL) { ret = my_data->csd->start_playback(ALL_SESSION_VSID); if (ret < 0) { ALOGE("%s: csd_client_start_playback failed, error %d", __func__, ret); } } return ret; } int platform_stop_incall_music_usecase(void *platform) { int ret = 0; struct platform_data *my_data = (struct platform_data *)platform; if (my_data->csd != NULL) { ret = my_data->csd->stop_playback(ALL_SESSION_VSID); if (ret < 0) { ALOGE("%s: csd_client_stop_playback failed, error %d", __func__, ret); } } return ret; } Loading
hal/msm8974/platform.h +1 −1 Original line number Diff line number Diff line Loading @@ -219,7 +219,7 @@ 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, int); typedef int (*stop_record_t)(uint32_t); /* CSD Client structure */ struct csd_data { void *csd_client; Loading
hal/platform_api.h +5 −2 Original line number Diff line number Diff line Loading @@ -46,8 +46,11 @@ int platform_edid_get_max_channels(void *platform); void platform_get_parameters(void *platform, struct str_parms *query, struct str_parms *reply); int platform_set_parameters(void *platform, struct str_parms *parms); int platform_set_incall_recoding_session_id(void *platform, uint32_t session_id); int platform_set_incall_recording_session_id(void *platform, uint32_t session_id, int rec_mode); int platform_stop_incall_recording_usecase(void *platform); int platform_start_incall_music_usecase(void *platform); int platform_stop_incall_music_usecase(void *platform); /* returns the latency for a usecase in Us */ int64_t platform_render_latency(audio_usecase_t usecase); int platform_update_usecase_from_source(int source, audio_usecase_t usecase); Loading
hal/voice.c +32 −3 Original line number Diff line number Diff line Loading @@ -207,17 +207,21 @@ int voice_check_and_set_incall_rec_usecase(struct audio_device *adev, int ret = 0; uint32_t session_id; int usecase_id; int rec_mode = INCALL_REC_NONE; if (voice_is_in_call(adev)) { switch (in->source) { case AUDIO_SOURCE_VOICE_UPLINK: in->usecase = USECASE_INCALL_REC_UPLINK; rec_mode = INCALL_REC_UPLINK; break; case AUDIO_SOURCE_VOICE_DOWNLINK: in->usecase = USECASE_INCALL_REC_DOWNLINK; rec_mode = INCALL_REC_DOWNLINK; break; case AUDIO_SOURCE_VOICE_CALL: in->usecase = USECASE_INCALL_REC_UPLINK_AND_DOWNLINK; rec_mode = INCALL_REC_UPLINK_AND_DOWNLINK; break; default: ALOGV("%s: Source type %d doesnt match incall recording criteria", Loading @@ -226,8 +230,8 @@ int voice_check_and_set_incall_rec_usecase(struct audio_device *adev, } session_id = voice_get_active_session_id(adev); ret = platform_set_incall_recoding_session_id(adev->platform, session_id); ret = platform_set_incall_recording_session_id(adev->platform, session_id, rec_mode); ALOGV("%s: Update usecase to %d",__func__, in->usecase); } else { ALOGV("%s: voice call not active", __func__); Loading @@ -236,6 +240,21 @@ int voice_check_and_set_incall_rec_usecase(struct audio_device *adev, return ret; } int voice_check_and_stop_incall_rec_usecase(struct audio_device *adev, struct stream_in *in) { int ret = 0; if (in->source == AUDIO_SOURCE_VOICE_UPLINK || in->source == AUDIO_SOURCE_VOICE_DOWNLINK || in->source == AUDIO_SOURCE_VOICE_CALL) { ret = platform_stop_incall_recording_usecase(adev->platform); ALOGV("%s: Stop In-call recording", __func__); } return ret; } int voice_check_and_set_incall_music_usecase(struct audio_device *adev, struct stream_out *out) { Loading Loading @@ -358,6 +377,16 @@ int voice_set_parameters(struct audio_device *adev, struct str_parms *parms) } } ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_INCALLMUSIC, value, sizeof(value)); if (ret >= 0) { str_parms_del(parms, AUDIO_PARAMETER_KEY_INCALLMUSIC); if (strcmp(value, AUDIO_PARAMETER_VALUE_TRUE) == 0) platform_start_incall_music_usecase(adev->platform); else platform_stop_incall_music_usecase(adev->platform); } done: ALOGV("%s: exit with code(%d)", __func__, ret); return ret; Loading