summaryrefslogtreecommitdiffstats
path: root/tinyalsa_audio/audio_hw.c
diff options
context:
space:
mode:
Diffstat (limited to 'tinyalsa_audio/audio_hw.c')
-rw-r--r--tinyalsa_audio/audio_hw.c516
1 files changed, 0 insertions, 516 deletions
diff --git a/tinyalsa_audio/audio_hw.c b/tinyalsa_audio/audio_hw.c
deleted file mode 100644
index bb219e1..0000000
--- a/tinyalsa_audio/audio_hw.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
- * Copyright (C) 2012 Paul Kocialkowski <contact@paulk.fr>
- *
- * This is based on Galaxy Nexus audio.primary.tuna implementation:
- * Copyright 2011, The Android Open-Source Project
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#define LOG_TAG "TinyALSA-Audio Hardware"
-
-#include <stdlib.h>
-#include <errno.h>
-#include <pthread.h>
-#include <stdint.h>
-#include <sys/time.h>
-
-#include <cutils/str_parms.h>
-#include <cutils/log.h>
-
-#ifdef YAMAHA_MC1N2_AUDIO
-#include <yamaha-mc1n2-audio.h>
-#endif
-
-#include "audio_hw.h"
-#include "mixer.h"
-
-/*
- * Functions
- */
-
-static int audio_hw_init_check(const struct audio_hw_device *dev)
-{
- struct tinyalsa_audio_device *device;
-
- ALOGD("%s(%p)", __func__, dev);
-
- if(dev == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- if(device->mixer == NULL)
- return -1;
-
- return 0;
-}
-
-static int audio_hw_set_voice_volume(struct audio_hw_device *dev, float volume)
-{
- struct tinyalsa_audio_device *device;
- audio_devices_t device_modem;
-
- ALOGD("%s(%p, %f)++", __func__, dev, volume);
-
- if(dev == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- if(device->mixer == NULL)
- return -1;
-
- if(volume != device->voice_volume) {
- pthread_mutex_lock(&device->lock);
-
- if(device->mode == AUDIO_MODE_IN_CALL) {
- if(device->ril_interface != NULL)
- device_modem = device->ril_interface->device_current;
- else if(device->stream_out != NULL)
- device_modem = device->stream_out->device_current;
- else
- device_modem = AUDIO_DEVICE_OUT_EARPIECE;
-
- tinyalsa_mixer_set_voice_volume(device->mixer,
- device_modem, volume);
-
- if(device->ril_interface != NULL)
- audio_ril_interface_set_voice_volume(device->ril_interface, device_modem, volume);
- }
-
- device->voice_volume = volume;
-
- pthread_mutex_unlock(&device->lock);
- }
-
- ALOGD("%s(%p, %f)--", __func__, dev, volume);
-
- return 0;
-}
-
-static int audio_hw_set_master_volume(struct audio_hw_device *dev, float volume)
-{
- struct tinyalsa_audio_device *device;
-
- ALOGD("%s(%p, %f)++", __func__, dev, volume);
-
- if(dev == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- if(device->mixer == NULL)
- return -1;
-
- pthread_mutex_lock(&device->lock);
- tinyalsa_mixer_set_master_volume(device->mixer, volume);
- pthread_mutex_unlock(&device->lock);
-
- ALOGD("%s(%p, %f)--", __func__, dev, volume);
-
- return 0;
-}
-
-static int audio_hw_set_mode(struct audio_hw_device *dev, int mode)
-{
- struct tinyalsa_audio_ril_interface *ril_interface;
- struct tinyalsa_audio_device *device;
- audio_devices_t device_modem;
- int rc;
-
- ALOGD("%s(%p, %d)++", __func__, dev, mode);
-
- if(dev == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- if(mode != device->mode) {
- pthread_mutex_lock(&device->lock);
-
- if(mode == AUDIO_MODE_IN_CALL) {
- tinyalsa_mixer_set_modem_state(device->mixer, 1);
-
- if(device->stream_out != NULL)
- device_modem = device->stream_out->device_current;
- else
- device_modem = AUDIO_DEVICE_OUT_EARPIECE;
-
- tinyalsa_mixer_set_device(device->mixer, device_modem);
-
-#ifdef YAMAHA_MC1N2_AUDIO
- rc = yamaha_mc1n2_audio_modem_start(device->mc1n2_pdata);
- if(rc < 0) {
- ALOGE("Failed to set Yamaha-MC1N2-Audio route");
- }
-#endif
-
- rc = audio_ril_interface_open((struct audio_hw_device *) device, device_modem, &ril_interface);
- if(rc < 0 || ril_interface == NULL) {
- ALOGE("Failed to open RIL interface");
- device->ril_interface = NULL;
- } else {
- device->ril_interface = ril_interface;
-
- //Only enable dualmic for earpiece.
- if(device_modem == AUDIO_DEVICE_OUT_EARPIECE)
- audio_ril_interface_set_twomic(ril_interface,TWO_MIC_SOLUTION_ON);
-
- if(device->voice_volume)
- audio_ril_interface_set_voice_volume(ril_interface, device_modem, device->voice_volume);
- }
- } else if(device->mode == AUDIO_MODE_IN_CALL) {
- tinyalsa_mixer_set_modem_state(device->mixer, 0);
-
- /*
- * Should be safe to ALWAYS disable it on exit
- * But we should instrument secril-client to be sure
- * when this is/isn't controlled - FIXME
- */
- if(device->ril_interface != NULL) {
- audio_ril_interface_set_twomic(device->ril_interface,TWO_MIC_SOLUTION_OFF);
- }
-
-#ifdef YAMAHA_MC1N2_AUDIO
- rc = yamaha_mc1n2_audio_modem_stop(device->mc1n2_pdata);
- if(rc < 0) {
- ALOGE("Failed to set Yamaha-MC1N2-Audio route");
- }
-#endif
-
- if(device->ril_interface != NULL) {
- audio_ril_interface_close((struct audio_hw_device *) device, device->ril_interface);
- }
- }
-
- device->mode = mode;
-
- pthread_mutex_unlock(&device->lock);
- }
-
- ALOGD("%s(%p, %d)--", __func__, dev, mode);
-
- return 0;
-}
-
-static int audio_hw_set_mic_mute(struct audio_hw_device *dev, bool state)
-{
- struct tinyalsa_audio_device *device;
- audio_devices_t device_modem;
-
- ALOGD("%s(%p, %d)++", __func__, dev, state);
-
- if(dev == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- if(device->mixer == NULL)
- return -1;
-
- if(device->mic_mute != state) {
- pthread_mutex_lock(&device->lock);
-
- if(device->mode == AUDIO_MODE_IN_CALL) {
- if(device->ril_interface != NULL)
- device_modem = device->ril_interface->device_current;
- else if(device->stream_out != NULL)
- device_modem = device->stream_out->device_current;
- else
- device_modem = AUDIO_DEVICE_OUT_EARPIECE;
-
- tinyalsa_mixer_set_mic_mute(device->mixer,
- device_modem, state);
-
- if(device->ril_interface != NULL)
- audio_ril_interface_set_mic_mute(device->ril_interface, state);
- } else {
- if(device->stream_in != NULL) {
- tinyalsa_mixer_set_mic_mute(device->mixer,
- device->stream_in->device_current, state);
- }
- }
-
- device->mic_mute = state;
-
- pthread_mutex_unlock(&device->lock);
- }
-
- ALOGD("%s(%p, %d)--", __func__, dev, state);
-
- return 0;
-}
-
-static int audio_hw_get_mic_mute(const struct audio_hw_device *dev, bool *state)
-{
- struct tinyalsa_audio_device *device;
-
- ALOGD("%s(%p, %p)", __func__, dev, state);
-
- if(dev == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- *state = device->mic_mute;
-
- return 0;
-}
-
-static int audio_hw_set_parameters(struct audio_hw_device *dev,
- const char *kvpairs)
-{
- struct tinyalsa_audio_device *device;
- struct str_parms *parms;
- char value_string[32] = { 0 };
- int value;
- int rc;
-
- ALOGD("%s(%p, %s)++", __func__, dev, kvpairs);
-
- if(dev == NULL || kvpairs == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- if(device->mixer == NULL)
- return -1;
-
- parms = str_parms_create_str(kvpairs);
- if(parms == NULL)
- return -1;
-
- rc = str_parms_get_str(parms, AUDIO_PARAMETER_STREAM_ROUTING, value_string, sizeof(value_string));
- if(rc < 0)
- goto error_params;
-
- value = atoi(value_string);
-
- pthread_mutex_lock(&device->lock);
-
- if(audio_is_output_device((audio_devices_t) value)) {
- if(device->stream_out != NULL && device->stream_out->device_current != (audio_devices_t) value) {
- pthread_mutex_lock(&device->stream_out->lock);
- audio_out_set_route(device->stream_out, (audio_devices_t) value);
- pthread_mutex_unlock(&device->stream_out->lock);
- }
- if(device->ril_interface != NULL && device->ril_interface->device_current != (audio_devices_t) value) {
- audio_ril_interface_set_route(device->ril_interface, (audio_devices_t) value);
- }
- } else if(audio_is_input_device((audio_devices_t) value)) {
- if(device->stream_in != NULL && device->stream_in->device_current != (audio_devices_t) value) {
- pthread_mutex_lock(&device->stream_in->lock);
- audio_in_set_route(device->stream_in, (audio_devices_t) value);
- pthread_mutex_unlock(&device->stream_in->lock);
- }
- }
-
- pthread_mutex_unlock(&device->lock);
-
- str_parms_destroy(parms);
-
- ALOGD("%s(%p, %s)--", __func__, dev, kvpairs);
-
- return 0;
-
-error_params:
- str_parms_destroy(parms);
-
- ALOGD("%s(%p, %s)-- (PARAMETER ERROR)", __func__, dev, kvpairs);
-
- return -1;
-}
-
-static char *audio_hw_get_parameters(const struct audio_hw_device *dev,
- const char *keys)
-{
- ALOGD("%s(%p, %s)", __func__, dev, keys);
-
- return strdup("");
-}
-
-static size_t audio_hw_get_input_buffer_size(const struct audio_hw_device *dev,
- const struct audio_config *config)
-{
- struct tinyalsa_audio_device *device;
- struct tinyalsa_mixer_io_props *mixer_props;
- size_t size;
-
- int channel_count = popcount(config->channel_mask);
-
- ALOGD("%s(%p, %d, %d, %d)++", __func__, dev, config->sample_rate, config->format, channel_count);
-
- if(dev == NULL)
- return -1;
-
- device = (struct tinyalsa_audio_device *) dev;
-
- if(device->mixer == NULL)
- return -1;
-
- mixer_props = tinyalsa_mixer_get_input_props(device->mixer);
- if(mixer_props == NULL)
- return -1;
-
- // Default value
- if(mixer_props->rate == 0)
- mixer_props->rate = 44100;
-
- size = (mixer_props->period_size * config->sample_rate) / mixer_props->rate;
- size = ((size + 15) / 16) * 16;
- size = size * channel_count * audio_bytes_per_sample(config->format);
-
- ALOGD("%s(%p, %d, %d, %d)--", __func__, dev, config->sample_rate, config->format, channel_count);
-
- return size;
-}
-
-static int audio_hw_dump(const audio_hw_device_t *device, int fd)
-{
- ALOGD("%s(%p, %d)", __func__, device, fd);
-
- return 0;
-}
-
-/*
- * Interface
- */
-
-int audio_hw_close(hw_device_t *device)
-{
- struct tinyalsa_audio_device *tinyalsa_audio_device;
-
- ALOGD("%s(%p)++", __func__, device);
-
- if(device != NULL) {
- tinyalsa_audio_device = (struct tinyalsa_audio_device *) device;
-
- if(tinyalsa_audio_device->mixer != NULL) {
- tinyalsa_mixer_close(tinyalsa_audio_device->mixer);
- tinyalsa_audio_device->mixer = NULL;
- }
-
-#ifdef YAMAHA_MC1N2_AUDIO
- if(tinyalsa_audio_device->mc1n2_pdata != NULL) {
- yamaha_mc1n2_audio_stop(tinyalsa_audio_device->mc1n2_pdata);
- tinyalsa_audio_device->mc1n2_pdata = NULL;
- }
-#endif
-
- free(device);
- }
-
- ALOGD("%s(%p)--", __func__, device);
-
- return 0;
-}
-
-int audio_hw_open(const hw_module_t *module, const char *name,
- hw_device_t **device)
-{
- struct tinyalsa_audio_device *tinyalsa_audio_device = NULL;
- struct tinyalsa_mixer *tinyalsa_mixer = NULL;
- struct audio_hw_device *dev;
- int rc;
-
- ALOGD("%s(%p, %s, %p)++", __func__, module, name, device);
-
- if(device == NULL)
- return -EINVAL;
-
- if(strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
- return -EINVAL;
-
- tinyalsa_audio_device = calloc(1, sizeof(struct tinyalsa_audio_device));
- if(tinyalsa_audio_device == NULL)
- return -ENOMEM;
-
- dev = &(tinyalsa_audio_device->device);
-
- dev->common.tag = HARDWARE_DEVICE_TAG;
- dev->common.version = AUDIO_DEVICE_API_VERSION_2_0;
- dev->common.module = (struct hw_module_t *) module;
- dev->common.close = audio_hw_close;
-
- dev->init_check = audio_hw_init_check;
- dev->set_voice_volume = audio_hw_set_voice_volume;
- dev->set_master_volume = audio_hw_set_master_volume;
- dev->set_mode = audio_hw_set_mode;
- dev->set_mic_mute = audio_hw_set_mic_mute;
- dev->get_mic_mute = audio_hw_get_mic_mute;
- dev->set_parameters = audio_hw_set_parameters;
- dev->get_parameters = audio_hw_get_parameters;
- dev->get_input_buffer_size = audio_hw_get_input_buffer_size;
-
- dev->open_output_stream = audio_hw_open_output_stream;
- dev->close_output_stream = audio_hw_close_output_stream;
-
- dev->open_input_stream = audio_hw_open_input_stream;
- dev->close_input_stream = audio_hw_close_input_stream;
-
- dev->dump = audio_hw_dump;
-
-#ifdef YAMAHA_MC1N2_AUDIO
- rc = yamaha_mc1n2_audio_start(&tinyalsa_audio_device->mc1n2_pdata,
- YAMAHA_MC1N2_AUDIO_DEVICE);
- if(rc < 0) {
- ALOGE("Failed to open Yamaha-MC1N2-Audio");
- goto error_device;
- }
-
- rc = yamaha_mc1n2_audio_init(tinyalsa_audio_device->mc1n2_pdata);
- if(rc < 0) {
- ALOGE("Failed to init Yamaha-MC1N2-Audio");
- }
-#endif
-
- rc = tinyalsa_mixer_open(&tinyalsa_mixer, TINYALSA_MIXER_CONFIG_FILE);
- if(rc < 0 || tinyalsa_mixer == NULL) {
- ALOGE("Failed to open mixer!");
- goto error_device;
- }
-
- tinyalsa_audio_device->mixer = tinyalsa_mixer;
-
- *device = &(dev->common);
-
- ALOGD("%s(%p, %s, %p)--", __func__, module, name, device);
-
- return 0;
-
-error_device:
- *device = NULL;
- free(tinyalsa_audio_device);
-
- ALOGD("%s(%p, %s, %p)-- (DEVICE ERROR)", __func__, module, name, device);
-
- return -1;
-}
-
-struct hw_module_methods_t audio_hw_module_methods = {
- .open = audio_hw_open,
-};
-
-struct audio_module HAL_MODULE_INFO_SYM = {
- .common = {
- .tag = HARDWARE_MODULE_TAG,
- .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
- .hal_api_version = HARDWARE_HAL_API_VERSION,
- .id = AUDIO_HARDWARE_MODULE_ID,
- .name = "TinyALSA-Audio",
- .author = "Paul Kocialkowski",
- .methods = &audio_hw_module_methods,
- },
-};