diff options
author | Christopher N. Hesse <raymanfx@gmail.com> | 2017-02-02 20:48:56 +0100 |
---|---|---|
committer | Christopher N. Hesse <raymanfx@gmail.com> | 2017-02-10 20:31:20 +0000 |
commit | 41c9f3d2bcb51ec0f0d19aa0dbba147c1770b62d (patch) | |
tree | b9e9906cfc6bbcd9dc4e317305902b93895ba214 /audio | |
parent | bc52af5471a404277b1d74a3c5128528bf0b3223 (diff) | |
download | hardware_samsung-41c9f3d2bcb51ec0f0d19aa0dbba147c1770b62d.tar.gz hardware_samsung-41c9f3d2bcb51ec0f0d19aa0dbba147c1770b62d.tar.bz2 hardware_samsung-41c9f3d2bcb51ec0f0d19aa0dbba147c1770b62d.zip |
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
Diffstat (limited to 'audio')
-rw-r--r-- | audio/Android.mk | 3 | ||||
-rw-r--r-- | audio/audio_hw.c | 13 | ||||
-rw-r--r-- | audio/audio_hw.h | 1 | ||||
-rw-r--r-- | audio/voice.c | 56 | ||||
-rw-r--r-- | audio/voice.h | 39 |
5 files changed, 111 insertions, 1 deletions
diff --git a/audio/Android.mk b/audio/Android.mk index 8b30613..87266f3 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 59cc0f4..97acd48 100644 --- a/audio/audio_hw.c +++ b/audio/audio_hw.c @@ -48,6 +48,7 @@ #include <audio_effects/effect_ns.h> #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 ab50ef7..96635ec 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 0000000..57fcc60 --- /dev/null +++ b/audio/voice.c @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2017 Christopher N. Hesse <raymanfx@gmail.com> + * + * 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 <stdlib.h> +#include <pthread.h> + +#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 0000000..40bd1b1 --- /dev/null +++ b/audio/voice.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2017 Christopher N. Hesse <raymanfx@gmail.com> + * + * 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 */ |