blob: 12276148666f2f5baf5a821f12ea01b5b5d64789 [file] [log] [blame]
rjw6c1fd8f2022-11-30 14:33:01 +08001/*****************************************************************************
2* Copyright Statement:
3* --------------------
4* This software is protected by Copyright and the information contained
5* herein is confidential. The software may not be copied and the information
6* contained herein may not be used or disclosed except with the written
7* permission of MediaTek Inc. (C) 2005
8*
9* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
10* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
11* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
12* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
13* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
14* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
15* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
16* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
17* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
18* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
19* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
20* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
21*
22* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
23* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
24* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
25* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
26* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
27*
28* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
29* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
30* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
31* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
32* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
33*
34*****************************************************************************/
35
36/*******************************************************************************
37 *
38 * Filename:
39 * ---------
40 * sp_ps.c
41 *
42 * Project:
43 * --------
44 * UMOLYE
45 *
46 * Description:
47 * ------------
48 * Packet-switching speech interface
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *------------------------------------------------------------------------------
55 * removed!
56 * removed!
57 * removed!
58 *
59 * removed!
60 * removed!
61 * removed!
62 *
63 * removed!
64 * removed!
65 * removed!
66 * removed!
67 *
68 * removed!
69 * removed!
70 * removed!
71 *
72 * removed!
73 * removed!
74 * removed!
75 * removed!
76 *
77 * removed!
78 * removed!
79 * removed!
80 * removed!
81 *
82 * removed!
83 * removed!
84 * removed!
85 * removed!
86 *
87 * removed!
88 * removed!
89 * removed!
90 * removed!
91 *
92 * removed!
93 * removed!
94 * removed!
95 * removed!
96 *
97 * removed!
98 * removed!
99 * removed!
100 *
101 * removed!
102 * removed!
103 * removed!
104 *
105 * removed!
106 * removed!
107 * removed!
108 *
109 * removed!
110 * removed!
111 * removed!
112 *
113 * removed!
114 * removed!
115 * removed!
116 *
117 * removed!
118 * removed!
119 * removed!
120 *
121 * removed!
122 * removed!
123 * removed!
124 * removed!
125 *
126 * removed!
127 * removed!
128 * removed!
129 *
130
131 *******************************************************************************/
132
133#include "kal_public_api.h"
134#include "kal_general_types.h"
135#include "string.h"
136#include "kal_trace.h"
137#include "reg_base.h"
138#include "sync_data.h"
139
140#include "audio_dsp_d2c_def.h"
141#include "l1aud_common_def.h"
142#include "l1audio.h"
143#include "am.h"
144#include "l1audio_trace_utmd.h"
145#include "media.h"
146#include "l1sp_trc.h"
147#include "amr_table.h"
148#include "sal_exp.h"
149#include "sal_def.h"
150#include "dcl.h"
151#include "drv_sap.h"
152#include "ltecsr_msgid.h"
153#include "audio_msgid.h"
154#include "sp_drv.h"
155
156#include "sp_ps.h"
157#include "sp_ps_aam.h"
158
159#include "sp_ps_codec_amr.h"
160#if defined(__EVS_CODEC_SUPPORT__)
161#include "sp_ps_codec_evs.h"
162#endif //#if defined(__EVS_CODEC_SUPPORT__)
163//#if defined(__G_CODEC_SUPPORT__)
164#include "sp_ps_codec_g.h"
165//#endif //#if defined(__G_CODEC_SUPPORT__)
166
167#include "sp_ps_dsp_opt.h"
168#include "sp_ps_aamp.h"
169
170//for query OP
171#include "ps_public_utility.h"
172
173//AAM related
174#include "l1sp_el2_struct.h"
175#include "el2_msgid.h"
176//#ifndef TK6291_FAKE_COMPILE
177//#include "uas_export_api.h"
178//#include "csr_export_api.h"
179//#endif //#ifndef TK6291_FAKE_COMPILE
180
181
182/*****************************
183Definitions
184*****************************/
185
186
187/*****************************
188External variables
189*****************************/
190extern kal_enhmutexid sp_handover_mutex;//sp_4g.c
191
192
193/*****************************
194External functions
195*****************************/
196extern void CSR_Codec_Close(int rab_id);
197extern void CSR_Codec_Ready(int rab_id);
198extern kal_uint32 SP3G_Rab_Id( void );
199extern uint32 L1I_GetTimeStamp( void );
200extern void sp4g_vmRecordService( uint32 *l1_info, uint16 crc_result, uint16 buf_status, uint16 *ul_frame_data, uint16* dl_frame_data, kal_bool bBufferOK);
201volatile uint16* SAL_PcmEx_Get4GULBuf(int *len);
202extern kal_uint32 get_is_fake_4g(void);
203
204
205/*****************************
206Local variables
207*****************************/
208static kal_uint8 spPS_reset_flag; // speech on and InterRAT : set TRUE
209static kal_bool spPS_dtx_mode;
210static int spPS_fake_EVS_IO;
211static uint8 spPS_est_codec_mode;
212static kal_uint32 spPS_rab_id;
213static kal_uint32 spPS_rab_id_record[SPPS_RAB_ID_MAX]; //valid element: 1~(SPPS_RAB_ID_MAX-1)
214static kal_bool spPS_rab_state;
215static SP_PS_RADIO_TYPE spPS_RadioType;
216
217static kal_uint8 encodebits_null[32];
218static kal_uint8 bitlen_null;
219
220VoLTE_JBM_TS_Info_t JBM_info_local;
221
222SPPS_Struct_t *spPS;
223SPPS_Struct_t stSPPS;
224kal_spinlockid spinlock_sp4g;
225
226SP4G_PSR_CallType sp4g_PSR_CallType = SP4G_PSR_CallType_None;
227
228/*****************************
229Local functions
230*****************************/
231
232void SP4G_PSR_SetCallType(SP4G_PSR_CallType type){
233 sp4g_PSR_CallType = type;
234}
235SP4G_PSR_CallType SP4G_PSR_GetCallType(void){
236 return(sp4g_PSR_CallType);
237}
238
239void spPS_RadioType_set(SP_PS_RADIO_TYPE radio_type)
240{
241 spPS_RadioType = radio_type;
242}
243
244
245SP_PS_RADIO_TYPE spPS_RadioType_get(void)
246{
247 return(spPS_RadioType);
248}
249
250
251void spPS_reset_flag_set(kal_uint8 val)
252{
253 spPS_reset_flag = val;
254}
255
256
257kal_uint8 spPS_reset_flag_get(void)
258{
259 return(spPS_reset_flag);
260}
261
262
263bool is_g_codec(uint8 codec)
264{
265 return( sp_ps_codec_g_is_g_codec(codec) );
266}
267
268
269bool is_EVS_codec(uint8 codec)
270{
271 return( sp_ps_codec_evs_is_EVS_codec(codec) );
272}
273
274
275int UseEVSIO2ReplaceAWB(void)
276{
277#if defined(__USE_EVS_IO_REPLACE_AWB__)
278 int ret = (int)L1Audio_GetDebugInfo(SPH_DEBUGINFO);
279
280 ret = ret & SPH_DEBUGINFO12_BIT0;
281 if(ret == 0x00)
282 return(1);
283 else
284 return(0);
285#else //#if defined(__USE_EVS_IO_REPLACE_AWB__)
286 return(0);
287#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
288}
289
290
291void PSR_SP4G_Callback( SP4G_Event event, void *data ){
292 if(get_is_fake_4g() == 0)
293 {
294 if(SP4G_UL_DATA_NOTIFY == event){
295 msg_send4( MOD_L1SP, /* source module id */
296 MOD_LTECSR, /* destination module id */
297 L1SP_LTECSR_SAP, /* sap id */
298 MSG_ID_LTECSR_VOICE_UL_DATA_NOTIFY /* message id */
299 );
300 }else if(SP4G_UL_MUTE_NOTIFY == event){
301 msg_send4( MOD_L1SP, /* source module id */
302 MOD_LTECSR, /* destination module id */
303 L1SP_LTECSR_SAP, /* sap id */
304 MSG_ID_LTECSR_VOICE_UL_MUTE_NOTIFY /* message id */
305 );
306 }else if(SP4G_DL_DATA_NOTIFY == event){
307#if 1
308 ilm_SP4G_PSR_DL_INFO_t *local_para;
309 local_para = (ilm_SP4G_PSR_DL_INFO_t *) construct_local_para( sizeof(ilm_SP4G_PSR_DL_INFO_t), TD_CTRL );
310 local_para->JBM_info.TS_Switch = (kal_uint8)SAL_4G_GetTSSwitch();
311 local_para->JBM_info.TS_Remain_Length_ms = (kal_int16)SAL_Get_RingBuf_RemainLen();
312 local_para->JBM_info.TS_Total_Length_ms = (kal_int16)SAL_Get_RingBuf_TotalLen();
313 msg_send6(MOD_L1SP, MOD_LTECSR, L1SP_LTECSR_SAP, MSG_ID_LTECSR_VOICE_DL_DATA_NOTIFY, (local_para_struct *)local_para, NULL);
314
315#endif
316 }
317 else if(SP4G_DL_MUTE_NOTIFY == event){
318#if 1
319 msg_send4( MOD_L1SP, /* source module id */
320 MOD_LTECSR, /* destination module id */
321 L1SP_LTECSR_SAP, /* sap id */
322 MSG_ID_LTECSR_VOICE_DL_MUTE_NOTIFY /* message id */
323 );
324#endif
325 }
326 }
327 else
328 {
329 if(SP4G_UL_DATA_NOTIFY == event){
330 msg_send4( MOD_L1SP, /* source module id */
331 MOD_MED, /* destination module id */
332 L1SP_LTECSR_SAP, /* sap id */
333 MSG_ID_LTECSR_VOICE_UL_DATA_NOTIFY /* message id */
334 );
335 }else if(SP4G_UL_MUTE_NOTIFY == event){
336 msg_send4( MOD_L1SP, /* source module id */
337 MOD_MED, /* destination module id */
338 L1SP_LTECSR_SAP, /* sap id */
339 MSG_ID_LTECSR_VOICE_UL_MUTE_NOTIFY /* message id */
340 );
341 }else if(SP4G_DL_DATA_NOTIFY == event){
342 msg_send4( MOD_L1SP, /* source module id */
343 MOD_MED, /* destination module id */
344 L1SP_LTECSR_SAP, /* sap id */
345 MSG_ID_LTECSR_VOICE_DL_DATA_NOTIFY /* message id */
346 );
347 }
348 else if(SP4G_DL_MUTE_NOTIFY == event){
349 msg_send4( MOD_L1SP, /* source module id */
350 MOD_MED, /* destination module id */
351 L1SP_LTECSR_SAP, /* sap id */
352 MSG_ID_LTECSR_VOICE_DL_MUTE_NOTIFY /* message id */
353 );
354 }
355 }
356}
357
358
359int get_spps_fake_EVS_IO(void)
360{
361 return spPS_fake_EVS_IO;
362}
363
364
365int get_sp4g_fake_EVS_IO(void)
366{
367 return( get_spps_fake_EVS_IO() );
368}
369
370
371kal_int32 SP4G_PSR_getToneDeteResult(void)
372{
373#ifdef __SP_4G_OPT_TONE_DETECTION_EXECUTED_IN_DSP__
374 return( (kal_int32)SAL_Get_DuDuPtnFlag() );
375#else // __SP_4G_OPT_TONE_DETECTION_EXECUTED_IN_DSP__
376#if defined(__SP_4G_OPT_TONE_DETECTION__)
377 return( sp_ps_dsp_opt_ToneDeteGetResult() );
378#else //#if defined(__SP_4G_OPT_TONE_DETECTION__)
379 return( 0 );
380#endif //#if defined(__SP_4G_OPT_TONE_DETECTION__)
381#endif // __SP_4G_OPT_TONE_DETECTION_EXECUTED_IN_DSP__
382}
383
384
385kal_int32 SP4G_PSR_getEarPhone(void)
386{
387 if( SPH_EXTDEVINFO_EARPHONE == SP_GetExtDevInfo() ) {
388 return( 1 );
389 }
390 else {
391 return( 0 );
392 }
393}
394
395
396kal_uint32 SP4G_GetGCodecMode(void)
397{
398 return spPS->ul_codec_mode;
399
400}
401
402
403kal_bool SP4G_IsGCodecMode()
404{
405 return sp_ps_codec_g_is_g_codec(spPS->ul_codec_mode);
406}
407
408
409kal_bool SP4G_IsEVSCodecMode()
410{
411 return sp_ps_codec_evs_is_EVS_codec(spPS->ul_codec_mode);
412}
413
414
415kal_uint32 SP4G_GetCodecMode(void)
416{
417 if(spPS != NULL)
418 return spPS->ul_codec_mode;
419 else
420 return INIT_CODEC;
421}
422
423
424void sp_ps_link_est( uint32 rab_id, kal_uint8 default_speech_codec )
425{
426 kal_uint8 old_ul_codec_mode = spPS->ul_codec_mode;
427#if defined(__USE_EVS_IO_REPLACE_AWB__)
428 kal_bool retval;
429 kal_uint8 new_SP4G_Codec;
430#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
431
432 spPS_rab_id = rab_id;
433 spPS_rab_state = KAL_TRUE;
434
435#if defined(__USE_EVS_IO_REPLACE_AWB__)
436 if( UseEVSIO2ReplaceAWB() )
437 {
438 MD_TRC_SPPS_RAB_EST_USE_EVS_IO_REPLACE_AWB_IN(default_speech_codec, default_speech_codec);
439 retval = convert_AWB_to_EVSIOEnum( (SP4G_Codec)default_speech_codec, (SP4G_Codec*)&new_SP4G_Codec );
440 if(retval == KAL_TRUE) {
441 spPS_fake_EVS_IO = 1;
442 }
443 else {
444 spPS_fake_EVS_IO = 0;
445 }
446 default_speech_codec = new_SP4G_Codec;
447 MD_TRC_SPPS_RAB_EST_USE_EVS_IO_REPLACE_AWB_OUT(default_speech_codec, default_speech_codec);
448 }
449 else
450 {
451 spPS_fake_EVS_IO = 0;
452 }
453#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
454
455 spPS_est_codec_mode = default_speech_codec;
456 if( (sp_ps_codec_g_is_g_codec(spPS_est_codec_mode) == false) && (sp_ps_codec_evs_is_EVS_codec(spPS_est_codec_mode) == false) )
457 {
458 spPS_est_codec_mode = sp_ps_codec_amr_Get_AmrFrameType2DspMode_spps(spPS_est_codec_mode);//GetFrameType2DspMode(spPS_est_codec_mode);
459 }
460 if(spPS != (SPPS_Struct_t *)NULL)
461 {
462 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
463 spPS->ul_codec_mode = spPS_est_codec_mode;//default_speech_codec;
464 kal_give_spinlock(spinlock_sp4g);
465 }
466 MD_TRC_SPPS_RAB_EST1(default_speech_codec, default_speech_codec, spPS_est_codec_mode);
467 MD_TRC_SPPS_RAB_EST2(rab_id, default_speech_codec, default_speech_codec/*spPS_est_codec_mode*/); /* Notice!! Due to the procedure of PSR, SP4G_Rab_Est must follow SetULFrameType so that spPS_est_codec_mode has been set properly*/
468#if defined(__C2K_SPEECH_SUPPORT__)
469 if( L1SP_GetState() == L1SP_STATE_C2K_SPEECH_ON ){//
470 //C2K_Codec_Close(SP3G_Rab_Id());
471 PSR_SP4G_Callback(SP4G_CODEC_READY, (void*)0 );
472 SP4G_Reset();
473 AM_InterRAT_C2K_to_4G(SP4G_GetCodecMode());
474 L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
475 }else
476#endif
477 if( L1SP_GetState() == L1SP_STATE_3G_SPEECH_ON ){//
478 CSR_Codec_Close(SP3G_Rab_Id());
479 PSR_SP4G_Callback(SP4G_CODEC_READY, (void*)0 );
480 SP4G_Reset();
481
482 AM_InterRAT_3G_to_4G(SP4G_GetCodecMode());
483
484 //fix me , depend on codec
485
486 L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
487 }else
488 if( L1SP_GetState() == L1SP_STATE_2G_SPEECH_ON ){//prepare InterRAT HO
489 PSR_SP4G_Callback(SP4G_CODEC_READY, (void*)0 );
490 SP4G_Reset();
491 AM_InterRAT_2G_to_4G(SP4G_GetCodecMode());
492
493 //fix me , depend on codec
494
495 L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
496 }else
497 if( L1SP_GetState() == L1SP_STATE_4G_SPEECH_ON ){//prepare InterRAT HO
498 uint32 resetType = PS_SRST_TYPE_HO_WITHOUT_VBIEND;
499 PSR_SP4G_Callback(SP4G_CODEC_READY, (void*)0 );
500 SP4G_Reset();
501 if( (sp_ps_codec_g_is_g_codec(old_ul_codec_mode) == true) || (sp_ps_codec_g_is_g_codec(default_speech_codec) == true) )
502 {
503 resetType = PS_SRST_TYPE_HO_WITH_VBIEND;
504 }
505 AM_4G_INTRARAT(SP4G_GetCodecMode(), resetType);
506
507 //fix me , depend on codec
508
509 L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
510 }
511}
512
513
514//CSR inform RAB is established, the rab_id should be set as parameter when callback to CSR
515kal_uint32 SPPS_PSR_Link_Est(SP4G_Codec default_speech_codec, SP_PS_RADIO_TYPE radio_type) // function call
516{
517 kal_int32 i;
518 kal_uint8 speech_codec_local = (kal_uint8)default_speech_codec;
519 //spPS_rab_id++;
520 //if(spPS_rab_id > 5)//just want to get unique id without any extra purpose
521 // spPS_rab_id = 0;
522
523 spPS_rab_id = 0;
524 for(i=1; i<SPPS_RAB_ID_MAX; i++)
525 {
526 if(spPS_rab_id_record[i] == 0)
527 {
528 spPS_rab_id = i;
529 spPS_rab_id_record[i] = 1;
530 break;
531 }
532 }
533 ASSERT(spPS_rab_id > 0);
534
535 kal_take_enh_mutex( sp_handover_mutex );
536 //AM_SetBlockMED( SAL_APP_TYPE_4GCall, true, 4);
537
538 SAL_Set_LinkStatus(SAL_LINKSTATUS_4G , true);
539 spPS_RadioType = radio_type;
540 sp_ps_link_est( spPS_rab_id, speech_codec_local );
541
542 //AM_SetBlockMED( SAL_APP_TYPE_4GCall, false, 4);
543 kal_give_enh_mutex( sp_handover_mutex );
544
545 MD_TRC_SPPS_PSR_LINK_EST(spPS_rab_id);
546 return spPS_rab_id;
547}
548
549
550//CSR inform RAB is established, the rab_id should be set as parameter when callback to CSR
551kal_uint32 SP4G_PSR_Link_Est( SP4G_Codec default_speech_codec ) // function call
552{
553 return( SPPS_PSR_Link_Est(default_speech_codec, SP_PS_RADIO_TYPE_LTE) );
554}
555
556
557void SP4G_PSR_Link_Deest(kal_uint32 id) // function call
558{
559 kal_int32 i;
560 kal_uint32 spPS_rab_id_total;
561 MD_TRC_SPPS_RAB_DEEST(id);
562 //ASSERT(id == spPS_rab_id);
563 ASSERT(spPS_rab_id_record[id] == 1);
564
565 spPS_rab_id_record[id] = 0;
566 spPS_rab_id_total = 0;
567 for(i=1; i<SPPS_RAB_ID_MAX; i++)
568 {
569 spPS_rab_id_total |= spPS_rab_id_record[i];
570 }
571 if(spPS_rab_id_total == 0)
572 {
573 spPS_rab_state = KAL_FALSE;
574 spPS_est_codec_mode = INIT_CODEC;
575 spPS_RadioType = SP_PS_RADIO_TYPE_UNKNOWN;
576 }
577
578 MD_TRC_SPPS_PSR_LINK_DEEST(spPS_rab_state);
579
580 SAL_Set_LinkStatus(SAL_LINKSTATUS_4G , false);
581 kal_take_enh_mutex( sp_handover_mutex );
582#if defined(__C2K_SPEECH_SUPPORT__)
583 if( L1SP_isC2KSO_Connected() && L1SP_GetState() != L1SP_STATE_C2K_SPEECH_ON && L1SP_GetState() != L1SP_STATE_IDLE ){//4G->C2K
584 PSR_SP4G_Callback(SP4G_CODEC_CLOSED, (void*)0 );
585 AM_InterRAT_4G_to_C2K(L1SP_GetC2KSO_Codec());
586 L1SP_SetState( L1SP_STATE_C2K_SPEECH_ON );
587 }else
588#endif
589 if( SP3G_Rab_State() && L1SP_GetState() != L1SP_STATE_3G_SPEECH_ON && L1SP_GetState() != L1SP_STATE_IDLE ){//4G->3G
590 PSR_SP4G_Callback(SP4G_CODEC_CLOSED, (void*)0 );
591 CSR_Codec_Ready(SP3G_Rab_Id());
592 AM_InterRAT_4G_to_3G(SP3G_GetCodecMode());
593 L1SP_SetState( L1SP_STATE_3G_SPEECH_ON );
594 }else
595 if( L1SP_TCH_State() && L1SP_GetState() != L1SP_STATE_2G_SPEECH_ON && L1SP_GetState() != L1SP_STATE_IDLE ){//4G->2G
596 PSR_SP4G_Callback(SP4G_CODEC_CLOSED, (void*)0 );
597 AM_InterRAT_4G_to_2G();
598 L1SP_SetState( L1SP_STATE_2G_SPEECH_ON );
599 }
600 kal_give_enh_mutex( sp_handover_mutex );
601}
602
603
604kal_bool spPS_Rab_State_get( void )
605{
606 return spPS_rab_state;
607}
608
609
610kal_bool SP4G_Rab_State( void )
611{
612 return( spPS_Rab_State_get() );
613}
614
615
616kal_uint32 SP4G_Rab_Id( void )
617{
618 return spPS_rab_id;
619}
620
621
622void SP4G_GetSyncDelayRW( kal_uint16 *u16DelayR, kal_uint16 *u16DelayW, kal_uint16 *u16DelayM, kal_uint32 *u32CurTime64us)
623{
624 sp_ps_aam_GetSyncDelayRW(u16DelayR, u16DelayW, u16DelayM, u32CurTime64us);
625}
626
627
628void SP4G_Set_G711Parameters(kal_int32 law, kal_int32 dec_init_CNG_enable)
629{
630//#if defined(__G_CODEC_SUPPORT__)
631 sp_ps_codec_g_Set_G711Parameters(law, dec_init_CNG_enable);
632//#endif //#if defined(__G_CODEC_SUPPORT__)
633}
634
635
636void SP4G_PSR_UL_GSeries_GetSpeechFrame(SP4G_Codec *codec, kal_uint8 *encodebits, kal_uint8 *bitlen)
637{
638//#if defined(__G_CODEC_SUPPORT__)
639 MD_TRC_SPPS_PSR_UL_GSERIES_GETSPEECHFRAME();
640 sp_ps_codec_g_GetFrame((int8 *)codec, (int8 *)bitlen, (uint8 *)encodebits);
641 MD_TRC_SPPS_PSR_UL_GSERIES_GETSPEECHFRAME_INFO(*codec, *codec, encodebits[0], encodebits[1], encodebits[2], encodebits[3], *bitlen);
642 // SP_updateEmCodec(true, *codec, false, 0);
643//#endif
644}
645
646
647void SP4G_PSR_DL_GSeries_PutSpeechFrame(SP4G_Codec codec, kal_uint8 *encodebits, kal_uint8 *bitlen)
648{
649//#if defined(__G_CODEC_SUPPORT__)
650 if(encodebits == NULL)
651 {
652 encodebits = encodebits_null;
653 bitlen = &bitlen_null;
654 *bitlen = 0;
655 }
656 MD_TRC_SPPS_PSR_DL_GSERIES_PUTSPEECHFRAME();
657 sp_ps_codec_g_PutFrame((int)codec, (int)(*bitlen), (uint8 *)encodebits);
658 MD_TRC_SPPS_PSR_DL_GSERIES_PUTSPEECHFRAME_INFO(codec, codec, encodebits[0], encodebits[1], encodebits[2], encodebits[3], *bitlen);
659 // SP_updateEmCodec(false, 0, true, codec);
660//#endif
661}
662
663
664/*
665return value:
6660: No more data in ul_buf.
6671: Have more data in ul_buf
668*/
669int SP4G_PSR_UL_GSeries_IsMoreData(void)
670{
671 return( sp_ps_codec_g_UL_GSeries_IsMoreData() );
672}
673
674
675void sp4g_hisr_ul_g(void *data)
676{
677 sp_ps_codec_g_hisr_ul_g((void *)0);
678}
679
680void sp4g_hisr_dl_g(void *data)
681{
682 sp_ps_codec_g_hisr_dl_g((void *)0);
683}
684
685void SP4G_EVS_CallOpenSetPar(void)
686{
687 sp_ps_codec_evs_CallOpenSetPar();
688}
689
690
691void SP4G_PSR_SetEVSEncCAPara(EVS_ENC_CA_PARAMETER *pEVS_CA_Par)
692{
693#if defined(__EVS_CODEC_SUPPORT__)
694 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
695 sp_ps_codec_evs_SetEVSEncCAPara(pEVS_CA_Par);
696 kal_give_spinlock(spinlock_sp4g);
697#endif //#if defined(__EVS_CODEC_SUPPORT__)
698}
699
700
701void SP4G_PSR_SetEVSDecCAPara(EVS_DEC_CA_PARAMETER *pEVS_CA_Par)
702{
703#if defined(__EVS_CODEC_SUPPORT__)
704 sp_ps_codec_evs_SetEVSDecCAPara(pEVS_CA_Par);
705#endif //#if defined(__EVS_CODEC_SUPPORT__)
706}
707
708kal_bool SP4G_PSR_GetEVSDecCAPara(kal_uint8* CA_RF_Flag, kal_uint8* CA_RF_Offset, SP4G_Codec codec, kal_uint8* frame_pt, kal_uint8 offset)
709{
710#if defined(__EVS_CODEC_SUPPORT__)
711 kal_uint32 rf_flag, rf_offset, rf_type;
712 *CA_RF_Flag = 0;
713 *CA_RF_Offset = 0;
714
715 if (codec==SP4G_CODEC_EVS_16K_013_2 || codec==SP4G_CODEC_EVS_32K_013_2) // EVS 13.2
716 {
717 rf_flag = SP4G_Get_Bit_Value(frame_pt, offset, 5);
718 rf_offset = SP4G_Get_Bit_Value(frame_pt, offset + 259, 2);
719 rf_type = SP4G_Get_Bit_Value(frame_pt, offset + 261, 3);
720 //FPRINT_04("VoLTE JBM Get_Payload_Info: rf_flag: %d, rf_offset: %d, rf_type: %d\n", rf_flag, rf_offset, rf_type);
721 if (rf_flag >=21 && rf_flag <=28 && rf_type != 0)
722 {
723 *CA_RF_Flag = 1;
724 if (rf_offset == 0)
725 *CA_RF_Offset = 2;
726 else if (rf_offset == 1)
727 *CA_RF_Offset = 3;
728 else if (rf_offset == 2)
729 *CA_RF_Offset = 5;
730 else if (rf_offset == 3)
731 *CA_RF_Offset = 7;
732 else
733 *CA_RF_Offset = 0;
734 }
735 return KAL_TRUE;
736 }
737
738 return KAL_FALSE;
739#else //#if defined(__EVS_CODEC_SUPPORT__)
740 return KAL_FALSE;
741#endif //#if defined(__EVS_CODEC_SUPPORT__)
742}
743
744kal_uint32 SP4G_Get_Bit_Value(kal_uint8* frame_pt, kal_uint32 offset, kal_uint8 size)
745{
746 kal_uint8 index, bit_offset, data;
747 kal_uint32 ret = 0;
748 kal_uint8 bits;
749
750 if (size >32)
751 {
752 return 0;
753 }
754 bits = sizeof(kal_uint8)*8;
755 index = offset/bits;
756 bit_offset = bits - 1 - offset%bits;
757 for (; size>0; size--)
758 {
759 ret = ret << 1;
760 data = frame_pt[index];
761 if (((data >> bit_offset) & 0x1) == 1)
762 {
763 ret++;
764 }
765 if (bit_offset == 0)
766 {
767 bit_offset = bits - 1;
768 index++;
769 }
770 else
771 {
772 bit_offset--;
773 }
774 }
775 return ret;
776}
777
778void SP4G_PSR_UL_EVS_GetSpeechFrame(SP4G_Codec *frame_type, kal_uint8 *encodebits, kal_uint32 *bitlen, VoLTE_JBM_TS_Info_t *JBM_info)
779{
780#if defined(__EVS_CODEC_SUPPORT__)
781 //kal_prompt_trace(MOD_L1SP, "SP4G_PSR_UL_EVS_GetSpeechFrame");
782 MD_TRC_SPPS_PSR_UL_EVS_GETSPEECHFRAME();
783
784 kal_take_enh_mutex( sp_handover_mutex );
785
786 sp_ps_codec_evs_UL_GetSpeechFrame(frame_type, encodebits, (kal_int32 *) bitlen);
787
788 kal_give_enh_mutex( sp_handover_mutex );
789
790 // SP_updateEmCodec(true, *frame_type, false, 0);
791#else //#if defined(__EVS_CODEC_SUPPORT__)
792 *frame_type = SP4G_CODEC_EVS_32K_000_0_NODATA;
793 *bitlen = 0;
794#endif //#if defined(__EVS_CODEC_SUPPORT__)
795}
796
797
798void SP4G_PSR_DL_EVS_PutSpeechFrame(kal_uint32 CFN, SP4G_Codec frame_type, kal_uint8 *encodebits, EVS_DEC_CA_PARAMETER *pEVS_Dec_CA_Par, kal_bool crc_status, VoLTE_JBM_TS_Info_t *JBM_info)
799{
800 kal_take_enh_mutex( sp_handover_mutex );
801 if( (VoLTE_JBM_TS_Info_t *)NULL == JBM_info )
802 {
803 JBM_info = &JBM_info_local;
804 }
805 sp_ps_codec_evs_DL_PutSpeechFrame(CFN, frame_type, encodebits, pEVS_Dec_CA_Par, crc_status, JBM_info);
806 kal_give_enh_mutex( sp_handover_mutex );
807}
808
809
810void sp4g_hisr_dl(void *data)
811{
812 uint8 ul_codec_mode_local;
813
814 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
815
816 ASSERT(spPS != (SPPS_Struct_t*) 0);
817
818 ul_codec_mode_local = spPS->ul_codec_mode;
819
820 if( (L1SP_GetState() != L1SP_STATE_4G_SPEECH_ON) || (sp_ps_codec_g_is_g_codec(ul_codec_mode_local)) )
821 {
822 MD_TRC_SPPS_DL_HISR_SKIP(L1SP_GetState(), sp_ps_codec_g_is_g_codec(ul_codec_mode_local));
823 kal_give_spinlock(spinlock_sp4g);
824 return;
825 }
826 kal_give_spinlock(spinlock_sp4g);
827
828
829#if defined(__EVS_CODEC_SUPPORT__)
830 if(sp_ps_codec_evs_is_EVS_codec(ul_codec_mode_local))
831 {
832 sp_ps_codec_evs_hisr_dl_EVS(data);
833 }
834 else
835#endif //#if defined(__EVS_CODEC_SUPPORT__)
836 {
837 sp_ps_codec_amr_hisr_dl_amr(data);
838 }
839}
840
841void SP4G_Reset( void )
842{
843 spPS_reset_flag = 1;
844}
845
846
847kal_bool spPS_IsDTXOn(void)
848{
849 return spPS_dtx_mode;
850}
851
852
853kal_bool SP4G_IsDTXOn(void)
854{
855 return( spPS_IsDTXOn() );
856}
857
858
859void SP4G_SetDTX(kal_bool on)
860{
861 spPS_dtx_mode = on;
862 MD_TRC_SPPS_SET_DTX(on);
863 if( L1SP_GetState() == L1SP_STATE_4G_SPEECH_ON )
864 {
865 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
866
867 SAL_3G_SetDtx(on);
868
869 kal_give_spinlock(spinlock_sp4g);
870 }
871}
872
873
874void SP4G_PSR_SetDTX(kal_bool on)
875{
876 SP4G_SetDTX(on);
877}
878
879
880void SP4G_SetRxTypeToNoData( void )
881{
882 //SAL_3G_Set_RxType(SAL_3G_RX_NO_DATA);
883 SAL_4G_Set_RxType(SAL_3G_RX_NO_DATA, SAL_3G_RX_NO_DATA);
884}
885
886
887kal_uint32 SP4G_JBM_GetDLVADFlag()
888{
889 return SAL_GetDLVADFlag();
890}
891
892
893void sp4g_hisr_ul(void *data)
894{
895 uint8 ul_codec_mode_local;
896
897 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
898
899 ASSERT(spPS != (SPPS_Struct_t*) 0);
900
901 ul_codec_mode_local = spPS->ul_codec_mode;
902
903 if( (L1SP_GetState() != L1SP_STATE_4G_SPEECH_ON) || (sp_ps_codec_g_is_g_codec(ul_codec_mode_local)) )
904 {
905 MD_TRC_SPPS_UL_HISR_SKIP(L1SP_GetState(), sp_ps_codec_g_is_g_codec(ul_codec_mode_local));
906 kal_give_spinlock(spinlock_sp4g);
907 return;
908 }
909 kal_give_spinlock(spinlock_sp4g);
910
911
912#if defined(__EVS_CODEC_SUPPORT__)
913 if(sp_ps_codec_evs_is_EVS_codec(ul_codec_mode_local))
914 {
915 sp_ps_codec_evs_hisr_ul_EVS(data);
916 }
917 else
918#endif //#if defined(__EVS_CODEC_SUPPORT__)
919 {
920 sp_ps_codec_amr_hisr_ul_amr(data);
921 }
922
923#if defined(__SP_4G_OPT_TONE_DETECTION__)
924 /**************************/
925 // Execute Tone Detection
926 /**************************/
927 L1Audio_SetEvent( sp_ps_dsp_opt_ToneDeteGetAudID(), (void *)0 );
928#endif //#if defined(__SP_4G_OPT_TONE_DETECTION__)
929}
930
931
932void sp_ps_reset_internal( void )
933{
934 // DL side(G-series)
935//#if defined(__G_CODEC_SUPPORT__)
936 if(sp_ps_codec_g_is_g_codec(spPS->ul_codec_mode)){
937 sp_ps_codec_g_reset_internal();
938 spPS_reset_flag = 2;
939 }else
940//#endif //#if defined(__G_CODEC_SUPPORT__)
941 {
942#if defined(__EVS_CODEC_SUPPORT__)
943 if(sp_ps_codec_evs_is_EVS_codec(spPS->ul_codec_mode)) {
944 sp_ps_codec_evs_reset_internal();
945 spPS_reset_flag = 0;
946 }else
947#endif //#if defined(__EVS_CODEC_SUPPORT__)
948 {
949 sp_ps_codec_amr_reset_internal();
950 spPS_reset_flag = 0; // clear reset flag, wait it to be 2
951 }
952 spPS->ul_waiting = KAL_FALSE;
953 spPS->dl_waiting = KAL_FALSE;
954 }
955}
956
957
958void sp4g_init( void )
959{
960 int i;
961
962 spPS_rab_id = 0;
963 for(i=0; i<SPPS_RAB_ID_MAX; i++)
964 {
965 spPS_rab_id_record[i] = 0;
966 }
967 spPS_rab_state = KAL_FALSE;
968 spPS_fake_EVS_IO = 0;
969 spPS_dtx_mode = 1;
970
971 spPS_RadioType = SP_PS_RADIO_TYPE_UNKNOWN;
972
973 JBM_info_local.TS_Switch = 0;
974 JBM_info_local.TS_HB_Frm_Num = 1;
975 JBM_info_local.TS_Frm_ID = 1;
976 JBM_info_local.TS_isRemainFrame = 0;
977 JBM_info_local.TS_Scale = 100;
978 JBM_info_local.TS_Max_Scale = 0;
979 JBM_info_local.TS_JBM_Reset_Flag = 0;
980 JBM_info_local.TS_DSP_Reset_Flag = 0;
981 JBM_info_local.TS_Remain_Length_ms = 0;
982 JBM_info_local.TS_Total_Length_ms = 0;
983 //JBM_info_local.TS_Reserve[JBM_TS_RESERVE];
984 JBM_info_local.Nodata_Type = JBM_NODATA_NORMAL;
985
986#if defined(__EVS_CODEC_SUPPORT__)
987 sp_ps_codec_evs_init();
988#endif //#if defined(__EVS_CODEC_SUPPORT__)
989
990#if defined(__SP4G_UL_RESYNC__)
991 sp_ps_aam_init();
992#endif
993
994 spPS = &stSPPS;
995 spinlock_sp4g = kal_create_spinlock("SP4GSL");
996}
997
998
999void sp4g_speech_init(uint8 RAT_Mode)
1000{
1001 ASSERT( RAT_Mode == RAT_4G_MODE );
1002 ASSERT( L1SP_GetState() == L1SP_STATE_IDLE );
1003
1004 memset(spPS, 0, sizeof(SPPS_Struct_t));
1005 spPS->sp4g_mode = RAT_Mode;
1006 // UL side
1007 spPS->ul_waiting = KAL_FALSE;
1008 spPS->dl_waiting = KAL_FALSE;
1009 spPS->ul_write_idx = 0;
1010 spPS->ul_read_idx = 0;
1011 spPS->ul_count = 0;
1012 spPS->is_getting_ul_data = KAL_FALSE;
1013 spPS->ul_delay = 0;
1014 spPS->dl_delay = 0;
1015 spPS->pre_ul_report = spPS->pre_dl_report = spPS->ul_report = spPS->dl_report = spPS_est_codec_mode;//INIT_CODEC;
1016 MD_TRC_SPPS_DEBUG_SPPS_SPEECH_INIT(spPS_est_codec_mode);
1017 if( spPS->sp4g_mode == RAT_4G_MODE )
1018 {
1019 spPS->ul_buffer_size = RAT_4G_UL_BUFFER_NUM;
1020 }
1021
1022#if defined(UL_HARD_REAL_TIME_DEMAND)
1023 spPS->ul_buffer_size = HARD_REAL_TIME_UL_BUFFER_NUM;
1024#endif
1025
1026 spPS->ul_codec_mode = spPS_est_codec_mode;//INIT_CODEC;// use 12.20kbps rate initially
1027
1028 spPS->ul_refresh = KAL_FALSE; // detect change codec_mode
1029 spPS->ul_intrarat = KAL_FALSE;
1030
1031 // DL side
1032 spPS->dl_count = 0;
1033 spPS->dl_write_idx = 0;
1034 spPS->dl_read_idx = 0;
1035
1036 if( spPS->sp4g_mode == RAT_4G_MODE ){
1037 MD_TRC_SPPS_PP5_SP4G_RESET_FLAG_INFO(spPS_reset_flag, spPS->dl_count, spPS->dl_read_idx, spPS->dl_write_idx, spPS->dl_buffer_size);
1038 MD_TRC_SPPS_PP5_1(RAT_4G_DL_BUFFER_NUM_BEFORE_RESYNC);
1039 spPS->dl_buffer_size = RAT_4G_DL_BUFFER_NUM_BEFORE_RESYNC;
1040 spPS->dl_buffer_size = 2;
1041 MD_TRC_SPPS_PP6_SP4G_RESET_FLAG_INFO(spPS_reset_flag, spPS->dl_count, spPS->dl_read_idx, spPS->dl_write_idx, spPS->dl_buffer_size);
1042 spPS_reset_flag = 1;
1043 }
1044 else{ // 4G324M
1045 spPS->dl_buffer_size = MAX_DL_BUFFER_NUM;
1046 spPS_reset_flag = 2;
1047 }
1048
1049#if defined(__SP4G_UL_RESYNC__)
1050 spPS->time[SP_PSCALL_EMAC][0] = spPS->time[SP_PSCALL_EMAC][1] = spPS->time[SP_PSCALL_EMAC][2] = 0;
1051 spPS->time[SP_PSCALL_NMAC][0] = spPS->time[SP_PSCALL_NMAC][1] = spPS->time[SP_PSCALL_NMAC][2] = 0;
1052 spPS->request_resync = KAL_FALSE;
1053 spPS->time2nextULHISR[SP_PSCALL_EMAC] = spPS->time2nextULHISR[SP_PSCALL_NMAC] = 0; //unit: ms
1054#endif
1055
1056#if defined(__SP4G_UL_RESYNC__)
1057 sp_ps_aam_speech_init();
1058#endif
1059
1060 sp_ps_aam_speech_init_SilenceDetection();
1061
1062#if defined(SP4G_UNIT_TEST)
1063 L1Audio_HookHisrHandler(DP_D2C_4G,(L1Audio_EventHandler)sp4g_hisr_2, 0);
1064#else
1065 L1Audio_HookHisrHandler(DP_D2C_4G_AMR_DONE_UL,(L1Audio_EventHandler)sp4g_hisr_ul, 0);
1066 L1Audio_HookHisrHandler(DP_D2C_4G_AMR_DONE_DL,(L1Audio_EventHandler)sp4g_hisr_dl, 0);
1067#endif
1068
1069#if defined(__SP4G_UL_RESYNC__)
1070 L1Audio_HookHisrHandler(DP_D2C_4G_AAM,(L1Audio_EventHandler)sp_ps_AAM_hisr, 0);
1071#endif
1072
1073#ifdef __SP_PS_AAM_PLUS__
1074 L1Audio_HookHisrHandler(DP_D2C_4G_AAMPLUS,(L1Audio_EventHandler)sp_ps_AAMPlus_notify_EMAC, 0);//fix
1075#endif //#ifdef __SP_PS_AAM_PLUS__
1076
1077
1078//#if defined(__G_CODEC_SUPPORT__)
1079 sp_ps_codec_g_speech_init();
1080//#endif//#if defined(__G_CODEC_SUPPORT__)
1081
1082#if defined(__EVS_CODEC_SUPPORT__)
1083 sp_ps_codec_evs_speech_init();
1084#endif //#if defined(__EVS_CODEC_SUPPORT__)
1085
1086#if defined(__SP_4G_OPT_TONE_DETECTION__)
1087 sp_ps_dsp_opt_ToneDeteInit();
1088 sp_ps_dsp_opt_ToneDeteTaskInit();
1089#endif //#if defined(__SP_4G_OPT_TONE_DETECTION__)
1090
1091 spPS->l1_info_idx = 0;
1092 spPS->dtx_state = 0;
1093
1094#ifdef __SP_PS_AAM_PLUS__
1095 sp_ps_AAMPlus_enable();
1096#endif //#ifdef __SP_PS_AAM_PLUS__
1097
1098}
1099
1100SP_PSCALL_L2_MODE SP4G_GetL2Mode()
1101{
1102 return spPS->sph_l2_mode;
1103}
1104//#if defined(__G_CODEC_SUPPORT__)
1105void GSeries_Encode_Init(SP4G_Codec codec_)
1106{
1107 sp_ps_codec_g_Encode_Init(codec_);
1108}
1109
1110
1111void GSeries_Encode_DeInit()
1112{
1113
1114}
1115
1116
1117void GSeries_Decode_Init(SP4G_Codec codec_)
1118{
1119 sp_ps_codec_g_Decode_Init(codec_);
1120}
1121
1122
1123void GSeries_Decode_DeInit()
1124{
1125
1126}
1127
1128
1129void sp4g_speech_close( void )
1130{
1131 L1Audio_UnhookHisrHandler(DP_D2C_4G_AMR_DONE_DL);
1132 L1Audio_UnhookHisrHandler(DP_D2C_4G_AMR_DONE_UL);
1133 L1Audio_UnhookHisrHandler(DP_D2C_4G_AAM);
1134#ifdef __SP_PS_AAM_PLUS__
1135 L1Audio_UnhookHisrHandler(DP_D2C_4G_AAMPLUS);
1136#endif //#ifdef __SP_PS_AAM_PLUS__
1137
1138 sp_ps_codec_g_close();
1139
1140#if defined(__SP_4G_OPT_TONE_DETECTION__)
1141 sp_ps_dsp_opt_ToneDeteClose();
1142#endif //#if defined(__SP_4G_OPT_TONE_DETECTION__)
1143
1144#ifdef __SP_PS_AAM_PLUS__
1145 sp_ps_AAMPlus_disable();
1146#endif //#ifdef __SP_PS_AAM_PLUS__
1147}
1148
1149
1150kal_uint16 SP4G_PSR_GetCodecBitLength(SP4G_Codec codec) // function call
1151{
1152 int len = 0/*, I*/;
1153
1154 if(sp_ps_codec_g_is_g_codec(codec)){
1155 if(codec == SP4G_CODEC_G711)
1156 {
1157 kal_uint16 G711_codec_bitlength = 80*8;
1158 return G711_codec_bitlength;
1159 }
1160 ASSERT(false);//FIX ME
1161 }else if(GET_IS_SP4G_CODEC_ENUM_EVS_ID(codec)){
1162 #if defined(__EVS_CODEC_SUPPORT__)
1163 return( sp_ps_codec_evs_GetCodecBitLength(codec) );
1164 #else //#if defined(__EVS_CODEC_SUPPORT__)
1165 ASSERT(false);//FIX ME
1166 #endif //#if defined(__EVS_CODEC_SUPPORT__)
1167 }else{//AMR, WB-AMR
1168 return( sp_ps_codec_amr_GetCodecBitLength(codec) );
1169 }
1170 return len;
1171}
1172
1173
1174void SP4G_UL_SetFrameType(uint8 amr_frame_type) // function call
1175{
1176 uint8 state;
1177 uint32 codec;
1178 spPS_est_codec_mode = sp_ps_codec_amr_Get_AmrFrameType2DspMode_spps(amr_frame_type);//AmrFrameType2DspMode_spps[amr_frame_type];
1179
1180 if( (state = L1SP_GetState()) != L1SP_STATE_4G_SPEECH_ON){
1181 return;
1182 }
1183
1184 ASSERT(spPS != (SPPS_Struct_t*) 0);
1185
1186 MD_TRC_SPPS_REQUEST_UL_FRAME_TYPE(amr_frame_type, amr_frame_type);
1187 codec = sp_ps_codec_amr_Get_AmrFrameType2DspMode_spps(amr_frame_type);//AmrFrameType2DspMode_spps[amr_frame_type];
1188 if( (sp_ps_codec_g_is_g_codec(spPS->ul_codec_mode)==true) || (sp_ps_codec_evs_is_EVS_codec(spPS->ul_codec_mode)==true) )
1189 {
1190 uint32 resetType = PS_SRST_TYPE_HO_WITHOUT_VBIEND;
1191 if( sp_ps_codec_g_is_g_codec(spPS->ul_codec_mode) == true )
1192 {
1193 resetType = PS_SRST_TYPE_HO_WITH_VBIEND;
1194 }
1195 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1196 spPS->ul_codec_mode = codec;
1197 kal_give_spinlock(spinlock_sp4g);
1198 AM_4G_INTRARAT(codec, resetType);
1199 //may add at 3G
1200 //spPS->ul_intrarat = KAL_TRUE;
1201 SP4G_Reset();
1202 MD_TRC_SPPS_SETCODEC_SETFRAMETYPE1(spPS->ul_codec_mode, spPS->ul_codec_mode, codec, amr_frame_type, amr_frame_type, spPS->ul_intrarat);
1203 //L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
1204 }else if( (spPS->ul_codec_mode >= 0x20 && codec <= 0x0A) || (spPS->ul_codec_mode <= 0x0A && codec >= 0x20) ){//Intrarat
1205 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1206 spPS->ul_codec_mode = codec;
1207 kal_give_spinlock(spinlock_sp4g);
1208 AM_4G_INTRARAT(codec, PS_SRST_TYPE_HO_WITHOUT_VBIEND);
1209 //may add at 3G
1210 spPS->ul_intrarat = KAL_TRUE;
1211 SP4G_Reset();
1212 MD_TRC_SPPS_SETCODEC_SETFRAMETYPE2(spPS->ul_codec_mode, codec, amr_frame_type, amr_frame_type, spPS->ul_intrarat);
1213 //L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
1214 }else{
1215 if(spPS->ul_codec_mode != codec){
1216 MD_TRC_SPPS_SETCODEC_SETFRAMETYPE3(spPS->ul_codec_mode, codec,amr_frame_type, amr_frame_type, spPS->ul_intrarat);
1217 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1218 spPS->ul_codec_mode = codec;
1219 spPS->ul_refresh = KAL_TRUE;
1220 kal_give_spinlock(spinlock_sp4g);
1221 }
1222 }
1223}
1224
1225
1226void SP4G_PSR_UL_SetFrameType(SP4G_Codec codec)
1227{
1228#if defined(__USE_EVS_IO_REPLACE_AWB__)
1229 kal_bool retval;
1230 kal_uint8 new_SP4G_Codec;
1231#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
1232
1233 kal_take_enh_mutex( sp_handover_mutex );
1234
1235 MD_TRC_SPPS_SETCODEC0(codec, codec);
1236
1237 MD_TRC_SPPS_PSR_UL_SETFRAMETYPE1(codec, L1SP_GetState(), sp_ps_codec_g_is_g_codec(codec), sp_ps_codec_evs_is_EVS_codec(codec));
1238
1239#if defined(__USE_EVS_IO_REPLACE_AWB__)
1240 if( UseEVSIO2ReplaceAWB() )
1241 {
1242 MD_TRC_SPPS_SETCODEC_USE_EVS_IO_REPLACE_AWB_IN(codec);
1243 retval = convert_AWB_to_EVSIOEnum( codec, (SP4G_Codec*)&new_SP4G_Codec );
1244 if(retval == KAL_TRUE) {
1245 spPS_fake_EVS_IO = 1;
1246 }
1247 else {
1248 spPS_fake_EVS_IO = 0;
1249 }
1250 codec = new_SP4G_Codec;
1251 MD_TRC_SPPS_SETCODEC_USE_EVS_IO_REPLACE_AWB_OUT(codec);
1252 }
1253 else
1254 {
1255 spPS_fake_EVS_IO = 0;
1256 }
1257#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
1258
1259 spPS_est_codec_mode = codec;
1260 if( (sp_ps_codec_g_is_g_codec(spPS_est_codec_mode)==false) && (sp_ps_codec_evs_is_EVS_codec(spPS_est_codec_mode)==false) ){
1261 spPS_est_codec_mode = sp_ps_codec_amr_Get_AmrFrameType2DspMode_spps(spPS_est_codec_mode);//GetFrameType2DspMode(spPS_est_codec_mode);
1262 }
1263
1264 if( L1SP_GetState() != L1SP_STATE_4G_SPEECH_ON){
1265 if( 1/*L1SP_STATE_IDLE == L1SP_GetState()*/ ){
1266 if( spPS != (SPPS_Struct_t *)NULL ){
1267 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1268 spPS->ul_codec_mode = spPS_est_codec_mode;//default_speech_codec;
1269 kal_give_spinlock(spinlock_sp4g);
1270 }
1271 MD_TRC_SPPS_SETCODEC(codec, codec, spPS_est_codec_mode);
1272 }
1273 kal_give_enh_mutex( sp_handover_mutex );
1274 return;
1275 }
1276
1277 if(sp_ps_codec_g_is_g_codec(codec)){
1278 if(codec == spPS->ul_codec_mode){
1279 MD_TRC_SPPS_SETCODEC_IS_EQUAL(codec, codec);
1280 //return;
1281 }
1282 else{
1283 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1284 spPS->ul_codec_mode = codec;
1285 kal_give_spinlock(spinlock_sp4g);
1286 AM_4G_INTRARAT(codec, PS_SRST_TYPE_HO_WITH_VBIEND);
1287 SP4G_Reset();
1288 }
1289 }else if(sp_ps_codec_evs_is_EVS_codec(codec)){
1290 if( /*sp_ps_codec_evs_is_EVS_codec(codec) ==*/ sp_ps_codec_evs_is_EVS_codec(spPS->ul_codec_mode) ){
1291 if( GET_SP4G_CODEC_ENUM_NON_EVS_ID(codec) != GET_SP4G_CODEC_ENUM_NON_EVS_ID(spPS->ul_codec_mode) )
1292 {
1293 sp_ps_codec_evs_set_network_bw(codec);
1294 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1295 spPS->ul_codec_mode = codec;
1296 kal_give_spinlock(spinlock_sp4g);
1297 AM_4G_INTRARAT(codec, PS_SRST_TYPE_HO_WITHOUT_VBIEND);
1298 SP4G_Reset();
1299 }
1300 else if( codec != (spPS->ul_codec_mode) )
1301 {
1302 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1303 spPS->ul_codec_mode = codec;
1304 kal_give_spinlock(spinlock_sp4g);
1305 }
1306 }
1307 else
1308 {
1309 uint32 reset_type = PS_SRST_TYPE_HO_WITHOUT_VBIEND;
1310 if( sp_ps_codec_g_is_g_codec(spPS->ul_codec_mode) == true )
1311 {
1312 reset_type = PS_SRST_TYPE_HO_WITH_VBIEND;
1313 }
1314 kal_take_spinlock(spinlock_sp4g, KAL_INFINITE_WAIT);
1315 spPS->ul_codec_mode = codec;
1316 kal_give_spinlock(spinlock_sp4g);
1317 AM_4G_INTRARAT(codec, reset_type);
1318 SP4G_Reset();
1319 }
1320 }else{
1321 SP4G_UL_SetFrameType(codec);
1322 }
1323
1324 kal_give_enh_mutex( sp_handover_mutex );
1325}
1326
1327
1328void SP4G_PSR_UL_AMR_GetSpeechFrame(SP4G_Codec *frame_type, kal_uint8 *encodebits, kal_uint8 *bitlen, VoLTE_JBM_TS_Info_t *JBM_info)
1329{
1330 kal_take_enh_mutex( sp_handover_mutex );
1331
1332#if defined(__USE_EVS_IO_REPLACE_AWB__)
1333 if(spPS_fake_EVS_IO == 0) {
1334#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
1335 sp_ps_codec_amr_UL_GetSpeechFrame(frame_type, encodebits, bitlen);
1336 // SP_updateEmCodec(true, convert_SP4G_CODEC_AMR_AMRWB_to_SPH_CODEC((*frame_type)), false, 0);
1337#if defined(__USE_EVS_IO_REPLACE_AWB__)
1338 } else {
1339 kal_bool retval;
1340 SP4G_Codec EVSIO_frame_type;
1341 kal_uint32 u32bitlen;
1342 uint8 EVS_codec_rate = 0;
1343
1344 //MD_TRC_SPPS_UL_GETSPEECHFRAME_USE_EVS_IO_REPLACE_AWB();
1345
1346 {
1347#if defined(__EVS_CODEC_SUPPORT__)
1348 sp_ps_codec_evs_UL_GetSpeechFrame(&EVSIO_frame_type, encodebits, (kal_int32 *)&u32bitlen);
1349#else //#if defined(__EVS_CODEC_SUPPORT__)
1350 *frame_type = SP4G_CODEC_EVS_32K_000_0_NODATA;
1351 *bitlen = 0;
1352#endif //#if defined(__EVS_CODEC_SUPPORT__)
1353 }
1354
1355 EVS_codec_rate = GET_SP4G_CODEC_ENUM_EVS_RATE(EVSIO_frame_type);
1356 *bitlen = (kal_uint8)sp_ps_codec_evs_Get_EVS_AWB_RAB_subflow(EVS_codec_rate, 3);//EVS_AWB_RAB_subflow[EVS_codec_rate][3];
1357 MD_TRC_SPPS_UL_GETSPEECHFRAME_USE_EVS_IO_REPLACE_AWB_LEN(u32bitlen, *bitlen);
1358
1359 retval = convert_EVSIO_to_AWBEnum(EVSIO_frame_type, frame_type);
1360 if(retval == KAL_FALSE) {
1361 *frame_type = AMR_NO_DATA;
1362 *bitlen = 0;
1363 }
1364 }
1365#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
1366
1367 kal_give_enh_mutex( sp_handover_mutex );
1368}
1369
1370
1371void SP4G_PSR_DL_AMR_PutSpeechFrame(kal_uint32 CFN, SP4G_PSR_Codec codec, SP4G_Codec frame_type, kal_bool crc_status, kal_uint8 *encodebits, VoLTE_JBM_TS_Info_t *JBM_info)
1372{
1373 kal_take_enh_mutex( sp_handover_mutex );
1374
1375 if( (VoLTE_JBM_TS_Info_t *)NULL == JBM_info )
1376 {
1377 JBM_info = &JBM_info_local;
1378 }
1379
1380#if defined(__USE_EVS_IO_REPLACE_AWB__)
1381 if(spPS_fake_EVS_IO == 0) {
1382#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
1383 sp_ps_codec_amr_DL_PutSpeechFrame(CFN, codec, frame_type, encodebits, crc_status, JBM_info);
1384#if defined(__USE_EVS_IO_REPLACE_AWB__)
1385 } else {
1386 kal_bool retval;
1387 SP4G_Codec EVSIO_frame_type;
1388
1389 //MD_TRC_SPPS_DL_PUTSPEECHFRAME_USE_EVS_IO_REPLACE_AWB();
1390
1391 retval = convert_AWB_to_EVSIOEnum(frame_type, &EVSIO_frame_type);
1392 if(retval == KAL_FALSE) {
1393 EVSIO_frame_type = SP4G_CODEC_EVS_AWB_00_00_NODATA;
1394 }
1395
1396 sp_ps_codec_evs_DL_PutSpeechFrame(CFN, EVSIO_frame_type, encodebits, (EVS_DEC_CA_PARAMETER*)NULL, crc_status, JBM_info);
1397 }
1398#endif //#if defined(__USE_EVS_IO_REPLACE_AWB__)
1399
1400 kal_give_enh_mutex( sp_handover_mutex );
1401}
1402
1403
1404//=====================================
1405// Fake 4G llopbck
1406//=====================================
1407kal_uint32 get_is_fake_4g(void);
1408kal_uint32 encodebits_buf[1000];
1409kal_uint8 encodebits[128];
1410
1411SP4G_Codec pscall_loopback_frame_type;
1412kal_uint32 pscall_loopback_bitlen;
1413kal_uint8 pscall_loopback_uint8_bitlen;
1414
1415void sp4g_EVS_loopback_ul(void)
1416{
1417#if defined(__EVS_CODEC_SUPPORT__)
1418 kal_uint8 *encodebits = (kal_uint8 *)encodebits_buf;
1419 MD_TRC_SPPS_PSR_EVS_LOOPBACK_UL_1();
1420 if( sp_ps_codec_evs_is_EVS_codec(spPS->ul_codec_mode) )
1421 {
1422 SP4G_PSR_UL_EVS_GetSpeechFrame(&pscall_loopback_frame_type, encodebits, &pscall_loopback_bitlen, (VoLTE_JBM_TS_Info_t *)NULL);
1423 {
1424 l1sp_emac_resync_info_struct *local_para;
1425 local_para = (l1sp_emac_resync_info_struct *) construct_local_para( sizeof(l1sp_emac_resync_info_struct), TD_CTRL );
1426 local_para->RX_period = 0;
1427 local_para->TX_period = 20;
1428 local_para->time2nextRX = 0;
1429 local_para->time2nextTX = 7;
1430 local_para->issueTime = ust_get_current_time();
1431
1432 msg_send6(MOD_EMAC, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_VOLTE_MAC_TIMING_INFO, (local_para_struct *)local_para, NULL);
1433 }
1434 MD_TRC_SPPS_PSR_EVS_LOOPBACK_UL_2(pscall_loopback_frame_type, pscall_loopback_bitlen);
1435 }
1436#endif //#if 0
1437}
1438
1439void sp4g_EVS_loopback_dl(void)
1440{
1441#if defined(__EVS_CODEC_SUPPORT__)
1442 kal_uint8 *encodebits = (kal_uint8 *)encodebits_buf;
1443 EVS_DEC_CA_PARAMETER EVS_Dec_CA_Par;
1444 EVS_DEC_CA_PARAMETER *pEVS_Dec_CA_Par = &EVS_Dec_CA_Par;
1445
1446 EVS_Dec_CA_Par.FrameMode = FRAMEMODE_NORMAL;
1447 MD_TRC_SPPS_PSR_EVS_LOOPBACK_DL_1();
1448 if( sp_ps_codec_evs_is_EVS_codec(spPS->ul_codec_mode) )
1449 {
1450 MD_TRC_SPPS_PSR_EVS_LOOPBACK_DL_2(pscall_loopback_frame_type, pscall_loopback_bitlen);
1451 //SP4G_PSR_UL_EVS_GetSpeechFrame(&frame_type, encodebits, &bitlen, (VoLTE_JBM_TS_Info_t *)NULL);
1452 if(pscall_loopback_bitlen == 0)
1453 {
1454 SP4G_PSR_DL_EVS_PutSpeechFrame(0, pscall_loopback_frame_type, NULL, pEVS_Dec_CA_Par, KAL_TRUE, (VoLTE_JBM_TS_Info_t *)NULL);
1455 }
1456 else
1457 {
1458 SP4G_PSR_DL_EVS_PutSpeechFrame(0, pscall_loopback_frame_type, encodebits, pEVS_Dec_CA_Par, KAL_TRUE, (VoLTE_JBM_TS_Info_t *)NULL);
1459 }
1460 }
1461#endif //#if 0
1462}
1463
1464
1465void sp4g_EVS_loopback_SetEVSEncCAPara(void)
1466{
1467#if defined(__EVS_CODEC_SUPPORT__)
1468 EVS_ENC_CA_PARAMETER EVS_CA_Par;
1469
1470 EVS_CA_Par.enable = 0;
1471 EVS_CA_Par.rf_fec_indicator = 0;
1472 EVS_CA_Par.rf_fec_offset = 0;
1473 EVS_CA_Par.rev3 = 0;
1474 EVS_CA_Par.rev4 = 0;
1475 EVS_CA_Par.rev5 = 0;
1476
1477 SP4G_PSR_SetEVSEncCAPara(&EVS_CA_Par);
1478#endif //#if defined(__EVS_CODEC_SUPPORT__)
1479}
1480
1481
1482void sp4g_AMR_NB_loopback_ul(void)
1483{
1484 SP4G_PSR_UL_AMR_GetSpeechFrame(&pscall_loopback_frame_type, encodebits, &pscall_loopback_uint8_bitlen, (VoLTE_JBM_TS_Info_t *)NULL);
1485}
1486
1487void sp4g_AMR_NB_loopback_dl(void)
1488{
1489 if( (pscall_loopback_frame_type >= SP4G_CODEC_WBAMR_6_6) && (pscall_loopback_frame_type <= SP4G_CODEC_WBAMR_SID) )
1490 {
1491 return;
1492 }
1493
1494 if( (pscall_loopback_frame_type==SP4G_CODEC_AMR_NO_DATA) || (pscall_loopback_frame_type==SP4G_CODEC_LOST_FRAME) )
1495 {
1496 SP4G_PSR_DL_AMR_PutSpeechFrame(0, SP4G_PSR_AMR, pscall_loopback_frame_type, KAL_TRUE, NULL, (VoLTE_JBM_TS_Info_t *)NULL);
1497 }
1498 else
1499 {
1500 SP4G_PSR_DL_AMR_PutSpeechFrame(0, SP4G_PSR_AMR, pscall_loopback_frame_type, KAL_TRUE, encodebits, (VoLTE_JBM_TS_Info_t *)NULL);
1501 }
1502}
1503
1504void sp4g_AMR_WB_loopback_ul(void)
1505{
1506 SP4G_PSR_UL_AMR_GetSpeechFrame(&pscall_loopback_frame_type, encodebits, &pscall_loopback_uint8_bitlen, (VoLTE_JBM_TS_Info_t *)NULL);
1507}
1508
1509void sp4g_AMR_WB_loopback_dl(void)
1510{
1511 if( pscall_loopback_frame_type <= SP4G_CODEC_AMR_SID )
1512 {
1513 return;
1514 }
1515
1516 if( (pscall_loopback_frame_type==SP4G_CODEC_AMR_NO_DATA) || (pscall_loopback_frame_type==SP4G_CODEC_LOST_FRAME) )
1517 {
1518 SP4G_PSR_DL_AMR_PutSpeechFrame(0, SP4G_PSR_WBAMR, pscall_loopback_frame_type, KAL_TRUE, NULL, (VoLTE_JBM_TS_Info_t *)NULL);
1519 }
1520 else
1521 {
1522 SP4G_PSR_DL_AMR_PutSpeechFrame(0, SP4G_PSR_WBAMR, pscall_loopback_frame_type, KAL_TRUE, encodebits, (VoLTE_JBM_TS_Info_t *)NULL);
1523 }
1524}
1525
1526
1527void sp4g_G711_loopback(void)
1528{
1529 SP4G_Codec frame_type;
1530 kal_uint8 bitlen;
1531
1532 while(SP4G_PSR_UL_GSeries_IsMoreData())
1533 {
1534 MD_TRC_SPPS_PSR_G711_LOOPBACK(0);
1535 SP4G_PSR_UL_GSeries_GetSpeechFrame(&frame_type, encodebits, &bitlen);
1536 MD_TRC_SPPS_PSR_G711_LOOPBACK(1);
1537 SP4G_PSR_DL_GSeries_PutSpeechFrame(frame_type, encodebits, &bitlen);
1538 MD_TRC_SPPS_PSR_G711_LOOPBACK(2);
1539 }
1540}
1541
1542
1543void sp4g_fake_loopback_ul(void)
1544{
1545 uint8 local_ul_codec_mode = spPS->ul_codec_mode;
1546
1547 if( get_is_fake_4g() == 0 )
1548 {
1549 return;
1550 }
1551
1552#ifdef TEST_AAM
1553 if(KAL_TRUE == SPPS_is_trigger_mac_notify)
1554 {
1555 if(0 == test_aam_resync)
1556 {
1557 SP4G_Set_AAM_Info(40, 20, 30, 5);
1558 }
1559 else
1560 {
1561 SP4G_Set_AAM_Info(40, 20, 30, 15);
1562 test_aam_resync = 0;
1563 }
1564 }
1565#endif //#ifdef TEST_AAM
1566
1567 //EVS
1568 if( sp_ps_codec_evs_is_EVS_codec(local_ul_codec_mode) )
1569 {
1570 sp4g_EVS_loopback_ul();
1571 }
1572 //G series
1573 else if( sp_ps_codec_g_is_g_codec(local_ul_codec_mode) )
1574 {
1575 sp4g_G711_loopback();
1576 }
1577 //AMR-NB
1578 else if( local_ul_codec_mode <= 0xA )
1579 {
1580 sp4g_AMR_NB_loopback_ul();
1581 }
1582 //AMR-WB
1583 else if( local_ul_codec_mode >= 0x20 )
1584 {
1585 sp4g_AMR_WB_loopback_dl();
1586 }
1587}
1588
1589void sp4g_fake_loopback_dl(void)
1590{
1591 uint8 local_ul_codec_mode = spPS->ul_codec_mode;
1592
1593 if( get_is_fake_4g() == 0 )
1594 {
1595 return;
1596 }
1597
1598#ifdef TEST_AAM
1599 if(KAL_TRUE == SPPS_is_trigger_mac_notify)
1600 {
1601 if(0 == test_aam_resync)
1602 {
1603 SP4G_Set_AAM_Info(40, 20, 30, 5);
1604 }
1605 else
1606 {
1607 SP4G_Set_AAM_Info(40, 20, 30, 15);
1608 test_aam_resync = 0;
1609 }
1610 }
1611#endif //#ifdef TEST_AAM
1612
1613 //EVS
1614 if( sp_ps_codec_evs_is_EVS_codec(local_ul_codec_mode) )
1615 {
1616 sp4g_EVS_loopback_dl();
1617 }
1618 //G series
1619 //else if( sp_ps_codec_g_is_g_codec(local_ul_codec_mode) )
1620 //{
1621 // sp4g_G711_loopback();
1622 //}
1623 //AMR-NB
1624 else if( local_ul_codec_mode <= 0xA )
1625 {
1626 sp4g_AMR_NB_loopback_dl();
1627 }
1628 //AMR-WB
1629 else if( local_ul_codec_mode >= 0x20 )
1630 {
1631 sp4g_AMR_WB_loopback_dl();
1632 }
1633}
1634
1635
1636
1637//#endif // __UMTS_RAT__
1638
1639
1640
1641