blob: a6f08836032f091888ff5552e2121d0bc21b7293 [file] [log] [blame]
b.liu68a94c92025-05-24 12:53:41 +08001#include "gsw/gsw_voice.h"
2#include <dlfcn.h>
3#include <pthread.h>
4
5// mbtk includes
6
7typedef unsigned int uint32;
8typedef unsigned char uint8;
9typedef unsigned short uint16;
10typedef void (*mbtk_info_callback_func)(const void* data, int data_len);
11
12typedef struct
13{
14 int client_fd;
15 pthread_t read_thread_id;
16 int exit_fd[2];
17 bool is_waitting;
18 pthread_cond_t cond;
19 pthread_mutex_t mutex;
20
21 pthread_mutex_t send_mutex;
22
23 // Temp response data.
24 uint16 info_err;
25 uint16 data_len;
26 void *data;
27
28 //mbtk wyq for server_ready_status add start
29 char server_ready_status;
30 //mbtk wyq for server_ready_status add end
31
32 mbtk_info_callback_func net_state_cb;
33 mbtk_info_callback_func call_state_cb;
34 mbtk_info_callback_func sms_state_cb;
35 mbtk_info_callback_func radio_state_cb;
36 mbtk_info_callback_func sim_state_cb;
37 mbtk_info_callback_func pdp_state_cb;
38 //add signal by xr
39 mbtk_info_callback_func signal_state_cb;
40} mbtk_info_handle_t;
41
42typedef struct
43{
44 uint8 call_wait;
45 uint8 dir1;
46 uint8 dir;
47 uint8 state;
48 uint8 mode;
49 uint8 mpty;
50 char phone_number[100];
51 uint8 type;
52 uint8 pas;
53 uint8 disconnected_id;
54 uint8 end_reason[128];
55} __attribute__((packed)) mbtk_call_info_t;
56
57typedef enum {
58 MBTK_CLCC = 1,
59 MBTK_CPAS,
60 MBTK_DISCONNECTED,
61} mbtk_call_enum;
62
63typedef enum {
64 MBTK_CALL_RADY, //MT allows commands from TA/TE
65 MBTK_CALL_UNAVAILABLE, //MT does not allow commands from TA/TE
66 MBTK_CALL_UNKNOWN, //MT is not guaranteed to respond to instructions
67 MBTK_CALL_RINGING, //MT is ready for commands from TA/TE, but the ringer is active
68 MBTK_CALL_PROGRESS, //MT is ready for commands from TA/TE, but a call is in progress
69 MBTK_CALL_ASLEEP, //MT is unable to process commands from TA/TE because it is in a low functionality state
70 MBTK_CALL_ACTIVE,
71} mbtk_call_pas_enum;
72
73
74//----------------end_reason start------------
75//mbtk end_reason define
76#define MBTK_VOICE_END_REASON_UNKNOWN "0 "
77#define MBTK_VOICE_END_REASON_UNASSIGNED_NUMBER "1 "
78#define MBTK_VOICE_END_REASON_NO_ROUTE_DES "3 "
79#define MBTK_VOICE_END_REASON_CHANNEL_UNACCEPTABLE "6 "
80#define MBTK_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING "8 "
81#define MBTK_VOICE_END_REASON_NORMAL_CALL_CLEARING "16 "
82#define MBTK_VOICE_END_REASON_USER_BUSY "17 "
83#define MBTK_VOICE_END_REASON_NO_USER_RESPONDING "18 "
84#define MBTK_VOICE_END_REASON_USER_ALERTING_NO_ANSWER "19 "
85#define MBTK_VOICE_END_REASON_CALL_REJECTED "21 "
86#define MBTK_VOICE_END_REASON_NUMBER_CHANGED "22 "
87#define MBTK_VOICE_END_REASON_PREEMPTION "25 "
88#define MBTK_VOICE_END_REASON_NON_SELECTED_USER_CLEARING "26 "
89#define MBTK_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER "27 "
90#define MBTK_VOICE_END_REASON_INVALID_NUMBER_FORMAT "28 "
91#define MBTK_VOICE_END_REASON_FACILITY_REJECTED "29 "
92#define MBTK_VOICE_END_REASON_STATUS_ENQUIRY "30 "
93#define MBTK_VOICE_END_REASON_NORMAL_UNSPECIFIED "31 "
94#define MBTK_VOICE_END_REASON_NO_CIRCUIT_AVAILABLE "34 "
95#define MBTK_VOICE_END_REASON_NETWORK_OUT_OF_ORDER "38 "
96#define MBTK_VOICE_END_REASON_TEMPORARY_FAILURE "41 "
97#define MBTK_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION "42 "
98#define MBTK_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED "43 "
99#define MBTK_VOICE_END_REASON_REQUESTED_CIRCUIT_UNAVAILABLE "44 "
100#define MBTK_VOICE_END_REASON_RESOURCE_UNAVAILABLE "47 "
101#define MBTK_VOICE_END_REASON_QOS_UNAVAILABLE "49 "
102#define MBTK_VOICE_END_REASON_REQUESTED_FACILITY_NOT_SUBSCRIBED "50 "
103#define MBTK_VOICE_END_REASON_INCOMING_CALLS_BARRED_WITHIN_CUG "55 "
104#define MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AUTHORIZED "57 "
105#define MBTK_VOICE_END_REASON_BEARER_CAPABILITY_NOT_AVAILABLE "58 "
106#define MBTK_VOICE_END_REASON_SERVICE_NOT_AVAILABLE "63 "
107#define MBTK_VOICE_END_REASON_BEARER_SERVICE_NOT_IMPLEMENTED "65 "
108#define MBTK_VOICE_END_REASON_ACM_MAX_REACHED "68 "
109#define MBTK_VOICE_END_REASON_FACILITY_NOT_IMPLEMENTED "69 "
110#define MBTK_VOICE_END_REASON_ONLY_RDI_BEARER_CAPABILITY_AVAILABLE "70 "
111#define MBTK_VOICE_END_REASON_SERVICE_NOT_IMPLEMENTED "79 "
112#define MBTK_VOICE_END_REASON_INVALID_TRANSACTION_ID "81 "
113#define MBTK_VOICE_END_REASON_USER_NOT_MEMBER_OF_CUG "87 "
114#define MBTK_VOICE_END_REASON_INCOMPATIBLE_DESTINATION "88 "
115#define MBTK_VOICE_END_REASON_INVALID_TRANSIT_NETWORK_SELECTION "91 "
116#define MBTK_VOICE_END_REASON_INCORRECT_MESSAGE "95 "
117#define MBTK_VOICE_END_REASON_INVALID_MANDATORY_INFORMATION "96 "
118#define MBTK_VOICE_END_REASON_MESSAGE_TYPE_NON_EXISTENT "97 "
119#define MBTK_VOICE_END_REASON_MESSAGE_TYPE_WRONG_STATE "98 "
120#define MBTK_VOICE_END_REASON_INFORMATION_ELEMENT_NOT_EXISTENT "99 "
121#define MBTK_VOICE_END_REASON_CONDITIONAL_IE_ERROR "100 "
122#define MBTK_VOICE_END_REASON_MESSAGE_WRONG_STATE "101 "
123#define MBTK_VOICE_END_REASON_RECOVERY_AFTER_TIMER_EXPIRY "102 "
124#define MBTK_VOICE_END_REASON_PROTOCOL_ERROR_UNSPECIFIED "111 "
125#define MBTK_VOICE_END_REASON_INERWORKING_UNSPECIFIED "127 "
126#define MBTK_VOICE_END_REASON_CALL_BARRING "224 "
127#define MBTK_VOICE_END_REASON_FDN_BLOCKED "241 "
128#define MBTK_VOICE_END_REASON_END "end"
129
130typedef enum{
131 GSW_LOCAL_END_NORMAL = 0,
132 GSW_PEER_END_NORMAL,
133 GSW_OTHER_END_NORMAL,
134 GSW_END_ABNORMAL,
135} gsw_call_end_reason_enum;
136
137//mbtk end_reason enum define
138typedef struct {
139 char mbtk_end_reason[128];
140 gsw_call_end_reason_enum end_reason;
141}end_reason_t;
142
143end_reason_t g_end_reason[] = {
144{MBTK_VOICE_END_REASON_UNASSIGNED_NUMBER, GSW_PEER_END_NORMAL},
145{MBTK_VOICE_END_REASON_NO_ROUTE_DES, GSW_END_ABNORMAL},
146{MBTK_VOICE_END_REASON_CHANNEL_UNACCEPTABLE, GSW_END_ABNORMAL},
147{MBTK_VOICE_END_REASON_OPERATOR_DETERMINED_BARRING, GSW_END_ABNORMAL},
148{MBTK_VOICE_END_REASON_NORMAL_CALL_CLEARING, GSW_LOCAL_END_NORMAL},
149{MBTK_VOICE_END_REASON_USER_BUSY, GSW_OTHER_END_NORMAL},
150{MBTK_VOICE_END_REASON_NO_USER_RESPONDING, GSW_OTHER_END_NORMAL},
151{MBTK_VOICE_END_REASON_USER_ALERTING_NO_ANSWER, GSW_LOCAL_END_NORMAL},
152{MBTK_VOICE_END_REASON_CALL_REJECTED, GSW_LOCAL_END_NORMAL},
153{MBTK_VOICE_END_REASON_NUMBER_CHANGED, GSW_OTHER_END_NORMAL},
154{MBTK_VOICE_END_REASON_PREEMPTION, GSW_OTHER_END_NORMAL},
155{MBTK_VOICE_END_REASON_NON_SELECTED_USER_CLEARING, GSW_OTHER_END_NORMAL},
156{MBTK_VOICE_END_REASON_DESTINATION_OUT_OF_ORDER, GSW_OTHER_END_NORMAL},
157{MBTK_VOICE_END_REASON_INVALID_NUMBER_FORMAT, GSW_OTHER_END_NORMAL},
158{MBTK_VOICE_END_REASON_FACILITY_REJECTED, GSW_OTHER_END_NORMAL},
159{MBTK_VOICE_END_REASON_STATUS_ENQUIRY, GSW_OTHER_END_NORMAL},
160{MBTK_VOICE_END_REASON_NORMAL_UNSPECIFIED, GSW_PEER_END_NORMAL},
161{MBTK_VOICE_END_REASON_NO_CIRCUIT_AVAILABLE, GSW_OTHER_END_NORMAL},
162{MBTK_VOICE_END_REASON_NETWORK_OUT_OF_ORDER, GSW_END_ABNORMAL},
163{MBTK_VOICE_END_REASON_TEMPORARY_FAILURE, GSW_END_ABNORMAL},
164{MBTK_VOICE_END_REASON_SWITCHING_EQUIPMENT_CONGESTION, GSW_OTHER_END_NORMAL},
165{MBTK_VOICE_END_REASON_ACCESS_INFORMATION_DISCARDED, GSW_OTHER_END_NORMAL},
166{MBTK_VOICE_END_REASON_REQUESTED_CIRCUIT_UNAVAILABLE, GSW_OTHER_END_NORMAL},
167{MBTK_VOICE_END_REASON_SERVICE_NOT_AVAILABLE, GSW_END_ABNORMAL},
168{MBTK_VOICE_END_REASON_END, GSW_OTHER_END_NORMAL}
169
170};
171
172int gsw_global_end_reason = GSW_OTHER_END_NORMAL;
173
174//----------------end_reason end------------
175
176
177typedef uint32_t voice_client_handle_type;
178
179
180
181static mbtk_info_handle_t* call_info_handle = NULL;
182static int level_call = 0;
183int gsw_voice_init_flag = 0;
184int auto_answer_flag = 0;
185voice_client_handle_type g_call_val = -1;
186CallStateInd gsw_voice_callback = NULL;
187
188
189int state_t = 0;
190char* phone_num_t = NULL;
191char* phone_num_t2 = NULL;
192int call_id_t = 0;
193int call_id_t2 = 0;
194
195#define lib_mbtk_path "/lib/libmbtk_lib.so"
196static void *dlHandle_mbtk;
197
198static mbtk_info_handle_t* (*mbtk_info_handle_get)(void);
199int (*mbtk_call_state_change_cb_reg)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb);
200int (*mbtk_call_start)(mbtk_info_handle_t* handle, char* phone_number);
201int (*mbtk_call_hang)(mbtk_info_handle_t* handle);
202int (*mbtk_a_call_hang)(mbtk_info_handle_t* handle, int phone_id);
203int (*mbtk_call_answer)(mbtk_info_handle_t* handle);
204int (*mbtk_call_reg_get)(mbtk_info_handle_t* handle, mbtk_call_info_t *reg);
205static void (*mbtk_log)(int level, const char *format, ...);
206static void (*mbtk_log_init)(char *path, char *tag);
207
208/*rtp begin*/
209int (*mbtk_rtp_init)();
210int (*mbtk_rtp_deinit)();
211int (*mbtk_rtp_enable)(bool enable);
212int (*mbtk_rtp_remote_ip_set)(const char *ipv4);
213int (*mbtk_rtp_server_port_set)(int port);
214int (*mbtk_rtp_client_port_set)(int port);
215int (*mbtk_rtp_sample_rate_set)(int sample_rate);
216int (*mbtk_rtp_channel_set)(int channel);
217/*rtp end*/
218
219
220#ifndef LOG_ERR_LEVEL
221#define LOG_ERR_LEVEL 3 /* error conditions */
222#endif
223#ifndef LOG_WARN_LEVEL
224#define LOG_WARN_LEVEL 4 /* warning conditions */
225#endif
226#ifndef LOG_INFO_LEVEL
227#define LOG_INFO_LEVEL 6 /* informational */
228#endif
229#ifndef LOG_DEBUG_LEVEL
230#define LOG_DEBUG_LEVEL 7 /* debug-level messages */
231#endif
232#ifndef LOG_VERBOSE_LEVEL
233#define LOG_VERBOSE_LEVEL 8
234#endif
235
236#define LOGV(fmt, args ...) \
237 do{ \
238 char *file_ptr_1001 = __FILE__; \
239 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
240 char line_1001[10] = {0}; \
241 sprintf(line_1001, "%d", __LINE__); \
242 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
243 if(*ptr_1001 == '/') \
244 break; \
245 ptr_1001--; \
246 } \
247 mbtk_log(LOG_VERBOSE_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
248 } while(0)
249
250#define LOGI(fmt, args...) \
251 do{ \
252 char *file_ptr_1001 = __FILE__; \
253 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
254 char line_1001[10] = {0}; \
255 sprintf(line_1001, "%d", __LINE__); \
256 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
257 if(*ptr_1001 == '/') \
258 break; \
259 ptr_1001--; \
260 } \
261 mbtk_log(LOG_INFO_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
262 } while(0)
263
264#define LOGD(fmt, args...) \
265 do{ \
266 char *file_ptr_1001 = __FILE__; \
267 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
268 char line_1001[10] = {0}; \
269 sprintf(line_1001, "%d", __LINE__); \
270 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
271 if(*ptr_1001 == '/') \
272 break; \
273 ptr_1001--; \
274 } \
275 mbtk_log(LOG_DEBUG_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
276 } while(0)
277
278#define LOGW(fmt, args...) \
279 do{ \
280 char *file_ptr_1001 = __FILE__; \
281 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
282 char line_1001[10] = {0}; \
283 sprintf(line_1001, "%d", __LINE__); \
284 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
285 if(*ptr_1001 == '/') \
286 break; \
287 ptr_1001--; \
288 } \
289 mbtk_log(LOG_WARN_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
290 } while(0)
291
292#define LOGE(fmt, args...) \
293 do{ \
294 char *file_ptr_1001 = __FILE__; \
295 char *ptr_1001 = file_ptr_1001 + strlen(file_ptr_1001) - 1; \
296 char line_1001[10] = {0}; \
297 sprintf(line_1001, "%d", __LINE__); \
298 while(ptr_1001 >= file_ptr_1001 && *ptr_1001){ \
299 if(*ptr_1001 == '/') \
300 break; \
301 ptr_1001--; \
302 } \
303 mbtk_log(LOG_ERR_LEVEL, "%s#%s: " fmt, ptr_1001 + 1, line_1001, ##args); \
304 } while(0)
305
306static int mbtk_rtp_api_import()
307{
308 mbtk_rtp_init = (int (*)(void))dlsym(dlHandle_mbtk, "mbtk_rtp_init");
309 if (mbtk_rtp_init == NULL)
310 {
311 LOGE("mbtk_rtp_init dlsym fail\n");
312 return GSW_HAL_FAIL;
313 }
314
315 mbtk_rtp_deinit = (int (*)(void))dlsym(dlHandle_mbtk, "mbtk_rtp_deinit");
316 if (mbtk_rtp_deinit == NULL)
317 {
318 LOGE("mbtk_rtp_deinit dlsym fail\n");
319 return GSW_HAL_FAIL;
320 }
321
322 mbtk_rtp_enable = (int (*)(bool enable))dlsym(dlHandle_mbtk, "mbtk_rtp_enable");
323 if (mbtk_rtp_enable == NULL)
324 {
325 LOGE("mbtk_rtp_enable dlsym fail\n");
326 return GSW_HAL_FAIL;
327 }
328
329 mbtk_rtp_remote_ip_set = (int (*)(const char *ipv4))dlsym(dlHandle_mbtk, "mbtk_rtp_remote_ip_set");
330 if (mbtk_rtp_remote_ip_set == NULL)
331 {
332 LOGE("mbtk_rtp_remote_ip_set dlsym fail\n");
333 return GSW_HAL_FAIL;
334 }
335
336 mbtk_rtp_server_port_set = (int (*)(int port))dlsym(dlHandle_mbtk, "mbtk_rtp_server_port_set");
337 if (mbtk_rtp_server_port_set == NULL)
338 {
339 LOGE("mbtk_rtp_server_port_set dlsym fail\n");
340 return GSW_HAL_FAIL;
341 }
342
343 mbtk_rtp_client_port_set = (int (*)(int port))dlsym(dlHandle_mbtk, "mbtk_rtp_client_port_set");
344 if (mbtk_rtp_client_port_set == NULL)
345 {
346 LOGE("mbtk_rtp_client_port_set dlsym fail\n");
347 return GSW_HAL_FAIL;
348 }
349
350 mbtk_rtp_sample_rate_set = (int (*)(int sample_rate))dlsym(dlHandle_mbtk, "mbtk_rtp_sample_rate_set");
351 if (mbtk_rtp_sample_rate_set == NULL)
352 {
353 LOGE("mbtk_rtp_sample_rate_set dlsym fail\n");
354 return GSW_HAL_FAIL;
355 }
356
357 mbtk_rtp_channel_set = (int (*)(int channel))dlsym(dlHandle_mbtk, "mbtk_rtp_channel_set");
358 if (mbtk_rtp_channel_set == NULL)
359 {
360 LOGE("mbtk_rtp_channel_set dlsym fail\n");
361 return GSW_HAL_FAIL;
362 }
363
364 return GSW_HAL_SUCCESS;
365}
366
367
368
369static int mbtk_call_api_import()
370{
371 dlHandle_mbtk = dlopen(lib_mbtk_path, RTLD_NOW);
372 if (dlHandle_mbtk == NULL)
373 {
374 return GSW_HAL_FAIL;
375 }
376
377 mbtk_log_init = (void (*)(char *path, char *tag))dlsym(dlHandle_mbtk, "mbtk_log_init");
378 if (mbtk_log_init == NULL)
379 {
380 return GSW_HAL_FAIL;
381 }
382
383 mbtk_log = (void (*)(int level, const char *format, ...))dlsym(dlHandle_mbtk, "mbtk_log");
384 if (mbtk_log == NULL)
385 {
386 return GSW_HAL_FAIL;
387 }
388
389 mbtk_info_handle_get = (mbtk_info_handle_t* (*)(void))dlsym(dlHandle_mbtk, "mbtk_info_handle_get");
390 if (mbtk_info_handle_get == NULL)
391 {
392 LOGE("mbtk_info_handle_get dlsym fail\n");
393 return GSW_HAL_FAIL;
394 }
395
396 mbtk_call_state_change_cb_reg = (int (*)(mbtk_info_handle_t* handle, mbtk_info_callback_func cb))dlsym(dlHandle_mbtk, "mbtk_call_state_change_cb_reg");
397 if(mbtk_call_state_change_cb_reg == NULL)
398 {
399 LOGE("mbtk_call_state_change_cb_reg dlsym fail\n");
400 return GSW_HAL_FAIL;
401 }
402
403 mbtk_call_start = (int (*)(mbtk_info_handle_t* handle, char* phone_number))dlsym(dlHandle_mbtk, "mbtk_call_start");
404 if(mbtk_call_start == NULL)
405 {
406 LOGE("mbtk_call_start dlsym fail\n");
407 return GSW_HAL_FAIL;
408 }
409
410 mbtk_call_answer = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_call_answer");
411 if(mbtk_call_answer == NULL)
412 {
413 LOGE("mbtk_call_answer dlsym fail\n");
414 return GSW_HAL_FAIL;
415 }
416
417 mbtk_call_hang = (int (*)(mbtk_info_handle_t* handle))dlsym(dlHandle_mbtk, "mbtk_call_hang");
418 if(mbtk_call_hang == NULL)
419 {
420 LOGE("mbtk_call_hang dlsym fail\n");
421 return GSW_HAL_FAIL;
422 }
423
424 mbtk_a_call_hang = (int (*)(mbtk_info_handle_t* handle, int phone_id))dlsym(dlHandle_mbtk, "mbtk_a_call_hang");
425 if(mbtk_a_call_hang == NULL)
426 {
427 LOGE("mbtk_a_call_hang dlsym fail\n");
428 return GSW_HAL_FAIL;
429 }
430
431 mbtk_call_reg_get = (int (*)(mbtk_info_handle_t* handle, mbtk_call_info_t *reg))dlsym(dlHandle_mbtk, "mbtk_call_reg_get");
432 if(mbtk_call_reg_get == NULL)
433 {
434 LOGE("mbtk_call_reg_get dlsym fail\n");
435 return GSW_HAL_FAIL;
436 }
437
438 return mbtk_rtp_api_import();
439}
440
441static int end_reason_mbtk_to_gsw(char* mbtk_reason)
442{
443 LOGE("mbtk_reason:%s\n", mbtk_reason);
444 gsw_global_end_reason = GSW_OTHER_END_NORMAL;
445 for(int i = 0; 0 != strncmp(g_end_reason[i].mbtk_end_reason, MBTK_VOICE_END_REASON_END, strlen(MBTK_VOICE_END_REASON_END)); i++)
446 {
447 if(0 == strncmp(mbtk_reason, g_end_reason[i].mbtk_end_reason, strlen(g_end_reason[i].mbtk_end_reason)))
448 {
449 gsw_global_end_reason = g_end_reason[i].end_reason;
450 LOGE("gsw_global_end_reason:%d\n", gsw_global_end_reason);
451 break;
452 }
453 }
454
455 return 0;
456}
457
458void gsw_call_state_change_cb(const void *data, int data_len)
459{
460 mbtk_call_info_t *reg = (mbtk_call_info_t *)data;
461 switch (reg->call_wait)
462 {
463 case MBTK_CLCC:
464 {
465 LOGD("RING : %d, %d, %d, %d, %d, %s, %d, %d, end_reason:%s", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type, reg->disconnected_id, reg->end_reason);
466 switch(reg->state)
467 {
468 case 0:
469 state_t = GSW_VOICE_CALL_CONNECTED;
470 break;
471 case 1:
472 state_t = GSW_VOICE_CALL_HOLDING;
473 break;
474 case 2:
475 state_t = GSW_VOICE_CALL_DIALING;
476 break;
477 case 3:
478 state_t = GSW_VOICE_CALL_ALERTING;
479 break;
480 case 4:
481 state_t = GSW_VOICE_CALL_INCOMING;
482 break;
483 case 5:
484 state_t = GSW_VOICE_CALL_WAITING;
485 break;
486 case 6:
487 {
488 state_t = GSW_VOICE_CALL_END;
489 call_id_t = reg->dir1;
490 end_reason_mbtk_to_gsw((char *)reg->end_reason);
491 break;
492 }
493
494 }
495
496 if(gsw_voice_callback)
497 {
498 gsw_voice_callback(reg->dir1, state_t);
499 }
500
501 }
502 break;
503 case MBTK_DISCONNECTED:
504 {
505 LOGD("RING : call dis connected!");
506 LOGD("RING : %d, %d, %d, %d, %d, %s, %d, %d, end_reason:%s", reg->dir1, reg->dir, reg->state, reg->mode, reg->mpty, reg->phone_number, reg->type, reg->disconnected_id, reg->end_reason);
507 state_t = GSW_VOICE_CALL_END;
508 call_id_t = reg->dir1;
509 end_reason_mbtk_to_gsw((char *)reg->end_reason);
510 if(gsw_voice_callback)
511 {
512 gsw_voice_callback(reg->disconnected_id, state_t);
513 }
514 }
515 break;
516 case MBTK_CPAS:
517 LOGD("CALL : Call state = %d", reg->pas);
518 switch (reg->pas)
519 {
520 case MBTK_CALL_RADY:
521 LOGD("CALL: call READY");
522 break;
523 case MBTK_CALL_UNAVAILABLE:
524 LOGD("CALL: call unavaliable");
525 break;
526 case MBTK_CALL_UNKNOWN:
527 LOGD("CALL: call unknown");
528 break;
529 case MBTK_CALL_RINGING:
530 LOGD("CALL: call ringing");
531 break;
532 case MBTK_CALL_PROGRESS:
533 LOGD("CALL: call progress");
534 break;
535 case MBTK_CALL_ASLEEP:
536 LOGD("CALL: call asleep");
537 break;
538 case MBTK_CALL_ACTIVE:
539 LOGD("CALL: call active");
540 break;
541 default:
542 //LOGE("\r\n");
543 break;
544 }
545 break;
546 default:
547 LOGE("RING : None call_wait = %d", reg->call_wait);
548 break;
549 }
550}
551
552
553/**
554* @brief init voice sdk,and register the status indicated callback function
555* @param [in] CallStateInd ind: status indicated callback function
556* @param [out] None
557* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
558*/
559int32_t gsw_voice_sdk_init(CallStateInd ind)
560{
561 int ret;
562
563 if (gsw_voice_init_flag == 1 && call_info_handle != NULL)
564 {
565 return GSW_HAL_SUCCESS;
566 }
567
568 if(ind == NULL)
569 {
570 LOGE("parameter is null\n");
571 return GSW_HAL_MEM_INVAILD;
572 }
573
574 ret = mbtk_call_api_import();
575 if(ret != 0)
576 {
577 if(mbtk_log != NULL)
578 {
579 LOGE("[gsw_voice_sdk_init]mbtk_call_api_import fail\n");
580 }
581 return GSW_HAL_FAIL;
582 }
583
584 mbtk_log_init("syslog", "MBTK_RIL");
585
586
587 if(ret < 0)
588 {
589 LOGE("mbtk_call_api_import fail,ret = %d\n",ret);
590 return GSW_HAL_FAIL;
591 }
592
593 ret=mbtk_rtp_init();
594
595 if(ret!=0)
596 {
597 LOGE("[gsw_voice_sdk_init]mbtk_rtp_init fail\n");
598 return GSW_HAL_FAIL;
599 }
600
601 if(call_info_handle == NULL)
602 {
603 call_info_handle = mbtk_info_handle_get();
604 if(call_info_handle != NULL)
605 {
606 LOGE("create gsw_voice_sdk_init success\n");
607
608 ret = mbtk_call_state_change_cb_reg(call_info_handle, gsw_call_state_change_cb);
609 if(ret)
610 {
611 LOGE("mbtk_call_state_change_cb_reg fail,ret = %d\n",ret);
612 (void) mbtk_rtp_deinit();
613 return GSW_HAL_FAIL;
614 }
615 else
616 {
617 gsw_voice_init_flag = 1;
618 gsw_voice_callback = ind;
619 LOGE("create gsw_voice_sdk_init success\n");
620 return GSW_HAL_SUCCESS;
621 }
622
623 }
624
625 else
626 {
627 (void) mbtk_rtp_deinit();
628 LOGE("create gsw_voice_sdk_init fail\n");
629 return GSW_HAL_FAIL;
630 }
631 }
632
633 return GSW_HAL_SUCCESS;
634}
635
636/**
637* @brief set speaker_volume
638* @param [in] int32_t volume:1(Min)-7(Max)
639* @param [out] None
640* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
641*/
642int32_t gsw_voice_set_speaker_volume(int32_t volume)
643{
644 //UNUSED(volume);
645
646#if 0
647
648 if(volume < 0 || volume > 5)
649 {
650 level_call = 0;
651 }
652 else
653 {
654 //支持-36~12
655 switch(volume)
656 {
657 case 0 :
658 level_call = -20;
659 break;
660 case 1 :
661 level_call = -14;
662 break;
663 case 2 :
664 level_call = -8;
665 break;
666 case 3 :
667 level_call = 0;
668 break;
669 case 4 :
670 level_call = 5;
671 break;
672 case 5 :
673 level_call = 12;
674 break;
675 default:
676 break;
677 }
678 }
679
680 mbtk_audio_dsp_set(1, level_call);
681 if(err)
682 {
683 LOGE("Error : %d\n", err);
684 return -1;
685 }
686 else
687 {
688 LOGE("Set success.\n");
689 }
690#endif
691
692 char cmd[128] = {0};
693 int lv = 0;
694
695 memset(cmd ,0x00, sizeof(cmd));
696
697 if(volume < 1 || volume > 7)
698 {
699 LOGE("Error volume : %d", volume);
700 return GSW_HAL_FAIL;
701 }
702 else
703 {
704 switch(volume)
705 {
706 case 1 :
707 lv = -36;
708 break;
709 case 2 :
710 lv = -36;
711 break;
712 case 3 :
713 lv = -27;
714 break;
715 case 4 :
716 lv = -18;
717 break;
718 case 5 :
719 lv = -9;
720 break;
721 case 6 :
722 lv = 0;
723 break;
724 case 7:
725 lv = 12;
726 break;
727 default:
728 break;
729 }
730 }
731
732 sprintf(cmd, "ubus call audio_if config_dspgain \"{\'type\':%d,\'gain\':%d}\"", 1, lv);
733// sLOGE(cmd, "ubus call audio_if volume_set \'{\"param0\":%d}\'", lv);
734 int err = system(cmd);
735 if ((err != -1) && (err != 127))
736 {
737 LOGE("Set success.");
738 level_call = volume;
739 }
740 else
741 {
742 LOGE("Error : %d", err);
743 return GSW_HAL_FAIL;
744 }
745
746 return GSW_HAL_SUCCESS;
747}
748
749/**
750* @brief start a voice call
751* @param [in] char *callNumber
752* @param [out] CallHandle *handle
753* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
754*/
755int32_t gsw_voice_normal_voice_start(CallHandle *handle, const char *callNumber)
756{
757 if(gsw_voice_init_flag == 0)
758 {
759 return GSW_HAL_FAIL;
760 }
761
762 mbtk_call_info_t reg = {0};
763 int ret = -1;
764
765
766 if(handle == NULL)
767 {
768 LOGE("handle is null\n");
769 return GSW_HAL_MEM_INVAILD;
770 }
771
772 if(callNumber == NULL)
773 {
774 LOGE("callNumber is null\n");
775 return GSW_HAL_MEM_INVAILD;
776 }
777
778
779 ret = mbtk_call_start(call_info_handle, (char *)callNumber);
780
781 if(ret != 0)
782 {
783 LOGE("mbtk_call_start fail,ret = %d\n",ret);
784 return GSW_HAL_FAIL;
785 }
786
787 //get call id
788 mbtk_call_reg_get(call_info_handle, &reg);
789 LOGE("call id = %d\n",reg.dir1);
790 *handle = reg.dir1;
791 LOGE("gsw_voice_normal_voice_start id = %d\n", (int)*handle);
792
793
794 return GSW_HAL_SUCCESS;
795
796}
797
798/**
799* @brief answer a voice call
800* @param [in] CallHandle handle
801* @param [out] None
802* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
803*/
804int32_t gsw_voice_answer(CallHandle handle)
805{
806 if(gsw_voice_init_flag == 0)
807 {
808 return GSW_HAL_FAIL;
809 }
810
811 int ret = -1;
812
813
814 ret = mbtk_call_answer(call_info_handle);
815
816 if(ret != 0)
817 {
818 LOGE("mbtk_call_answer fail,ret = %d\n", ret);
819 return GSW_HAL_FAIL;
820 }
821 else
822 {
823 LOGE("mbtk_call_answer success\n");
824 }
825
826 return GSW_HAL_SUCCESS;
827}
828
829
830/**
831* @brief hangup a voice call
832* @param [in] CallHandle handle
833* @param [out] None
834* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
835*/
836int32_t gsw_voice_hangup(CallHandle handle)
837{
838 if(gsw_voice_init_flag == 0)
839 {
840 return GSW_HAL_FAIL;
841 }
842
843 int ret = -1;
844
845 ret = mbtk_a_call_hang(call_info_handle,handle);
846
847 if(ret != 0)
848 {
849 LOGE("mbtk_a_call_hang fail,ret = %d\n", ret);
850 return GSW_HAL_FAIL;
851 }
852 else
853 {
854 LOGE("mbtk_a_call_hang success\n");
855 }
856
857 return GSW_HAL_SUCCESS;
858}
859
860/**
861* @brief set auto answer mode
862* @param [in] int32_t mode:0-1, 0:NO(close auto answer), 1:YES(auto answer)
863* @param [out] None
864* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
865*/
866int32_t gsw_voice_set_auto_answer_mode(int32_t mode)
867{
868 if(gsw_voice_init_flag == 0)
869 {
870 return GSW_HAL_FAIL;
871 }
872
873 if(mode == 1)
874 {
875 int ret = -1;
876
877 ret = mbtk_call_answer(call_info_handle);
878 if(ret != 0)
879 {
880 LOGE("mbtk_call_answer fail,ret = %d\n", ret);
881 return GSW_HAL_FAIL;
882 }
883 else
884 {
885 LOGE("mbtk_call_answer success\n");
886 }
887 }
888
889 return GSW_HAL_SUCCESS;
890}
891
892int32_t gsw_voice_get_current_call_end_reason(CallHandle handle)
893{
894 if(gsw_voice_init_flag == 0 || call_info_handle == NULL)
895 {
896 return GSW_HAL_FAIL;
897 }
898
899 int reason = gsw_global_end_reason;
900
901 return reason;
902}
903
904
905
906/*##########################################rtp begin*/
907/**
908* @brief set audio mode
909* @param [in] AudioMode audioMode
910* @param [out] None
911* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
912*/
913int32_t gsw_voice_set_audio_mode(AudioMode audioMode)
914{
915 if(gsw_voice_init_flag == 0)
916 {
917 return GSW_HAL_FAIL;
918 }
919
920 int ret=mbtk_rtp_enable(audioMode);
921 if(ret !=0 )
922 {
923 return GSW_HAL_FAIL;
924 }
925 return GSW_HAL_SUCCESS;
926}
927
928/**
929* @brief set rtp ip address of remote
930* @param [in] char *ip :ip address
931* @param [in] int32_t len: length
932* @param [out] None
933* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
934*/
935int32_t gsw_voice_set_remote_rtp_ip(const char *ip, int32_t len)
936{
937 if(gsw_voice_init_flag == 0)
938 {
939 return GSW_HAL_FAIL;
940 }
941
942 int ret=mbtk_rtp_remote_ip_set(ip);
943 if(ret !=0 )
944 {
945 return GSW_HAL_FAIL;
946 }
947 return GSW_HAL_SUCCESS;
948}
949
950/**
951* @brief set rtp mode and port
952* @param [in] RTPMode rtpMode: rtp mode
953* @param [in] int32_t port:rtp port
954* @param [out] None
955* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
956*/
957int32_t gsw_voice_set_rtp_port(RTPMode rtpMode, int32_t port)
958{
959 if(gsw_voice_init_flag == 0)
960 {
961 return GSW_HAL_FAIL;
962 }
963
964 int ret;
965 if(rtpMode==GSW_RTP_CLIENT)
966 {
967 ret = mbtk_rtp_client_port_set(port);
968 }
969 else
970 {
971 ret = mbtk_rtp_server_port_set(port);
972 }
973 if(ret !=0 )
974 {
975 return GSW_HAL_FAIL;
976 }
977 return GSW_HAL_SUCCESS;
978}
979
980/**
981* @brief set rtp mode and port
982* @param [in] int32_t clockRate: clock rate
983* @param [in] int32_t channel:channel
984* @param [in] int32_t latency:latency
985* @param [out] None
986* @retval GSW_HAL_SUCCESS\GSW_HAL_FAIL
987*/
988int32_t gsw_voice_set_rtp_param(int32_t clockRate, int32_t channel, int32_t latency)
989{
990 if(gsw_voice_init_flag == 0)
991 {
992 return GSW_HAL_FAIL;
993 }
994
995 int ret=mbtk_rtp_channel_set(channel);
996 if(ret==0)
997 {
998 ret=mbtk_rtp_sample_rate_set(clockRate);
999 }
1000 if(ret !=0 )
1001 {
1002 return GSW_HAL_FAIL;
1003 }
1004 return GSW_HAL_SUCCESS;
1005}
1006/*##########################################rtp end*/
1007