blob: 07a81d8618128fa8b3e6b7a2fff45ff4bb59a74f [file] [log] [blame]
lh25827952022-01-10 00:34:35 -08001#include <stdio.h>
2#include <sys/types.h>
3#include <sys/socket.h>
4#include <arpa/inet.h>
5#include <fcntl.h>
6#include <string.h>
7#include <stdlib.h>
8#include <unistd.h>
9#include <binder/Parcel.h>
10#include <log/log.h>
lh25827952022-01-10 00:34:35 -080011#include <cutils/jstring.h>
12#include <pthread.h>
13#include "liblog/lynq_deflog.h"
lh228a7b82022-01-10 02:24:31 -080014#include <sys/time.h>
lh59e0d002022-01-27 00:27:12 -080015#include <string.h>
q.huangfe1b4052022-04-18 00:09:50 -040016#include <vendor-ril/telephony/ril.h>
17#include <vendor-ril/telephony/mtk_ril_sp.h>
18#include <vendor-ril/telephony/mtk_ril_ivt.h>
19#include "lynq_call.h"
20
21
lh25827952022-01-10 00:34:35 -080022#define LYNQ_SERVICE_PORT 8088
rjw8bdc56b2022-02-28 15:01:49 +080023#define DSET_IP_ADDRESS "127.0.0.1"
lh25827952022-01-10 00:34:35 -080024#define LYNQ_URC_SERVICE_PORT 8086
25#define LYNQ_REC_BUF 8192
26#define LYNQ_REQUEST_PARAM_BUF 8192
27#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
q.huang783ed5d2022-06-02 14:49:02 +080028#define INVALID_ID (-1)
q.huang3e761702022-06-28 20:12:01 +080029#define RTP_FROM_CMD "gst-launch-1.0 -v udpsrc port=%d caps=\'application/x-rtp, media=(string)audio, clock-rate=(int)%d, channels=(int)%d\' ! rtpjitterbuffer latency=%d ! rtppcmadepay ! alawdec ! audioresample ! audioconvert ! alsasink device=\'hw:0,2\'"
30#define RTP_TO_CMD "gst-launch-1.0 -v alsasrc device=\'hw:0,6\' ! audioconvert ! audioresample ! alawenc ! rtppcmapay ! udpsink host=%s auto-multicast=true port=%d"
31#define MAX_IP_LENGTH 128
lh25827952022-01-10 00:34:35 -080032#define USER_LOG_TAG "LYNQ_CALL"
33
34using ::android::Parcel;
35 typedef enum {
36 LYNQ_CALL_ACTIVE = 0,
37 LYNQ_CALL_HOLDING = 1,
38 LYNQ_CALL_DIALING = 2, /* MO call only */
39 LYNQ_CALL_ALERTING = 3, /* MO call only */
40 LYNQ_CALL_INCOMING = 4, /* MT call only */
lh8657e742022-04-26 00:45:44 -070041 LYNQ_CALL_WAITING = 5, /* MT call only */
42 /*warren add for T800 platform 2022/04/26 start*/
43 LYNQ_CALL_END = 6, /*CALL END*/
44 /*warren add for T800 platform 2022/04/26 end*/
lh25827952022-01-10 00:34:35 -080045}lynq_call_state_t;
46
47typedef struct{
48 int uToken;
49 int request;
50 int paramLen;
51 char param[LYNQ_REQUEST_PARAM_BUF];
52}lynq_client_t;
53typedef struct
54{
55 int used;
56 int call_id;
57 int call_state;
58 int toa;
59 int direction;/*0: MO call,1:MT call*/
60 char addr[LYNQ_PHONE_NUMBER_MAX];
lh25827952022-01-10 00:34:35 -080061}lynq_call_list_e_t;
62typedef struct
63{
64 int call_id;
65 int call_state;
66 int toa;
67 int direction;/*0: MO call,1:MT call*/
68 char addr[LYNQ_PHONE_NUMBER_MAX];
69}lynq_call_list_t;
70
71lynq_call_list_e_t lynq_call_lists[LYNQ_CALL_MAX]={};
72static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
73static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
llc81b4d52022-07-13 09:39:44 +000074static pthread_mutex_t *s_urc_call_state_change_mutex = NULL;
75static pthread_cond_t *s_urc_call_state_change_cond = NULL;
lh25827952022-01-10 00:34:35 -080076static pthread_mutex_t s_incoming_call_mutex = PTHREAD_MUTEX_INITIALIZER;
77static pthread_cond_t s_incoming_call_cond = PTHREAD_COND_INITIALIZER;
ll1343a5b2022-03-17 05:31:33 +000078pthread_t lynq_call_urc_tid = -1;
79pthread_t lynq_call_list_loop_tid = -1;
lhcdf816a2022-02-13 23:56:05 -080080
rjw8bdc56b2022-02-28 15:01:49 +080081/*lei add*/
82/* socket文件描述符 */
83int len_addr_serv;
84struct sockaddr_in addr_serv;
85lynq_client_t client_t;
86int client_size = 0;
87/*lei add*/
lh25827952022-01-10 00:34:35 -080088
llc81b4d52022-07-13 09:39:44 +000089int s_call_urc_event_complete = 0;
lh25827952022-01-10 00:34:35 -080090
91enum{
92 CALL_OFF=0,
93 CALL_ON=1
94}call_state;
ll375c94d2022-01-27 05:54:38 +000095typedef enum{
96 LYNQ_E_CARDSTATE_ERROR=8000,
97 /* The voice service state is out of service*/
98 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
99 /* The voice service state is EMERGENCY_ONLY*/
100 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
101 /* The radio power is power off*/
102 LYNQ_E_STATE_POWER_OFF=8003,
103 LYNQ_E_TIME_OUT=8004,
104 /*create or open sms DB fail */
105 LYNQ_E_SMS_DB_FAIL=8005,
106 /*Failed to execute sql statement*/
107 LYNQ_E_SMS_SQL_FAIL = 8006,
108 LYNQ_E_SMS_NOT_FIND = 8007,
109 /* The logic conflict*/
110 LYNQ_E_CONFLICT=9000,
111 /*Null anomaly*/
q.huang783ed5d2022-06-02 14:49:02 +0800112 LYNQ_E_NULL_ANONALY=9001,
113 /*Invalid id anomaly*/
114 LYNQ_E_INVALID_ID_ANONALY=9002,
115#ifdef ECALL_SUPPORT
116 LYNQ_E_ECALL_BEING_RUNNING =9003,
117 LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
q.huang40f5e322022-06-21 14:57:02 +0800118 LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
q.huang783ed5d2022-06-02 14:49:02 +0800119#endif
lh25827952022-01-10 00:34:35 -0800120}LYNQ_E;
q.huangb0eb7b02022-03-29 04:17:32 -0400121typedef enum{
122 LYNQ_E_VOLUMN_SET_DTMF,
123 LYNQ_E_VOLUMN_SET_SPEECH
124}LYNQ_E_VOLUMN_SET;
lh25827952022-01-10 00:34:35 -0800125
126int lynq_call_state =CALL_OFF;
lha35d4ee2022-01-25 18:47:39 -0800127int lynq_call_client_sockfd = 0;
128int Global_uToken_call = 0;
lh25827952022-01-10 00:34:35 -0800129int global_call_count =0;
130int global_call_auto_answer = 0;
lha35d4ee2022-01-25 18:47:39 -0800131bool urc_call_recive_status = 1;
llc81b4d52022-07-13 09:39:44 +0000132bool call_list_loop = 0;
lh25827952022-01-10 00:34:35 -0800133int isDial = 0;
134int lynqIncomingCallId = 0;
q.huang18d08bf2022-04-19 20:27:44 -0400135
q.huang3e761702022-06-28 20:12:01 +0800136/*rtp begin*/
137typedef struct
138{
139 char ip[MAX_IP_LENGTH];
140 int port;
141}lynq_rtp_server_info;
142
143typedef struct
144{
145 int port;
146 int clockrate;
147 int latency;
148 int channels;
149}lynq_rtp_client_info;
150
151static lynq_rtp_client_info g_rtp_client_info;
152static lynq_rtp_server_info g_rtp_server_info;
153
154static pthread_t g_rtp_thread[RTP_MODE_MAX];
155static bool g_rtp_thread_valid[RTP_MODE_MAX];
156
157/*rtp end*/
158
q.huang18d08bf2022-04-19 20:27:44 -0400159#ifdef ECALL_SUPPORT
q.huang783ed5d2022-06-02 14:49:02 +0800160int lynq_set_common_request(int request_id, int argc, const char* format,...);
q.huang783ed5d2022-06-02 14:49:02 +0800161int g_ecallId = INVALID_ID;
q.huang18d08bf2022-04-19 20:27:44 -0400162typedef enum{
163 LYNQ_ECALL_TYPE_TEST = 0, /* Test eCall */
164 LYNQ_ECALL_TYPE_RECONFIG = 1, /* Reconfiguration eCall */
q.huangfe1b4052022-04-18 00:09:50 -0400165 LYNQ_ECALL_MANUAL_EMERGENCY = 2, /*Manual Emergency eCall */
q.huang40f5e322022-06-21 14:57:02 +0800166 LYNQ_ECALL_TYPE_AUTO_EMERGENCY = 3, /* Automatic Emergency eCall */
q.huangfe1b4052022-04-18 00:09:50 -0400167}LYNQ_ECall_Type;
168
q.huang40f5e322022-06-21 14:57:02 +0800169typedef enum{
170 LYNQ_ECALL_DAILING_STATE_NONE =0,
171 LYNQ_ECALL_DAILING_STATE_STARTED = 1,
172 LYNQ_ECALL_DAILING_STATE_ANSWERED = 2,
173}LYNQ_ECall_Dailing_State;
174
175LYNQ_ECall_Dailing_State is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang783ed5d2022-06-02 14:49:02 +0800176char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"test_ecall","emergency_ecall","reconf_ecall"};
q.huang18d08bf2022-04-19 20:27:44 -0400177
178static pthread_mutex_t s_incoming_e_call_mutex = PTHREAD_MUTEX_INITIALIZER;
179static pthread_cond_t s_incoming_e_call_cond = PTHREAD_COND_INITIALIZER;
180
q.huang783ed5d2022-06-02 14:49:02 +0800181LYNQ_ECall_Indication g_lynqIncomingEcallIndication;
q.huang40f5e322022-06-21 14:57:02 +0800182int g_lynqIncomingEcallId;
q.huang18d08bf2022-04-19 20:27:44 -0400183
184void sendSignalIncomingECallEvent()
185{
q.huang3e761702022-06-28 20:12:01 +0800186 LYINFLOG("send incoming ecall event signal");
q.huang18d08bf2022-04-19 20:27:44 -0400187 pthread_mutex_lock(&s_incoming_e_call_mutex);
188 pthread_cond_signal(&s_incoming_e_call_cond);
189 pthread_mutex_unlock(&s_incoming_e_call_mutex);
190}
q.huang783ed5d2022-06-02 14:49:02 +0800191
192int lynq_is_msd_suc(LYNQ_ECall_Indication lynqIncomingEcallIndication)
193{
194 if(LYNQ_ECALL_LLACK_RECEIVED == lynqIncomingEcallIndication ||
195 LYNQ_ECALL_ALACK_POSITIVE_RECEIVED == lynqIncomingEcallIndication ||
196 LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED == lynqIncomingEcallIndication ||
197 LYNQ_ECALL_T5_TIMER_OUT == lynqIncomingEcallIndication ||
198 LYNQ_ECALL_T6_TIMER_OUT == lynqIncomingEcallIndication ||
199 LYNQ_ECALL_T7_TIMER_OUT == lynqIncomingEcallIndication)
200 {
201 return 1;
202 }
203
204 return 0;
205}
206
207int lynq_ecall_is_running()
208{
q.huang40f5e322022-06-21 14:57:02 +0800209 return (is_ecall_dial!=LYNQ_ECALL_DAILING_STATE_NONE) || (g_ecallId !=INVALID_ID);
q.huang783ed5d2022-06-02 14:49:02 +0800210}
q.huang18d08bf2022-04-19 20:27:44 -0400211#endif
q.huangfe1b4052022-04-18 00:09:50 -0400212
ll1343a5b2022-03-17 05:31:33 +0000213/**
214 * @brief mark call initialization state
215 * 0: deinit state
216 * 1: init state
217 */
218int g_lynq_call_init_flag = 0;
lh25827952022-01-10 00:34:35 -0800219
220int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
221{
222 if(p.dataAvail() > 0)
223 {
224 p.readInt32(resp_type);
225 p.readInt32(request);
226 p.readInt32(slot_id);
227 p.readInt32(error);
228 return 0;
229 }
230 else
231 {
232 return -1;
233 }
234}
235int send_request(int sockfd,lynq_client_t *client_tmp)
236{
237 int ret=0;
rjw8bdc56b2022-02-28 15:01:49 +0800238 ret = sendto(sockfd, client_tmp, client_size, 0, (struct sockaddr *)&addr_serv, len_addr_serv);
lh25827952022-01-10 00:34:35 -0800239 if(ret==-1)
240 {
q.huang783ed5d2022-06-02 14:49:02 +0800241 LYERRLOG("sendto error");
lh25827952022-01-10 00:34:35 -0800242 return -1;
243 }
244 return 0;
245}
246
247int get_response(int sockfd,Parcel &p)
248{
249 int len = 0;
250 char recvline[LYNQ_REC_BUF];
251 bzero(recvline,LYNQ_REC_BUF);
252 /* receive data from server */
rjw8bdc56b2022-02-28 15:01:49 +0800253 len = recvfrom(sockfd,recvline,LYNQ_REC_BUF, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
lh25827952022-01-10 00:34:35 -0800254 if(len == -1)
255 {
q.huang783ed5d2022-06-02 14:49:02 +0800256 LYERRLOG("recvfrom error");
lh25827952022-01-10 00:34:35 -0800257 return -1;
258 }
lh25827952022-01-10 00:34:35 -0800259 if (recvline != NULL) {
260 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
261 p.setDataPosition(0);
262 }
263 return 0;
264}
265static char *strdupReadString(Parcel &p) {
ll375c94d2022-01-27 05:54:38 +0000266 size_t stringlen;
lh25827952022-01-10 00:34:35 -0800267 const char16_t *s16;
268 s16 = p.readString16Inplace(&stringlen);
ll375c94d2022-01-27 05:54:38 +0000269 return strndup16to8(s16, stringlen);
lh25827952022-01-10 00:34:35 -0800270}
271
272int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])
273{
274 Parcel p;
275 lynq_client_t client;
276 int resp_type = -1;
277 int request = -1;
278 int slot_id = -1;
279 int error = -1;
280 int call_num = 0;
281 int temp = 0;
282 char *remote_phoneNum = NULL;
283 char *remote_name= NULL;
284 char *uusData = NULL;
lha35d4ee2022-01-25 18:47:39 -0800285 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -0800286 client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS
287 client.paramLen = 0;
288 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +0800289 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lha35d4ee2022-01-25 18:47:39 -0800290 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -0800291 {
292 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -0800293 return -1;
294 }
lha35d4ee2022-01-25 18:47:39 -0800295 get_response(lynq_call_client_sockfd,p);
lh25827952022-01-10 00:34:35 -0800296 JumpHeader(p,&resp_type,&request,&slot_id,&error);
297 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
298 if(error == 0)
299 {
300 p.readInt32(&call_num);
301 global_call_count = call_num;
302 if(call_num<=0)
303 {
304 lynq_call_state = CALL_OFF;
lhcdf816a2022-02-13 23:56:05 -0800305 LYINFLOG("lynq_call_state:%d",lynq_call_state);
lh25827952022-01-10 00:34:35 -0800306 return 0;
307 }
lhcdf816a2022-02-13 23:56:05 -0800308 lynq_call_state = CALL_ON;
q.huang783ed5d2022-06-02 14:49:02 +0800309 LYINFLOG("lynq_call_state:%d, call num is %d ",lynq_call_state,call_num);
lh25827952022-01-10 00:34:35 -0800310 for(int i = 0;i < call_num;i++)
311 {
312 p.readInt32(&temp);
313 call_list[i].call_state = temp;
314 p.readInt32(&call_list[i].call_id);
315 p.readInt32(&call_list[i].toa);
316 p.readInt32(&temp);
317 p.readInt32(&temp);
318 call_list[i].direction = temp;
319 p.readInt32(&temp);
320 p.readInt32(&temp);
321 p.readInt32(&temp);
322 remote_phoneNum = strdupReadString(p);
323 memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));
324 LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,
325 call_list[i].direction,call_list[i].addr,call_list[i].toa);
326 p.readInt32(&temp);
327 remote_name = strdupReadString(p);
328 p.readInt32(&temp);
329 p.readInt32(&temp);
330 if(temp==0)
331 {
332 continue;
333 }
334 p.readInt32(&temp); /* UUS Information is present */
335 p.readInt32(&temp);
336 p.readInt32(&temp);
337 p.read(uusData,temp);
338 }
339 }
340 return 0;
341}
342
343void cleanCallList(int lynq_call_id)
344{
q.huang783ed5d2022-06-02 14:49:02 +0800345 LYINFLOG("cleanCall local idx is %d, id is %d",lynq_call_id,lynq_call_lists[lynq_call_id].call_id);
lh25827952022-01-10 00:34:35 -0800346 lynq_call_lists[lynq_call_id].call_id = 0;
lh8657e742022-04-26 00:45:44 -0700347 lynq_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
lh25827952022-01-10 00:34:35 -0800348 lynq_call_lists[lynq_call_id].toa = 0;
349 lynq_call_lists[lynq_call_id].direction = 0;
350 lynq_call_lists[lynq_call_id].used = 0;
lh25827952022-01-10 00:34:35 -0800351 memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));
352}
353int getUnusedElement()
354{
355 for(int i=0;i < LYNQ_CALL_MAX; i++)
356 {
357 if(lynq_call_lists[i].used!=1)
358 {
359 return i;
360 }
361 }
362 return -1;
363}
q.huang783ed5d2022-06-02 14:49:02 +0800364int addAddr(char addr[])
lh25827952022-01-10 00:34:35 -0800365{
366 int ret = 0;
367 ret = getUnusedElement();
368 memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);
369 lynq_call_lists[ret].used = 1;
q.huang783ed5d2022-06-02 14:49:02 +0800370 LYINFLOG("add local idx is %d addr is %s",ret,addr);
lh25827952022-01-10 00:34:35 -0800371 return ret;
372}
373void updateCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction)
374{
q.huang783ed5d2022-06-02 14:49:02 +0800375 LYINFLOG("Update original local id is %d, new local id is %d",callList->call_id,call_id);
lh25827952022-01-10 00:34:35 -0800376 callList->call_id = call_id;
377 callList->call_state = call_state;
378 callList->toa = toa;
q.huang783ed5d2022-06-02 14:49:02 +0800379 callList->direction = direction;
lh25827952022-01-10 00:34:35 -0800380 return;
381}
382int waitCallstateChange(int mtime)
383{
lhbe92dd12022-04-19 06:01:25 -0700384 LYINFLOG("wait Call state Change");
lh25827952022-01-10 00:34:35 -0800385 int ret = 0;
386 int sec = 0;
387 int usec = 0;
lh228a7b82022-01-10 02:24:31 -0800388 struct timeval now;
389 struct timespec timeout;
390 gettimeofday(&now,NULL);
lh25827952022-01-10 00:34:35 -0800391 sec = mtime/1000;
392 usec = mtime%1000;
lh228a7b82022-01-10 02:24:31 -0800393 timeout.tv_sec = now.tv_sec+sec;
394 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
lh25827952022-01-10 00:34:35 -0800395 pthread_mutex_lock(&call_state_change_mutex);
lh228a7b82022-01-10 02:24:31 -0800396 ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);
lh25827952022-01-10 00:34:35 -0800397 pthread_mutex_unlock(&call_state_change_mutex);
398 return ret;
399}
400int waitIncomingCall()
401{
lhbe92dd12022-04-19 06:01:25 -0700402 LYINFLOG("wait incming call");
lh25827952022-01-10 00:34:35 -0800403 int ret = 0;
404 pthread_mutex_lock(&s_incoming_call_mutex);
405 ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);
406 pthread_mutex_unlock(&s_incoming_call_mutex);
407 return ret;
408}
409int checkHasCall(char addr[])
410{
411 for(int i = 0;i<LYNQ_CALL_MAX;i++)
412 {
413 if(strcmp(lynq_call_lists[i].addr,addr)==0)
414 {
q.huang783ed5d2022-06-02 14:49:02 +0800415 LYINFLOG("checkHasCall addr is %s idx is %d id is %d",addr,i,lynq_call_lists[i].call_id);
lh25827952022-01-10 00:34:35 -0800416 return 1;
417 }
418 }
q.huang783ed5d2022-06-02 14:49:02 +0800419 LYINFLOG("checkHasCall addr is %s , no idx is found",addr);
lh25827952022-01-10 00:34:35 -0800420 return 0;
421}
lhbe92dd12022-04-19 06:01:25 -0700422int find_call_id_with_addr(char *addr)
423{
lhbe92dd12022-04-19 06:01:25 -0700424 for(int id = 0; id < LYNQ_CALL_MAX; id++)
425 {
q.huang783ed5d2022-06-02 14:49:02 +0800426 if(lynq_call_lists[id].used && (strcmp(lynq_call_lists[id].addr,addr) == 0))
lhbe92dd12022-04-19 06:01:25 -0700427 {
q.huang783ed5d2022-06-02 14:49:02 +0800428 LYINFLOG("find addr %s in local list, local idx is %d id is %d",addr,id,lynq_call_lists[id].call_id);
lhbe92dd12022-04-19 06:01:25 -0700429 return id;
430 }
431 }
q.huang783ed5d2022-06-02 14:49:02 +0800432 LYINFLOG("find addr %s in local list , not found",addr);
lhbe92dd12022-04-19 06:01:25 -0700433 return -1;
434}
q.huang783ed5d2022-06-02 14:49:02 +0800435int find_call_id_with_call_id(int call_id)
436{
437 for(int id = 0; id < LYNQ_CALL_MAX; id++)
438 {
439 if(lynq_call_lists[id].used && (lynq_call_lists[id].call_id == call_id))
440 {
441 LYINFLOG("find id %d in local list, local idx is %d, addr is %s",call_id,id,lynq_call_lists[id].addr);
442 return id;
443 }
444 }
445 LYINFLOG("find id %d in local list , not found",call_id);
446 return INVALID_ID;
447}
lh25827952022-01-10 00:34:35 -0800448void sendSignalToWaitCallStateChange()
449{
lhbe92dd12022-04-19 06:01:25 -0700450 LYINFLOG("send Signal To Wait Call State Change");
lh25827952022-01-10 00:34:35 -0800451 pthread_mutex_lock(&call_state_change_mutex);
452 pthread_cond_signal(&call_state_change_cond);
453 pthread_mutex_unlock(&call_state_change_mutex);
454}
455void sendSignalIncomingCall()
456{
lhbe92dd12022-04-19 06:01:25 -0700457 LYINFLOG("send incoming call signal");
lh25827952022-01-10 00:34:35 -0800458 pthread_mutex_lock(&s_incoming_call_mutex);
459 pthread_cond_signal(&s_incoming_call_cond);
460 pthread_mutex_unlock(&s_incoming_call_mutex);
461}
462
463void addCallListToLynqCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction,char addr[LYNQ_PHONE_NUMBER_MAX])
464{
465 callList->call_id = call_id;
466 callList->call_state = call_state;
467 callList->toa = toa;
468 callList->direction = direction;
469 memcpy(callList->addr,addr,strlen(addr)+1);
470 callList->used = 1;
lh25827952022-01-10 00:34:35 -0800471 return;
472}
473
474void *triggerGetCallList(void *parg)
ll375c94d2022-01-27 05:54:38 +0000475{
476 int ret=0;
lhbe92dd12022-04-19 06:01:25 -0700477 bool call_end;
ll375c94d2022-01-27 05:54:38 +0000478 lynq_call_list_t call_list[LYNQ_CALL_MAX];
q.huang18d08bf2022-04-19 20:27:44 -0400479 int update=0;
q.huang783ed5d2022-06-02 14:49:02 +0800480 int cnt;
481 int i,n;
482
lh25827952022-01-10 00:34:35 -0800483 while(call_list_loop)
ll375c94d2022-01-27 05:54:38 +0000484 {
q.huang18d08bf2022-04-19 20:27:44 -0400485 update=0;
llc81b4d52022-07-13 09:39:44 +0000486 pthread_mutex_lock(s_urc_call_state_change_mutex);
487 pthread_cond_wait(s_urc_call_state_change_cond, s_urc_call_state_change_mutex);
q.huang783ed5d2022-06-02 14:49:02 +0800488 LYDBGLOG("triggerGetCallList event!!!");
ll375c94d2022-01-27 05:54:38 +0000489 memset(call_list,0,sizeof(call_list));
490 ret = lynq_get_current_call_list(call_list);
491 if(ret != 0)
492 {
q.huang783ed5d2022-06-02 14:49:02 +0800493 LYDBGLOG("get current call list failure!!!");
ll22101402022-04-11 05:49:51 +0000494 continue;
ll375c94d2022-01-27 05:54:38 +0000495 }
lhbe92dd12022-04-19 06:01:25 -0700496 LYINFLOG("++++++++++++++triggerGetCallList++++++++++++++");
q.huang783ed5d2022-06-02 14:49:02 +0800497 LYINFLOG("clear local index begin");
498 cnt=0;
499 for(i = 0;i < LYNQ_CALL_MAX;i++)
lh25827952022-01-10 00:34:35 -0800500 {
q.huang783ed5d2022-06-02 14:49:02 +0800501 if(lynq_call_lists[i].used ==0)
502 {
503 continue;
504 }
505 cnt++;
506 LYINFLOG("local idx is %d id is %d addr is %s state is %d direction is %d",i,lynq_call_lists[i].call_id,lynq_call_lists[i].addr,lynq_call_lists[i].call_state,lynq_call_lists[i].direction);
507
508 if(lynq_call_lists[i].call_id > 0)
lhbe92dd12022-04-19 06:01:25 -0700509 {
510 call_end = 0;
q.huang783ed5d2022-06-02 14:49:02 +0800511 for(n = 0; n < LYNQ_CALL_MAX; n++)
lhbe92dd12022-04-19 06:01:25 -0700512 {
q.huang783ed5d2022-06-02 14:49:02 +0800513 if(call_list[n].call_id == lynq_call_lists[i].call_id)
lhbe92dd12022-04-19 06:01:25 -0700514 {
515 call_end = 1;
q.huang783ed5d2022-06-02 14:49:02 +0800516 LYINFLOG("find lynq call local idx %d, service idx %d id is %d!!!",i,n,lynq_call_lists[i].call_id);
517 break;
lhbe92dd12022-04-19 06:01:25 -0700518 }
519 }
520 if(call_end == 0)
521 {
q.huang783ed5d2022-06-02 14:49:02 +0800522 LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, lynq_call_lists[i].call_id);
523 cleanCallList(i);
lhbe92dd12022-04-19 06:01:25 -0700524 }
525 } //fix bug API-54
q.huang783ed5d2022-06-02 14:49:02 +0800526 else
527 {
528 LYINFLOG("local id is 0");
529 }
530 }
531 LYINFLOG("clear local index end, local used cnt is %d", cnt);
532
533 LYINFLOG("add or update local index begin ");
534 for (i = 0;i < LYNQ_CALL_MAX;i++)
535 {
536 if(call_list[i].call_id==0)
537 {
538 break;
539 }
540
541 LYINFLOG("servie idx %d begin: call_id=%d, call_state=%d, direction=%d, addr=%s, toa=%d",i,call_list[i].call_id, call_list[i].call_state,
542 call_list[i].direction,call_list[i].addr,call_list[i].toa);
543
lh25827952022-01-10 00:34:35 -0800544 if(call_list[i].direction == 1)//MT call
545 {
q.huang783ed5d2022-06-02 14:49:02 +0800546 LYINFLOG("This is a MT CALL");
lh4256e1b2022-05-13 03:02:19 -0700547 /*MT CALL state code
548 **LYNQ_CALL_INCOMING = 4,
549 **LYNQ_CALL_WAITING = 5,
550 */
551 if((call_list[i].call_state ==4) || (call_list[i].call_state ==5))
lh25827952022-01-10 00:34:35 -0800552 {
q.huang783ed5d2022-06-02 14:49:02 +0800553#ifdef ECALL_SUPPORT
554 if(lynq_ecall_is_running())
lh25827952022-01-10 00:34:35 -0800555 {
q.huang783ed5d2022-06-02 14:49:02 +0800556 lynq_call_hungup(&(call_list[i].call_id));
557 continue;
lh25827952022-01-10 00:34:35 -0800558 }
q.huang783ed5d2022-06-02 14:49:02 +0800559#endif
560 }
561 /*you call me, and i call you,One party failed to dial*/
562 n = find_call_id_with_addr(call_list[i].addr);
563 if(n ==INVALID_ID)
564 {
565 n = addAddr(call_list[i].addr);
566 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
567 lynqIncomingCallId = call_list[i].call_id;
568 sendSignalIncomingCall();
569 }
570 else if(lynq_call_lists[n].call_state == call_list[i].call_state)
571 {
572 LYINFLOG("state not changed, state is %d ",call_list[i].call_state);
573 if(call_list[i].call_state ==4 || call_list[i].call_state ==5)
lhbe92dd12022-04-19 06:01:25 -0700574 {
lhbe92dd12022-04-19 06:01:25 -0700575 /*if call state not change,Maybe this call was ignored, so we need to continue to inform the user of
576 **an incoming call until the status changes.
577 **fix bug API-54
578 */
q.huang783ed5d2022-06-02 14:49:02 +0800579 LYINFLOG("resend incoming call signal");
580 sendSignalIncomingCall();
lhbe92dd12022-04-19 06:01:25 -0700581 }
lh25827952022-01-10 00:34:35 -0800582 }
q.huang783ed5d2022-06-02 14:49:02 +0800583 else
ll45d3ea92022-03-24 10:22:25 +0800584 {
q.huang783ed5d2022-06-02 14:49:02 +0800585 LYINFLOG("state changed from %d to %d",lynq_call_lists[n].call_state,call_list[i].call_state);
586
587 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
588 }
lh25827952022-01-10 00:34:35 -0800589 }
590 else
q.huang783ed5d2022-06-02 14:49:02 +0800591 {
592 LYINFLOG("This is a MO CALL");
593 call_end = 0;
594 for(n = 0 ; n < LYNQ_CALL_MAX; n++)
lh25827952022-01-10 00:34:35 -0800595 {
q.huang783ed5d2022-06-02 14:49:02 +0800596 if(lynq_call_lists[n].used && ((strcmp(call_list[i].addr,lynq_call_lists[n].addr)==0)||(call_list[i].call_id==lynq_call_lists[n].call_id)))
lh25827952022-01-10 00:34:35 -0800597 {
q.huang783ed5d2022-06-02 14:49:02 +0800598 if(lynq_call_lists[n].call_id==0)
599 {
600 LYINFLOG("add a call id");
601 update=1;
602 }
603 LYINFLOG("local idx %d updated, original call id is %d origial addr is %s original state is %d",n,lynq_call_lists[n].call_id,lynq_call_lists[n].addr,lynq_call_lists[n].call_state);
604 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
605 call_end = 1;
606 break;
607 }
608 }
609
610 if(call_end == 0)
611 {
612 LYINFLOG("need to hangup id %d", call_list[i].call_id);
613#ifdef ECALL_SUPPORT
q.huang40f5e322022-06-21 14:57:02 +0800614 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
q.huang783ed5d2022-06-02 14:49:02 +0800615 {
616 LYINFLOG("ecall is dialing, for the timebeing, don't huangup");
lh25827952022-01-10 00:34:35 -0800617 continue;
618 }
q.huang783ed5d2022-06-02 14:49:02 +0800619#endif
620 LYINFLOG("hang up service call id %d",call_list[i].call_id);
621 lynq_call_hungup(&(call_list[i].call_id));
lh25827952022-01-10 00:34:35 -0800622 }
lh25827952022-01-10 00:34:35 -0800623 }
q.huang783ed5d2022-06-02 14:49:02 +0800624 LYDBGLOG("servie idx %d end",i);
ll375c94d2022-01-27 05:54:38 +0000625 }
q.huang783ed5d2022-06-02 14:49:02 +0800626 LYINFLOG("add or update local index end ");
lha35d4ee2022-01-25 18:47:39 -0800627 s_call_urc_event_complete = 1;
q.huang783ed5d2022-06-02 14:49:02 +0800628 if(isDial==1)
lh25827952022-01-10 00:34:35 -0800629 {
q.huang783ed5d2022-06-02 14:49:02 +0800630 LYINFLOG("now is dialing");
631 if(update==1)
632 {
633 LYINFLOG("find added call");
634 sendSignalToWaitCallStateChange();
635 isDial = 0;
636 }
637 else
638 {
639 LYINFLOG("not find added call");
640 }
641 }
642 else
643 {
644 LYINFLOG("now is not dialing");
lh25827952022-01-10 00:34:35 -0800645 }
llc81b4d52022-07-13 09:39:44 +0000646 pthread_mutex_unlock(s_urc_call_state_change_mutex);
ll375c94d2022-01-27 05:54:38 +0000647 }
648 return NULL;
lh25827952022-01-10 00:34:35 -0800649}
650
651void lynqRespWatingEvent()
ll375c94d2022-01-27 05:54:38 +0000652{
653 if(s_call_urc_event_complete==1)
654 {
llc81b4d52022-07-13 09:39:44 +0000655 pthread_mutex_lock(s_urc_call_state_change_mutex);
656 pthread_cond_signal(s_urc_call_state_change_cond);
ll375c94d2022-01-27 05:54:38 +0000657 s_call_urc_event_complete = 0;
llc81b4d52022-07-13 09:39:44 +0000658 pthread_mutex_unlock(s_urc_call_state_change_mutex);
lh25827952022-01-10 00:34:35 -0800659 }
ll375c94d2022-01-27 05:54:38 +0000660 return;
lh25827952022-01-10 00:34:35 -0800661}
662
663/*Warren add for T800 platform 2021/11/19 start*/
664int lynq_socket_client_start()
rjw8bdc56b2022-02-28 15:01:49 +0800665{
666 #if 0
lh25827952022-01-10 00:34:35 -0800667 struct sockaddr_in lynq_socket_server_addr;
668 /* init lynq_socket_server_addr */
669 bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
670 lynq_socket_server_addr.sin_family = AF_INET;
671 lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
672 lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
rjw8bdc56b2022-02-28 15:01:49 +0800673
lh25827952022-01-10 00:34:35 -0800674 /*
675 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
676 {
q.huang783ed5d2022-06-02 14:49:02 +0800677 LYDBGLOG("[%s] is not a valid IPaddress", argv[1]);
lh25827952022-01-10 00:34:35 -0800678 exit(1);
679 }
680*/
lha35d4ee2022-01-25 18:47:39 -0800681 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
682 if(connect(lynq_call_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
lh25827952022-01-10 00:34:35 -0800683 {
q.huang783ed5d2022-06-02 14:49:02 +0800684 LYERRLOG("connect error");
lh25827952022-01-10 00:34:35 -0800685 return -1;
686 }
rjw8bdc56b2022-02-28 15:01:49 +0800687 #endif
688 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
689 if (-1 == lynq_call_client_sockfd)
690 {
691 return lynq_call_client_sockfd;
692 }
693 /* 设置address */
694 memset(&addr_serv, 0, sizeof(addr_serv));
695 addr_serv.sin_family = AF_INET;
696 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
697 addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
698 len_addr_serv = sizeof(addr_serv);
lh25827952022-01-10 00:34:35 -0800699 return 0;
700}
701int lynq_update_call_list_loop()
702{
703 int ret = 0;
lh25827952022-01-10 00:34:35 -0800704 pthread_attr_t attr;
705 pthread_attr_init(&attr);
706 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhcdf816a2022-02-13 23:56:05 -0800707 ret = pthread_create(&lynq_call_list_loop_tid,&attr,triggerGetCallList,NULL);
lh25827952022-01-10 00:34:35 -0800708 if(ret < 0)
709 {
710 LYERRLOG("lynq_update_call_list_loop fail!!!");
711 return -1;
712 }
q.huang783ed5d2022-06-02 14:49:02 +0800713 LYDBGLOG("lynq_update_call_list_loop success!!!");
lh25827952022-01-10 00:34:35 -0800714 return 0;
715
716}
q.huang783ed5d2022-06-02 14:49:02 +0800717
lh25827952022-01-10 00:34:35 -0800718void *thread_urc_recv(void *parg)
ll375c94d2022-01-27 05:54:38 +0000719{
lh25827952022-01-10 00:34:35 -0800720 int socket_fd = (int64_t)parg;
721 int len=0;
722 socklen_t addr_len=0;
723 uint8_t *dataLength = NULL;
724 char urc_data[LYNQ_REC_BUF];
725 int slot_id = -1;
726 int resp_type = -1;
727 int urcid = -1;
728 Parcel *p = NULL;
729 struct sockaddr_in dest_addr;
q.huang18d08bf2022-04-19 20:27:44 -0400730#ifdef ECALL_SUPPORT
q.huang783ed5d2022-06-02 14:49:02 +0800731 int ecall_ind;
732 int ecallId;
733 int unused_callid;
q.huang18d08bf2022-04-19 20:27:44 -0400734#endif
735
q.huang783ed5d2022-06-02 14:49:02 +0800736 LYINFLOG("thread_urc_recv in running....");
lha35d4ee2022-01-25 18:47:39 -0800737 while(urc_call_recive_status)
lh25827952022-01-10 00:34:35 -0800738 {
739 bzero(urc_data,LYNQ_REC_BUF);
740 //get data msg
741 len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
742 if(len <= 0)
ll375c94d2022-01-27 05:54:38 +0000743 {
q.huang783ed5d2022-06-02 14:49:02 +0800744 LYERRLOG("thread_urc_recv step2 fail");
ll375c94d2022-01-27 05:54:38 +0000745 break;
lh25827952022-01-10 00:34:35 -0800746 }
q.huang783ed5d2022-06-02 14:49:02 +0800747 LYDBGLOG("=====>urc data len<=====:%d",len);
lh25827952022-01-10 00:34:35 -0800748 p = new Parcel();
749 if(p==NULL)
750 {
lh59e0d002022-01-27 00:27:12 -0800751 LYERRLOG("new parcel failure!!!");
lh25827952022-01-10 00:34:35 -0800752 break;
753 }
754 p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
755 p->setDataPosition(0);
756 if(p->dataAvail() > 0)
757 {
758 p->readInt32(&resp_type);
759 p->readInt32(&urcid);
760 p->readInt32(&slot_id);
q.huang783ed5d2022-06-02 14:49:02 +0800761 //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh25827952022-01-10 00:34:35 -0800762 switch (urcid)
763 {
764 case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
765 {
q.huang783ed5d2022-06-02 14:49:02 +0800766 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh25827952022-01-10 00:34:35 -0800767 lynqRespWatingEvent();
768 break;
769 }
770 case 1018://RIL_UNSOL_CALL_RING
771 {
772 if(global_call_auto_answer==1)
773 {
774 lynq_call_answer();
775 }
776 break;
777 }
778 case 1029://RIL_UNSOL_RINGBACK_TONE
779 case 3049://RIL_UNSOL_CALL_INFO_INDICATION
780 {
q.huang783ed5d2022-06-02 14:49:02 +0800781 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh25827952022-01-10 00:34:35 -0800782 break;
783 }
q.huang18d08bf2022-04-19 20:27:44 -0400784#ifdef ECALL_SUPPORT
785 case RIL_UNSOL_ECALL_INDICATIONS:
786 {
q.huang783ed5d2022-06-02 14:49:02 +0800787 p->readInt32(&ecall_ind);
788 g_lynqIncomingEcallIndication = ecall_ind;
789 p->readInt32(&ecallId);
q.huang40f5e322022-06-21 14:57:02 +0800790 g_lynqIncomingEcallId = ecallId;
q.huang783ed5d2022-06-02 14:49:02 +0800791 LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS ,Id %d, ind %d, ecall dialing is %d, normal dialing is %d, local ecall id is %d",ecallId,ecall_ind,is_ecall_dial,isDial,g_ecallId);
q.huang40f5e322022-06-21 14:57:02 +0800792 switch (g_lynqIncomingEcallIndication)
q.huang783ed5d2022-06-02 14:49:02 +0800793 {
q.huang40f5e322022-06-21 14:57:02 +0800794 case LYNQ_ECALL_ACTIVE:
795 if(is_ecall_dial)
q.huang783ed5d2022-06-02 14:49:02 +0800796 {
q.huang40f5e322022-06-21 14:57:02 +0800797 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_ANSWERED;
q.huang783ed5d2022-06-02 14:49:02 +0800798 }
q.huang40f5e322022-06-21 14:57:02 +0800799 break;
800 case LYNQ_ECALL_LLACK_RECEIVED:
801 case LYNQ_ECALL_ALACK_POSITIVE_RECEIVED:
802 case LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED:
803 case LYNQ_ECALL_T5_TIMER_OUT:
804 case LYNQ_ECALL_T6_TIMER_OUT:
805 case LYNQ_ECALL_T7_TIMER_OUT:
806 if(is_ecall_dial)
807 {
808 LYINFLOG("ecall is dialing, recv suc indication");
809 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
810 if(ecallId >0 && find_call_id_with_call_id(ecallId)==INVALID_ID)
811 {
812 LYINFLOG("add ecall in loacl list");
813 g_ecallId = ecallId;
814 unused_callid=addAddr("ecall");
815 lynq_call_lists[unused_callid].call_id=g_ecallId;
816 }
817 sendSignalToWaitCallStateChange();
818 }
819 else if(ecallId >0 && (find_call_id_with_call_id(ecallId)==INVALID_ID))
820 {
821 LYERRLOG("ecall is not in dialing and first recv suc indication, hangup");
822 lynq_call_hungup(&ecallId);
823 }
824 else
825 {
826 LYERRLOG("ecall is not in dialing and not first recv suc indication");
827 }
828 break;
829 case LYNQ_ECALL_PSAP_CALLBACK_START:
830 if(lynq_ecall_is_running()==0)
831 {
832 LYINFLOG("ecall is not running, recv psap call back msd start, set ecall in dialing");
833 if(find_call_id_with_call_id(ecallId)!=INVALID_ID)
834 {
835 g_ecallId = ecallId;
836 if(isDial)
837 {
838 LYINFLOG("stop normal dial");
839 sendSignalToWaitCallStateChange();
840 }
841 else
842 {
843 LYINFLOG("no normal dial");
844 }
845 }
846 else
847 {
848 LYERRLOG("can't find ecall id in local list");
849 }
850 }
851 else
852 {
853 LYERRLOG("ecall is running, recv psap call back msd start");
854 }
855 break;
856 case LYNQ_ECALL_ABNORMAL_HANGUP:
857 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_NONE)
858 {
859 LYERRLOG("ecall is not in dialing , recv abnormal hangup");
860 g_ecallId = INVALID_ID;
861 }
862 else if (is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
863 {
864 LYERRLOG("ecall is in dialing state, recv no answer, recv abnormal hangup, dont' redial");
865 g_ecallId = INVALID_ID;
866 sendSignalToWaitCallStateChange();
867 }
868 else {
869 LYINFLOG("ecall is in dialing and recv answer, recv abnormal hangup");
870 }
871 break;
872 case LYNQ_ECALL_DISCONNECTED:
873 case LYNQ_ECALL_REDIAL_TIMER_OUT:
874 case LYNQ_ECALL_T2_TIMER_OUT :
875 case LYNQ_ECALL_IMS_DISCONNECTED:
876 g_ecallId = INVALID_ID;
877 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
878 {
879 LYERRLOG("ecall is in dialing, recv like disconnect indication");
880 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
881 sendSignalToWaitCallStateChange();
882 }
883 else
884 {
885 LYINFLOG("ecall is not in dialing, recv like disconnect indication");
886 }
887 break;
888 default:
889 LYINFLOG("not special indication");
q.huang783ed5d2022-06-02 14:49:02 +0800890 }
q.huang18d08bf2022-04-19 20:27:44 -0400891 sendSignalIncomingECallEvent();
q.huang783ed5d2022-06-02 14:49:02 +0800892 LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS, local ecall id is %d", g_ecallId);
q.huang18d08bf2022-04-19 20:27:44 -0400893 break;
894 }
895#endif
lh25827952022-01-10 00:34:35 -0800896 default:
897 break;
898 }
899 }
900 delete p;
901 p = NULL;
902 }
903 close(socket_fd);
904}
905int lynq_socket_urc_start()
906{
907 int socket_fd=0;
908 int rt=0;
909 int len=0;
910 int on=1;
911 struct sockaddr_in urc_local_addr;
lh25827952022-01-10 00:34:35 -0800912 pthread_attr_t attr;
ll375c94d2022-01-27 05:54:38 +0000913 socket_fd = socket(AF_INET,SOCK_DGRAM,0);
ll375c94d2022-01-27 05:54:38 +0000914 if(socket_fd < 0)
915 {
q.huang783ed5d2022-06-02 14:49:02 +0800916 LYERRLOG("creaet socket for udp fail");
ll375c94d2022-01-27 05:54:38 +0000917 return -1;
lh25827952022-01-10 00:34:35 -0800918 }
919 urc_local_addr.sin_family = AF_INET;
920 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
921 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
922 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
ll375c94d2022-01-27 05:54:38 +0000923 rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
924 if(rt<0)
925 {
q.huang783ed5d2022-06-02 14:49:02 +0800926 LYERRLOG("SO_REUSEADDR fail");
lh25827952022-01-10 00:34:35 -0800927 return -1;
928 }
929 rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
ll375c94d2022-01-27 05:54:38 +0000930 if (rt == -1)
931 {
lh59e0d002022-01-27 00:27:12 -0800932 LYERRLOG("bind failed");
ll375c94d2022-01-27 05:54:38 +0000933 return -1;
lh25827952022-01-10 00:34:35 -0800934 }
935 pthread_attr_init(&attr);
936 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhcdf816a2022-02-13 23:56:05 -0800937 rt = pthread_create(&lynq_call_urc_tid,&attr,thread_urc_recv,(void *)socket_fd);
lh25827952022-01-10 00:34:35 -0800938 if(rt < 0)
939 {
q.huang783ed5d2022-06-02 14:49:02 +0800940 LYERRLOG("urc loop failure!!!");
lh25827952022-01-10 00:34:35 -0800941 return -1;
942 }
q.huang783ed5d2022-06-02 14:49:02 +0800943 LYDBGLOG("urc loop success!!!");
lh25827952022-01-10 00:34:35 -0800944 return 0;
945}
946int getSelfElement(char addr[])
947{
948 for(int i=0;i < LYNQ_CALL_MAX; i++)
949 {
950 if(lynq_call_lists[i].used==1)
951 {
952 if(strcmp(lynq_call_lists[i].addr,addr)==0)
953 {
954 return i;
955 }
956
957 }
958 }
959 return -1;
960}
961
962void lynq_call_state_change_test(int soc_id)
963{
q.huang783ed5d2022-06-02 14:49:02 +0800964 LYDBGLOG("call state change,sim:%d",soc_id);
lh25827952022-01-10 00:34:35 -0800965}
q.huang3e761702022-06-28 20:12:01 +0800966
967void lynq_init_rtp()
968{
969 memset(&g_rtp_client_info,0,sizeof(g_rtp_client_info));
970 memset(&g_rtp_server_info,0,sizeof(g_rtp_server_info));
971
972
973 lynq_set_rtp_param(8000,1,400);
974
975 for(int i=0;i<RTP_MODE_MAX;i++)
976 {
q.huang301f2a62022-06-30 09:55:45 +0800977 lynq_set_rtp_port(i,6666);
q.huang3e761702022-06-28 20:12:01 +0800978 g_rtp_thread_valid[i] = 0;
979 }
980
981 LYDBGLOG("lynq init rtp success!!!");
982 return;
983}
984
lh25827952022-01-10 00:34:35 -0800985int lynq_init_call(int uToken)
ll1343a5b2022-03-17 05:31:33 +0000986{
987 if(g_lynq_call_init_flag == 1){
988 LYDBGLOG("lynq init call failed!!!");
989 return -1;
990 }
991 g_lynq_call_init_flag = 1;
llc81b4d52022-07-13 09:39:44 +0000992 s_call_urc_event_complete = 1;
993 call_list_loop = 1;
994 LYINFLOG("liulei call_list_loop %d\n", call_list_loop);
995 s_urc_call_state_change_mutex = new pthread_mutex_t;
996 pthread_mutex_init(s_urc_call_state_change_mutex, NULL);
997 s_urc_call_state_change_cond = new pthread_cond_t;
998 LYINFLOG("liulei s_urc_call_state_change_mutex\n");
999 pthread_cond_init(s_urc_call_state_change_cond, NULL);
1000 LYINFLOG("liulei s_urc_call_state_change_cond\n");
lh25827952022-01-10 00:34:35 -08001001 int result = 0;
lha35d4ee2022-01-25 18:47:39 -08001002 Global_uToken_call = uToken;
lh59e0d002022-01-27 00:27:12 -08001003 urc_call_recive_status = 1;
rjw8bdc56b2022-02-28 15:01:49 +08001004 client_size = sizeof(client_t);
lh25827952022-01-10 00:34:35 -08001005 LYLOGSET(LOG_INFO);
1006 LYLOGEINIT(USER_LOG_TAG);
1007 result = lynq_socket_client_start();
1008 if(result!=0)
1009 {
1010 return -1;
1011 }
1012 result = lynq_socket_urc_start();
1013 if(result!=0)
1014 {
1015 return -1;
1016 }
1017 result = lynq_update_call_list_loop();
1018 if(result!=0)
1019 {
1020 return -1;
1021 }
1022 memset(lynq_call_lists,0,sizeof(lynq_call_lists));
q.huang3e761702022-06-28 20:12:01 +08001023
1024 lynq_init_rtp();
1025
lh25827952022-01-10 00:34:35 -08001026 LYDBGLOG("lynq init call success!!!");
1027 return 0;
1028}
1029int lynq_deinit_call()
1030{
q.huang783ed5d2022-06-02 14:49:02 +08001031 int ret;
ll1343a5b2022-03-17 05:31:33 +00001032 if(g_lynq_call_init_flag == 0)
lhcdf816a2022-02-13 23:56:05 -08001033 {
ll1343a5b2022-03-17 05:31:33 +00001034 LYDBGLOG("lynq_deinit_call failed!!!");
1035 return -1;
lhcdf816a2022-02-13 23:56:05 -08001036 }
ll1343a5b2022-03-17 05:31:33 +00001037 else
llc81b4d52022-07-13 09:39:44 +00001038 {
ll1343a5b2022-03-17 05:31:33 +00001039 g_lynq_call_init_flag = 0;
q.huang783ed5d2022-06-02 14:49:02 +08001040 lynq_call_hungup_all();
ll1343a5b2022-03-17 05:31:33 +00001041 if(lynq_call_client_sockfd>0)
1042 {
1043 close(lynq_call_client_sockfd);
1044 }
1045 urc_call_recive_status = 0;
1046 call_list_loop = 0;
q.huang3e761702022-06-28 20:12:01 +08001047 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
ll1343a5b2022-03-17 05:31:33 +00001048 if(lynq_call_urc_tid == -1 || lynq_call_list_loop_tid == -1)
1049 {
1050 return -1;
1051 }
1052 ret = pthread_cancel(lynq_call_urc_tid);
1053 LYDBGLOG("pthread cancel ret = %d",ret);
1054 ret = pthread_cancel(lynq_call_list_loop_tid);
1055 LYDBGLOG("pthread cancel ret = %d",ret);
1056 ret = pthread_join(lynq_call_urc_tid,NULL);
1057 LYDBGLOG("pthread join ret = %d",ret);
1058 ret = pthread_join(lynq_call_list_loop_tid,NULL);
1059 LYDBGLOG("pthread join ret = %d",ret);
llc81b4d52022-07-13 09:39:44 +00001060 pthread_mutex_destroy(s_urc_call_state_change_mutex);
1061 pthread_cond_destroy(s_urc_call_state_change_cond);
1062 delete s_urc_call_state_change_mutex;
1063 //s_urc_call_state_change_mutex = NULL;
1064 delete s_urc_call_state_change_cond;
1065 //s_urc_call_state_change_cond = NULL;
1066
ll1343a5b2022-03-17 05:31:33 +00001067 return 0;
1068 }
rita47debb92022-04-07 06:08:13 -04001069}
q.huangfe1b4052022-04-18 00:09:50 -04001070
1071int lynq_set_common_request(int request_id, int argc, const char* format,...)
rita9b436d82022-04-07 01:55:39 -04001072{
1073 Parcel p;
1074 lynq_client_t client;
1075 int resp_type = -1;
1076 int request = -1;
1077 int slot_id = -1;
1078 int error = -1;
rita9b436d82022-04-07 01:55:39 -04001079
1080 client.uToken = Global_uToken_call;
q.huangfe1b4052022-04-18 00:09:50 -04001081 client.request = request_id;
1082 client.paramLen = argc;
rita9b436d82022-04-07 01:55:39 -04001083 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huangfe1b4052022-04-18 00:09:50 -04001084 if(argc!=0)
1085 {
1086 va_list args;
1087 va_start(args, format);
1088 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
1089 va_end(args);
1090 }
q.huang783ed5d2022-06-02 14:49:02 +08001091 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita9b436d82022-04-07 01:55:39 -04001092 if(send_request(lynq_call_client_sockfd,&client)==-1)
1093 {
1094 LYERRLOG("send request fail");
1095 return -1;
1096 }
q.huangfe1b4052022-04-18 00:09:50 -04001097 if(get_response(lynq_call_client_sockfd,p)==0)
1098 {
1099 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1100 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1101 }
rita9b436d82022-04-07 01:55:39 -04001102 return error;
1103}
1104
q.huangfe1b4052022-04-18 00:09:50 -04001105int lynq_get_common_request(int request_id, int* status)
rita9b436d82022-04-07 01:55:39 -04001106{
1107 Parcel p;
1108 lynq_client_t client;
1109 int resp_type = -1;
1110 int request = -1;
1111 int slot_id = -1;
1112 int error = -1;
q.huangfe1b4052022-04-18 00:09:50 -04001113 if(status==NULL)
1114 {
1115 LYERRLOG("status is null");
1116 return -1;
1117 }
rita9b436d82022-04-07 01:55:39 -04001118 client.uToken = Global_uToken_call;
q.huangfe1b4052022-04-18 00:09:50 -04001119 client.request = request_id;
1120 client.paramLen = 0;
rita9b436d82022-04-07 01:55:39 -04001121 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001122 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita9b436d82022-04-07 01:55:39 -04001123 if(send_request(lynq_call_client_sockfd,&client)==-1)
1124 {
1125 LYERRLOG("send request fail");
1126 return -1;
1127 }
q.huangfe1b4052022-04-18 00:09:50 -04001128 if(get_response(lynq_call_client_sockfd,p)==0)
rita9b436d82022-04-07 01:55:39 -04001129 {
q.huangfe1b4052022-04-18 00:09:50 -04001130 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1131 p.readInt32(status);
1132 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
rita9b436d82022-04-07 01:55:39 -04001133 }
rita9b436d82022-04-07 01:55:39 -04001134 return error;
1135}
1136
lh25827952022-01-10 00:34:35 -08001137int lynq_call(int* handle,char addr[])
1138{
1139 Parcel p;
1140 lynq_client_t client;
1141 int resp_type = -1;
1142 int request = -1;
1143 int slot_id = -1;
1144 int error = -1;
1145 int lynq_call_id = -1;
q.huang783ed5d2022-06-02 14:49:02 +08001146
1147 LYINFLOG("lynq_call begin addr %s",addr);
lh25827952022-01-10 00:34:35 -08001148 if(addr==NULL)
1149 {
1150 LYERRLOG("Phone num is null!!!");
1151 return -1;
1152 }
q.huang783ed5d2022-06-02 14:49:02 +08001153
1154 if(find_call_id_with_addr(addr)!=INVALID_ID)
1155 {
1156 LYERRLOG("addr %s exists",addr);
1157 return LYNQ_E_CONFLICT;
1158 }
1159
1160#ifdef ECALL_SUPPORT
1161 if(lynq_ecall_is_running())
1162 {
1163 LYERRLOG("lynq_fast_ecall ecall is running");
1164 return LYNQ_E_ECALL_BEING_RUNNING;
1165 }
1166#endif
1167
lha35d4ee2022-01-25 18:47:39 -08001168 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001169 client.request = 10;//RIL_REQUEST_DIAL
1170 client.paramLen = 2;
1171 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1172 memcpy(client.param,addr,strlen(addr)+1);
1173 strcat(client.param," 0");
q.huang783ed5d2022-06-02 14:49:02 +08001174 lynq_call_id = addAddr(addr);
1175 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lha35d4ee2022-01-25 18:47:39 -08001176 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001177 {
1178 LYERRLOG("send request fail");
q.huang783ed5d2022-06-02 14:49:02 +08001179 cleanCallList(lynq_call_id);
lh25827952022-01-10 00:34:35 -08001180 return -1;
1181 }
lha35d4ee2022-01-25 18:47:39 -08001182 get_response(lynq_call_client_sockfd,p);
lh25827952022-01-10 00:34:35 -08001183 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1184 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
lh25827952022-01-10 00:34:35 -08001185 if(error==0)
1186 {
1187 isDial = 1;
ll45d3ea92022-03-24 10:22:25 +08001188 if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
lh25827952022-01-10 00:34:35 -08001189 {
lhbe92dd12022-04-19 06:01:25 -07001190 //if timeout,this call need destroy.
1191 isDial = 0;
lh25827952022-01-10 00:34:35 -08001192 error = LYNQ_E_TIME_OUT;
q.huang783ed5d2022-06-02 14:49:02 +08001193 LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
1194 cleanCallList(lynq_call_id);
lh25827952022-01-10 00:34:35 -08001195 return error;
1196 }
q.huang783ed5d2022-06-02 14:49:02 +08001197 isDial = 0;
1198 *handle = lynq_call_lists[lynq_call_id].call_id;
1199 if(*handle > 0)
1200 {
1201 LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);
1202 return 0;
1203 }
1204 else
1205 {
1206 LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
1207 cleanCallList(lynq_call_id);
1208 return LYNQ_E_INVALID_ID_ANONALY;
1209 }
1210
lh25827952022-01-10 00:34:35 -08001211 }
q.huang783ed5d2022-06-02 14:49:02 +08001212 LYERRLOG("lynq_call dial addr %s fail, service error %d",addr, error);
1213 cleanCallList(lynq_call_id);
lh25827952022-01-10 00:34:35 -08001214 return error;
1215}
1216int lynq_call_answer()
1217{
1218 Parcel p;
1219 lynq_client_t client;
1220 int resp_type = -1;
1221 int request = -1;
1222 int slot_id = -1;
1223 int error = -1;
lha35d4ee2022-01-25 18:47:39 -08001224 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001225 client.request = 40;//RIL_REQUEST_DIAL
1226 client.paramLen = 0;
1227 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001228 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lha35d4ee2022-01-25 18:47:39 -08001229 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001230 {
1231 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -08001232 return -1;
1233 }
lha35d4ee2022-01-25 18:47:39 -08001234 get_response(lynq_call_client_sockfd,p);
lh25827952022-01-10 00:34:35 -08001235 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1236 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1237 return error;
1238}
1239int lynq_call_hungup(int* handle)
1240{
1241 Parcel p;
1242 lynq_client_t client;
1243 int resp_type = -1;
1244 int request = -1;
1245 int slot_id = -1;
1246 int error = -1;
1247 int call_id = 0;
q.huang783ed5d2022-06-02 14:49:02 +08001248 int lynq_call_id;
lha35d4ee2022-01-25 18:47:39 -08001249 if(handle==NULL||!((*handle>=0)&&(*handle<10)))
1250 {
1251 LYERRLOG("[%s] illegal input!!!!",__FUNCTION__);
1252 return LYNQ_E_CONFLICT;
1253 }
1254 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001255 client.request = 12;//RIL_REQUEST_HUNGUP
1256 client.paramLen = 1;
1257 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001258 call_id = *handle;
lh25827952022-01-10 00:34:35 -08001259 sprintf(client.param,"%d",call_id);
q.huang783ed5d2022-06-02 14:49:02 +08001260 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lha35d4ee2022-01-25 18:47:39 -08001261 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001262 {
1263 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -08001264 return -1;
1265 }
lha35d4ee2022-01-25 18:47:39 -08001266 get_response(lynq_call_client_sockfd,p);
lh25827952022-01-10 00:34:35 -08001267 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1268 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1269 if(error==0)
1270 {
q.huang783ed5d2022-06-02 14:49:02 +08001271 lynq_call_id=find_call_id_with_call_id(call_id);
1272 if(lynq_call_id!=INVALID_ID)
1273 {
1274 cleanCallList(lynq_call_id);
1275 }
lh25827952022-01-10 00:34:35 -08001276 }
1277 return error;
1278}
1279int lynq_call_hungup_all()
1280{
1281 Parcel p;
1282 lynq_client_t client;
1283 int resp_type = -1;
1284 int request = -1;
1285 int slot_id = -1;
1286 int error = -1;
lha35d4ee2022-01-25 18:47:39 -08001287 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001288 client.request = 17;//RIL_REQUEST_UDUB
1289 client.paramLen = 0;
1290 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001291 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lha35d4ee2022-01-25 18:47:39 -08001292 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001293 {
1294 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -08001295 return -1;
1296 }
lha35d4ee2022-01-25 18:47:39 -08001297 get_response(lynq_call_client_sockfd,p);
lh25827952022-01-10 00:34:35 -08001298 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1299 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1300 return error;
1301}
1302int lynq_wait_incoming_call(int *handle)
1303{
1304 waitIncomingCall();
1305 *handle = lynqIncomingCallId;
1306 LYINFLOG("lynq incoming call id:%d",lynqIncomingCallId);
1307 return 0;
1308}
1309
1310int lynq_set_auto_answercall(const int mode)
1311{
1312 global_call_auto_answer = mode;
1313 LYINFLOG("auto answer call mode =%d",mode);
1314 return 0;
1315}
q.huangb0eb7b02022-03-29 04:17:32 -04001316int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
1317{
1318 int lynq_call_id = 0;
q.huang783ed5d2022-06-02 14:49:02 +08001319 LYINFLOG("lynq_get_current_call_state begin ");
q.huangb0eb7b02022-03-29 04:17:32 -04001320 if(handle==NULL)
1321 {
q.huang783ed5d2022-06-02 14:49:02 +08001322 LYERRLOG("handle is NULL");
q.huangb0eb7b02022-03-29 04:17:32 -04001323 return LYNQ_E_NULL_ANONALY;
1324 }
q.huang783ed5d2022-06-02 14:49:02 +08001325 lynq_call_id = find_call_id_with_call_id(*handle);
1326 if(lynq_call_id==INVALID_ID)
1327 {
1328 return LYNQ_E_INVALID_ID_ANONALY;
1329 }
q.huangb0eb7b02022-03-29 04:17:32 -04001330 *call_state = lynq_call_lists[lynq_call_id].call_state;
1331 *toa = lynq_call_lists[lynq_call_id].toa;
1332 *direction = lynq_call_lists[lynq_call_id].direction;
1333 memcpy(addr,lynq_call_lists[lynq_call_id].addr,strlen(lynq_call_lists[lynq_call_id].addr)+1);
1334 return 0;
1335}
1336
1337/*audio begin*/
ll7e055f22022-01-24 12:16:22 +00001338static int judge_mic(const int enable){
llc6030062022-02-14 08:58:16 +00001339 switch(enable){
1340 case 0:
1341 return 1;
1342 case 1:
1343 return 1;
1344 default:
1345 return 0;
ll7e055f22022-01-24 12:16:22 +00001346 }
1347}
1348
lh25827952022-01-10 00:34:35 -08001349int lynq_set_mute_mic(const int enable)
ll7e055f22022-01-24 12:16:22 +00001350{
1351 if(!judge_mic(enable)){
1352 return LYNQ_E_CONFLICT;
1353 }
q.huangb0eb7b02022-03-29 04:17:32 -04001354 return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE
1355}
1356int lynq_get_mute_mic(int *status)
1357{
1358 return lynq_get_common_request(54,status);//RIL_REQUEST_GET_MUTE
lh25827952022-01-10 00:34:35 -08001359}
ll45d3ea92022-03-24 10:22:25 +08001360
1361/**
1362 * @brief Check whether DTMF is valid
1363 *
1364 * @param callnum dtmf eg:0-9 * #
1365 * @return int
1366 */
1367static int judge_dtmf(const char callnum)
1368{
1369 if(callnum == '#')
1370 {
1371 return 1;
1372 }
1373 if(callnum == '*')
1374 {
1375 return 1;
1376 }
1377 if(callnum >= '0'&& callnum <= '9')
1378 {
1379 return 1;
1380 }
1381 return 0;
1382}
1383
lla0438322022-07-20 09:30:19 +00001384int lynq_switch_waiting_or_holding_and_active(void)
1385{
1386 Parcel p;
1387 lynq_client_t client;
1388 int resp_type = -1;
1389 int request = -1;
1390 int slot_id = -1;
1391 int error = -1;
1392 client.uToken = Global_uToken_call;
1393 client.request = RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE;
1394 client.paramLen = 0;
1395 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1396 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1397 if(send_request(lynq_call_client_sockfd,&client)==-1)
1398 {
1399 LYERRLOG("send request fail");
1400 return -1;
1401 }
1402 get_response(lynq_call_client_sockfd,p);
1403 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1404 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1405 return error;
1406}
1407
1408int lynq_hangup_waiting_or_background(void)
1409{
1410 Parcel p;
1411 lynq_client_t client;
1412 int resp_type = -1;
1413 int request = -1;
1414 int slot_id = -1;
1415 int error = -1;
1416 client.uToken = Global_uToken_call;
1417 client.request = RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
1418 client.paramLen = 0;
1419 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1420 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1421 if(send_request(lynq_call_client_sockfd,&client)==-1)
1422 {
1423 LYERRLOG("send request fail");
1424 return -1;
1425 }
1426 get_response(lynq_call_client_sockfd,p);
1427 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1428 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1429 return error;
1430}
1431
1432int lynq_hangup_foreground_resume_background(void)
1433{
1434 Parcel p;
1435 lynq_client_t client;
1436 int resp_type = -1;
1437 int request = -1;
1438 int slot_id = -1;
1439 int error = -1;
1440 client.uToken = Global_uToken_call;
1441 client.request = RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
1442 client.paramLen = 0;
1443 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1444 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
1445 if(send_request(lynq_call_client_sockfd,&client)==-1)
1446 {
1447 LYERRLOG("send request fail");
1448 return -1;
1449 }
1450 get_response(lynq_call_client_sockfd,p);
1451 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1452 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1453 return error;
1454}
1455
lh25827952022-01-10 00:34:35 -08001456int lynq_set_DTMF(const char callnum)
1457{
ll45d3ea92022-03-24 10:22:25 +08001458 if(!judge_dtmf(callnum))
1459 {
1460 return LYNQ_E_CONFLICT;
1461 }
lh25827952022-01-10 00:34:35 -08001462 if(!lynq_call_state)
1463 {
1464 LYERRLOG("LYNQ_E_CONFLICT");
1465 return LYNQ_E_CONFLICT;
1466 }
q.huangb0eb7b02022-03-29 04:17:32 -04001467 return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF
lh25827952022-01-10 00:34:35 -08001468}
q.huangb0eb7b02022-03-29 04:17:32 -04001469static int judge_volume(LYNQ_E_VOLUMN_SET set,const int volume){
1470 if(set==LYNQ_E_VOLUMN_SET_DTMF){
1471 if(volume < 0 ||volume >36){
1472 return 0;
1473 }
1474 }
1475 else if (set==LYNQ_E_VOLUMN_SET_SPEECH)
1476 {
1477 if(volume < 1 ||volume >7){
1478 return 0;
1479 }
ll7e055f22022-01-24 12:16:22 +00001480 }
ll375c94d2022-01-27 05:54:38 +00001481 return 1;
ll7e055f22022-01-24 12:16:22 +00001482}
lh25827952022-01-10 00:34:35 -08001483int lynq_set_DTMF_volume(const int volume)
ll7e055f22022-01-24 12:16:22 +00001484{
q.huangb0eb7b02022-03-29 04:17:32 -04001485 if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){
ll7e055f22022-01-24 12:16:22 +00001486 return LYNQ_E_CONFLICT;
1487 }
q.huangb0eb7b02022-03-29 04:17:32 -04001488 return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME
lh25827952022-01-10 00:34:35 -08001489}
q.huang9ee6d5b2022-04-05 23:11:02 -04001490int lynq_set_speech_volume(const int volume)//mixer_set_volume
lh25827952022-01-10 00:34:35 -08001491{
q.huangb0eb7b02022-03-29 04:17:32 -04001492 if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))
lh25827952022-01-10 00:34:35 -08001493 {
q.huangb0eb7b02022-03-29 04:17:32 -04001494 return LYNQ_E_CONFLICT;
lh25827952022-01-10 00:34:35 -08001495 }
q.huangb0eb7b02022-03-29 04:17:32 -04001496 return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME
lh25827952022-01-10 00:34:35 -08001497}
q.huangb0eb7b02022-03-29 04:17:32 -04001498int lynq_get_speech_volume(int* volumn)//mixer_get_volume
1499{
1500 return lynq_get_common_request(8010,volumn);//LYNQ_REQUEST_GET_SPEECH_VOLUME
1501}
q.huang9ee6d5b2022-04-05 23:11:02 -04001502int lynq_incall_record_start(const char* file_path)
q.huangb0eb7b02022-03-29 04:17:32 -04001503{
q.huang783ed5d2022-06-02 14:49:02 +08001504 return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
q.huangb0eb7b02022-03-29 04:17:32 -04001505}
1506int lynq_incall_record_stop()
1507{
q.huang9ee6d5b2022-04-05 23:11:02 -04001508 const char* unused_file="just_ocuupy_paramter_postion";
1509 return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD
q.huangb0eb7b02022-03-29 04:17:32 -04001510}
1511/*audio end*/
q.huangfe1b4052022-04-18 00:09:50 -04001512
1513#ifdef ECALL_SUPPORT
1514LYNQ_ECall_Variant lynq_get_lynq_ecall_variant_from_lynq_type(LYNQ_ECall_Type type)
1515{
1516 switch(type)
1517 {
1518 case LYNQ_ECALL_TYPE_TEST:
1519 return LYNQ_ECALL_TEST;
1520 case LYNQ_ECALL_TYPE_RECONFIG:
1521 return LYNQ_ECALL_RECONFIG;
1522 default:
1523 return LYNQ_ECALL_EMERGENCY;
1524 }
1525}
1526
1527RIL_ECall_Variant lynq_get_ril_ecall_variant_from_lynq_variant(LYNQ_ECall_Variant type)
1528{
1529 switch(type)
1530 {
1531 case LYNQ_ECALL_TEST:
1532 return ECALL_TEST;
1533 case LYNQ_ECALL_RECONFIG:
1534 return ECALL_RECONFIG;
1535 default:
1536 return ECALL_EMERGENCY;
1537 }
1538}
1539
1540RIL_ECall_Category lynq_get_ril_ecall_cat_from_lynq_cat(LYNQ_ECall_Category cat)
1541{
1542 switch(cat)
1543 {
1544 case LYNQ_EMER_CAT_MANUAL_ECALL:
1545 return EMER_CAT_MANUAL_ECALL;
1546 default:
1547 return EMER_CAT_AUTO_ECALL;
1548 }
1549}
1550
1551
1552int lynq_set_test_num(LYNQ_ECall_Set_Type type, const char *test_num, int test_num_length)
1553{
1554 int error;
1555
1556 if(test_num==NULL || test_num_length > LYNQ_PHONE_NUMBER_MAX )
1557 {
q.huang783ed5d2022-06-02 14:49:02 +08001558 LYERRLOG("test_num is null or test_num_length %d s greater than %d ",test_num_length,LYNQ_PHONE_NUMBER_MAX);
q.huangfe1b4052022-04-18 00:09:50 -04001559 return -1;
1560 }
1561
1562 error=lynq_set_common_request(RIL_REQUEST_ECALL_SET_TEST_NUM,2,"%d %s",type,test_num);
1563
1564 if(error==0)
1565 {
1566 snprintf(e_call_addr[LYNQ_ECALL_TEST],LYNQ_PHONE_NUMBER_MAX,"%s",test_num);
1567 }
1568
1569 return error;
1570}
1571
q.huang892722f2022-05-10 20:37:21 +08001572int lynq_fast_ecall(int* handle, LYNQ_ECall_Category lynq_ecall_cat, LYNQ_ECall_Variant lynq_ecall_variant, const char *addr, int addr_length, const unsigned char *msd_data,int msd_length)
q.huangfe1b4052022-04-18 00:09:50 -04001573{
q.huang783ed5d2022-06-02 14:49:02 +08001574 int error;
q.huangfe1b4052022-04-18 00:09:50 -04001575 RIL_ECall_Variant ril_ecall_variant = lynq_get_ril_ecall_variant_from_lynq_variant (lynq_ecall_variant);
q.huang9a9b8762022-04-19 05:20:12 -04001576 RIL_ECall_Category ril_ecall_cat = lynq_get_ril_ecall_cat_from_lynq_cat(lynq_ecall_cat);
q.huang6a119762022-05-11 20:10:38 +08001577 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
1578 unsigned int i;
q.huang783ed5d2022-06-02 14:49:02 +08001579 if(lynq_ecall_is_running())
q.huang892722f2022-05-10 20:37:21 +08001580 {
q.huang783ed5d2022-06-02 14:49:02 +08001581 LYERRLOG("lynq_fast_ecall ecall is running");
1582 return LYNQ_E_ECALL_BEING_RUNNING;
1583 }
1584
1585 if(msd_length > MSD_MAX_LENGTH || msd_length <=0)
1586 {
1587 LYERRLOG("lynq_fast_ecall msd_length %d is greater than %d or <= 0, parameter error",msd_length,MSD_MAX_LENGTH);
1588 return LYNQ_E_ECALL_MSD_LENGTH_ERROR;
q.huang892722f2022-05-10 20:37:21 +08001589 }
q.huang892722f2022-05-10 20:37:21 +08001590
q.huang6a119762022-05-11 20:10:38 +08001591 for(i =0; i<msd_length;i++)
q.huang892722f2022-05-10 20:37:21 +08001592 {
q.huang6a119762022-05-11 20:10:38 +08001593 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang892722f2022-05-10 20:37:21 +08001594 }
1595
q.huang18d08bf2022-04-19 20:27:44 -04001596
q.huang783ed5d2022-06-02 14:49:02 +08001597 LYINFLOG("lynq_fast_ecall addr is %s",e_call_addr[lynq_ecall_variant]);
q.huang18d08bf2022-04-19 20:27:44 -04001598
q.huang892722f2022-05-10 20:37:21 +08001599 error=lynq_set_common_request(RIL_REQUEST_ECALL_FAST_MAKE_ECALL,4,"%d %d %s %s",ril_ecall_cat, ril_ecall_variant, "null", lynq_msd_data);
q.huangfe1b4052022-04-18 00:09:50 -04001600
1601 if(error==0)
q.huang783ed5d2022-06-02 14:49:02 +08001602 {
q.huang40f5e322022-06-21 14:57:02 +08001603 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_STARTED;
q.huang415e21d2022-07-01 11:38:26 +08001604 if(waitCallstateChange(270000)==ETIMEDOUT)//4.5 min, dailing 1 min, alerting 1 min, sending msd 30s, redial 2min
q.huangfe1b4052022-04-18 00:09:50 -04001605 {
q.huang783ed5d2022-06-02 14:49:02 +08001606 LYERRLOG("lynq_fast_ecall timeout:wait Call state time out!!!");
q.huang40f5e322022-06-21 14:57:02 +08001607 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang783ed5d2022-06-02 14:49:02 +08001608 lynqRespWatingEvent();
1609 return LYNQ_E_TIME_OUT;
q.huangfe1b4052022-04-18 00:09:50 -04001610 }
q.huang40f5e322022-06-21 14:57:02 +08001611 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
1612 {
1613 /*just dail, no recv answer*/
1614 LYERRLOG("lynq_fast_ecall, no answer!");
1615 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
1616 lynqRespWatingEvent();
1617 return LYNQ_E_ECALL_DAILING_NO_ANSWER;
1618 }
1619
1620 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang783ed5d2022-06-02 14:49:02 +08001621 lynqRespWatingEvent();
q.huang18d08bf2022-04-19 20:27:44 -04001622
q.huang783ed5d2022-06-02 14:49:02 +08001623 if(g_ecallId != INVALID_ID)
1624 {
1625 *handle=g_ecallId;
1626 LYINFLOG("lynq_fast_ecall id is %d",g_ecallId);
1627 return 0;
1628 }
1629 else
1630 {
1631 LYERRLOG("lynq_fast_ecall service return fail");
1632 return LYNQ_E_INVALID_ID_ANONALY;
1633 }
q.huangfe1b4052022-04-18 00:09:50 -04001634 }
1635
1636 return error;
1637}
1638
1639int lynq_set_psap(int enable)
1640{
1641 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_PSAP,1,"%d",enable);
1642}
1643
1644int lynq_psap_pull_msd()
1645{
1646 return lynq_set_common_request(RIL_REQUEST_ECALL_PSAP_PULL_MSD,0,"");
1647}
1648
1649int lynq_make_ecall(int* handle, LYNQ_ECall_Type type)
1650{
1651 LYNQ_ECall_Variant lynq_ecall_variant;
1652 int error = -1;
1653 int lynq_call_id = -1;
1654
1655 if(handle==NULL)
1656 {
q.huang783ed5d2022-06-02 14:49:02 +08001657 LYERRLOG("handle is NULL, parameter error ");
q.huangfe1b4052022-04-18 00:09:50 -04001658 return -1;
1659 }
1660
1661 error=lynq_set_common_request(RIL_REQUEST_ECALL_MAKE_ECALL,1,"%d",type);
1662
1663 if(error==0)
1664 {
1665 lynq_ecall_variant=lynq_get_lynq_ecall_variant_from_lynq_type(type);
1666
q.huang783ed5d2022-06-02 14:49:02 +08001667 lynq_call_id = addAddr(e_call_addr[lynq_ecall_variant]);
q.huangfe1b4052022-04-18 00:09:50 -04001668 isDial = 1;
1669 if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms
1670 {
1671 error = LYNQ_E_TIME_OUT;
1672 LYERRLOG("timeout:wait Call state fail!!!");
q.huangfe1b4052022-04-18 00:09:50 -04001673 return error;
1674 }
1675
1676 *handle = lynq_call_id;
1677 }
1678
1679 return error;
1680}
1681
1682
q.huangbd6a3062022-05-10 20:49:46 +08001683int lynq_set_msd(int* handle, const unsigned char *msd_data, int msd_length)
q.huangfe1b4052022-04-18 00:09:50 -04001684{
q.huang6a119762022-05-11 20:10:38 +08001685 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
1686 unsigned int i;
1687
q.huang783ed5d2022-06-02 14:49:02 +08001688 if(handle==NULL || ((*handle) >= LYNQ_CALL_MAX) || msd_length > MSD_MAX_LENGTH || msd_length == 0 || msd_data ==NULL)
q.huangfe1b4052022-04-18 00:09:50 -04001689 {
q.huang783ed5d2022-06-02 14:49:02 +08001690 LYERRLOG("lynq_set_msd handle is NULL or *handle %d is greater or equeal to %d or msd_length %d is greater than %d or msd_data %s is NULL, parameter error",*handle,LYNQ_CALL_MAX,msd_length,MSD_MAX_LENGTH, msd_data);
q.huangbd6a3062022-05-10 20:49:46 +08001691 return -1;
1692 }
q.huangbd6a3062022-05-10 20:49:46 +08001693
q.huang6a119762022-05-11 20:10:38 +08001694 for(i=0; i<msd_length;i++)
q.huangbd6a3062022-05-10 20:49:46 +08001695 {
q.huang6a119762022-05-11 20:10:38 +08001696 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang783ed5d2022-06-02 14:49:02 +08001697 }
1698
1699 LYINFLOG("lynq_set_msd ");
q.huangfe1b4052022-04-18 00:09:50 -04001700
q.huangbd6a3062022-05-10 20:49:46 +08001701 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_MSD,2,"%d %s",lynq_call_lists[(*handle)].call_id,lynq_msd_data);
q.huangfe1b4052022-04-18 00:09:50 -04001702}
1703
1704int lynq_set_ivs(int enable)
1705{
q.huang783ed5d2022-06-02 14:49:02 +08001706 if(enable<0)
1707 {
1708 lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
1709 return 0;
1710 }
1711
1712 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
q.huangfe1b4052022-04-18 00:09:50 -04001713}
1714
1715int lynq_reset_ivs()
1716{
1717 return lynq_set_common_request(RIL_REQUEST_ECALL_RESET_IVS,0,"");
1718}
1719
1720int lynq_ivs_push_msd()
1721{
1722 return lynq_set_common_request(RIL_REQUEST_ECALL_IVS_PUSH_MSD,0,"");
1723}
q.huang18d08bf2022-04-19 20:27:44 -04001724
1725int wait_ecall_event()
1726{
1727 int ret = 0;
1728 pthread_mutex_lock(&s_incoming_e_call_mutex);
1729 ret = pthread_cond_wait(&s_incoming_e_call_cond,&s_incoming_e_call_mutex);
q.huang783ed5d2022-06-02 14:49:02 +08001730 pthread_mutex_unlock(&s_incoming_e_call_mutex);
q.huang18d08bf2022-04-19 20:27:44 -04001731 return ret;
1732}
1733
q.huang2b60c482022-06-30 19:39:20 +08001734int lynq_wait_ecall_indication(int* handle, LYNQ_ECall_Indication *eCall_Indication)
q.huang18d08bf2022-04-19 20:27:44 -04001735{
1736 wait_ecall_event();
q.huang2b60c482022-06-30 19:39:20 +08001737 *handle = g_lynqIncomingEcallId;
q.huang40f5e322022-06-21 14:57:02 +08001738 *eCall_Indication = g_lynqIncomingEcallIndication;
q.huang2b60c482022-06-30 19:39:20 +08001739 LYINFLOG("lynq_wait_ecall_indication handle %d, Ind id: %d", *handle, *eCall_Indication);
q.huang18d08bf2022-04-19 20:27:44 -04001740 return 0;
1741}
1742
q.huangfe1b4052022-04-18 00:09:50 -04001743#endif
1744
q.huang877d6b32022-06-06 16:15:31 +08001745/*Audio Path setting begin*/
q.huang3e761702022-06-28 20:12:01 +08001746/*sub function*/
1747void lynq_set_rtp_mixer_ctrl(int enable_rtp)
1748{
1749 char cmd[256];
1750 LYINFLOG("set_rtp_mixer_ctrl %d", enable_rtp);
1751 if(enable_rtp)
1752 {
1753 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 0);
1754 system(cmd);
1755 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 1);
1756 system(cmd);
1757 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 1);
1758 system(cmd);
1759 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 1);
1760 system(cmd);
1761 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 1);
1762 system(cmd);
1763 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 1);
1764 system(cmd);
1765 }
1766 else
1767 {
1768 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);
1769 system(cmd);
1770 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 0);
1771 system(cmd);
1772 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 0);
1773 system(cmd);
1774 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 0);
1775 system(cmd);
1776 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 0);
1777 system(cmd);
1778 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 0);
1779 system(cmd);
1780 }
1781}
1782
1783void* lynq_start_rtp_cmd(void *arg)
1784{
1785 int* rtp_mode= (int*) arg;
1786 char cmd[384];
1787 LYINFLOG("lynq_start_rtp_cmd: rtp_mode is %d",(*rtp_mode));
1788 if ((*rtp_mode) == RTP_CLIENT)
1789 {
1790 sprintf(cmd,RTP_FROM_CMD, \
1791 g_rtp_client_info.port,g_rtp_client_info.clockrate,g_rtp_client_info.channels, \
1792 g_rtp_client_info.latency);
1793 LYINFLOG("start from rtp play: cmd is %s",cmd);
1794 system(cmd);
1795 }
1796 else if ((*rtp_mode) == RTP_SERVER)
1797 {
1798 sprintf(cmd,RTP_TO_CMD, \
1799 g_rtp_server_info.ip,g_rtp_server_info.port);
1800 LYINFLOG("start to rtp play: cmd is %s",cmd);
1801 system(cmd);
1802 }
1803 return NULL;
1804}
1805
1806int lynq_start_rtp_thread(int rtp_mode)
1807{
1808 int ret;
1809 pthread_attr_t attr;
1810 static int start_mode[RTP_MODE_MAX]={0,1};
1811
1812 pthread_attr_init(&attr);
1813 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1814 ret = pthread_create(&(g_rtp_thread[rtp_mode]),&attr,lynq_start_rtp_cmd,&(start_mode[rtp_mode]));
1815 if(ret != 0)
1816 {
1817 g_rtp_thread_valid[rtp_mode]=0;
1818 LYERRLOG("rtp create %d pthread error, ret is %d",rtp_mode, ret);
1819 return ret;
1820 }
1821 g_rtp_thread_valid[rtp_mode]=1;
1822 return 0;
1823}
1824
q.huang877d6b32022-06-06 16:15:31 +08001825/*set*/
1826int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode)
1827{
q.huang3e761702022-06-28 20:12:01 +08001828 int ret;
1829 int i;
1830
1831 if(audio_mode==AUDIO_MODE_RTP)
1832 {
1833 lynq_set_rtp_mixer_ctrl(1);
1834 for(i=0;i<RTP_MODE_MAX;i++)
1835 {
1836 if(!g_rtp_thread_valid[i])
1837 {
1838 if(lynq_start_rtp_thread(i)!= 0)
1839 {
1840 LYERRLOG("start rtp %d fail",i);
1841 break;
1842 }
1843 else
1844 {
1845 LYINFLOG("start rtp %d suc",i);
1846 }
1847 }
1848 else
1849 {
1850 LYERRLOG("rtp %d needn't start",i);
1851 }
1852 }
1853 if(i!= RTP_MODE_MAX)
1854 {
1855 LYERRLOG("start rtp whole fail");
1856 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
1857 return 1;
1858 }
1859 LYINFLOG("start rtp whole suc");
1860 return 0;
1861 }
1862 else if(audio_mode==AUDIO_MODE_CODEC)
1863 {
1864 for(i=0;i<RTP_MODE_MAX;i++)
1865 {
1866 if(g_rtp_thread_valid[i])
1867 {
1868 ret = pthread_cancel(g_rtp_thread[i]);
1869 LYINFLOG("pthread cancel rtp %d ret = %d",i,ret);
1870 ret = pthread_join(g_rtp_thread[i],NULL);
1871 LYINFLOG("pthread join rtp %d ret = %d",i,ret);
1872 g_rtp_thread_valid[i] = 0;
1873 }
1874 else
1875 {
1876 LYINFLOG("rtp %d needn't stop",i);
1877 }
1878 }
1879 lynq_set_rtp_mixer_ctrl(0);
1880 LYINFLOG("stop rtp suc");
1881 }
1882 return 0;
q.huang877d6b32022-06-06 16:15:31 +08001883}
q.huang3e761702022-06-28 20:12:01 +08001884int lynq_set_remote_rtp_ip(const char* ip, const int ip_length)
q.huang877d6b32022-06-06 16:15:31 +08001885{
q.huang3e761702022-06-28 20:12:01 +08001886 if (NULL == ip)
1887 {
1888 LYERRLOG("ip is NULL!!!");
1889 return -1;
1890 }
1891 if ((ip_length < strlen(ip)+1) || (ip_length > MAX_IP_LENGTH))
1892 {
1893 LYERRLOG("incoming ip length error %d", ip_length);
1894 return -1;
1895 }
1896
1897 bzero(g_rtp_server_info.ip,MAX_IP_LENGTH);
1898 strcpy(g_rtp_server_info.ip,ip);
1899
1900 LYINFLOG("lynq_set_remote_rtp_ip suc: ip is %s, length is %d", ip,ip_length);
1901
q.huang877d6b32022-06-06 16:15:31 +08001902 return 0;
1903}
q.huang65033cb2022-06-06 20:23:15 +08001904int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port)
q.huang877d6b32022-06-06 16:15:31 +08001905{
q.huang3e761702022-06-28 20:12:01 +08001906 if (port < 0)
1907 {
1908 LYERRLOG("invalid port number %d", port);
1909 return -1;
1910 }
1911 if (rtp_mode == 0)
1912 {
1913 g_rtp_client_info.port = port;
1914 }
1915 else if (rtp_mode == 1)
1916 {
1917 g_rtp_server_info.port = port;
1918 }
1919 LYINFLOG("lynq_set_rtp_port suc: LYNQ_Rtp_Mode is %d, port is %d", rtp_mode, port);
q.huang877d6b32022-06-06 16:15:31 +08001920 return 0;
1921}
1922int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency) //only for client mode
1923{
q.huang3e761702022-06-28 20:12:01 +08001924 g_rtp_client_info.clockrate = clock_rate;
1925 g_rtp_client_info.channels = channels;
1926 g_rtp_client_info.latency = latency;
1927 LYINFLOG("lynq_set_rtp_param suc: clockrate is %d, channels is %d, latency is %d", clock_rate, channels, latency);
q.huang877d6b32022-06-06 16:15:31 +08001928 return 0;
1929}
1930/*get*/
1931LYNQ_Audio_Mode lynq_get_voice_audio_mode()
1932{
q.huang3e761702022-06-28 20:12:01 +08001933 if(g_rtp_thread_valid[0])
1934 {
1935 return AUDIO_MODE_RTP;
1936 }
1937 else
1938 {
1939 return AUDIO_MODE_CODEC;
1940 }
q.huang877d6b32022-06-06 16:15:31 +08001941}
q.huang3e761702022-06-28 20:12:01 +08001942int lynq_get_remote_rtp_ip(char* ip, const int ip_length)
q.huang877d6b32022-06-06 16:15:31 +08001943{
1944 if(ip==NULL)
1945 {
q.huang3e761702022-06-28 20:12:01 +08001946 LYERRLOG("ip is NULL");
q.huang877d6b32022-06-06 16:15:31 +08001947 return 1;
1948 }
q.huang3e761702022-06-28 20:12:01 +08001949
1950 if(ip_length < strlen(g_rtp_server_info.ip)+1)
1951 {
1952 LYERRLOG("ip lenght %d is shorter than saved ip length %d",ip_length,strlen(g_rtp_server_info.ip)+1);
1953 return 1;
1954 }
1955 bzero(ip,ip_length);
1956 strcpy(ip,g_rtp_server_info.ip);
q.huang877d6b32022-06-06 16:15:31 +08001957 return 0;
1958}
1959int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port)
1960{
1961 if(port==NULL)
1962 {
1963 return 1;
q.huang3e761702022-06-28 20:12:01 +08001964 }
1965 if (rtp_mode == 0)
1966 {
1967 *port = g_rtp_client_info.port;
1968 }
1969 else if (rtp_mode == 1)
1970 {
1971 *port = g_rtp_server_info.port;
1972 }
q.huang877d6b32022-06-06 16:15:31 +08001973 return 0;
1974}
1975int lynq_get_rtp_param(int* clock_rate, int* channels, int* latency)//only for client mode
1976{
1977 if(clock_rate == NULL || channels ==NULL || latency ==NULL)
1978 {
q.huang3e761702022-06-28 20:12:01 +08001979 LYERRLOG("input parameter is NULL");
q.huang877d6b32022-06-06 16:15:31 +08001980 return 1;
1981 }
1982
q.huang3e761702022-06-28 20:12:01 +08001983 *clock_rate = g_rtp_client_info.clockrate;
1984 *channels = g_rtp_client_info.channels ;
1985 *latency = g_rtp_client_info.latency;
1986
q.huang877d6b32022-06-06 16:15:31 +08001987 return 0;
1988}
1989/*Audio Path setting end*/
1990
lh25827952022-01-10 00:34:35 -08001991#if 0
1992int main(int argc,char **argv)
1993{
1994 int n = 0;
1995 n = lynq_init_call(lynq_call_state_change_test,2222);
1996 if(n<0)
1997 {
q.huang783ed5d2022-06-02 14:49:02 +08001998 LYDBGLOG("lynq init call fail!!!");
lh25827952022-01-10 00:34:35 -08001999 return -1;
2000 }
q.huang783ed5d2022-06-02 14:49:02 +08002001 LYDBGLOG("lynq call init success!!!");
lh25827952022-01-10 00:34:35 -08002002 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
2003 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
2004 lynq_call(phoneNum);
2005 while(1)
2006 {
2007 sleep(1);
2008 }
2009 return 0;
2010}
2011#endif
2012/*Warren add for T800 platform 2021/11/19 end*/