summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--audio/Android.mk3
-rw-r--r--audio/audio_hw.c13
-rw-r--r--audio/audio_hw.h1
-rw-r--r--audio/voice.c56
-rw-r--r--audio/voice.h39
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 */