From 41c9f3d2bcb51ec0f0d19aa0dbba147c1770b62d Mon Sep 17 00:00:00 2001 From: "Christopher N. Hesse" Date: Thu, 2 Feb 2017 20:48:56 +0100 Subject: [PATCH] audio: Initialize the radio voice session This just allocates the structre and creates the RIL connection. This is per audio_device structure to make sure we to not run into issues with audioserver threading. Change-Id: I42e1b7ae57579f39c5f76566ef5b67d4e2c13e3f --- audio/Android.mk | 3 ++- audio/audio_hw.c | 13 +++++++++++ audio/audio_hw.h | 1 + audio/voice.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++ audio/voice.h | 39 +++++++++++++++++++++++++++++++++ 5 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 audio/voice.c create mode 100644 audio/voice.h diff --git a/audio/Android.mk b/audio/Android.mk index 8b306131..87266f3b 100644 --- a/audio/Android.mk +++ b/audio/Android.mk @@ -23,7 +23,8 @@ LOCAL_ARM_MODE := arm LOCAL_SRC_FILES := \ audio_hw.c \ compress_offload.c \ - ril_interface.c + ril_interface.c \ + voice.c # TODO: remove resampler if possible when AudioFlinger supports downsampling from 48 to 8 LOCAL_SHARED_LIBRARIES := \ diff --git a/audio/audio_hw.c b/audio/audio_hw.c index 59cc0f4c..97acd48f 100644 --- a/audio/audio_hw.c +++ b/audio/audio_hw.c @@ -48,6 +48,7 @@ #include #include "audio_hw.h" #include "compress_offload.h" +#include "voice.h" #include "sound/compress_params.h" @@ -4184,10 +4185,12 @@ static int adev_dump(const audio_hw_device_t *device, int fd) static int adev_close(hw_device_t *device) { struct audio_device *adev = (struct audio_device *)device; + voice_session_deinit(adev->voice.session); audio_device_ref_count--; free(adev->snd_dev_ref_cnt); free_mixer_list(adev); free(device); + return 0; } @@ -4318,6 +4321,16 @@ static int adev_open(const hw_module_t *module, const char *name, } } + adev->voice.session = voice_session_init(); + if (adev->voice.session == NULL) { + ALOGE("%s: Failed to initialize voice session data", __func__); + + free(adev->snd_dev_ref_cnt); + free(adev); + + *device = NULL; + return -EINVAL; + } *device = &adev->device.common; diff --git a/audio/audio_hw.h b/audio/audio_hw.h index ab50ef74..96635ecb 100644 --- a/audio/audio_hw.h +++ b/audio/audio_hw.h @@ -373,6 +373,7 @@ struct voice_data { bool in_call; float volume; bool bluetooth_nrec; + void *session; }; struct audio_device { diff --git a/audio/voice.c b/audio/voice.c new file mode 100644 index 00000000..57fcc600 --- /dev/null +++ b/audio/voice.c @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2017 Christopher N. Hesse + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "audio_hw_voice" +#define LOG_NDEBUG 0 +/*#define VERY_VERY_VERBOSE_LOGGING*/ +#ifdef VERY_VERY_VERBOSE_LOGGING +#define ALOGVV ALOGV +#else +#define ALOGVV(a...) do { } while(0) +#endif + +#include +#include + +#include "audio_hw.h" +#include "voice.h" + +struct voice_session *voice_session_init(void) +{ + struct voice_session *session; + int ret; + + session = calloc(1, sizeof(struct voice_session)); + if (session == NULL) { + return NULL; + } + + /* Do this as the last step so we do not have to close it on error */ + ret = ril_open(&session->ril); + if (ret != 0) { + free(session); + return NULL; + } + + return session; +} + +void voice_session_deinit(struct voice_session *session) +{ + ril_close(&session->ril); + free(session); +} diff --git a/audio/voice.h b/audio/voice.h new file mode 100644 index 00000000..40bd1b16 --- /dev/null +++ b/audio/voice.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2017 Christopher N. Hesse + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef VOICE_CALL_H +#define VOICE_CALL_H + +#include "ril_interface.h" + +struct voice_session { + struct ril_handle ril; + + struct pcm *pcm_voice_rx; + struct pcm *pcm_voice_tx; + + bool wb_amr; + bool two_mic_control; + bool two_mic_disabled; + + /* from uc_info */ + audio_devices_t out_device; +}; + +struct voice_session *voice_session_init(void); +void voice_session_deinit(struct voice_session *s); + +#endif /* VOICE_CALL_H */