blob: 9cedd2e82ad724de0a36a3cae6026b0b7be2a1d7 [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include "lynq_modem_voice.h"
#include <syslog.h>
#include <log/log.h>
#define LOG_TAG "MEDIA_API"
#include <dtmf.h>
#include "mixer_ctrl.h"
const char g_card_name[] = "mtk_phonecall";
/*for speech on*/
const char g_mixer_name[] = "Speech_on";
const char g_mixer_name_volume[] = "DL Call Playback Volume";
const char g_DL_mute_name[] = "Speech_DL_mute";
const char g_UL_mute_name[] = "Speech_UL_mute";
GstElement *pipeline_element;
static int inCallRecordMode = 0;
static int gst_status = 0;
int lynq_audio_init() //mixer_init
{
int ret;
// only need to set card name once
ret = set_card_name(g_card_name);
if (ret)
RLOGE("set_card_name err: %d", ret);
return ret;
}
int lynq_audio_set(int value )//mixer_set
{
int ret;
//set mixer ctl to om:1 or off:0
ret = set_mixer_ctrl_value_int(g_mixer_name, value);
if (ret)
RLOGE("set_mixer_ctrl_value_int g_mixer_name err: %d", ret);
return ret;
}
/*
int mixer_reset_set(int value )
{
int ret;
// set mixer to reset:1
ret = set_mixer_ctrl_value_int(g_mixer_reset_name, value);
if (ret)
RLOGE("set_mixer_ctrl_value_int g_mixer_reset_name err: %d", ret);
return ret;
}*/
int lynq_set_spk_modem_volume(int value)//mixer_set_volume
{
int ret;
// if (get_audio_path() == 0) {
ret = set_mixer_ctrl_volume_value(g_mixer_name_volume, value);
// } else {
// ret = set_mixer_ctrl_volume_value(g_mixer_name_volume_bt, value);
// }
if (ret)
RLOGE("set_mixer_ctrl_volume_value_int err: %d", ret);
return ret;
}
int lynq_get_spk_modem_volume()//mixer_get_volume
{
long int vol_value;
// if (get_audio_path() == 0) {
vol_value = get_mixer_ctrl_volume_value(g_mixer_name_volume);
// } else {
// vol_value = get_mixer_ctrl_volume_value(g_mixer_name_volume_bt);
// }
RLOGD("The ctrl \"%s\" is set to %d", g_mixer_name_volume, vol_value);
return vol_value;
}
static int GSM_Init(char* filepath){
GstElement *pipeline, *source, *mux, *encoder, *sink;
RLOGD("[GSM]GSM Init Start!");
/* Initialisation */
gst_init (NULL, NULL);
pipeline = gst_pipeline_new ("3gppmux-test");
source = gst_element_factory_make ("pulsesrc", "file-source");
encoder = gst_element_factory_make ("faac", "encoder");
mux = gst_element_factory_make ("3gppmux", "muxer");
sink = gst_element_factory_make ("filesink", "output");
g_object_set(mux, "fragment-duration", 100, NULL);
g_object_set(sink, "location", filepath, NULL);
if (!pipeline || !source || !encoder || !mux || !sink) {
if(pipeline) {
gst_object_unref (GST_OBJECT (pipeline));
pipeline = NULL;
}
if(source) {
gst_object_unref (GST_OBJECT (source));
source = NULL;
}
if(encoder) {
gst_object_unref (GST_OBJECT (encoder));
encoder = NULL;
}
if(mux) {
gst_object_unref (GST_OBJECT (mux));
mux = NULL;
}
if(sink) {
gst_object_unref (GST_OBJECT (sink));
sink = NULL;
}
RLOGE ("[GSM]One element could not be created. Exiting");
return -1;
}
gst_bin_add_many (GST_BIN (pipeline), source, encoder, mux, sink, NULL);
gst_element_link_many (source, encoder, mux, sink, NULL);
pipeline_element = pipeline;
gst_status = 1; //initial done
RLOGD("[GSM]GSM Init Done!");
return 0;
}
static int GSM_Start(void)
{
RLOGD("[GSM]GSM Start start!");
if(gst_status == 2)
return 0;
if(gst_status == 1 || gst_status ==3) {
GstStateChangeReturn ret = gst_element_set_state (pipeline_element, GST_STATE_PLAYING);
RLOGD("[GSM]Running... return: %d", ret);
//g_main_loop_run (gst_loop);
gst_status = 2; //start done
} else {
return -1;
}
RLOGD("[GSM]GSM Start End!");
return 0;
}
static int GSM_Stop()
{
RLOGD("[GSM]GSM Stop Start!");
if (gst_status == 4)
return 0;
if(gst_status == 2 || gst_status == 3) {
/* Out of the main loop, clean up nicely */
gboolean isSend = gst_element_send_event (pipeline_element, gst_event_new_eos ());
GstStateChangeReturn ret = gst_element_set_state (pipeline_element, GST_STATE_NULL);
RLOGD("[GSM]Returned, stopping playback. ret: %d, isSend: %d", ret, isSend);
gst_status = 4;
} else {
return -1;
}
RLOGD("[GSM]GSM Stop End!");
return 0;
}
static int GSM_Close()
{
RLOGD("[GSM]Deleting pipeline");
gst_object_unref (GST_OBJECT (pipeline_element));
gst_deinit ();
gst_status = 0;
RLOGD("[GSM]GSM Close Done!");
return 0;
}
int lynq_incall_record(char* file_path)
{
RLOGD("start GSM!");
if(-1 != GSM_Init(file_path) && -1 != GSM_Start()) {
inCallRecordMode = 1;
RLOGW("inCallRecord Start OK!");
}else{
inCallRecordMode = 0;
return 1;
RLOGW("[error],inCallRecord Start fail!");
}
return 0;
}
int lynq_stop_record()
{
RLOGD("After Handup, stop record! Before Record is %s",inCallRecordMode ? "Enable" : "Disable");
if (inCallRecordMode == 1) {
if(!(-1 != GSM_Stop() && -1 != GSM_Close()))
RLOGW("[error],inCallRecord fail!");
inCallRecordMode = 0;
/*From GSM report stop_record to PulseAudio send record_off need 15ms. so after stop record delay 30ms*/
usleep(30*1000);
return 1;
}
return 0;
}
static int mixer_set_mute(int path, int value)
{
RLOGD("mixer_set_mute path: %d , value: %d", path, value);
int ret;
/* DL:0 UL:1 */
if (path == 0) {
ret = set_mixer_ctrl_value_int(g_DL_mute_name, value);
} else {
ret = set_mixer_ctrl_value_int(g_UL_mute_name, value);
}
if (ret) {
RLOGE("set_mixer_ctrl_volume_value_int err: %d", ret);
}
return ret;
}
static long int mixer_get_mute(int path)
{
long int is_mute;
/* DL:0 UL:1 */
if (path == 0) {
is_mute = get_mixer_ctrl_value_int(g_DL_mute_name);
RLOGD("The ctrl \"%s\" is set to %d", g_DL_mute_name, is_mute);
} else {
is_mute = get_mixer_ctrl_value_int(g_UL_mute_name);
RLOGD("The ctrl \"%s\" is set to %d", g_UL_mute_name, is_mute);
}
return is_mute;
}
int lynq_set_call_mute(int mute) {
RLOGD("setCallMute: %d", mute);
return mixer_set_mute(1, (mute ? 1: 0));
}
int lynq_get_call_mute() {
long int cc_mute = mixer_get_mute(1);
RLOGD("getCallMute: %d", cc_mute);
return cc_mute;
}
void lynq_reset_mute() {
if (lynq_get_call_mute() > 0) {
lynq_set_call_mute(0);
}
}