From a7ff1df1869ce543171a6ee92cbf821647b1bf7d Mon Sep 17 00:00:00 2001 From: Paul Kocialkowski Date: Thu, 7 Aug 2014 13:12:15 +0200 Subject: Samsung-RIL rewrite: harder, better, probably not faster but definitely stronger Signed-off-by: Paul Kocialkowski --- sound.c | 159 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 sound.c (limited to 'sound.c') diff --git a/sound.c b/sound.c new file mode 100644 index 0000000..22601b3 --- /dev/null +++ b/sound.c @@ -0,0 +1,159 @@ +/* + * This file is part of Samsung-RIL. + * + * Copyright (C) 2011-2014 Paul Kocialkowski + * + * Samsung-RIL 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. + * + * Samsung-RIL 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 Samsung-RIL. If not, see . + */ + +#include + +#define LOG_TAG "RIL" +#include + +#include + +unsigned char srs2ipc_call_type(int type) +{ + switch (type) { + case SRS_SND_TYPE_VOICE: + return IPC_SND_VOLUME_TYPE_VOICE; + case SRS_SND_TYPE_SPEAKER: + return IPC_SND_VOLUME_TYPE_SPEAKER; + case SRS_SND_TYPE_HEADSET: + return IPC_SND_VOLUME_TYPE_HEADSET; + case SRS_SND_TYPE_BTVOICE: + return IPC_SND_VOLUME_TYPE_BTVOICE; + default: + return IPC_SND_VOLUME_TYPE_VOICE; + } +} + +unsigned char srs2ipc_audio_path(int path) +{ + switch (path) { + case SRS_SND_PATH_HANDSET: + return IPC_SND_AUDIO_PATH_HANDSET; + case SRS_SND_PATH_HEADSET: + return IPC_SND_AUDIO_PATH_HEADSET; + case SRS_SND_PATH_SPEAKER: + return IPC_SND_AUDIO_PATH_SPEAKER; + case SRS_SND_PATH_BLUETOOTH: + return IPC_SND_AUDIO_PATH_BLUETOOTH; + case SRS_SND_PATH_BLUETOOTH_NO_NR: + return IPC_SND_AUDIO_PATH_BLUETOOTH_NO_NR; + case SRS_SND_PATH_HEADPHONE: + return IPC_SND_AUDIO_PATH_HEADPHONE; + default: + return IPC_SND_AUDIO_PATH_HANDSET; + } +} + +int srs_snd_set_call_volume(struct srs_message *message) +{ + struct ipc_snd_spkr_volume_ctrl_data request_data; + struct srs_snd_call_volume_data *data; + int rc; + + if (message == NULL || message->data == NULL || message->size < sizeof(struct srs_snd_call_volume_data)) + return -1; + + data = (struct srs_snd_call_volume_data *) message->data; + + memset(&request_data, 0, sizeof(request_data)); + request_data.type = srs2ipc_call_type(data->type); + request_data.volume = data->volume; + + rc = ipc_fmt_send(ipc_fmt_seq(), IPC_SND_SPKR_VOLUME_CTRL, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); + if (rc < 0) + return 0; + + return 0; +} + +int ril_request_set_mute(void *data, size_t size, RIL_Token token) +{ + struct ipc_snd_mic_mute_ctrl_data request_data; + int mute; + int rc; + + if (data == NULL || size < sizeof(int)) + goto error; + + mute = *((int *) data); + + memset(&request_data, 0, sizeof(request_data)); + request_data.mute = !!mute; + + rc = ipc_gen_phone_res_expect_complete(ipc_fmt_request_seq(token), IPC_SND_MIC_MUTE_CTRL); + if (rc < 0) + goto error; + + rc = ipc_fmt_send(ipc_fmt_request_seq(token), IPC_SND_MIC_MUTE_CTRL, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); + if (rc < 0) + goto error; + + rc = RIL_REQUEST_HANDLED; + goto complete; + +error: + ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); + + rc = RIL_REQUEST_COMPLETED; + +complete: + return rc; +} + +int srs_snd_set_call_audio_path(struct srs_message *message) +{ + struct ipc_snd_audio_path_ctrl_data request_data; + struct srs_snd_call_audio_path_data *data; + int rc; + + if (message == NULL || message->data == NULL || message->size < sizeof(struct srs_snd_call_audio_path_data)) + return -1; + + data = (struct srs_snd_call_audio_path_data *) message->data; + + memset(&request_data, 0, sizeof(request_data)); + request_data.path = srs2ipc_audio_path(data->path); + + rc = ipc_fmt_send(ipc_fmt_seq(), IPC_SND_AUDIO_PATH_CTRL, IPC_TYPE_SET, (void *) &request_data, sizeof(request_data)); + if (rc < 0) + return 0; + + return 0; +} + +int srs_snd_set_call_clock_sync(struct srs_message *message) +{ + struct ipc_snd_clock_ctrl_data request_data; + struct srs_snd_call_clock_sync_data *data; + int rc; + + if (message == NULL || message->data == NULL || message->size < sizeof(struct srs_snd_call_clock_sync_data)) + return -1; + + data = (struct srs_snd_call_clock_sync_data *) message->data; + + memset(&request_data, 0, sizeof(request_data)); + request_data.sync = data->sync; + + rc = ipc_fmt_send(ipc_fmt_seq(), IPC_SND_CLOCK_CTRL, IPC_TYPE_EXEC, (void *) &request_data, sizeof(request_data)); + if (rc < 0) + return 0; + + return 0; +} -- cgit v1.1