Loading hal/audio_hw.c +3 −4 Original line number Diff line number Diff line Loading @@ -2021,15 +2021,13 @@ static int adev_open_output_stream(struct audio_hw_device *dev, out->config.period_size = HDMI_MULTI_PERIOD_BYTES / (out->config.channels * 2); } else if ((out->dev->mode == AUDIO_MODE_IN_COMMUNICATION) && (out->flags == (AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_VOIP_RX)) && (voice_extn_compress_voip_is_format_supported(out->format))) { (voice_extn_compress_voip_is_config_supported(config))) { ret = voice_extn_compress_voip_open_output_stream(out); if (ret != 0) { ALOGE("%s: Compress voip output cannot be opened, error:%d", __func__, ret); goto error_open; } out->config.rate = config->sample_rate; out->sample_rate = config->sample_rate; } else if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) { if (config->offload_info.version != AUDIO_INFO_INITIALIZER.version || config->offload_info.size != AUDIO_INFO_INITIALIZER.size) { Loading Loading @@ -2289,6 +2287,7 @@ static char* adev_get_parameters(const struct audio_hw_device *dev, pthread_mutex_lock(&adev->lock); audio_extn_get_parameters(adev, query, reply); voice_extn_get_parameters(adev, query, reply); platform_get_parameters(adev->platform, query, reply); str = str_parms_to_str(reply); str_parms_destroy(query); Loading Loading @@ -2421,7 +2420,7 @@ static int adev_open_input_stream(struct audio_hw_device *dev, in->format = config->format; if ((in->dev->mode == AUDIO_MODE_IN_COMMUNICATION) && (voice_extn_compress_voip_is_format_supported(in->format))) { (voice_extn_compress_voip_is_config_supported(config))) { ret = voice_extn_compress_voip_open_input_stream(in); if (ret != 0) { Loading hal/voice_extn/compress_voip.c +52 −16 Original line number Diff line number Diff line Loading @@ -36,12 +36,21 @@ #include "platform.h" #include "voice_extn.h" #define COMPRESS_VOIP_IO_BUF_SIZE 320 #define COMPRESS_VOIP_IO_BUF_SIZE_NB 320 #define COMPRESS_VOIP_IO_BUF_SIZE_WB 640 struct pcm_config pcm_config_voip = { struct pcm_config pcm_config_voip_nb = { .channels = 1, .rate = 8000, /* changed when the stream is opened */ .period_size = COMPRESS_VOIP_IO_BUF_SIZE/2, .period_size = COMPRESS_VOIP_IO_BUF_SIZE_NB/2, .period_count = 10, .format = PCM_FORMAT_S16_LE, }; struct pcm_config pcm_config_voip_wb = { .channels = 1, .rate = 16000, /* changed when the stream is opened */ .period_size = COMPRESS_VOIP_IO_BUF_SIZE_WB/2, .period_count = 10, .format = PCM_FORMAT_S16_LE, }; Loading Loading @@ -83,7 +92,8 @@ static int voip_set_evrc_min_max_rate(struct audio_device *adev, int min_rate, int max_rate); static int voip_set_dtx(struct audio_device *adev, bool enable); static int voip_stop_call(struct audio_device *adev); static int voip_start_call(struct audio_device *adev); static int voip_start_call(struct audio_device *adev, struct pcm_config *voip_config); static int audio_format_to_voip_mode(int format) { Loading Loading @@ -304,12 +314,12 @@ static int voip_stop_call(struct audio_device *adev) return ret; } static int voip_start_call(struct audio_device *adev) static int voip_start_call(struct audio_device *adev, struct pcm_config *voip_config) { int i, ret = 0; struct audio_usecase *uc_info; int pcm_dev_rx_id, pcm_dev_tx_id; struct pcm_config voip_config = pcm_config_voip; ALOGD("%s: enter", __func__); Loading Loading @@ -341,7 +351,7 @@ static int voip_start_call(struct audio_device *adev) __func__, SOUND_CARD, pcm_dev_rx_id); voip_data.pcm_rx = pcm_open(SOUND_CARD, pcm_dev_rx_id, PCM_OUT, &voip_config); PCM_OUT, voip_config); if (voip_data.pcm_rx && !pcm_is_ready(voip_data.pcm_rx)) { ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_rx)); pcm_close(voip_data.pcm_rx); Loading @@ -354,7 +364,7 @@ static int voip_start_call(struct audio_device *adev) __func__, SOUND_CARD, pcm_dev_tx_id); voip_data.pcm_tx = pcm_open(SOUND_CARD, pcm_dev_tx_id, PCM_IN, &voip_config); PCM_IN, voip_config); if (voip_data.pcm_tx && !pcm_is_ready(voip_data.pcm_tx)) { ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_tx)); pcm_close(voip_data.pcm_rx); Loading Loading @@ -483,12 +493,18 @@ void voice_extn_compress_voip_in_get_parameters(struct stream_in *in, int voice_extn_compress_voip_out_get_buffer_size(struct stream_out *out) { return COMPRESS_VOIP_IO_BUF_SIZE; if (out->config.rate == 16000) return COMPRESS_VOIP_IO_BUF_SIZE_WB; else return COMPRESS_VOIP_IO_BUF_SIZE_NB; } int voice_extn_compress_voip_in_get_buffer_size(struct stream_in *in) { return COMPRESS_VOIP_IO_BUF_SIZE; if (in->config.rate == 16000) return COMPRESS_VOIP_IO_BUF_SIZE_WB; else return COMPRESS_VOIP_IO_BUF_SIZE_NB; } int voice_extn_compress_voip_start_output_stream(struct stream_out *out) Loading @@ -499,7 +515,7 @@ int voice_extn_compress_voip_start_output_stream(struct stream_out *out) ALOGD("%s: enter", __func__); ret = voip_start_call(adev); ret = voip_start_call(adev, &out->config); out->pcm = voip_data.pcm_rx; uc_info = get_usecase_from_list(adev, USECASE_COMPRESS_VOIP_CALL); uc_info->stream.out = out; Loading @@ -517,7 +533,7 @@ int voice_extn_compress_voip_start_input_stream(struct stream_in *in) ALOGD("%s: enter", __func__); ret = voip_start_call(adev); ret = voip_start_call(adev, &in->config); in->pcm = voip_data.pcm_tx; ALOGV("%s: exit: status(%d)", __func__, ret); Loading Loading @@ -548,7 +564,11 @@ int voice_extn_compress_voip_open_output_stream(struct stream_out *out) out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_MONO; out->channel_mask = AUDIO_CHANNEL_OUT_MONO; out->usecase = USECASE_COMPRESS_VOIP_CALL; out->config = pcm_config_voip; if (out->sample_rate == 16000) out->config = pcm_config_voip_wb; else out->config = pcm_config_voip_nb; voip_data.out_stream = out; ret = voip_set_mode(out->dev, out->format); Loading Loading @@ -581,9 +601,10 @@ int voice_extn_compress_voip_open_input_stream(struct stream_in *in) ALOGD("%s: enter", __func__); in->usecase = USECASE_COMPRESS_VOIP_CALL; sample_rate = in->config.rate; in->config = pcm_config_voip; in->config.rate = sample_rate; if (in->config.rate == 16000) in->config = pcm_config_voip_wb; else in->config = pcm_config_voip_nb; ret = voip_set_mode(in->dev, in->format); Loading Loading @@ -674,3 +695,18 @@ bool voice_extn_compress_voip_is_format_supported(audio_format_t format) return false; } } bool voice_extn_compress_voip_is_config_supported(struct audio_config *config) { bool ret = false; ret = voice_extn_compress_voip_is_format_supported(config->format); if (ret) { if ((popcount(config->channel_mask) == 1) && (config->sample_rate == 8000 || config->sample_rate == 16000)) ret = true; else ret = false; } return ret; } hal/voice_extn/voice_extn.c +17 −0 Original line number Diff line number Diff line Loading @@ -434,6 +434,23 @@ done: return ret; } void voice_extn_get_parameters(const struct audio_device *adev, struct str_parms *query, struct str_parms *reply) { int ret; char value[32]={0}; char *str = NULL; ret = str_parms_get_str(query, "audio_mode", value, sizeof(value)); if (ret >= 0) { str_parms_add_int(reply, "audio_mode", adev->mode); } ALOGV("%s: returns %s", __func__, str_parms_to_str(reply)); } void voice_extn_out_get_parameters(struct stream_out *out, struct str_parms *query, struct str_parms *reply) Loading hal/voice_extn/voice_extn.h +17 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,9 @@ int voice_extn_get_session_from_use_case(struct audio_device *adev, void voice_extn_init(struct audio_device *adev); int voice_extn_set_parameters(struct audio_device *adev, struct str_parms *parms); void voice_extn_get_parameters(const struct audio_device *adev, struct str_parms *query, struct str_parms *reply); int voice_extn_is_in_call(struct audio_device *adev, bool *in_call); int voice_extn_get_active_session_id(struct audio_device *adev, uint32_t *session_id); Loading Loading @@ -66,6 +69,12 @@ static int voice_extn_set_parameters(struct audio_device *adev, return -ENOSYS; } static void voice_extn_get_parameters(const struct audio_device *adev, struct str_parms *query, struct str_parms *reply) { } static int voice_extn_is_in_call(struct audio_device *adev, bool *in_call) { return -ENOSYS; Loading Loading @@ -131,6 +140,7 @@ void voice_extn_compress_voip_in_get_parameters(struct stream_in *in, bool voice_extn_compress_voip_pcm_prop_check(); bool voice_extn_compress_voip_is_active(struct audio_device *adev); bool voice_extn_compress_voip_is_format_supported(audio_format_t format); bool voice_extn_compress_voip_is_config_supported(struct audio_config *config); #else static int voice_extn_compress_voip_close_output_stream(struct audio_stream *stream) { Loading Loading @@ -231,11 +241,18 @@ static bool voice_extn_compress_voip_is_active(struct audio_device *adev) ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__); return false; } static bool voice_extn_compress_voip_is_format_supported(audio_format_t format) { ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__); return true; } static bool voice_extn_compress_voip_is_config_supported(struct audio_config *config) { ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__); return true; } #endif #endif //VOICE_EXTN_H Loading
hal/audio_hw.c +3 −4 Original line number Diff line number Diff line Loading @@ -2021,15 +2021,13 @@ static int adev_open_output_stream(struct audio_hw_device *dev, out->config.period_size = HDMI_MULTI_PERIOD_BYTES / (out->config.channels * 2); } else if ((out->dev->mode == AUDIO_MODE_IN_COMMUNICATION) && (out->flags == (AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_VOIP_RX)) && (voice_extn_compress_voip_is_format_supported(out->format))) { (voice_extn_compress_voip_is_config_supported(config))) { ret = voice_extn_compress_voip_open_output_stream(out); if (ret != 0) { ALOGE("%s: Compress voip output cannot be opened, error:%d", __func__, ret); goto error_open; } out->config.rate = config->sample_rate; out->sample_rate = config->sample_rate; } else if (out->flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) { if (config->offload_info.version != AUDIO_INFO_INITIALIZER.version || config->offload_info.size != AUDIO_INFO_INITIALIZER.size) { Loading Loading @@ -2289,6 +2287,7 @@ static char* adev_get_parameters(const struct audio_hw_device *dev, pthread_mutex_lock(&adev->lock); audio_extn_get_parameters(adev, query, reply); voice_extn_get_parameters(adev, query, reply); platform_get_parameters(adev->platform, query, reply); str = str_parms_to_str(reply); str_parms_destroy(query); Loading Loading @@ -2421,7 +2420,7 @@ static int adev_open_input_stream(struct audio_hw_device *dev, in->format = config->format; if ((in->dev->mode == AUDIO_MODE_IN_COMMUNICATION) && (voice_extn_compress_voip_is_format_supported(in->format))) { (voice_extn_compress_voip_is_config_supported(config))) { ret = voice_extn_compress_voip_open_input_stream(in); if (ret != 0) { Loading
hal/voice_extn/compress_voip.c +52 −16 Original line number Diff line number Diff line Loading @@ -36,12 +36,21 @@ #include "platform.h" #include "voice_extn.h" #define COMPRESS_VOIP_IO_BUF_SIZE 320 #define COMPRESS_VOIP_IO_BUF_SIZE_NB 320 #define COMPRESS_VOIP_IO_BUF_SIZE_WB 640 struct pcm_config pcm_config_voip = { struct pcm_config pcm_config_voip_nb = { .channels = 1, .rate = 8000, /* changed when the stream is opened */ .period_size = COMPRESS_VOIP_IO_BUF_SIZE/2, .period_size = COMPRESS_VOIP_IO_BUF_SIZE_NB/2, .period_count = 10, .format = PCM_FORMAT_S16_LE, }; struct pcm_config pcm_config_voip_wb = { .channels = 1, .rate = 16000, /* changed when the stream is opened */ .period_size = COMPRESS_VOIP_IO_BUF_SIZE_WB/2, .period_count = 10, .format = PCM_FORMAT_S16_LE, }; Loading Loading @@ -83,7 +92,8 @@ static int voip_set_evrc_min_max_rate(struct audio_device *adev, int min_rate, int max_rate); static int voip_set_dtx(struct audio_device *adev, bool enable); static int voip_stop_call(struct audio_device *adev); static int voip_start_call(struct audio_device *adev); static int voip_start_call(struct audio_device *adev, struct pcm_config *voip_config); static int audio_format_to_voip_mode(int format) { Loading Loading @@ -304,12 +314,12 @@ static int voip_stop_call(struct audio_device *adev) return ret; } static int voip_start_call(struct audio_device *adev) static int voip_start_call(struct audio_device *adev, struct pcm_config *voip_config) { int i, ret = 0; struct audio_usecase *uc_info; int pcm_dev_rx_id, pcm_dev_tx_id; struct pcm_config voip_config = pcm_config_voip; ALOGD("%s: enter", __func__); Loading Loading @@ -341,7 +351,7 @@ static int voip_start_call(struct audio_device *adev) __func__, SOUND_CARD, pcm_dev_rx_id); voip_data.pcm_rx = pcm_open(SOUND_CARD, pcm_dev_rx_id, PCM_OUT, &voip_config); PCM_OUT, voip_config); if (voip_data.pcm_rx && !pcm_is_ready(voip_data.pcm_rx)) { ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_rx)); pcm_close(voip_data.pcm_rx); Loading @@ -354,7 +364,7 @@ static int voip_start_call(struct audio_device *adev) __func__, SOUND_CARD, pcm_dev_tx_id); voip_data.pcm_tx = pcm_open(SOUND_CARD, pcm_dev_tx_id, PCM_IN, &voip_config); PCM_IN, voip_config); if (voip_data.pcm_tx && !pcm_is_ready(voip_data.pcm_tx)) { ALOGE("%s: %s", __func__, pcm_get_error(voip_data.pcm_tx)); pcm_close(voip_data.pcm_rx); Loading Loading @@ -483,12 +493,18 @@ void voice_extn_compress_voip_in_get_parameters(struct stream_in *in, int voice_extn_compress_voip_out_get_buffer_size(struct stream_out *out) { return COMPRESS_VOIP_IO_BUF_SIZE; if (out->config.rate == 16000) return COMPRESS_VOIP_IO_BUF_SIZE_WB; else return COMPRESS_VOIP_IO_BUF_SIZE_NB; } int voice_extn_compress_voip_in_get_buffer_size(struct stream_in *in) { return COMPRESS_VOIP_IO_BUF_SIZE; if (in->config.rate == 16000) return COMPRESS_VOIP_IO_BUF_SIZE_WB; else return COMPRESS_VOIP_IO_BUF_SIZE_NB; } int voice_extn_compress_voip_start_output_stream(struct stream_out *out) Loading @@ -499,7 +515,7 @@ int voice_extn_compress_voip_start_output_stream(struct stream_out *out) ALOGD("%s: enter", __func__); ret = voip_start_call(adev); ret = voip_start_call(adev, &out->config); out->pcm = voip_data.pcm_rx; uc_info = get_usecase_from_list(adev, USECASE_COMPRESS_VOIP_CALL); uc_info->stream.out = out; Loading @@ -517,7 +533,7 @@ int voice_extn_compress_voip_start_input_stream(struct stream_in *in) ALOGD("%s: enter", __func__); ret = voip_start_call(adev); ret = voip_start_call(adev, &in->config); in->pcm = voip_data.pcm_tx; ALOGV("%s: exit: status(%d)", __func__, ret); Loading Loading @@ -548,7 +564,11 @@ int voice_extn_compress_voip_open_output_stream(struct stream_out *out) out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_MONO; out->channel_mask = AUDIO_CHANNEL_OUT_MONO; out->usecase = USECASE_COMPRESS_VOIP_CALL; out->config = pcm_config_voip; if (out->sample_rate == 16000) out->config = pcm_config_voip_wb; else out->config = pcm_config_voip_nb; voip_data.out_stream = out; ret = voip_set_mode(out->dev, out->format); Loading Loading @@ -581,9 +601,10 @@ int voice_extn_compress_voip_open_input_stream(struct stream_in *in) ALOGD("%s: enter", __func__); in->usecase = USECASE_COMPRESS_VOIP_CALL; sample_rate = in->config.rate; in->config = pcm_config_voip; in->config.rate = sample_rate; if (in->config.rate == 16000) in->config = pcm_config_voip_wb; else in->config = pcm_config_voip_nb; ret = voip_set_mode(in->dev, in->format); Loading Loading @@ -674,3 +695,18 @@ bool voice_extn_compress_voip_is_format_supported(audio_format_t format) return false; } } bool voice_extn_compress_voip_is_config_supported(struct audio_config *config) { bool ret = false; ret = voice_extn_compress_voip_is_format_supported(config->format); if (ret) { if ((popcount(config->channel_mask) == 1) && (config->sample_rate == 8000 || config->sample_rate == 16000)) ret = true; else ret = false; } return ret; }
hal/voice_extn/voice_extn.c +17 −0 Original line number Diff line number Diff line Loading @@ -434,6 +434,23 @@ done: return ret; } void voice_extn_get_parameters(const struct audio_device *adev, struct str_parms *query, struct str_parms *reply) { int ret; char value[32]={0}; char *str = NULL; ret = str_parms_get_str(query, "audio_mode", value, sizeof(value)); if (ret >= 0) { str_parms_add_int(reply, "audio_mode", adev->mode); } ALOGV("%s: returns %s", __func__, str_parms_to_str(reply)); } void voice_extn_out_get_parameters(struct stream_out *out, struct str_parms *query, struct str_parms *reply) Loading
hal/voice_extn/voice_extn.h +17 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,9 @@ int voice_extn_get_session_from_use_case(struct audio_device *adev, void voice_extn_init(struct audio_device *adev); int voice_extn_set_parameters(struct audio_device *adev, struct str_parms *parms); void voice_extn_get_parameters(const struct audio_device *adev, struct str_parms *query, struct str_parms *reply); int voice_extn_is_in_call(struct audio_device *adev, bool *in_call); int voice_extn_get_active_session_id(struct audio_device *adev, uint32_t *session_id); Loading Loading @@ -66,6 +69,12 @@ static int voice_extn_set_parameters(struct audio_device *adev, return -ENOSYS; } static void voice_extn_get_parameters(const struct audio_device *adev, struct str_parms *query, struct str_parms *reply) { } static int voice_extn_is_in_call(struct audio_device *adev, bool *in_call) { return -ENOSYS; Loading Loading @@ -131,6 +140,7 @@ void voice_extn_compress_voip_in_get_parameters(struct stream_in *in, bool voice_extn_compress_voip_pcm_prop_check(); bool voice_extn_compress_voip_is_active(struct audio_device *adev); bool voice_extn_compress_voip_is_format_supported(audio_format_t format); bool voice_extn_compress_voip_is_config_supported(struct audio_config *config); #else static int voice_extn_compress_voip_close_output_stream(struct audio_stream *stream) { Loading Loading @@ -231,11 +241,18 @@ static bool voice_extn_compress_voip_is_active(struct audio_device *adev) ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__); return false; } static bool voice_extn_compress_voip_is_format_supported(audio_format_t format) { ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__); return true; } static bool voice_extn_compress_voip_is_config_supported(struct audio_config *config) { ALOGE("%s: COMPRESS_VOIP_ENABLED is not defined", __func__); return true; } #endif #endif //VOICE_EXTN_H