Loading hal/audio_hw.c +3 −4 Original line number Diff line number Diff line Loading @@ -1923,11 +1923,10 @@ static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) (voice_extn_compress_voip_is_format_supported(in->format)) && (in->config.rate == 8000 || in->config.rate == 16000) && (popcount(in->channel_mask) == 1)) { ret = voice_extn_compress_voip_open_input_stream(in); if (ret != 0) { err = voice_extn_compress_voip_open_input_stream(in); if (err != 0) { ALOGE("%s: Compress voip input cannot be opened, error:%d", __func__, ret); goto done; __func__, err); } } } Loading hal/voice_extn/compress_voip.c +48 −18 Original line number Diff line number Diff line Loading @@ -59,8 +59,9 @@ struct voip_data { struct pcm *pcm_rx; struct pcm *pcm_tx; struct stream_out *out_stream; int ref_count; int out_stream_count; uint32_t out_stream_count; uint32_t in_stream_count; uint32_t sample_rate; }; #define MODE_IS127 0x2 Loading @@ -78,13 +79,15 @@ struct voip_data { #define AUDIO_PARAMETER_VALUE_VOIP_TRUE "true" #define AUDIO_PARAMETER_KEY_VOIP_CHECK "voip_flag" #define AUDIO_PARAMETER_KEY_VOIP_OUT_STREAM_COUNT "voip_out_stream_count" #define AUDIO_PARAMETER_KEY_VOIP_SAMPLE_RATE "voip_sample_rate" static struct voip_data voip_data = { .pcm_rx = NULL, .pcm_tx = NULL, .out_stream = NULL, .ref_count = 0, .out_stream_count = 0 .out_stream_count = 0, .in_stream_count = 0, .sample_rate = 0 }; static int voip_set_volume(struct audio_device *adev, int volume); Loading Loading @@ -280,10 +283,10 @@ static int voip_stop_call(struct audio_device *adev) int i, ret = 0; struct audio_usecase *uc_info; ALOGD("%s: enter, ref_count=%d", __func__, voip_data.ref_count); voip_data.ref_count--; ALOGD("%s: enter, out_stream_count=%d, in_stream_count=%d", __func__, voip_data.out_stream_count, voip_data.in_stream_count); if (!voip_data.ref_count) { if (!voip_data.out_stream_count && !voip_data.in_stream_count) { uc_info = get_usecase_from_list(adev, USECASE_COMPRESS_VOIP_CALL); if (uc_info == NULL) { ALOGE("%s: Could not find the usecase (%d) in the list", Loading @@ -310,8 +313,10 @@ static int voip_stop_call(struct audio_device *adev) list_remove(&uc_info->list); free(uc_info); voip_data.sample_rate = 0; } else ALOGV("%s: NO-OP because ref_count=%d", __func__, voip_data.ref_count); ALOGV("%s: NO-OP because out_stream_count=%d, in_stream_count=%d", __func__, voip_data.out_stream_count, voip_data.in_stream_count); ALOGV("%s: exit: status(%d)", __func__, ret); return ret; Loading @@ -327,12 +332,15 @@ static int voip_start_call(struct audio_device *adev, ALOGD("%s: enter", __func__); uc_info = get_usecase_from_list(adev, USECASE_COMPRESS_VOIP_CALL); if ((uc_info == NULL) && (voip_data.out_stream)) { if (uc_info == NULL) { ALOGV("%s: voip usecase is added to the list", __func__); uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); uc_info->id = USECASE_COMPRESS_VOIP_CALL; uc_info->type = VOIP_CALL; if (voip_data.out_stream) uc_info->stream.out = voip_data.out_stream; else uc_info->stream.out = adev->primary_output; uc_info->in_snd_device = SND_DEVICE_NONE; uc_info->out_snd_device = SND_DEVICE_NONE; Loading Loading @@ -388,12 +396,15 @@ static int voip_start_call(struct audio_device *adev, ALOGE("%s: error %d\n", __func__, ret); goto error_start_voip; } voip_data.ref_count = 0; } else } else { ALOGV("%s: voip usecase is already enabled", __func__); if (voip_data.out_stream) uc_info->stream.out = voip_data.out_stream; else uc_info->stream.out = adev->primary_output; select_devices(adev, USECASE_COMPRESS_VOIP_CALL); } voip_data.ref_count++; return 0; error_start_voip: Loading Loading @@ -472,6 +483,13 @@ void voice_extn_compress_voip_get_parameters(const struct audio_device *adev, str_parms_add_int(reply, AUDIO_PARAMETER_KEY_VOIP_OUT_STREAM_COUNT, voip_data.out_stream_count); } ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_VOIP_SAMPLE_RATE, value, sizeof(value)); if (ret >= 0) { str_parms_add_int(reply, AUDIO_PARAMETER_KEY_VOIP_SAMPLE_RATE, voip_data.sample_rate); } } void voice_extn_compress_voip_out_get_parameters(struct stream_out *out, Loading Loading @@ -576,9 +594,9 @@ int voice_extn_compress_voip_close_output_stream(struct audio_stream *stream) ALOGD("%s: enter", __func__); voip_data.out_stream_count--; ret = voip_stop_call(adev); voip_data.out_stream = NULL; voip_data.out_stream_count--; ALOGV("%s: exit: status(%d)", __func__, ret); return ret; Loading @@ -600,7 +618,7 @@ int voice_extn_compress_voip_open_output_stream(struct stream_out *out) voip_data.out_stream = out; voip_data.out_stream_count++; voip_data.sample_rate = out->sample_rate; ret = voip_set_mode(out->dev, out->format); ALOGV("%s: exit", __func__); Loading @@ -615,6 +633,7 @@ int voice_extn_compress_voip_close_input_stream(struct audio_stream *stream) ALOGD("%s: enter", __func__); voip_data.in_stream_count--; status = voip_stop_call(adev); ALOGV("%s: exit: status(%d)", __func__, status); Loading @@ -630,15 +649,25 @@ int voice_extn_compress_voip_open_input_stream(struct stream_in *in) ALOGD("%s: enter", __func__); if ((voip_data.sample_rate != 0) && (voip_data.sample_rate != in->config.rate)) { ret = -ENOTSUP; goto done; } else { voip_data.sample_rate = in->config.rate; } in->usecase = USECASE_COMPRESS_VOIP_CALL; if (in->config.rate == 16000) in->config = pcm_config_voip_wb; else in->config = pcm_config_voip_nb; voip_data.in_stream_count++; ret = voip_set_mode(in->dev, in->format); ALOGV("%s: exit", __func__); done: ALOGV("%s: exit, ret=%d", __func__, ret); return ret; } Loading Loading @@ -734,7 +763,8 @@ bool voice_extn_compress_voip_is_config_supported(struct audio_config *config) if (ret) { if ((popcount(config->channel_mask) == 1) && (config->sample_rate == 8000 || config->sample_rate == 16000)) ret = true; ret = ((voip_data.sample_rate == 0) ? true: (voip_data.sample_rate == config->sample_rate)); else ret = false; } Loading Loading
hal/audio_hw.c +3 −4 Original line number Diff line number Diff line Loading @@ -1923,11 +1923,10 @@ static int in_set_parameters(struct audio_stream *stream, const char *kvpairs) (voice_extn_compress_voip_is_format_supported(in->format)) && (in->config.rate == 8000 || in->config.rate == 16000) && (popcount(in->channel_mask) == 1)) { ret = voice_extn_compress_voip_open_input_stream(in); if (ret != 0) { err = voice_extn_compress_voip_open_input_stream(in); if (err != 0) { ALOGE("%s: Compress voip input cannot be opened, error:%d", __func__, ret); goto done; __func__, err); } } } Loading
hal/voice_extn/compress_voip.c +48 −18 Original line number Diff line number Diff line Loading @@ -59,8 +59,9 @@ struct voip_data { struct pcm *pcm_rx; struct pcm *pcm_tx; struct stream_out *out_stream; int ref_count; int out_stream_count; uint32_t out_stream_count; uint32_t in_stream_count; uint32_t sample_rate; }; #define MODE_IS127 0x2 Loading @@ -78,13 +79,15 @@ struct voip_data { #define AUDIO_PARAMETER_VALUE_VOIP_TRUE "true" #define AUDIO_PARAMETER_KEY_VOIP_CHECK "voip_flag" #define AUDIO_PARAMETER_KEY_VOIP_OUT_STREAM_COUNT "voip_out_stream_count" #define AUDIO_PARAMETER_KEY_VOIP_SAMPLE_RATE "voip_sample_rate" static struct voip_data voip_data = { .pcm_rx = NULL, .pcm_tx = NULL, .out_stream = NULL, .ref_count = 0, .out_stream_count = 0 .out_stream_count = 0, .in_stream_count = 0, .sample_rate = 0 }; static int voip_set_volume(struct audio_device *adev, int volume); Loading Loading @@ -280,10 +283,10 @@ static int voip_stop_call(struct audio_device *adev) int i, ret = 0; struct audio_usecase *uc_info; ALOGD("%s: enter, ref_count=%d", __func__, voip_data.ref_count); voip_data.ref_count--; ALOGD("%s: enter, out_stream_count=%d, in_stream_count=%d", __func__, voip_data.out_stream_count, voip_data.in_stream_count); if (!voip_data.ref_count) { if (!voip_data.out_stream_count && !voip_data.in_stream_count) { uc_info = get_usecase_from_list(adev, USECASE_COMPRESS_VOIP_CALL); if (uc_info == NULL) { ALOGE("%s: Could not find the usecase (%d) in the list", Loading @@ -310,8 +313,10 @@ static int voip_stop_call(struct audio_device *adev) list_remove(&uc_info->list); free(uc_info); voip_data.sample_rate = 0; } else ALOGV("%s: NO-OP because ref_count=%d", __func__, voip_data.ref_count); ALOGV("%s: NO-OP because out_stream_count=%d, in_stream_count=%d", __func__, voip_data.out_stream_count, voip_data.in_stream_count); ALOGV("%s: exit: status(%d)", __func__, ret); return ret; Loading @@ -327,12 +332,15 @@ static int voip_start_call(struct audio_device *adev, ALOGD("%s: enter", __func__); uc_info = get_usecase_from_list(adev, USECASE_COMPRESS_VOIP_CALL); if ((uc_info == NULL) && (voip_data.out_stream)) { if (uc_info == NULL) { ALOGV("%s: voip usecase is added to the list", __func__); uc_info = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase)); uc_info->id = USECASE_COMPRESS_VOIP_CALL; uc_info->type = VOIP_CALL; if (voip_data.out_stream) uc_info->stream.out = voip_data.out_stream; else uc_info->stream.out = adev->primary_output; uc_info->in_snd_device = SND_DEVICE_NONE; uc_info->out_snd_device = SND_DEVICE_NONE; Loading Loading @@ -388,12 +396,15 @@ static int voip_start_call(struct audio_device *adev, ALOGE("%s: error %d\n", __func__, ret); goto error_start_voip; } voip_data.ref_count = 0; } else } else { ALOGV("%s: voip usecase is already enabled", __func__); if (voip_data.out_stream) uc_info->stream.out = voip_data.out_stream; else uc_info->stream.out = adev->primary_output; select_devices(adev, USECASE_COMPRESS_VOIP_CALL); } voip_data.ref_count++; return 0; error_start_voip: Loading Loading @@ -472,6 +483,13 @@ void voice_extn_compress_voip_get_parameters(const struct audio_device *adev, str_parms_add_int(reply, AUDIO_PARAMETER_KEY_VOIP_OUT_STREAM_COUNT, voip_data.out_stream_count); } ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_VOIP_SAMPLE_RATE, value, sizeof(value)); if (ret >= 0) { str_parms_add_int(reply, AUDIO_PARAMETER_KEY_VOIP_SAMPLE_RATE, voip_data.sample_rate); } } void voice_extn_compress_voip_out_get_parameters(struct stream_out *out, Loading Loading @@ -576,9 +594,9 @@ int voice_extn_compress_voip_close_output_stream(struct audio_stream *stream) ALOGD("%s: enter", __func__); voip_data.out_stream_count--; ret = voip_stop_call(adev); voip_data.out_stream = NULL; voip_data.out_stream_count--; ALOGV("%s: exit: status(%d)", __func__, ret); return ret; Loading @@ -600,7 +618,7 @@ int voice_extn_compress_voip_open_output_stream(struct stream_out *out) voip_data.out_stream = out; voip_data.out_stream_count++; voip_data.sample_rate = out->sample_rate; ret = voip_set_mode(out->dev, out->format); ALOGV("%s: exit", __func__); Loading @@ -615,6 +633,7 @@ int voice_extn_compress_voip_close_input_stream(struct audio_stream *stream) ALOGD("%s: enter", __func__); voip_data.in_stream_count--; status = voip_stop_call(adev); ALOGV("%s: exit: status(%d)", __func__, status); Loading @@ -630,15 +649,25 @@ int voice_extn_compress_voip_open_input_stream(struct stream_in *in) ALOGD("%s: enter", __func__); if ((voip_data.sample_rate != 0) && (voip_data.sample_rate != in->config.rate)) { ret = -ENOTSUP; goto done; } else { voip_data.sample_rate = in->config.rate; } in->usecase = USECASE_COMPRESS_VOIP_CALL; if (in->config.rate == 16000) in->config = pcm_config_voip_wb; else in->config = pcm_config_voip_nb; voip_data.in_stream_count++; ret = voip_set_mode(in->dev, in->format); ALOGV("%s: exit", __func__); done: ALOGV("%s: exit, ret=%d", __func__, ret); return ret; } Loading Loading @@ -734,7 +763,8 @@ bool voice_extn_compress_voip_is_config_supported(struct audio_config *config) if (ret) { if ((popcount(config->channel_mask) == 1) && (config->sample_rate == 8000 || config->sample_rate == 16000)) ret = true; ret = ((voip_data.sample_rate == 0) ? true: (voip_data.sample_rate == config->sample_rate)); else ret = false; } Loading