diff options
-rw-r--r-- | samsung-ril.c | 13 | ||||
-rw-r--r-- | samsung-ril.h | 3 | ||||
-rw-r--r-- | snd.c | 79 |
3 files changed, 90 insertions, 5 deletions
diff --git a/samsung-ril.c b/samsung-ril.c index 5e57dac..0a2f993 100644 --- a/samsung-ril.c +++ b/samsung-ril.c @@ -35,7 +35,6 @@ * Samsung-RIL TODO: * * General: - * - add IPC_NET_SERVING_NETWORK * - USSD codes * - full operators list * - ipc_disp_icon_info: trace on RILJ & emulate RIl_REQUEST_SIGNAL_STRENGTH @@ -45,8 +44,7 @@ * - gen phone res queue → apply to max functions * * Call-related: - * - complete sound handling - * - add MIC_MUTE from RILJ + * - take care of SRS socket * * SMS-related: * - Add support for multiple-messages SMS @@ -297,6 +295,12 @@ void srs_dispatch(struct srs_message *message) case SRS_SND_SET_CALL_CLOCK_SYNC: srs_snd_set_call_clock_sync(message); break; + case SRS_SND_SET_CALL_VOLUME: + srs_snd_set_call_volume(message); + break; + case SRS_SND_SET_CALL_AUDIO_PATH: + srs_snd_set_call_audio_path(message); + break; default: LOGD("Unhandled command: (%04x)", message->command); break; @@ -424,6 +428,9 @@ void onRequest(int request, void *data, size_t datalen, RIL_Token t) case RIL_REQUEST_SETUP_DATA_CALL: ril_request_setup_data_call(t, data, datalen); break; + /* SND */ + case RIL_REQUEST_SET_MUTE: + ril_request_set_mute(t, data, datalen); /* OTHER */ case RIL_REQUEST_SCREEN_STATE: /* This doesn't affect anything */ diff --git a/samsung-ril.h b/samsung-ril.h index 42b1305..3b6b2a1 100644 --- a/samsung-ril.h +++ b/samsung-ril.h @@ -311,7 +311,10 @@ void ril_request_dtmf_stop(RIL_Token t); /* SND */ +void ril_request_set_mute(RIL_Token t, void *data, size_t datalen); void srs_snd_set_call_clock_sync(struct srs_message *message); +void srs_snd_set_call_volume(struct srs_message *message); +void srs_snd_set_call_audio_path(struct srs_message *message); /* GPRS */ @@ -1,7 +1,6 @@ /** * This file is part of samsung-ril. * - * Copyright (C) 2010-2011 Joerie de Gram <j.de.gram@gmail.com> * Copyright (C) 2011 Paul Kocialkowski <contact@oaulk.fr> * * samsung-ril is free software: you can redistribute it and/or modify @@ -25,10 +24,86 @@ #include "samsung-ril.h" #include "util.h" +/** + * Format conversion utils + */ + +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: + LOGE("Unknown call type: 0x%x", type); + return 0; + } +} + +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: + LOGE("Unknown audio path: 0x%x", path); + return 0; + } +} + +void ril_request_set_mute(RIL_Token t, void *data, size_t datalen) +{ + unsigned char mute_data = ((int *)data)[0] > 0 ? 1 : 0; + + LOGD("Mute data is %d\n", mute_data); + + ipc_gen_phone_res_expect_to_complete(reqGetId(t), IPC_SND_MIC_MUTE_CTRL); + + ipc_fmt_send(IPC_SND_MIC_MUTE_CTRL, IPC_TYPE_SET, (void *) &mute_data, sizeof(mute_data), reqGetId(t)); +} + void srs_snd_set_call_clock_sync(struct srs_message *message) { unsigned char data = *((unsigned char *) message->data); - LOGE("SetCallClockSync data is 0x%x\n", data); + LOGD("Clock sync data is 0x%x\n", data); ipc_fmt_send(IPC_SND_CLOCK_CTRL, IPC_TYPE_EXEC, &data, sizeof(data), reqIdNew()); } + +void srs_snd_set_call_volume(struct srs_message *message) +{ + struct srs_snd_call_volume *call_volume = (struct srs_snd_call_volume *) message->data; + struct ipc_snd_spkr_volume_ctrl volume_ctrl; + + LOGD("Call volume for: 0x%x vol = 0x%x\n", call_volume->type, call_volume->volume); + + volume_ctrl.type = srs2ipc_call_type(call_volume->type); + volume_ctrl.volume = call_volume->volume; + + ipc_fmt_send(IPC_SND_SPKR_VOLUME_CTRL, IPC_TYPE_SET, (void *) &volume_ctrl, sizeof(volume_ctrl), reqIdNew()); +} + +void srs_snd_set_call_audio_path(struct srs_message *message) +{ + int audio_path = ((int *) message->data)[0]; + unsigned char path = srs2ipc_audio_path(audio_path); + + LOGD("Audio path to: 0x%x\n", path); + + ipc_fmt_send(IPC_SND_AUDIO_PATH_CTRL, IPC_TYPE_SET, (void *) &path, sizeof(path), reqIdNew()); +} |