blob: 077511885c207419551f624d9bca5bb2ffc80f3d [file] [log] [blame]
llafa36b42022-07-25 05:52:14 +00001
lh25827952022-01-10 00:34:35 -08002#include <stdio.h>
3#include <sys/types.h>
4#include <sys/socket.h>
5#include <arpa/inet.h>
6#include <fcntl.h>
7#include <string.h>
8#include <stdlib.h>
9#include <unistd.h>
10#include <binder/Parcel.h>
11#include <log/log.h>
lh25827952022-01-10 00:34:35 -080012#include <cutils/jstring.h>
13#include <pthread.h>
14#include "liblog/lynq_deflog.h"
lh228a7b82022-01-10 02:24:31 -080015#include <sys/time.h>
lh59e0d002022-01-27 00:27:12 -080016#include <string.h>
q.huangfe1b4052022-04-18 00:09:50 -040017#include <vendor-ril/telephony/ril.h>
18#include <vendor-ril/telephony/mtk_ril_sp.h>
19#include <vendor-ril/telephony/mtk_ril_ivt.h>
20#include "lynq_call.h"
21
22
lh25827952022-01-10 00:34:35 -080023#define LYNQ_SERVICE_PORT 8088
rjw8bdc56b2022-02-28 15:01:49 +080024#define DSET_IP_ADDRESS "127.0.0.1"
lh25827952022-01-10 00:34:35 -080025#define LYNQ_URC_SERVICE_PORT 8086
26#define LYNQ_REC_BUF 8192
27#define LYNQ_REQUEST_PARAM_BUF 8192
28#define LYQN_SEDN_BUF 1024*8+sizeof(int)*3
q.huang783ed5d2022-06-02 14:49:02 +080029#define INVALID_ID (-1)
q.huang3e761702022-06-28 20:12:01 +080030#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\'"
31#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"
32#define MAX_IP_LENGTH 128
lh25827952022-01-10 00:34:35 -080033#define USER_LOG_TAG "LYNQ_CALL"
34
35using ::android::Parcel;
36 typedef enum {
37 LYNQ_CALL_ACTIVE = 0,
38 LYNQ_CALL_HOLDING = 1,
39 LYNQ_CALL_DIALING = 2, /* MO call only */
40 LYNQ_CALL_ALERTING = 3, /* MO call only */
41 LYNQ_CALL_INCOMING = 4, /* MT call only */
lh8657e742022-04-26 00:45:44 -070042 LYNQ_CALL_WAITING = 5, /* MT call only */
43 /*warren add for T800 platform 2022/04/26 start*/
44 LYNQ_CALL_END = 6, /*CALL END*/
45 /*warren add for T800 platform 2022/04/26 end*/
lh25827952022-01-10 00:34:35 -080046}lynq_call_state_t;
47
48typedef struct{
49 int uToken;
50 int request;
51 int paramLen;
52 char param[LYNQ_REQUEST_PARAM_BUF];
53}lynq_client_t;
54typedef struct
55{
56 int used;
57 int call_id;
58 int call_state;
59 int toa;
60 int direction;/*0: MO call,1:MT call*/
61 char addr[LYNQ_PHONE_NUMBER_MAX];
lh25827952022-01-10 00:34:35 -080062}lynq_call_list_e_t;
63typedef struct
64{
65 int call_id;
66 int call_state;
67 int toa;
68 int direction;/*0: MO call,1:MT call*/
69 char addr[LYNQ_PHONE_NUMBER_MAX];
70}lynq_call_list_t;
71
72lynq_call_list_e_t lynq_call_lists[LYNQ_CALL_MAX]={};
73static pthread_mutex_t call_state_change_mutex = PTHREAD_MUTEX_INITIALIZER;
74static pthread_cond_t call_state_change_cond = PTHREAD_COND_INITIALIZER;
llc81b4d52022-07-13 09:39:44 +000075static pthread_mutex_t *s_urc_call_state_change_mutex = NULL;
76static pthread_cond_t *s_urc_call_state_change_cond = NULL;
lh25827952022-01-10 00:34:35 -080077static pthread_mutex_t s_incoming_call_mutex = PTHREAD_MUTEX_INITIALIZER;
78static pthread_cond_t s_incoming_call_cond = PTHREAD_COND_INITIALIZER;
llafa36b42022-07-25 05:52:14 +000079static pthread_mutex_t g_lynq_call_sendto_mutex;
ll1343a5b2022-03-17 05:31:33 +000080pthread_t lynq_call_urc_tid = -1;
81pthread_t lynq_call_list_loop_tid = -1;
lhcdf816a2022-02-13 23:56:05 -080082
rjw8bdc56b2022-02-28 15:01:49 +080083/*lei add*/
84/* socket文件描述符 */
85int len_addr_serv;
86struct sockaddr_in addr_serv;
87lynq_client_t client_t;
88int client_size = 0;
89/*lei add*/
lh25827952022-01-10 00:34:35 -080090
llc81b4d52022-07-13 09:39:44 +000091int s_call_urc_event_complete = 0;
lh25827952022-01-10 00:34:35 -080092
93enum{
94 CALL_OFF=0,
95 CALL_ON=1
96}call_state;
ll375c94d2022-01-27 05:54:38 +000097typedef enum{
98 LYNQ_E_CARDSTATE_ERROR=8000,
99 /* The voice service state is out of service*/
100 LYNQ_E_STATE_OUT_OF_SERVICE=8001,
101 /* The voice service state is EMERGENCY_ONLY*/
102 LYNQ_E_STATE_EMERGENCY_ONLY=8002,
103 /* The radio power is power off*/
104 LYNQ_E_STATE_POWER_OFF=8003,
105 LYNQ_E_TIME_OUT=8004,
106 /*create or open sms DB fail */
107 LYNQ_E_SMS_DB_FAIL=8005,
108 /*Failed to execute sql statement*/
109 LYNQ_E_SMS_SQL_FAIL = 8006,
110 LYNQ_E_SMS_NOT_FIND = 8007,
111 /* The logic conflict*/
112 LYNQ_E_CONFLICT=9000,
113 /*Null anomaly*/
q.huang783ed5d2022-06-02 14:49:02 +0800114 LYNQ_E_NULL_ANONALY=9001,
115 /*Invalid id anomaly*/
116 LYNQ_E_INVALID_ID_ANONALY=9002,
117#ifdef ECALL_SUPPORT
118 LYNQ_E_ECALL_BEING_RUNNING =9003,
119 LYNQ_E_ECALL_MSD_LENGTH_ERROR =9004,
q.huang40f5e322022-06-21 14:57:02 +0800120 LYNQ_E_ECALL_DAILING_NO_ANSWER =9005,
q.huang783ed5d2022-06-02 14:49:02 +0800121#endif
lh25827952022-01-10 00:34:35 -0800122}LYNQ_E;
q.huangb0eb7b02022-03-29 04:17:32 -0400123typedef enum{
124 LYNQ_E_VOLUMN_SET_DTMF,
125 LYNQ_E_VOLUMN_SET_SPEECH
126}LYNQ_E_VOLUMN_SET;
lh25827952022-01-10 00:34:35 -0800127
128int lynq_call_state =CALL_OFF;
lha35d4ee2022-01-25 18:47:39 -0800129int lynq_call_client_sockfd = 0;
130int Global_uToken_call = 0;
lh25827952022-01-10 00:34:35 -0800131int global_call_count =0;
132int global_call_auto_answer = 0;
lha35d4ee2022-01-25 18:47:39 -0800133bool urc_call_recive_status = 1;
llc81b4d52022-07-13 09:39:44 +0000134bool call_list_loop = 0;
lh25827952022-01-10 00:34:35 -0800135int isDial = 0;
136int lynqIncomingCallId = 0;
q.huang18d08bf2022-04-19 20:27:44 -0400137
q.huang3e761702022-06-28 20:12:01 +0800138/*rtp begin*/
139typedef struct
140{
141 char ip[MAX_IP_LENGTH];
142 int port;
143}lynq_rtp_server_info;
144
145typedef struct
146{
147 int port;
148 int clockrate;
149 int latency;
150 int channels;
151}lynq_rtp_client_info;
152
153static lynq_rtp_client_info g_rtp_client_info;
154static lynq_rtp_server_info g_rtp_server_info;
155
156static pthread_t g_rtp_thread[RTP_MODE_MAX];
157static bool g_rtp_thread_valid[RTP_MODE_MAX];
158
159/*rtp end*/
160
q.huang18d08bf2022-04-19 20:27:44 -0400161#ifdef ECALL_SUPPORT
q.huang783ed5d2022-06-02 14:49:02 +0800162int lynq_set_common_request(int request_id, int argc, const char* format,...);
q.huang783ed5d2022-06-02 14:49:02 +0800163int g_ecallId = INVALID_ID;
q.huang18d08bf2022-04-19 20:27:44 -0400164typedef enum{
165 LYNQ_ECALL_TYPE_TEST = 0, /* Test eCall */
166 LYNQ_ECALL_TYPE_RECONFIG = 1, /* Reconfiguration eCall */
q.huangfe1b4052022-04-18 00:09:50 -0400167 LYNQ_ECALL_MANUAL_EMERGENCY = 2, /*Manual Emergency eCall */
q.huang40f5e322022-06-21 14:57:02 +0800168 LYNQ_ECALL_TYPE_AUTO_EMERGENCY = 3, /* Automatic Emergency eCall */
q.huangfe1b4052022-04-18 00:09:50 -0400169}LYNQ_ECall_Type;
170
q.huang40f5e322022-06-21 14:57:02 +0800171typedef enum{
172 LYNQ_ECALL_DAILING_STATE_NONE =0,
173 LYNQ_ECALL_DAILING_STATE_STARTED = 1,
174 LYNQ_ECALL_DAILING_STATE_ANSWERED = 2,
175}LYNQ_ECall_Dailing_State;
176
177LYNQ_ECall_Dailing_State is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang783ed5d2022-06-02 14:49:02 +0800178char e_call_addr[LYNQ_ECALL_VAR_MAX][LYNQ_PHONE_NUMBER_MAX]={"test_ecall","emergency_ecall","reconf_ecall"};
q.huang18d08bf2022-04-19 20:27:44 -0400179
180static pthread_mutex_t s_incoming_e_call_mutex = PTHREAD_MUTEX_INITIALIZER;
181static pthread_cond_t s_incoming_e_call_cond = PTHREAD_COND_INITIALIZER;
182
q.huang783ed5d2022-06-02 14:49:02 +0800183LYNQ_ECall_Indication g_lynqIncomingEcallIndication;
q.huang40f5e322022-06-21 14:57:02 +0800184int g_lynqIncomingEcallId;
q.huang18d08bf2022-04-19 20:27:44 -0400185
186void sendSignalIncomingECallEvent()
187{
q.huang3e761702022-06-28 20:12:01 +0800188 LYINFLOG("send incoming ecall event signal");
q.huang18d08bf2022-04-19 20:27:44 -0400189 pthread_mutex_lock(&s_incoming_e_call_mutex);
190 pthread_cond_signal(&s_incoming_e_call_cond);
191 pthread_mutex_unlock(&s_incoming_e_call_mutex);
192}
q.huang783ed5d2022-06-02 14:49:02 +0800193
194int lynq_is_msd_suc(LYNQ_ECall_Indication lynqIncomingEcallIndication)
195{
196 if(LYNQ_ECALL_LLACK_RECEIVED == lynqIncomingEcallIndication ||
197 LYNQ_ECALL_ALACK_POSITIVE_RECEIVED == lynqIncomingEcallIndication ||
198 LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED == lynqIncomingEcallIndication ||
199 LYNQ_ECALL_T5_TIMER_OUT == lynqIncomingEcallIndication ||
200 LYNQ_ECALL_T6_TIMER_OUT == lynqIncomingEcallIndication ||
201 LYNQ_ECALL_T7_TIMER_OUT == lynqIncomingEcallIndication)
202 {
203 return 1;
204 }
205
206 return 0;
207}
208
209int lynq_ecall_is_running()
210{
q.huang40f5e322022-06-21 14:57:02 +0800211 return (is_ecall_dial!=LYNQ_ECALL_DAILING_STATE_NONE) || (g_ecallId !=INVALID_ID);
q.huang783ed5d2022-06-02 14:49:02 +0800212}
q.huang18d08bf2022-04-19 20:27:44 -0400213#endif
q.huangfe1b4052022-04-18 00:09:50 -0400214
ll1343a5b2022-03-17 05:31:33 +0000215/**
216 * @brief mark call initialization state
217 * 0: deinit state
218 * 1: init state
219 */
220int g_lynq_call_init_flag = 0;
lh25827952022-01-10 00:34:35 -0800221
222int JumpHeader(Parcel &p,int *resp_type,int *request,int *slot_id,int *error)
223{
224 if(p.dataAvail() > 0)
225 {
226 p.readInt32(resp_type);
227 p.readInt32(request);
228 p.readInt32(slot_id);
229 p.readInt32(error);
230 return 0;
231 }
232 else
233 {
234 return -1;
235 }
236}
237int send_request(int sockfd,lynq_client_t *client_tmp)
238{
239 int ret=0;
rjw8bdc56b2022-02-28 15:01:49 +0800240 ret = sendto(sockfd, client_tmp, client_size, 0, (struct sockaddr *)&addr_serv, len_addr_serv);
lh25827952022-01-10 00:34:35 -0800241 if(ret==-1)
242 {
q.huang783ed5d2022-06-02 14:49:02 +0800243 LYERRLOG("sendto error");
lh25827952022-01-10 00:34:35 -0800244 return -1;
245 }
246 return 0;
247}
248
249int get_response(int sockfd,Parcel &p)
250{
251 int len = 0;
252 char recvline[LYNQ_REC_BUF];
253 bzero(recvline,LYNQ_REC_BUF);
254 /* receive data from server */
rjw8bdc56b2022-02-28 15:01:49 +0800255 len = recvfrom(sockfd,recvline,LYNQ_REC_BUF, 0, (struct sockaddr *)&addr_serv,(socklen_t*)&len_addr_serv);
lh25827952022-01-10 00:34:35 -0800256 if(len == -1)
257 {
q.huang783ed5d2022-06-02 14:49:02 +0800258 LYERRLOG("recvfrom error");
lh25827952022-01-10 00:34:35 -0800259 return -1;
260 }
lh25827952022-01-10 00:34:35 -0800261 if (recvline != NULL) {
262 p.setData((uint8_t *)recvline,len); // p.setData((uint8_t *) buffer, buflen);
263 p.setDataPosition(0);
264 }
265 return 0;
266}
267static char *strdupReadString(Parcel &p) {
ll375c94d2022-01-27 05:54:38 +0000268 size_t stringlen;
lh25827952022-01-10 00:34:35 -0800269 const char16_t *s16;
270 s16 = p.readString16Inplace(&stringlen);
ll375c94d2022-01-27 05:54:38 +0000271 return strndup16to8(s16, stringlen);
lh25827952022-01-10 00:34:35 -0800272}
273
274int lynq_get_current_call_list(lynq_call_list_t call_list[LYNQ_CALL_MAX])
275{
276 Parcel p;
277 lynq_client_t client;
278 int resp_type = -1;
279 int request = -1;
280 int slot_id = -1;
281 int error = -1;
282 int call_num = 0;
283 int temp = 0;
284 char *remote_phoneNum = NULL;
285 char *remote_name= NULL;
286 char *uusData = NULL;
lha35d4ee2022-01-25 18:47:39 -0800287 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -0800288 client.request = 9;//RIL_REQUEST_GET_CURRENT_CALLS
289 client.paramLen = 0;
290 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +0800291 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
lha35d4ee2022-01-25 18:47:39 -0800292 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -0800293 {
294 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -0800295 return -1;
296 }
lha35d4ee2022-01-25 18:47:39 -0800297 get_response(lynq_call_client_sockfd,p);
lh25827952022-01-10 00:34:35 -0800298 JumpHeader(p,&resp_type,&request,&slot_id,&error);
299 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
300 if(error == 0)
301 {
302 p.readInt32(&call_num);
303 global_call_count = call_num;
304 if(call_num<=0)
305 {
306 lynq_call_state = CALL_OFF;
lhcdf816a2022-02-13 23:56:05 -0800307 LYINFLOG("lynq_call_state:%d",lynq_call_state);
lh25827952022-01-10 00:34:35 -0800308 return 0;
309 }
lhcdf816a2022-02-13 23:56:05 -0800310 lynq_call_state = CALL_ON;
q.huang783ed5d2022-06-02 14:49:02 +0800311 LYINFLOG("lynq_call_state:%d, call num is %d ",lynq_call_state,call_num);
lh25827952022-01-10 00:34:35 -0800312 for(int i = 0;i < call_num;i++)
313 {
314 p.readInt32(&temp);
315 call_list[i].call_state = temp;
316 p.readInt32(&call_list[i].call_id);
317 p.readInt32(&call_list[i].toa);
318 p.readInt32(&temp);
319 p.readInt32(&temp);
320 call_list[i].direction = temp;
321 p.readInt32(&temp);
322 p.readInt32(&temp);
323 p.readInt32(&temp);
324 remote_phoneNum = strdupReadString(p);
325 memcpy(call_list[i].addr,remote_phoneNum,strlen(remote_phoneNum));
326 LYINFLOG("call_id=%d,call_state=%d,direction=%d,addr=%s,toa=%d",call_list[i].call_id,call_list[i].call_state,
327 call_list[i].direction,call_list[i].addr,call_list[i].toa);
328 p.readInt32(&temp);
329 remote_name = strdupReadString(p);
330 p.readInt32(&temp);
331 p.readInt32(&temp);
332 if(temp==0)
333 {
334 continue;
335 }
336 p.readInt32(&temp); /* UUS Information is present */
337 p.readInt32(&temp);
338 p.readInt32(&temp);
339 p.read(uusData,temp);
340 }
341 }
342 return 0;
343}
344
345void cleanCallList(int lynq_call_id)
346{
q.huang783ed5d2022-06-02 14:49:02 +0800347 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 -0800348 lynq_call_lists[lynq_call_id].call_id = 0;
lh8657e742022-04-26 00:45:44 -0700349 lynq_call_lists[lynq_call_id].call_state = (int)LYNQ_CALL_END;
lh25827952022-01-10 00:34:35 -0800350 lynq_call_lists[lynq_call_id].toa = 0;
351 lynq_call_lists[lynq_call_id].direction = 0;
352 lynq_call_lists[lynq_call_id].used = 0;
lh25827952022-01-10 00:34:35 -0800353 memset(lynq_call_lists[lynq_call_id].addr,0,sizeof(lynq_call_lists[lynq_call_id].addr));
354}
355int getUnusedElement()
356{
357 for(int i=0;i < LYNQ_CALL_MAX; i++)
358 {
359 if(lynq_call_lists[i].used!=1)
360 {
361 return i;
362 }
363 }
364 return -1;
365}
q.huang783ed5d2022-06-02 14:49:02 +0800366int addAddr(char addr[])
lh25827952022-01-10 00:34:35 -0800367{
368 int ret = 0;
369 ret = getUnusedElement();
370 memcpy(lynq_call_lists[ret].addr,addr,strlen(addr)+1);
371 lynq_call_lists[ret].used = 1;
q.huang783ed5d2022-06-02 14:49:02 +0800372 LYINFLOG("add local idx is %d addr is %s",ret,addr);
lh25827952022-01-10 00:34:35 -0800373 return ret;
374}
375void updateCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction)
376{
q.huang783ed5d2022-06-02 14:49:02 +0800377 LYINFLOG("Update original local id is %d, new local id is %d",callList->call_id,call_id);
lh25827952022-01-10 00:34:35 -0800378 callList->call_id = call_id;
379 callList->call_state = call_state;
380 callList->toa = toa;
q.huang783ed5d2022-06-02 14:49:02 +0800381 callList->direction = direction;
lh25827952022-01-10 00:34:35 -0800382 return;
383}
384int waitCallstateChange(int mtime)
385{
lhbe92dd12022-04-19 06:01:25 -0700386 LYINFLOG("wait Call state Change");
lh25827952022-01-10 00:34:35 -0800387 int ret = 0;
388 int sec = 0;
389 int usec = 0;
lh228a7b82022-01-10 02:24:31 -0800390 struct timeval now;
391 struct timespec timeout;
392 gettimeofday(&now,NULL);
lh25827952022-01-10 00:34:35 -0800393 sec = mtime/1000;
394 usec = mtime%1000;
lh228a7b82022-01-10 02:24:31 -0800395 timeout.tv_sec = now.tv_sec+sec;
396 timeout.tv_nsec = now.tv_usec*1000+usec*1000000;
lh25827952022-01-10 00:34:35 -0800397 pthread_mutex_lock(&call_state_change_mutex);
lh228a7b82022-01-10 02:24:31 -0800398 ret = pthread_cond_timedwait(&call_state_change_cond,&call_state_change_mutex,&timeout);
lh25827952022-01-10 00:34:35 -0800399 pthread_mutex_unlock(&call_state_change_mutex);
400 return ret;
401}
402int waitIncomingCall()
403{
lhbe92dd12022-04-19 06:01:25 -0700404 LYINFLOG("wait incming call");
lh25827952022-01-10 00:34:35 -0800405 int ret = 0;
406 pthread_mutex_lock(&s_incoming_call_mutex);
407 ret = pthread_cond_wait(&s_incoming_call_cond,&s_incoming_call_mutex);
408 pthread_mutex_unlock(&s_incoming_call_mutex);
409 return ret;
410}
411int checkHasCall(char addr[])
412{
413 for(int i = 0;i<LYNQ_CALL_MAX;i++)
414 {
415 if(strcmp(lynq_call_lists[i].addr,addr)==0)
416 {
q.huang783ed5d2022-06-02 14:49:02 +0800417 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 -0800418 return 1;
419 }
420 }
q.huang783ed5d2022-06-02 14:49:02 +0800421 LYINFLOG("checkHasCall addr is %s , no idx is found",addr);
lh25827952022-01-10 00:34:35 -0800422 return 0;
423}
lhbe92dd12022-04-19 06:01:25 -0700424int find_call_id_with_addr(char *addr)
425{
lhbe92dd12022-04-19 06:01:25 -0700426 for(int id = 0; id < LYNQ_CALL_MAX; id++)
427 {
q.huang783ed5d2022-06-02 14:49:02 +0800428 if(lynq_call_lists[id].used && (strcmp(lynq_call_lists[id].addr,addr) == 0))
lhbe92dd12022-04-19 06:01:25 -0700429 {
q.huang783ed5d2022-06-02 14:49:02 +0800430 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 -0700431 return id;
432 }
433 }
q.huang783ed5d2022-06-02 14:49:02 +0800434 LYINFLOG("find addr %s in local list , not found",addr);
lhbe92dd12022-04-19 06:01:25 -0700435 return -1;
436}
q.huang783ed5d2022-06-02 14:49:02 +0800437int find_call_id_with_call_id(int call_id)
438{
439 for(int id = 0; id < LYNQ_CALL_MAX; id++)
440 {
441 if(lynq_call_lists[id].used && (lynq_call_lists[id].call_id == call_id))
442 {
443 LYINFLOG("find id %d in local list, local idx is %d, addr is %s",call_id,id,lynq_call_lists[id].addr);
444 return id;
445 }
446 }
447 LYINFLOG("find id %d in local list , not found",call_id);
448 return INVALID_ID;
449}
lh25827952022-01-10 00:34:35 -0800450void sendSignalToWaitCallStateChange()
451{
lhbe92dd12022-04-19 06:01:25 -0700452 LYINFLOG("send Signal To Wait Call State Change");
lh25827952022-01-10 00:34:35 -0800453 pthread_mutex_lock(&call_state_change_mutex);
454 pthread_cond_signal(&call_state_change_cond);
455 pthread_mutex_unlock(&call_state_change_mutex);
456}
457void sendSignalIncomingCall()
458{
lhbe92dd12022-04-19 06:01:25 -0700459 LYINFLOG("send incoming call signal");
lh25827952022-01-10 00:34:35 -0800460 pthread_mutex_lock(&s_incoming_call_mutex);
461 pthread_cond_signal(&s_incoming_call_cond);
462 pthread_mutex_unlock(&s_incoming_call_mutex);
463}
464
465void addCallListToLynqCallList(lynq_call_list_e_t *callList, int call_id,int call_state,int toa,int direction,char addr[LYNQ_PHONE_NUMBER_MAX])
466{
467 callList->call_id = call_id;
468 callList->call_state = call_state;
469 callList->toa = toa;
470 callList->direction = direction;
471 memcpy(callList->addr,addr,strlen(addr)+1);
472 callList->used = 1;
lh25827952022-01-10 00:34:35 -0800473 return;
474}
475
476void *triggerGetCallList(void *parg)
ll375c94d2022-01-27 05:54:38 +0000477{
478 int ret=0;
lhbe92dd12022-04-19 06:01:25 -0700479 bool call_end;
ll375c94d2022-01-27 05:54:38 +0000480 lynq_call_list_t call_list[LYNQ_CALL_MAX];
q.huang18d08bf2022-04-19 20:27:44 -0400481 int update=0;
q.huang783ed5d2022-06-02 14:49:02 +0800482 int cnt;
483 int i,n;
484
lh25827952022-01-10 00:34:35 -0800485 while(call_list_loop)
ll375c94d2022-01-27 05:54:38 +0000486 {
q.huang18d08bf2022-04-19 20:27:44 -0400487 update=0;
llc81b4d52022-07-13 09:39:44 +0000488 pthread_mutex_lock(s_urc_call_state_change_mutex);
489 pthread_cond_wait(s_urc_call_state_change_cond, s_urc_call_state_change_mutex);
q.huang783ed5d2022-06-02 14:49:02 +0800490 LYDBGLOG("triggerGetCallList event!!!");
ll375c94d2022-01-27 05:54:38 +0000491 memset(call_list,0,sizeof(call_list));
492 ret = lynq_get_current_call_list(call_list);
493 if(ret != 0)
494 {
q.huang783ed5d2022-06-02 14:49:02 +0800495 LYDBGLOG("get current call list failure!!!");
ll22101402022-04-11 05:49:51 +0000496 continue;
ll375c94d2022-01-27 05:54:38 +0000497 }
lhbe92dd12022-04-19 06:01:25 -0700498 LYINFLOG("++++++++++++++triggerGetCallList++++++++++++++");
q.huang783ed5d2022-06-02 14:49:02 +0800499 LYINFLOG("clear local index begin");
500 cnt=0;
501 for(i = 0;i < LYNQ_CALL_MAX;i++)
lh25827952022-01-10 00:34:35 -0800502 {
q.huang783ed5d2022-06-02 14:49:02 +0800503 if(lynq_call_lists[i].used ==0)
504 {
505 continue;
506 }
507 cnt++;
508 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);
509
510 if(lynq_call_lists[i].call_id > 0)
lhbe92dd12022-04-19 06:01:25 -0700511 {
512 call_end = 0;
q.huang783ed5d2022-06-02 14:49:02 +0800513 for(n = 0; n < LYNQ_CALL_MAX; n++)
lhbe92dd12022-04-19 06:01:25 -0700514 {
q.huang783ed5d2022-06-02 14:49:02 +0800515 if(call_list[n].call_id == lynq_call_lists[i].call_id)
lhbe92dd12022-04-19 06:01:25 -0700516 {
517 call_end = 1;
q.huang783ed5d2022-06-02 14:49:02 +0800518 LYINFLOG("find lynq call local idx %d, service idx %d id is %d!!!",i,n,lynq_call_lists[i].call_id);
519 break;
lhbe92dd12022-04-19 06:01:25 -0700520 }
521 }
522 if(call_end == 0)
523 {
q.huang783ed5d2022-06-02 14:49:02 +0800524 LYINFLOG("MT hungup,then clean call info local idx is %d id is %d",i, lynq_call_lists[i].call_id);
525 cleanCallList(i);
lhbe92dd12022-04-19 06:01:25 -0700526 }
527 } //fix bug API-54
q.huang783ed5d2022-06-02 14:49:02 +0800528 else
529 {
530 LYINFLOG("local id is 0");
531 }
532 }
533 LYINFLOG("clear local index end, local used cnt is %d", cnt);
534
535 LYINFLOG("add or update local index begin ");
536 for (i = 0;i < LYNQ_CALL_MAX;i++)
537 {
538 if(call_list[i].call_id==0)
539 {
540 break;
541 }
542
543 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,
544 call_list[i].direction,call_list[i].addr,call_list[i].toa);
545
lh25827952022-01-10 00:34:35 -0800546 if(call_list[i].direction == 1)//MT call
547 {
q.huang783ed5d2022-06-02 14:49:02 +0800548 LYINFLOG("This is a MT CALL");
lh4256e1b2022-05-13 03:02:19 -0700549 /*MT CALL state code
550 **LYNQ_CALL_INCOMING = 4,
551 **LYNQ_CALL_WAITING = 5,
552 */
553 if((call_list[i].call_state ==4) || (call_list[i].call_state ==5))
lh25827952022-01-10 00:34:35 -0800554 {
q.huang783ed5d2022-06-02 14:49:02 +0800555#ifdef ECALL_SUPPORT
556 if(lynq_ecall_is_running())
lh25827952022-01-10 00:34:35 -0800557 {
q.huang783ed5d2022-06-02 14:49:02 +0800558 lynq_call_hungup(&(call_list[i].call_id));
559 continue;
lh25827952022-01-10 00:34:35 -0800560 }
q.huang783ed5d2022-06-02 14:49:02 +0800561#endif
562 }
563 /*you call me, and i call you,One party failed to dial*/
564 n = find_call_id_with_addr(call_list[i].addr);
565 if(n ==INVALID_ID)
566 {
567 n = addAddr(call_list[i].addr);
568 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
569 lynqIncomingCallId = call_list[i].call_id;
570 sendSignalIncomingCall();
571 }
572 else if(lynq_call_lists[n].call_state == call_list[i].call_state)
573 {
574 LYINFLOG("state not changed, state is %d ",call_list[i].call_state);
575 if(call_list[i].call_state ==4 || call_list[i].call_state ==5)
lhbe92dd12022-04-19 06:01:25 -0700576 {
lhbe92dd12022-04-19 06:01:25 -0700577 /*if call state not change,Maybe this call was ignored, so we need to continue to inform the user of
578 **an incoming call until the status changes.
579 **fix bug API-54
580 */
q.huang783ed5d2022-06-02 14:49:02 +0800581 LYINFLOG("resend incoming call signal");
582 sendSignalIncomingCall();
lhbe92dd12022-04-19 06:01:25 -0700583 }
lh25827952022-01-10 00:34:35 -0800584 }
q.huang783ed5d2022-06-02 14:49:02 +0800585 else
ll45d3ea92022-03-24 10:22:25 +0800586 {
q.huang783ed5d2022-06-02 14:49:02 +0800587 LYINFLOG("state changed from %d to %d",lynq_call_lists[n].call_state,call_list[i].call_state);
588
589 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
590 }
lh25827952022-01-10 00:34:35 -0800591 }
592 else
q.huang783ed5d2022-06-02 14:49:02 +0800593 {
594 LYINFLOG("This is a MO CALL");
595 call_end = 0;
596 for(n = 0 ; n < LYNQ_CALL_MAX; n++)
lh25827952022-01-10 00:34:35 -0800597 {
q.huang783ed5d2022-06-02 14:49:02 +0800598 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 -0800599 {
q.huang783ed5d2022-06-02 14:49:02 +0800600 if(lynq_call_lists[n].call_id==0)
601 {
602 LYINFLOG("add a call id");
603 update=1;
604 }
605 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);
606 updateCallList(&lynq_call_lists[n],call_list[i].call_id,call_list[i].call_state,call_list[i].toa,call_list[i].direction);
607 call_end = 1;
608 break;
609 }
610 }
611
612 if(call_end == 0)
613 {
614 LYINFLOG("need to hangup id %d", call_list[i].call_id);
615#ifdef ECALL_SUPPORT
q.huang40f5e322022-06-21 14:57:02 +0800616 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
q.huang783ed5d2022-06-02 14:49:02 +0800617 {
618 LYINFLOG("ecall is dialing, for the timebeing, don't huangup");
lh25827952022-01-10 00:34:35 -0800619 continue;
620 }
q.huang783ed5d2022-06-02 14:49:02 +0800621#endif
622 LYINFLOG("hang up service call id %d",call_list[i].call_id);
623 lynq_call_hungup(&(call_list[i].call_id));
lh25827952022-01-10 00:34:35 -0800624 }
lh25827952022-01-10 00:34:35 -0800625 }
q.huang783ed5d2022-06-02 14:49:02 +0800626 LYDBGLOG("servie idx %d end",i);
ll375c94d2022-01-27 05:54:38 +0000627 }
q.huang783ed5d2022-06-02 14:49:02 +0800628 LYINFLOG("add or update local index end ");
lha35d4ee2022-01-25 18:47:39 -0800629 s_call_urc_event_complete = 1;
q.huang783ed5d2022-06-02 14:49:02 +0800630 if(isDial==1)
lh25827952022-01-10 00:34:35 -0800631 {
q.huang783ed5d2022-06-02 14:49:02 +0800632 LYINFLOG("now is dialing");
633 if(update==1)
634 {
635 LYINFLOG("find added call");
636 sendSignalToWaitCallStateChange();
637 isDial = 0;
638 }
639 else
640 {
641 LYINFLOG("not find added call");
642 }
643 }
644 else
645 {
646 LYINFLOG("now is not dialing");
lh25827952022-01-10 00:34:35 -0800647 }
llc81b4d52022-07-13 09:39:44 +0000648 pthread_mutex_unlock(s_urc_call_state_change_mutex);
ll375c94d2022-01-27 05:54:38 +0000649 }
650 return NULL;
lh25827952022-01-10 00:34:35 -0800651}
652
653void lynqRespWatingEvent()
ll375c94d2022-01-27 05:54:38 +0000654{
655 if(s_call_urc_event_complete==1)
656 {
llc81b4d52022-07-13 09:39:44 +0000657 pthread_mutex_lock(s_urc_call_state_change_mutex);
658 pthread_cond_signal(s_urc_call_state_change_cond);
ll375c94d2022-01-27 05:54:38 +0000659 s_call_urc_event_complete = 0;
llc81b4d52022-07-13 09:39:44 +0000660 pthread_mutex_unlock(s_urc_call_state_change_mutex);
lh25827952022-01-10 00:34:35 -0800661 }
ll375c94d2022-01-27 05:54:38 +0000662 return;
lh25827952022-01-10 00:34:35 -0800663}
664
665/*Warren add for T800 platform 2021/11/19 start*/
666int lynq_socket_client_start()
rjw8bdc56b2022-02-28 15:01:49 +0800667{
668 #if 0
lh25827952022-01-10 00:34:35 -0800669 struct sockaddr_in lynq_socket_server_addr;
670 /* init lynq_socket_server_addr */
671 bzero(&lynq_socket_server_addr, sizeof(lynq_socket_server_addr));
672 lynq_socket_server_addr.sin_family = AF_INET;
673 lynq_socket_server_addr.sin_port = htons(LYNQ_SERVICE_PORT);
674 lynq_socket_server_addr.sin_addr.s_addr = htons(INADDR_ANY);
rjw8bdc56b2022-02-28 15:01:49 +0800675
lh25827952022-01-10 00:34:35 -0800676 /*
677 if(inet_pton(AF_INET,"127.0.0.1", &lynq_socket_server_addr.sin_addr) <= 0)
678 {
q.huang783ed5d2022-06-02 14:49:02 +0800679 LYDBGLOG("[%s] is not a valid IPaddress", argv[1]);
lh25827952022-01-10 00:34:35 -0800680 exit(1);
681 }
682*/
lha35d4ee2022-01-25 18:47:39 -0800683 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
684 if(connect(lynq_call_client_sockfd, (struct sockaddr *)&lynq_socket_server_addr, sizeof(lynq_socket_server_addr)) == -1)
lh25827952022-01-10 00:34:35 -0800685 {
q.huang783ed5d2022-06-02 14:49:02 +0800686 LYERRLOG("connect error");
lh25827952022-01-10 00:34:35 -0800687 return -1;
688 }
rjw8bdc56b2022-02-28 15:01:49 +0800689 #endif
690 lynq_call_client_sockfd = socket(AF_INET, SOCK_DGRAM, 0);
691 if (-1 == lynq_call_client_sockfd)
692 {
693 return lynq_call_client_sockfd;
694 }
llafa36b42022-07-25 05:52:14 +0000695 struct timeval timeOut;
696 timeOut.tv_sec = 60;
697 timeOut.tv_usec = 0;
698 if (setsockopt(lynq_call_client_sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
699 {
700 RLOGD("time out setting failed\n");
701 return -1;
702 }
rjw8bdc56b2022-02-28 15:01:49 +0800703 /* 设置address */
704 memset(&addr_serv, 0, sizeof(addr_serv));
705 addr_serv.sin_family = AF_INET;
706 addr_serv.sin_addr.s_addr = inet_addr(DSET_IP_ADDRESS);
707 addr_serv.sin_port = htons(LYNQ_SERVICE_PORT);
708 len_addr_serv = sizeof(addr_serv);
lh25827952022-01-10 00:34:35 -0800709 return 0;
710}
711int lynq_update_call_list_loop()
712{
713 int ret = 0;
lh25827952022-01-10 00:34:35 -0800714 pthread_attr_t attr;
715 pthread_attr_init(&attr);
716 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhcdf816a2022-02-13 23:56:05 -0800717 ret = pthread_create(&lynq_call_list_loop_tid,&attr,triggerGetCallList,NULL);
lh25827952022-01-10 00:34:35 -0800718 if(ret < 0)
719 {
720 LYERRLOG("lynq_update_call_list_loop fail!!!");
721 return -1;
722 }
q.huang783ed5d2022-06-02 14:49:02 +0800723 LYDBGLOG("lynq_update_call_list_loop success!!!");
lh25827952022-01-10 00:34:35 -0800724 return 0;
725
726}
q.huang783ed5d2022-06-02 14:49:02 +0800727
lh25827952022-01-10 00:34:35 -0800728void *thread_urc_recv(void *parg)
ll375c94d2022-01-27 05:54:38 +0000729{
lh25827952022-01-10 00:34:35 -0800730 int socket_fd = (int64_t)parg;
731 int len=0;
732 socklen_t addr_len=0;
733 uint8_t *dataLength = NULL;
734 char urc_data[LYNQ_REC_BUF];
735 int slot_id = -1;
736 int resp_type = -1;
737 int urcid = -1;
738 Parcel *p = NULL;
739 struct sockaddr_in dest_addr;
q.huang18d08bf2022-04-19 20:27:44 -0400740#ifdef ECALL_SUPPORT
q.huang783ed5d2022-06-02 14:49:02 +0800741 int ecall_ind;
742 int ecallId;
743 int unused_callid;
q.huang18d08bf2022-04-19 20:27:44 -0400744#endif
745
q.huang783ed5d2022-06-02 14:49:02 +0800746 LYINFLOG("thread_urc_recv in running....");
lha35d4ee2022-01-25 18:47:39 -0800747 while(urc_call_recive_status)
lh25827952022-01-10 00:34:35 -0800748 {
749 bzero(urc_data,LYNQ_REC_BUF);
750 //get data msg
751 len = recvfrom(socket_fd,urc_data,LYNQ_REC_BUF,0,(struct sockaddr *)&dest_addr,&addr_len);
752 if(len <= 0)
ll375c94d2022-01-27 05:54:38 +0000753 {
q.huang783ed5d2022-06-02 14:49:02 +0800754 LYERRLOG("thread_urc_recv step2 fail");
ll375c94d2022-01-27 05:54:38 +0000755 break;
lh25827952022-01-10 00:34:35 -0800756 }
q.huang783ed5d2022-06-02 14:49:02 +0800757 LYDBGLOG("=====>urc data len<=====:%d",len);
lh25827952022-01-10 00:34:35 -0800758 p = new Parcel();
759 if(p==NULL)
760 {
lh59e0d002022-01-27 00:27:12 -0800761 LYERRLOG("new parcel failure!!!");
lh25827952022-01-10 00:34:35 -0800762 break;
763 }
764 p->setData((uint8_t *)urc_data,len); // p.setData((uint8_t *) buffer, buflen);
765 p->setDataPosition(0);
766 if(p->dataAvail() > 0)
767 {
768 p->readInt32(&resp_type);
769 p->readInt32(&urcid);
770 p->readInt32(&slot_id);
q.huang783ed5d2022-06-02 14:49:02 +0800771 //LYDBGLOG("*******Warren test*******:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh25827952022-01-10 00:34:35 -0800772 switch (urcid)
773 {
774 case 1001://RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED
775 {
q.huang783ed5d2022-06-02 14:49:02 +0800776 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh25827952022-01-10 00:34:35 -0800777 lynqRespWatingEvent();
778 break;
779 }
780 case 1018://RIL_UNSOL_CALL_RING
781 {
782 if(global_call_auto_answer==1)
783 {
784 lynq_call_answer();
785 }
786 break;
787 }
788 case 1029://RIL_UNSOL_RINGBACK_TONE
789 case 3049://RIL_UNSOL_CALL_INFO_INDICATION
790 {
q.huang783ed5d2022-06-02 14:49:02 +0800791 LYINFLOG("**************:resp_type=%d,urcid=%d,slot_id=%d",resp_type,urcid,slot_id);
lh25827952022-01-10 00:34:35 -0800792 break;
793 }
q.huang18d08bf2022-04-19 20:27:44 -0400794#ifdef ECALL_SUPPORT
795 case RIL_UNSOL_ECALL_INDICATIONS:
796 {
q.huang783ed5d2022-06-02 14:49:02 +0800797 p->readInt32(&ecall_ind);
798 g_lynqIncomingEcallIndication = ecall_ind;
799 p->readInt32(&ecallId);
q.huang40f5e322022-06-21 14:57:02 +0800800 g_lynqIncomingEcallId = ecallId;
q.huang783ed5d2022-06-02 14:49:02 +0800801 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 +0800802 switch (g_lynqIncomingEcallIndication)
q.huang783ed5d2022-06-02 14:49:02 +0800803 {
q.huang40f5e322022-06-21 14:57:02 +0800804 case LYNQ_ECALL_ACTIVE:
805 if(is_ecall_dial)
q.huang783ed5d2022-06-02 14:49:02 +0800806 {
q.huang40f5e322022-06-21 14:57:02 +0800807 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_ANSWERED;
q.huang783ed5d2022-06-02 14:49:02 +0800808 }
q.huang40f5e322022-06-21 14:57:02 +0800809 break;
810 case LYNQ_ECALL_LLACK_RECEIVED:
811 case LYNQ_ECALL_ALACK_POSITIVE_RECEIVED:
812 case LYNQ_ECALL_ALACK_CLEARDOWN_RECEIVED:
813 case LYNQ_ECALL_T5_TIMER_OUT:
814 case LYNQ_ECALL_T6_TIMER_OUT:
815 case LYNQ_ECALL_T7_TIMER_OUT:
816 if(is_ecall_dial)
817 {
818 LYINFLOG("ecall is dialing, recv suc indication");
819 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
820 if(ecallId >0 && find_call_id_with_call_id(ecallId)==INVALID_ID)
821 {
822 LYINFLOG("add ecall in loacl list");
823 g_ecallId = ecallId;
824 unused_callid=addAddr("ecall");
825 lynq_call_lists[unused_callid].call_id=g_ecallId;
826 }
827 sendSignalToWaitCallStateChange();
828 }
829 else if(ecallId >0 && (find_call_id_with_call_id(ecallId)==INVALID_ID))
830 {
831 LYERRLOG("ecall is not in dialing and first recv suc indication, hangup");
832 lynq_call_hungup(&ecallId);
833 }
834 else
835 {
836 LYERRLOG("ecall is not in dialing and not first recv suc indication");
837 }
838 break;
839 case LYNQ_ECALL_PSAP_CALLBACK_START:
840 if(lynq_ecall_is_running()==0)
841 {
842 LYINFLOG("ecall is not running, recv psap call back msd start, set ecall in dialing");
843 if(find_call_id_with_call_id(ecallId)!=INVALID_ID)
844 {
845 g_ecallId = ecallId;
846 if(isDial)
847 {
848 LYINFLOG("stop normal dial");
849 sendSignalToWaitCallStateChange();
850 }
851 else
852 {
853 LYINFLOG("no normal dial");
854 }
855 }
856 else
857 {
858 LYERRLOG("can't find ecall id in local list");
859 }
860 }
861 else
862 {
863 LYERRLOG("ecall is running, recv psap call back msd start");
864 }
865 break;
866 case LYNQ_ECALL_ABNORMAL_HANGUP:
867 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_NONE)
868 {
869 LYERRLOG("ecall is not in dialing , recv abnormal hangup");
870 g_ecallId = INVALID_ID;
871 }
872 else if (is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
873 {
874 LYERRLOG("ecall is in dialing state, recv no answer, recv abnormal hangup, dont' redial");
875 g_ecallId = INVALID_ID;
876 sendSignalToWaitCallStateChange();
877 }
878 else {
879 LYINFLOG("ecall is in dialing and recv answer, recv abnormal hangup");
880 }
881 break;
882 case LYNQ_ECALL_DISCONNECTED:
883 case LYNQ_ECALL_REDIAL_TIMER_OUT:
884 case LYNQ_ECALL_T2_TIMER_OUT :
885 case LYNQ_ECALL_IMS_DISCONNECTED:
886 g_ecallId = INVALID_ID;
887 if(is_ecall_dial != LYNQ_ECALL_DAILING_STATE_NONE)
888 {
889 LYERRLOG("ecall is in dialing, recv like disconnect indication");
890 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
891 sendSignalToWaitCallStateChange();
892 }
893 else
894 {
895 LYINFLOG("ecall is not in dialing, recv like disconnect indication");
896 }
897 break;
898 default:
899 LYINFLOG("not special indication");
q.huang783ed5d2022-06-02 14:49:02 +0800900 }
q.huang18d08bf2022-04-19 20:27:44 -0400901 sendSignalIncomingECallEvent();
q.huang783ed5d2022-06-02 14:49:02 +0800902 LYINFLOG("**************:RIL_UNSOL_ECALL_INDICATIONS, local ecall id is %d", g_ecallId);
q.huang18d08bf2022-04-19 20:27:44 -0400903 break;
904 }
905#endif
lh25827952022-01-10 00:34:35 -0800906 default:
907 break;
908 }
909 }
910 delete p;
911 p = NULL;
912 }
913 close(socket_fd);
914}
915int lynq_socket_urc_start()
916{
917 int socket_fd=0;
918 int rt=0;
919 int len=0;
920 int on=1;
921 struct sockaddr_in urc_local_addr;
lh25827952022-01-10 00:34:35 -0800922 pthread_attr_t attr;
ll375c94d2022-01-27 05:54:38 +0000923 socket_fd = socket(AF_INET,SOCK_DGRAM,0);
ll375c94d2022-01-27 05:54:38 +0000924 if(socket_fd < 0)
925 {
q.huang783ed5d2022-06-02 14:49:02 +0800926 LYERRLOG("creaet socket for udp fail");
ll375c94d2022-01-27 05:54:38 +0000927 return -1;
lh25827952022-01-10 00:34:35 -0800928 }
929 urc_local_addr.sin_family = AF_INET;
930 urc_local_addr.sin_port = htons(LYNQ_URC_SERVICE_PORT);
931 urc_local_addr.sin_addr.s_addr = htons(INADDR_ANY);
932 /* Set socket to allow reuse of address and port, SO_REUSEADDR value is 2*/
ll375c94d2022-01-27 05:54:38 +0000933 rt = setsockopt(socket_fd,SOL_SOCKET,SO_REUSEADDR,&on,sizeof on);
934 if(rt<0)
935 {
q.huang783ed5d2022-06-02 14:49:02 +0800936 LYERRLOG("SO_REUSEADDR fail");
lh25827952022-01-10 00:34:35 -0800937 return -1;
938 }
939 rt = bind(socket_fd ,(struct sockaddr*)&urc_local_addr, sizeof(urc_local_addr));
ll375c94d2022-01-27 05:54:38 +0000940 if (rt == -1)
941 {
lh59e0d002022-01-27 00:27:12 -0800942 LYERRLOG("bind failed");
ll375c94d2022-01-27 05:54:38 +0000943 return -1;
lh25827952022-01-10 00:34:35 -0800944 }
945 pthread_attr_init(&attr);
946 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
lhcdf816a2022-02-13 23:56:05 -0800947 rt = pthread_create(&lynq_call_urc_tid,&attr,thread_urc_recv,(void *)socket_fd);
lh25827952022-01-10 00:34:35 -0800948 if(rt < 0)
949 {
q.huang783ed5d2022-06-02 14:49:02 +0800950 LYERRLOG("urc loop failure!!!");
lh25827952022-01-10 00:34:35 -0800951 return -1;
952 }
q.huang783ed5d2022-06-02 14:49:02 +0800953 LYDBGLOG("urc loop success!!!");
lh25827952022-01-10 00:34:35 -0800954 return 0;
955}
956int getSelfElement(char addr[])
957{
958 for(int i=0;i < LYNQ_CALL_MAX; i++)
959 {
960 if(lynq_call_lists[i].used==1)
961 {
962 if(strcmp(lynq_call_lists[i].addr,addr)==0)
963 {
964 return i;
965 }
966
967 }
968 }
969 return -1;
970}
971
972void lynq_call_state_change_test(int soc_id)
973{
q.huang783ed5d2022-06-02 14:49:02 +0800974 LYDBGLOG("call state change,sim:%d",soc_id);
lh25827952022-01-10 00:34:35 -0800975}
q.huang3e761702022-06-28 20:12:01 +0800976
977void lynq_init_rtp()
978{
979 memset(&g_rtp_client_info,0,sizeof(g_rtp_client_info));
980 memset(&g_rtp_server_info,0,sizeof(g_rtp_server_info));
981
982
983 lynq_set_rtp_param(8000,1,400);
984
985 for(int i=0;i<RTP_MODE_MAX;i++)
986 {
q.huang301f2a62022-06-30 09:55:45 +0800987 lynq_set_rtp_port(i,6666);
q.huang3e761702022-06-28 20:12:01 +0800988 g_rtp_thread_valid[i] = 0;
989 }
990
991 LYDBGLOG("lynq init rtp success!!!");
992 return;
993}
994
lh25827952022-01-10 00:34:35 -0800995int lynq_init_call(int uToken)
ll1343a5b2022-03-17 05:31:33 +0000996{
997 if(g_lynq_call_init_flag == 1){
998 LYDBGLOG("lynq init call failed!!!");
999 return -1;
1000 }
1001 g_lynq_call_init_flag = 1;
llc81b4d52022-07-13 09:39:44 +00001002 s_call_urc_event_complete = 1;
1003 call_list_loop = 1;
1004 LYINFLOG("liulei call_list_loop %d\n", call_list_loop);
1005 s_urc_call_state_change_mutex = new pthread_mutex_t;
1006 pthread_mutex_init(s_urc_call_state_change_mutex, NULL);
1007 s_urc_call_state_change_cond = new pthread_cond_t;
1008 LYINFLOG("liulei s_urc_call_state_change_mutex\n");
1009 pthread_cond_init(s_urc_call_state_change_cond, NULL);
1010 LYINFLOG("liulei s_urc_call_state_change_cond\n");
lh25827952022-01-10 00:34:35 -08001011 int result = 0;
lha35d4ee2022-01-25 18:47:39 -08001012 Global_uToken_call = uToken;
lh59e0d002022-01-27 00:27:12 -08001013 urc_call_recive_status = 1;
rjw8bdc56b2022-02-28 15:01:49 +08001014 client_size = sizeof(client_t);
lh25827952022-01-10 00:34:35 -08001015 LYLOGSET(LOG_INFO);
1016 LYLOGEINIT(USER_LOG_TAG);
1017 result = lynq_socket_client_start();
1018 if(result!=0)
1019 {
1020 return -1;
1021 }
1022 result = lynq_socket_urc_start();
1023 if(result!=0)
1024 {
1025 return -1;
1026 }
1027 result = lynq_update_call_list_loop();
1028 if(result!=0)
1029 {
1030 return -1;
1031 }
1032 memset(lynq_call_lists,0,sizeof(lynq_call_lists));
q.huang3e761702022-06-28 20:12:01 +08001033
1034 lynq_init_rtp();
1035
lh25827952022-01-10 00:34:35 -08001036 LYDBGLOG("lynq init call success!!!");
1037 return 0;
1038}
1039int lynq_deinit_call()
1040{
q.huang783ed5d2022-06-02 14:49:02 +08001041 int ret;
ll1343a5b2022-03-17 05:31:33 +00001042 if(g_lynq_call_init_flag == 0)
lhcdf816a2022-02-13 23:56:05 -08001043 {
ll1343a5b2022-03-17 05:31:33 +00001044 LYDBGLOG("lynq_deinit_call failed!!!");
1045 return -1;
lhcdf816a2022-02-13 23:56:05 -08001046 }
ll1343a5b2022-03-17 05:31:33 +00001047 else
llc81b4d52022-07-13 09:39:44 +00001048 {
ll1343a5b2022-03-17 05:31:33 +00001049 g_lynq_call_init_flag = 0;
q.huang783ed5d2022-06-02 14:49:02 +08001050 lynq_call_hungup_all();
ll1343a5b2022-03-17 05:31:33 +00001051 if(lynq_call_client_sockfd>0)
1052 {
1053 close(lynq_call_client_sockfd);
1054 }
1055 urc_call_recive_status = 0;
1056 call_list_loop = 0;
q.huang3e761702022-06-28 20:12:01 +08001057 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
ll1343a5b2022-03-17 05:31:33 +00001058 if(lynq_call_urc_tid == -1 || lynq_call_list_loop_tid == -1)
1059 {
1060 return -1;
1061 }
1062 ret = pthread_cancel(lynq_call_urc_tid);
1063 LYDBGLOG("pthread cancel ret = %d",ret);
1064 ret = pthread_cancel(lynq_call_list_loop_tid);
1065 LYDBGLOG("pthread cancel ret = %d",ret);
1066 ret = pthread_join(lynq_call_urc_tid,NULL);
1067 LYDBGLOG("pthread join ret = %d",ret);
1068 ret = pthread_join(lynq_call_list_loop_tid,NULL);
1069 LYDBGLOG("pthread join ret = %d",ret);
llc81b4d52022-07-13 09:39:44 +00001070 pthread_mutex_destroy(s_urc_call_state_change_mutex);
1071 pthread_cond_destroy(s_urc_call_state_change_cond);
1072 delete s_urc_call_state_change_mutex;
1073 //s_urc_call_state_change_mutex = NULL;
1074 delete s_urc_call_state_change_cond;
1075 //s_urc_call_state_change_cond = NULL;
1076
ll1343a5b2022-03-17 05:31:33 +00001077 return 0;
1078 }
rita47debb92022-04-07 06:08:13 -04001079}
q.huangfe1b4052022-04-18 00:09:50 -04001080
1081int lynq_set_common_request(int request_id, int argc, const char* format,...)
rita9b436d82022-04-07 01:55:39 -04001082{
1083 Parcel p;
1084 lynq_client_t client;
1085 int resp_type = -1;
1086 int request = -1;
1087 int slot_id = -1;
1088 int error = -1;
rita9b436d82022-04-07 01:55:39 -04001089
1090 client.uToken = Global_uToken_call;
q.huangfe1b4052022-04-18 00:09:50 -04001091 client.request = request_id;
1092 client.paramLen = argc;
rita9b436d82022-04-07 01:55:39 -04001093 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huangfe1b4052022-04-18 00:09:50 -04001094 if(argc!=0)
1095 {
1096 va_list args;
1097 va_start(args, format);
1098 vsnprintf(client.param, LYNQ_REQUEST_PARAM_BUF, format, args);
1099 va_end(args);
1100 }
q.huang783ed5d2022-06-02 14:49:02 +08001101 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita9b436d82022-04-07 01:55:39 -04001102 if(send_request(lynq_call_client_sockfd,&client)==-1)
1103 {
1104 LYERRLOG("send request fail");
1105 return -1;
1106 }
q.huangfe1b4052022-04-18 00:09:50 -04001107 if(get_response(lynq_call_client_sockfd,p)==0)
1108 {
1109 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1110 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1111 }
rita9b436d82022-04-07 01:55:39 -04001112 return error;
1113}
1114
q.huangfe1b4052022-04-18 00:09:50 -04001115int lynq_get_common_request(int request_id, int* status)
rita9b436d82022-04-07 01:55:39 -04001116{
1117 Parcel p;
1118 lynq_client_t client;
1119 int resp_type = -1;
1120 int request = -1;
1121 int slot_id = -1;
1122 int error = -1;
q.huangfe1b4052022-04-18 00:09:50 -04001123 if(status==NULL)
1124 {
1125 LYERRLOG("status is null");
1126 return -1;
1127 }
rita9b436d82022-04-07 01:55:39 -04001128 client.uToken = Global_uToken_call;
q.huangfe1b4052022-04-18 00:09:50 -04001129 client.request = request_id;
1130 client.paramLen = 0;
rita9b436d82022-04-07 01:55:39 -04001131 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001132 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
rita9b436d82022-04-07 01:55:39 -04001133 if(send_request(lynq_call_client_sockfd,&client)==-1)
1134 {
1135 LYERRLOG("send request fail");
1136 return -1;
1137 }
q.huangfe1b4052022-04-18 00:09:50 -04001138 if(get_response(lynq_call_client_sockfd,p)==0)
rita9b436d82022-04-07 01:55:39 -04001139 {
q.huangfe1b4052022-04-18 00:09:50 -04001140 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1141 p.readInt32(status);
1142 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
rita9b436d82022-04-07 01:55:39 -04001143 }
rita9b436d82022-04-07 01:55:39 -04001144 return error;
1145}
1146
lh25827952022-01-10 00:34:35 -08001147int lynq_call(int* handle,char addr[])
1148{
1149 Parcel p;
1150 lynq_client_t client;
1151 int resp_type = -1;
1152 int request = -1;
1153 int slot_id = -1;
1154 int error = -1;
1155 int lynq_call_id = -1;
q.huang783ed5d2022-06-02 14:49:02 +08001156
1157 LYINFLOG("lynq_call begin addr %s",addr);
lh25827952022-01-10 00:34:35 -08001158 if(addr==NULL)
1159 {
1160 LYERRLOG("Phone num is null!!!");
1161 return -1;
1162 }
q.huang783ed5d2022-06-02 14:49:02 +08001163
1164 if(find_call_id_with_addr(addr)!=INVALID_ID)
1165 {
1166 LYERRLOG("addr %s exists",addr);
1167 return LYNQ_E_CONFLICT;
1168 }
1169
1170#ifdef ECALL_SUPPORT
1171 if(lynq_ecall_is_running())
1172 {
1173 LYERRLOG("lynq_fast_ecall ecall is running");
1174 return LYNQ_E_ECALL_BEING_RUNNING;
1175 }
1176#endif
1177
lha35d4ee2022-01-25 18:47:39 -08001178 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001179 client.request = 10;//RIL_REQUEST_DIAL
1180 client.paramLen = 2;
1181 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1182 memcpy(client.param,addr,strlen(addr)+1);
1183 strcat(client.param," 0");
q.huang783ed5d2022-06-02 14:49:02 +08001184 lynq_call_id = addAddr(addr);
1185 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
llafa36b42022-07-25 05:52:14 +00001186 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lha35d4ee2022-01-25 18:47:39 -08001187 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001188 {
1189 LYERRLOG("send request fail");
q.huang783ed5d2022-06-02 14:49:02 +08001190 cleanCallList(lynq_call_id);
lh25827952022-01-10 00:34:35 -08001191 return -1;
1192 }
lha35d4ee2022-01-25 18:47:39 -08001193 get_response(lynq_call_client_sockfd,p);
llafa36b42022-07-25 05:52:14 +00001194 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh25827952022-01-10 00:34:35 -08001195 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1196 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
lh25827952022-01-10 00:34:35 -08001197 if(error==0)
1198 {
1199 isDial = 1;
ll45d3ea92022-03-24 10:22:25 +08001200 if(waitCallstateChange(6000)==ETIMEDOUT)//6000ms
lh25827952022-01-10 00:34:35 -08001201 {
lhbe92dd12022-04-19 06:01:25 -07001202 //if timeout,this call need destroy.
1203 isDial = 0;
lh25827952022-01-10 00:34:35 -08001204 error = LYNQ_E_TIME_OUT;
q.huang783ed5d2022-06-02 14:49:02 +08001205 LYERRLOG("lynq_call timeout:wait Call state fail!!! clear local idx %d",lynq_call_id);
1206 cleanCallList(lynq_call_id);
lh25827952022-01-10 00:34:35 -08001207 return error;
1208 }
q.huang783ed5d2022-06-02 14:49:02 +08001209 isDial = 0;
1210 *handle = lynq_call_lists[lynq_call_id].call_id;
1211 if(*handle > 0)
1212 {
1213 LYINFLOG("lynq_call dial addr %s suc, id is %d",addr,*handle);
1214 return 0;
1215 }
1216 else
1217 {
1218 LYERRLOG("lynq_call dial addr %s fail, invalid id",addr);
1219 cleanCallList(lynq_call_id);
1220 return LYNQ_E_INVALID_ID_ANONALY;
1221 }
1222
lh25827952022-01-10 00:34:35 -08001223 }
q.huang783ed5d2022-06-02 14:49:02 +08001224 LYERRLOG("lynq_call dial addr %s fail, service error %d",addr, error);
1225 cleanCallList(lynq_call_id);
lh25827952022-01-10 00:34:35 -08001226 return error;
1227}
1228int lynq_call_answer()
1229{
1230 Parcel p;
1231 lynq_client_t client;
1232 int resp_type = -1;
1233 int request = -1;
1234 int slot_id = -1;
1235 int error = -1;
lha35d4ee2022-01-25 18:47:39 -08001236 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001237 client.request = 40;//RIL_REQUEST_DIAL
1238 client.paramLen = 0;
1239 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001240 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
llafa36b42022-07-25 05:52:14 +00001241 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lha35d4ee2022-01-25 18:47:39 -08001242 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001243 {
1244 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -08001245 return -1;
1246 }
lha35d4ee2022-01-25 18:47:39 -08001247 get_response(lynq_call_client_sockfd,p);
llafa36b42022-07-25 05:52:14 +00001248 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh25827952022-01-10 00:34:35 -08001249 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1250 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1251 return error;
1252}
1253int lynq_call_hungup(int* handle)
1254{
1255 Parcel p;
1256 lynq_client_t client;
1257 int resp_type = -1;
1258 int request = -1;
1259 int slot_id = -1;
1260 int error = -1;
1261 int call_id = 0;
q.huang783ed5d2022-06-02 14:49:02 +08001262 int lynq_call_id;
lha35d4ee2022-01-25 18:47:39 -08001263 if(handle==NULL||!((*handle>=0)&&(*handle<10)))
1264 {
1265 LYERRLOG("[%s] illegal input!!!!",__FUNCTION__);
1266 return LYNQ_E_CONFLICT;
1267 }
1268 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001269 client.request = 12;//RIL_REQUEST_HUNGUP
1270 client.paramLen = 1;
1271 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001272 call_id = *handle;
lh25827952022-01-10 00:34:35 -08001273 sprintf(client.param,"%d",call_id);
q.huang783ed5d2022-06-02 14:49:02 +08001274 LYINFLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
llafa36b42022-07-25 05:52:14 +00001275 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lha35d4ee2022-01-25 18:47:39 -08001276 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001277 {
1278 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -08001279 return -1;
1280 }
lha35d4ee2022-01-25 18:47:39 -08001281 get_response(lynq_call_client_sockfd,p);
llafa36b42022-07-25 05:52:14 +00001282 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh25827952022-01-10 00:34:35 -08001283 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1284 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1285 if(error==0)
1286 {
q.huang783ed5d2022-06-02 14:49:02 +08001287 lynq_call_id=find_call_id_with_call_id(call_id);
1288 if(lynq_call_id!=INVALID_ID)
1289 {
1290 cleanCallList(lynq_call_id);
1291 }
lh25827952022-01-10 00:34:35 -08001292 }
1293 return error;
1294}
1295int lynq_call_hungup_all()
1296{
1297 Parcel p;
1298 lynq_client_t client;
1299 int resp_type = -1;
1300 int request = -1;
1301 int slot_id = -1;
1302 int error = -1;
lha35d4ee2022-01-25 18:47:39 -08001303 client.uToken = Global_uToken_call;
lh25827952022-01-10 00:34:35 -08001304 client.request = 17;//RIL_REQUEST_UDUB
1305 client.paramLen = 0;
1306 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
q.huang783ed5d2022-06-02 14:49:02 +08001307 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
llafa36b42022-07-25 05:52:14 +00001308 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lha35d4ee2022-01-25 18:47:39 -08001309 if(send_request(lynq_call_client_sockfd,&client)==-1)
lh25827952022-01-10 00:34:35 -08001310 {
1311 LYERRLOG("send request fail");
lh25827952022-01-10 00:34:35 -08001312 return -1;
1313 }
lha35d4ee2022-01-25 18:47:39 -08001314 get_response(lynq_call_client_sockfd,p);
llafa36b42022-07-25 05:52:14 +00001315 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lh25827952022-01-10 00:34:35 -08001316 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1317 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1318 return error;
1319}
1320int lynq_wait_incoming_call(int *handle)
1321{
1322 waitIncomingCall();
1323 *handle = lynqIncomingCallId;
1324 LYINFLOG("lynq incoming call id:%d",lynqIncomingCallId);
1325 return 0;
1326}
1327
1328int lynq_set_auto_answercall(const int mode)
1329{
1330 global_call_auto_answer = mode;
1331 LYINFLOG("auto answer call mode =%d",mode);
1332 return 0;
1333}
q.huangb0eb7b02022-03-29 04:17:32 -04001334int lynq_get_current_call_state(int *handle, int *call_state,int *toa,int *direction,char addr[])
1335{
1336 int lynq_call_id = 0;
q.huang783ed5d2022-06-02 14:49:02 +08001337 LYINFLOG("lynq_get_current_call_state begin ");
q.huangb0eb7b02022-03-29 04:17:32 -04001338 if(handle==NULL)
1339 {
q.huang783ed5d2022-06-02 14:49:02 +08001340 LYERRLOG("handle is NULL");
q.huangb0eb7b02022-03-29 04:17:32 -04001341 return LYNQ_E_NULL_ANONALY;
1342 }
q.huang783ed5d2022-06-02 14:49:02 +08001343 lynq_call_id = find_call_id_with_call_id(*handle);
1344 if(lynq_call_id==INVALID_ID)
1345 {
1346 return LYNQ_E_INVALID_ID_ANONALY;
1347 }
q.huangb0eb7b02022-03-29 04:17:32 -04001348 *call_state = lynq_call_lists[lynq_call_id].call_state;
1349 *toa = lynq_call_lists[lynq_call_id].toa;
1350 *direction = lynq_call_lists[lynq_call_id].direction;
1351 memcpy(addr,lynq_call_lists[lynq_call_id].addr,strlen(lynq_call_lists[lynq_call_id].addr)+1);
1352 return 0;
1353}
1354
1355/*audio begin*/
ll7e055f22022-01-24 12:16:22 +00001356static int judge_mic(const int enable){
llc6030062022-02-14 08:58:16 +00001357 switch(enable){
1358 case 0:
1359 return 1;
1360 case 1:
1361 return 1;
1362 default:
1363 return 0;
ll7e055f22022-01-24 12:16:22 +00001364 }
1365}
1366
lh25827952022-01-10 00:34:35 -08001367int lynq_set_mute_mic(const int enable)
ll7e055f22022-01-24 12:16:22 +00001368{
1369 if(!judge_mic(enable)){
1370 return LYNQ_E_CONFLICT;
1371 }
q.huangb0eb7b02022-03-29 04:17:32 -04001372 return lynq_set_common_request(53,1,"%d",enable); //RIL_REQUEST_SET_MUTE
1373}
1374int lynq_get_mute_mic(int *status)
1375{
1376 return lynq_get_common_request(54,status);//RIL_REQUEST_GET_MUTE
lh25827952022-01-10 00:34:35 -08001377}
ll45d3ea92022-03-24 10:22:25 +08001378
1379/**
1380 * @brief Check whether DTMF is valid
1381 *
1382 * @param callnum dtmf eg:0-9 * #
1383 * @return int
1384 */
1385static int judge_dtmf(const char callnum)
1386{
1387 if(callnum == '#')
1388 {
1389 return 1;
1390 }
1391 if(callnum == '*')
1392 {
1393 return 1;
1394 }
1395 if(callnum >= '0'&& callnum <= '9')
1396 {
1397 return 1;
1398 }
1399 return 0;
1400}
1401
lla0438322022-07-20 09:30:19 +00001402int lynq_switch_waiting_or_holding_and_active(void)
1403{
1404 Parcel p;
1405 lynq_client_t client;
1406 int resp_type = -1;
1407 int request = -1;
1408 int slot_id = -1;
1409 int error = -1;
1410 client.uToken = Global_uToken_call;
1411 client.request = RIL_REQUEST_SWITCH_WAITING_OR_HOLDING_AND_ACTIVE;
1412 client.paramLen = 0;
1413 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1414 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
llafa36b42022-07-25 05:52:14 +00001415 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lla0438322022-07-20 09:30:19 +00001416 if(send_request(lynq_call_client_sockfd,&client)==-1)
1417 {
1418 LYERRLOG("send request fail");
1419 return -1;
1420 }
1421 get_response(lynq_call_client_sockfd,p);
llafa36b42022-07-25 05:52:14 +00001422 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lla0438322022-07-20 09:30:19 +00001423 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1424 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1425 return error;
1426}
1427
1428int lynq_hangup_waiting_or_background(void)
1429{
1430 Parcel p;
1431 lynq_client_t client;
1432 int resp_type = -1;
1433 int request = -1;
1434 int slot_id = -1;
1435 int error = -1;
1436 client.uToken = Global_uToken_call;
1437 client.request = RIL_REQUEST_HANGUP_WAITING_OR_BACKGROUND;
1438 client.paramLen = 0;
1439 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1440 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
llafa36b42022-07-25 05:52:14 +00001441 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lla0438322022-07-20 09:30:19 +00001442 if(send_request(lynq_call_client_sockfd,&client)==-1)
1443 {
1444 LYERRLOG("send request fail");
1445 return -1;
1446 }
1447 get_response(lynq_call_client_sockfd,p);
llafa36b42022-07-25 05:52:14 +00001448 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lla0438322022-07-20 09:30:19 +00001449 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1450 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1451 return error;
1452}
1453
1454int lynq_hangup_foreground_resume_background(void)
1455{
1456 Parcel p;
1457 lynq_client_t client;
1458 int resp_type = -1;
1459 int request = -1;
1460 int slot_id = -1;
1461 int error = -1;
1462 client.uToken = Global_uToken_call;
1463 client.request = RIL_REQUEST_HANGUP_FOREGROUND_RESUME_BACKGROUND;
1464 client.paramLen = 0;
1465 bzero(client.param,LYNQ_REQUEST_PARAM_BUF);
1466 LYDBGLOG("uToken=%d,request=%d,paralen=%d,param=%s",client.uToken,client.request,client.paramLen,client.param);
llafa36b42022-07-25 05:52:14 +00001467 pthread_mutex_lock(&g_lynq_call_sendto_mutex);
lla0438322022-07-20 09:30:19 +00001468 if(send_request(lynq_call_client_sockfd,&client)==-1)
1469 {
1470 LYERRLOG("send request fail");
1471 return -1;
1472 }
1473 get_response(lynq_call_client_sockfd,p);
llafa36b42022-07-25 05:52:14 +00001474 pthread_mutex_unlock(&g_lynq_call_sendto_mutex);
lla0438322022-07-20 09:30:19 +00001475 JumpHeader(p,&resp_type,&request,&slot_id,&error);
1476 LYINFLOG("resp_type=%d,request=%d,slot_id=%d,error_code=%d",resp_type,request,slot_id,error);
1477 return error;
1478}
1479
lh25827952022-01-10 00:34:35 -08001480int lynq_set_DTMF(const char callnum)
1481{
ll45d3ea92022-03-24 10:22:25 +08001482 if(!judge_dtmf(callnum))
1483 {
1484 return LYNQ_E_CONFLICT;
1485 }
lh25827952022-01-10 00:34:35 -08001486 if(!lynq_call_state)
1487 {
1488 LYERRLOG("LYNQ_E_CONFLICT");
1489 return LYNQ_E_CONFLICT;
1490 }
q.huangb0eb7b02022-03-29 04:17:32 -04001491 return lynq_set_common_request(24,1,"%c",callnum); //RIL_REQUEST_DTMF
lh25827952022-01-10 00:34:35 -08001492}
q.huangb0eb7b02022-03-29 04:17:32 -04001493static int judge_volume(LYNQ_E_VOLUMN_SET set,const int volume){
1494 if(set==LYNQ_E_VOLUMN_SET_DTMF){
1495 if(volume < 0 ||volume >36){
1496 return 0;
1497 }
1498 }
1499 else if (set==LYNQ_E_VOLUMN_SET_SPEECH)
1500 {
1501 if(volume < 1 ||volume >7){
1502 return 0;
1503 }
ll7e055f22022-01-24 12:16:22 +00001504 }
ll375c94d2022-01-27 05:54:38 +00001505 return 1;
ll7e055f22022-01-24 12:16:22 +00001506}
lh25827952022-01-10 00:34:35 -08001507int lynq_set_DTMF_volume(const int volume)
ll7e055f22022-01-24 12:16:22 +00001508{
q.huangb0eb7b02022-03-29 04:17:32 -04001509 if(!judge_volume(LYNQ_E_VOLUMN_SET_DTMF,volume)){
ll7e055f22022-01-24 12:16:22 +00001510 return LYNQ_E_CONFLICT;
1511 }
q.huangb0eb7b02022-03-29 04:17:32 -04001512 return lynq_set_common_request(8003,1,"%d",volume);//LYNQ_REQUEST_SET_DTMF_VOLUME
lh25827952022-01-10 00:34:35 -08001513}
q.huang9ee6d5b2022-04-05 23:11:02 -04001514int lynq_set_speech_volume(const int volume)//mixer_set_volume
lh25827952022-01-10 00:34:35 -08001515{
q.huangb0eb7b02022-03-29 04:17:32 -04001516 if(!judge_volume(LYNQ_E_VOLUMN_SET_SPEECH,volume))
lh25827952022-01-10 00:34:35 -08001517 {
q.huangb0eb7b02022-03-29 04:17:32 -04001518 return LYNQ_E_CONFLICT;
lh25827952022-01-10 00:34:35 -08001519 }
q.huangb0eb7b02022-03-29 04:17:32 -04001520 return lynq_set_common_request(8009,1,"%d",volume); //LYNQ_REQUEST_SET_SPEECH_VOLUME
lh25827952022-01-10 00:34:35 -08001521}
q.huangb0eb7b02022-03-29 04:17:32 -04001522int lynq_get_speech_volume(int* volumn)//mixer_get_volume
1523{
1524 return lynq_get_common_request(8010,volumn);//LYNQ_REQUEST_GET_SPEECH_VOLUME
1525}
q.huang9ee6d5b2022-04-05 23:11:02 -04001526int lynq_incall_record_start(const char* file_path)
q.huangb0eb7b02022-03-29 04:17:32 -04001527{
q.huang783ed5d2022-06-02 14:49:02 +08001528 return lynq_set_common_request(8011,2,"%s %s","1",file_path); //LYNQ_REQUEST_RECORD
q.huangb0eb7b02022-03-29 04:17:32 -04001529}
1530int lynq_incall_record_stop()
1531{
q.huang9ee6d5b2022-04-05 23:11:02 -04001532 const char* unused_file="just_ocuupy_paramter_postion";
1533 return lynq_set_common_request(8011,2,"%s %s","0",unused_file); //LYNQ_REQUEST_RECORD
q.huangb0eb7b02022-03-29 04:17:32 -04001534}
1535/*audio end*/
q.huangfe1b4052022-04-18 00:09:50 -04001536
1537#ifdef ECALL_SUPPORT
1538LYNQ_ECall_Variant lynq_get_lynq_ecall_variant_from_lynq_type(LYNQ_ECall_Type type)
1539{
1540 switch(type)
1541 {
1542 case LYNQ_ECALL_TYPE_TEST:
1543 return LYNQ_ECALL_TEST;
1544 case LYNQ_ECALL_TYPE_RECONFIG:
1545 return LYNQ_ECALL_RECONFIG;
1546 default:
1547 return LYNQ_ECALL_EMERGENCY;
1548 }
1549}
1550
1551RIL_ECall_Variant lynq_get_ril_ecall_variant_from_lynq_variant(LYNQ_ECall_Variant type)
1552{
1553 switch(type)
1554 {
1555 case LYNQ_ECALL_TEST:
1556 return ECALL_TEST;
1557 case LYNQ_ECALL_RECONFIG:
1558 return ECALL_RECONFIG;
1559 default:
1560 return ECALL_EMERGENCY;
1561 }
1562}
1563
1564RIL_ECall_Category lynq_get_ril_ecall_cat_from_lynq_cat(LYNQ_ECall_Category cat)
1565{
1566 switch(cat)
1567 {
1568 case LYNQ_EMER_CAT_MANUAL_ECALL:
1569 return EMER_CAT_MANUAL_ECALL;
1570 default:
1571 return EMER_CAT_AUTO_ECALL;
1572 }
1573}
1574
1575
1576int lynq_set_test_num(LYNQ_ECall_Set_Type type, const char *test_num, int test_num_length)
1577{
1578 int error;
1579
1580 if(test_num==NULL || test_num_length > LYNQ_PHONE_NUMBER_MAX )
1581 {
q.huang783ed5d2022-06-02 14:49:02 +08001582 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 -04001583 return -1;
1584 }
1585
1586 error=lynq_set_common_request(RIL_REQUEST_ECALL_SET_TEST_NUM,2,"%d %s",type,test_num);
1587
1588 if(error==0)
1589 {
1590 snprintf(e_call_addr[LYNQ_ECALL_TEST],LYNQ_PHONE_NUMBER_MAX,"%s",test_num);
1591 }
1592
1593 return error;
1594}
1595
q.huang892722f2022-05-10 20:37:21 +08001596int 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 -04001597{
q.huang783ed5d2022-06-02 14:49:02 +08001598 int error;
q.huangfe1b4052022-04-18 00:09:50 -04001599 RIL_ECall_Variant ril_ecall_variant = lynq_get_ril_ecall_variant_from_lynq_variant (lynq_ecall_variant);
q.huang9a9b8762022-04-19 05:20:12 -04001600 RIL_ECall_Category ril_ecall_cat = lynq_get_ril_ecall_cat_from_lynq_cat(lynq_ecall_cat);
q.huang6a119762022-05-11 20:10:38 +08001601 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
1602 unsigned int i;
q.huang783ed5d2022-06-02 14:49:02 +08001603 if(lynq_ecall_is_running())
q.huang892722f2022-05-10 20:37:21 +08001604 {
q.huang783ed5d2022-06-02 14:49:02 +08001605 LYERRLOG("lynq_fast_ecall ecall is running");
1606 return LYNQ_E_ECALL_BEING_RUNNING;
1607 }
1608
1609 if(msd_length > MSD_MAX_LENGTH || msd_length <=0)
1610 {
1611 LYERRLOG("lynq_fast_ecall msd_length %d is greater than %d or <= 0, parameter error",msd_length,MSD_MAX_LENGTH);
1612 return LYNQ_E_ECALL_MSD_LENGTH_ERROR;
q.huang892722f2022-05-10 20:37:21 +08001613 }
q.huang892722f2022-05-10 20:37:21 +08001614
q.huang6a119762022-05-11 20:10:38 +08001615 for(i =0; i<msd_length;i++)
q.huang892722f2022-05-10 20:37:21 +08001616 {
q.huang6a119762022-05-11 20:10:38 +08001617 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang892722f2022-05-10 20:37:21 +08001618 }
1619
q.huang18d08bf2022-04-19 20:27:44 -04001620
q.huang783ed5d2022-06-02 14:49:02 +08001621 LYINFLOG("lynq_fast_ecall addr is %s",e_call_addr[lynq_ecall_variant]);
q.huang18d08bf2022-04-19 20:27:44 -04001622
q.huang892722f2022-05-10 20:37:21 +08001623 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 -04001624
1625 if(error==0)
q.huang783ed5d2022-06-02 14:49:02 +08001626 {
q.huang40f5e322022-06-21 14:57:02 +08001627 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_STARTED;
q.huang415e21d2022-07-01 11:38:26 +08001628 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 -04001629 {
q.huang783ed5d2022-06-02 14:49:02 +08001630 LYERRLOG("lynq_fast_ecall timeout:wait Call state time out!!!");
q.huang40f5e322022-06-21 14:57:02 +08001631 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang783ed5d2022-06-02 14:49:02 +08001632 lynqRespWatingEvent();
1633 return LYNQ_E_TIME_OUT;
q.huangfe1b4052022-04-18 00:09:50 -04001634 }
q.huang40f5e322022-06-21 14:57:02 +08001635 if(is_ecall_dial == LYNQ_ECALL_DAILING_STATE_STARTED)
1636 {
1637 /*just dail, no recv answer*/
1638 LYERRLOG("lynq_fast_ecall, no answer!");
1639 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
1640 lynqRespWatingEvent();
1641 return LYNQ_E_ECALL_DAILING_NO_ANSWER;
1642 }
1643
1644 is_ecall_dial = LYNQ_ECALL_DAILING_STATE_NONE;
q.huang783ed5d2022-06-02 14:49:02 +08001645 lynqRespWatingEvent();
q.huang18d08bf2022-04-19 20:27:44 -04001646
q.huang783ed5d2022-06-02 14:49:02 +08001647 if(g_ecallId != INVALID_ID)
1648 {
1649 *handle=g_ecallId;
1650 LYINFLOG("lynq_fast_ecall id is %d",g_ecallId);
1651 return 0;
1652 }
1653 else
1654 {
1655 LYERRLOG("lynq_fast_ecall service return fail");
1656 return LYNQ_E_INVALID_ID_ANONALY;
1657 }
q.huangfe1b4052022-04-18 00:09:50 -04001658 }
1659
1660 return error;
1661}
1662
1663int lynq_set_psap(int enable)
1664{
1665 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_PSAP,1,"%d",enable);
1666}
1667
1668int lynq_psap_pull_msd()
1669{
1670 return lynq_set_common_request(RIL_REQUEST_ECALL_PSAP_PULL_MSD,0,"");
1671}
1672
1673int lynq_make_ecall(int* handle, LYNQ_ECall_Type type)
1674{
1675 LYNQ_ECall_Variant lynq_ecall_variant;
1676 int error = -1;
1677 int lynq_call_id = -1;
1678
1679 if(handle==NULL)
1680 {
q.huang783ed5d2022-06-02 14:49:02 +08001681 LYERRLOG("handle is NULL, parameter error ");
q.huangfe1b4052022-04-18 00:09:50 -04001682 return -1;
1683 }
1684
1685 error=lynq_set_common_request(RIL_REQUEST_ECALL_MAKE_ECALL,1,"%d",type);
1686
1687 if(error==0)
1688 {
1689 lynq_ecall_variant=lynq_get_lynq_ecall_variant_from_lynq_type(type);
1690
q.huang783ed5d2022-06-02 14:49:02 +08001691 lynq_call_id = addAddr(e_call_addr[lynq_ecall_variant]);
q.huangfe1b4052022-04-18 00:09:50 -04001692 isDial = 1;
1693 if(waitCallstateChange(10000)==ETIMEDOUT)//10000ms
1694 {
1695 error = LYNQ_E_TIME_OUT;
1696 LYERRLOG("timeout:wait Call state fail!!!");
q.huangfe1b4052022-04-18 00:09:50 -04001697 return error;
1698 }
1699
1700 *handle = lynq_call_id;
1701 }
1702
1703 return error;
1704}
1705
1706
q.huangbd6a3062022-05-10 20:49:46 +08001707int lynq_set_msd(int* handle, const unsigned char *msd_data, int msd_length)
q.huangfe1b4052022-04-18 00:09:50 -04001708{
q.huang6a119762022-05-11 20:10:38 +08001709 char lynq_msd_data[MSD_MAX_LENGTH*2+1]={0};
1710 unsigned int i;
1711
q.huang783ed5d2022-06-02 14:49:02 +08001712 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 -04001713 {
q.huang783ed5d2022-06-02 14:49:02 +08001714 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 +08001715 return -1;
1716 }
q.huangbd6a3062022-05-10 20:49:46 +08001717
q.huang6a119762022-05-11 20:10:38 +08001718 for(i=0; i<msd_length;i++)
q.huangbd6a3062022-05-10 20:49:46 +08001719 {
q.huang6a119762022-05-11 20:10:38 +08001720 sprintf(&(lynq_msd_data[i<<1]),"%02x",msd_data[i]);
q.huang783ed5d2022-06-02 14:49:02 +08001721 }
1722
1723 LYINFLOG("lynq_set_msd ");
q.huangfe1b4052022-04-18 00:09:50 -04001724
q.huangbd6a3062022-05-10 20:49:46 +08001725 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 -04001726}
1727
1728int lynq_set_ivs(int enable)
1729{
q.huang783ed5d2022-06-02 14:49:02 +08001730 if(enable<0)
1731 {
1732 lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
1733 return 0;
1734 }
1735
1736 return lynq_set_common_request(RIL_REQUEST_ECALL_SET_IVS,1,"%d",enable);
q.huangfe1b4052022-04-18 00:09:50 -04001737}
1738
1739int lynq_reset_ivs()
1740{
1741 return lynq_set_common_request(RIL_REQUEST_ECALL_RESET_IVS,0,"");
1742}
1743
1744int lynq_ivs_push_msd()
1745{
1746 return lynq_set_common_request(RIL_REQUEST_ECALL_IVS_PUSH_MSD,0,"");
1747}
q.huang18d08bf2022-04-19 20:27:44 -04001748
1749int wait_ecall_event()
1750{
1751 int ret = 0;
1752 pthread_mutex_lock(&s_incoming_e_call_mutex);
1753 ret = pthread_cond_wait(&s_incoming_e_call_cond,&s_incoming_e_call_mutex);
q.huang783ed5d2022-06-02 14:49:02 +08001754 pthread_mutex_unlock(&s_incoming_e_call_mutex);
q.huang18d08bf2022-04-19 20:27:44 -04001755 return ret;
1756}
1757
q.huang2b60c482022-06-30 19:39:20 +08001758int lynq_wait_ecall_indication(int* handle, LYNQ_ECall_Indication *eCall_Indication)
q.huang18d08bf2022-04-19 20:27:44 -04001759{
1760 wait_ecall_event();
q.huang2b60c482022-06-30 19:39:20 +08001761 *handle = g_lynqIncomingEcallId;
q.huang40f5e322022-06-21 14:57:02 +08001762 *eCall_Indication = g_lynqIncomingEcallIndication;
q.huang2b60c482022-06-30 19:39:20 +08001763 LYINFLOG("lynq_wait_ecall_indication handle %d, Ind id: %d", *handle, *eCall_Indication);
q.huang18d08bf2022-04-19 20:27:44 -04001764 return 0;
1765}
1766
q.huangfe1b4052022-04-18 00:09:50 -04001767#endif
1768
q.huang877d6b32022-06-06 16:15:31 +08001769/*Audio Path setting begin*/
q.huang3e761702022-06-28 20:12:01 +08001770/*sub function*/
1771void lynq_set_rtp_mixer_ctrl(int enable_rtp)
1772{
1773 char cmd[256];
1774 LYINFLOG("set_rtp_mixer_ctrl %d", enable_rtp);
1775 if(enable_rtp)
1776 {
1777 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 0);
1778 system(cmd);
1779 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 1);
1780 system(cmd);
1781 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 1);
1782 system(cmd);
1783 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 1);
1784 system(cmd);
1785 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 1);
1786 system(cmd);
1787 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 1);
1788 system(cmd);
1789 }
1790 else
1791 {
1792 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"Speech_on\" %d", 1);
1793 system(cmd);
1794 sprintf(cmd, "amixer -D mtk_phonecall cset name=\"M2M_Speech_on\" %d", 0);
1795 system(cmd);
1796 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH1 DL2_CH1\" %d", 0);
1797 system(cmd);
1798 sprintf(cmd, "amixer -c0 cset name=\"PCM_2_PB_CH2 DL2_CH2\" %d", 0);
1799 system(cmd);
1800 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH1 PCM_2_CAP_CH1\" %d", 0);
1801 system(cmd);
1802 sprintf(cmd, "amixer -c0 cset name=\"UL2_CH2 PCM_2_CAP_CH1\" %d", 0);
1803 system(cmd);
1804 }
1805}
1806
1807void* lynq_start_rtp_cmd(void *arg)
1808{
1809 int* rtp_mode= (int*) arg;
1810 char cmd[384];
1811 LYINFLOG("lynq_start_rtp_cmd: rtp_mode is %d",(*rtp_mode));
1812 if ((*rtp_mode) == RTP_CLIENT)
1813 {
1814 sprintf(cmd,RTP_FROM_CMD, \
1815 g_rtp_client_info.port,g_rtp_client_info.clockrate,g_rtp_client_info.channels, \
1816 g_rtp_client_info.latency);
1817 LYINFLOG("start from rtp play: cmd is %s",cmd);
1818 system(cmd);
1819 }
1820 else if ((*rtp_mode) == RTP_SERVER)
1821 {
1822 sprintf(cmd,RTP_TO_CMD, \
1823 g_rtp_server_info.ip,g_rtp_server_info.port);
1824 LYINFLOG("start to rtp play: cmd is %s",cmd);
1825 system(cmd);
1826 }
1827 return NULL;
1828}
1829
1830int lynq_start_rtp_thread(int rtp_mode)
1831{
1832 int ret;
1833 pthread_attr_t attr;
1834 static int start_mode[RTP_MODE_MAX]={0,1};
1835
1836 pthread_attr_init(&attr);
1837 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
1838 ret = pthread_create(&(g_rtp_thread[rtp_mode]),&attr,lynq_start_rtp_cmd,&(start_mode[rtp_mode]));
1839 if(ret != 0)
1840 {
1841 g_rtp_thread_valid[rtp_mode]=0;
1842 LYERRLOG("rtp create %d pthread error, ret is %d",rtp_mode, ret);
1843 return ret;
1844 }
1845 g_rtp_thread_valid[rtp_mode]=1;
1846 return 0;
1847}
1848
q.huang877d6b32022-06-06 16:15:31 +08001849/*set*/
1850int lynq_set_voice_audio_mode(const LYNQ_Audio_Mode audio_mode)
1851{
q.huang3e761702022-06-28 20:12:01 +08001852 int ret;
1853 int i;
1854
1855 if(audio_mode==AUDIO_MODE_RTP)
1856 {
1857 lynq_set_rtp_mixer_ctrl(1);
1858 for(i=0;i<RTP_MODE_MAX;i++)
1859 {
1860 if(!g_rtp_thread_valid[i])
1861 {
1862 if(lynq_start_rtp_thread(i)!= 0)
1863 {
1864 LYERRLOG("start rtp %d fail",i);
1865 break;
1866 }
1867 else
1868 {
1869 LYINFLOG("start rtp %d suc",i);
1870 }
1871 }
1872 else
1873 {
1874 LYERRLOG("rtp %d needn't start",i);
1875 }
1876 }
1877 if(i!= RTP_MODE_MAX)
1878 {
1879 LYERRLOG("start rtp whole fail");
1880 lynq_set_voice_audio_mode(AUDIO_MODE_CODEC);
1881 return 1;
1882 }
1883 LYINFLOG("start rtp whole suc");
1884 return 0;
1885 }
1886 else if(audio_mode==AUDIO_MODE_CODEC)
1887 {
1888 for(i=0;i<RTP_MODE_MAX;i++)
1889 {
1890 if(g_rtp_thread_valid[i])
1891 {
1892 ret = pthread_cancel(g_rtp_thread[i]);
1893 LYINFLOG("pthread cancel rtp %d ret = %d",i,ret);
1894 ret = pthread_join(g_rtp_thread[i],NULL);
1895 LYINFLOG("pthread join rtp %d ret = %d",i,ret);
1896 g_rtp_thread_valid[i] = 0;
1897 }
1898 else
1899 {
1900 LYINFLOG("rtp %d needn't stop",i);
1901 }
1902 }
1903 lynq_set_rtp_mixer_ctrl(0);
1904 LYINFLOG("stop rtp suc");
1905 }
1906 return 0;
q.huang877d6b32022-06-06 16:15:31 +08001907}
q.huang3e761702022-06-28 20:12:01 +08001908int lynq_set_remote_rtp_ip(const char* ip, const int ip_length)
q.huang877d6b32022-06-06 16:15:31 +08001909{
q.huang3e761702022-06-28 20:12:01 +08001910 if (NULL == ip)
1911 {
1912 LYERRLOG("ip is NULL!!!");
1913 return -1;
1914 }
1915 if ((ip_length < strlen(ip)+1) || (ip_length > MAX_IP_LENGTH))
1916 {
1917 LYERRLOG("incoming ip length error %d", ip_length);
1918 return -1;
1919 }
1920
1921 bzero(g_rtp_server_info.ip,MAX_IP_LENGTH);
1922 strcpy(g_rtp_server_info.ip,ip);
1923
1924 LYINFLOG("lynq_set_remote_rtp_ip suc: ip is %s, length is %d", ip,ip_length);
1925
q.huang877d6b32022-06-06 16:15:31 +08001926 return 0;
1927}
q.huang65033cb2022-06-06 20:23:15 +08001928int lynq_set_rtp_port(const LYNQ_Rtp_Mode rtp_mode, const int port)
q.huang877d6b32022-06-06 16:15:31 +08001929{
q.huang3e761702022-06-28 20:12:01 +08001930 if (port < 0)
1931 {
1932 LYERRLOG("invalid port number %d", port);
1933 return -1;
1934 }
1935 if (rtp_mode == 0)
1936 {
1937 g_rtp_client_info.port = port;
1938 }
1939 else if (rtp_mode == 1)
1940 {
1941 g_rtp_server_info.port = port;
1942 }
1943 LYINFLOG("lynq_set_rtp_port suc: LYNQ_Rtp_Mode is %d, port is %d", rtp_mode, port);
q.huang877d6b32022-06-06 16:15:31 +08001944 return 0;
1945}
1946int lynq_set_rtp_param(const int clock_rate,const int channels,const int latency) //only for client mode
1947{
q.huang3e761702022-06-28 20:12:01 +08001948 g_rtp_client_info.clockrate = clock_rate;
1949 g_rtp_client_info.channels = channels;
1950 g_rtp_client_info.latency = latency;
1951 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 +08001952 return 0;
1953}
1954/*get*/
1955LYNQ_Audio_Mode lynq_get_voice_audio_mode()
1956{
q.huang3e761702022-06-28 20:12:01 +08001957 if(g_rtp_thread_valid[0])
1958 {
1959 return AUDIO_MODE_RTP;
1960 }
1961 else
1962 {
1963 return AUDIO_MODE_CODEC;
1964 }
q.huang877d6b32022-06-06 16:15:31 +08001965}
q.huang3e761702022-06-28 20:12:01 +08001966int lynq_get_remote_rtp_ip(char* ip, const int ip_length)
q.huang877d6b32022-06-06 16:15:31 +08001967{
1968 if(ip==NULL)
1969 {
q.huang3e761702022-06-28 20:12:01 +08001970 LYERRLOG("ip is NULL");
q.huang877d6b32022-06-06 16:15:31 +08001971 return 1;
1972 }
q.huang3e761702022-06-28 20:12:01 +08001973
1974 if(ip_length < strlen(g_rtp_server_info.ip)+1)
1975 {
1976 LYERRLOG("ip lenght %d is shorter than saved ip length %d",ip_length,strlen(g_rtp_server_info.ip)+1);
1977 return 1;
1978 }
1979 bzero(ip,ip_length);
1980 strcpy(ip,g_rtp_server_info.ip);
q.huang877d6b32022-06-06 16:15:31 +08001981 return 0;
1982}
1983int lynq_get_rtp_port(const LYNQ_Rtp_Mode rtp_mode, int* port)
1984{
1985 if(port==NULL)
1986 {
1987 return 1;
q.huang3e761702022-06-28 20:12:01 +08001988 }
1989 if (rtp_mode == 0)
1990 {
1991 *port = g_rtp_client_info.port;
1992 }
1993 else if (rtp_mode == 1)
1994 {
1995 *port = g_rtp_server_info.port;
1996 }
q.huang877d6b32022-06-06 16:15:31 +08001997 return 0;
1998}
1999int lynq_get_rtp_param(int* clock_rate, int* channels, int* latency)//only for client mode
2000{
2001 if(clock_rate == NULL || channels ==NULL || latency ==NULL)
2002 {
q.huang3e761702022-06-28 20:12:01 +08002003 LYERRLOG("input parameter is NULL");
q.huang877d6b32022-06-06 16:15:31 +08002004 return 1;
2005 }
2006
q.huang3e761702022-06-28 20:12:01 +08002007 *clock_rate = g_rtp_client_info.clockrate;
2008 *channels = g_rtp_client_info.channels ;
2009 *latency = g_rtp_client_info.latency;
2010
q.huang877d6b32022-06-06 16:15:31 +08002011 return 0;
2012}
2013/*Audio Path setting end*/
2014
lh25827952022-01-10 00:34:35 -08002015#if 0
2016int main(int argc,char **argv)
2017{
2018 int n = 0;
2019 n = lynq_init_call(lynq_call_state_change_test,2222);
2020 if(n<0)
2021 {
q.huang783ed5d2022-06-02 14:49:02 +08002022 LYDBGLOG("lynq init call fail!!!");
lh25827952022-01-10 00:34:35 -08002023 return -1;
2024 }
q.huang783ed5d2022-06-02 14:49:02 +08002025 LYDBGLOG("lynq call init success!!!");
lh25827952022-01-10 00:34:35 -08002026 char phoneNum[LYNQ_PHONE_NUMBER_MAX];
2027 sprintf(phoneNum,"18180053406 0",strlen("18180053406 0")+1);
2028 lynq_call(phoneNum);
2029 while(1)
2030 {
2031 sleep(1);
2032 }
2033 return 0;
2034}
2035#endif
2036/*Warren add for T800 platform 2021/11/19 end*/