rjw | 6c1fd8f | 2022-11-30 14:33:01 +0800 | [diff] [blame^] | 1 | /***************************************************************************** |
| 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 | /***************************** |
| 183 | Definitions |
| 184 | *****************************/ |
| 185 | |
| 186 | |
| 187 | /***************************** |
| 188 | External variables |
| 189 | *****************************/ |
| 190 | extern kal_enhmutexid sp_handover_mutex;//sp_4g.c |
| 191 | |
| 192 | |
| 193 | /***************************** |
| 194 | External functions |
| 195 | *****************************/ |
| 196 | extern void CSR_Codec_Close(int rab_id); |
| 197 | extern void CSR_Codec_Ready(int rab_id); |
| 198 | extern kal_uint32 SP3G_Rab_Id( void ); |
| 199 | extern uint32 L1I_GetTimeStamp( void ); |
| 200 | extern void sp4g_vmRecordService( uint32 *l1_info, uint16 crc_result, uint16 buf_status, uint16 *ul_frame_data, uint16* dl_frame_data, kal_bool bBufferOK); |
| 201 | volatile uint16* SAL_PcmEx_Get4GULBuf(int *len); |
| 202 | extern kal_uint32 get_is_fake_4g(void); |
| 203 | |
| 204 | |
| 205 | /***************************** |
| 206 | Local variables |
| 207 | *****************************/ |
| 208 | static kal_uint8 spPS_reset_flag; // speech on and InterRAT : set TRUE |
| 209 | static kal_bool spPS_dtx_mode; |
| 210 | static int spPS_fake_EVS_IO; |
| 211 | static uint8 spPS_est_codec_mode; |
| 212 | static kal_uint32 spPS_rab_id; |
| 213 | static kal_uint32 spPS_rab_id_record[SPPS_RAB_ID_MAX]; //valid element: 1~(SPPS_RAB_ID_MAX-1) |
| 214 | static kal_bool spPS_rab_state; |
| 215 | static SP_PS_RADIO_TYPE spPS_RadioType; |
| 216 | |
| 217 | static kal_uint8 encodebits_null[32]; |
| 218 | static kal_uint8 bitlen_null; |
| 219 | |
| 220 | VoLTE_JBM_TS_Info_t JBM_info_local; |
| 221 | |
| 222 | SPPS_Struct_t *spPS; |
| 223 | SPPS_Struct_t stSPPS; |
| 224 | kal_spinlockid spinlock_sp4g; |
| 225 | |
| 226 | SP4G_PSR_CallType sp4g_PSR_CallType = SP4G_PSR_CallType_None; |
| 227 | |
| 228 | /***************************** |
| 229 | Local functions |
| 230 | *****************************/ |
| 231 | |
| 232 | void SP4G_PSR_SetCallType(SP4G_PSR_CallType type){ |
| 233 | sp4g_PSR_CallType = type; |
| 234 | } |
| 235 | SP4G_PSR_CallType SP4G_PSR_GetCallType(void){ |
| 236 | return(sp4g_PSR_CallType); |
| 237 | } |
| 238 | |
| 239 | void spPS_RadioType_set(SP_PS_RADIO_TYPE radio_type) |
| 240 | { |
| 241 | spPS_RadioType = radio_type; |
| 242 | } |
| 243 | |
| 244 | |
| 245 | SP_PS_RADIO_TYPE spPS_RadioType_get(void) |
| 246 | { |
| 247 | return(spPS_RadioType); |
| 248 | } |
| 249 | |
| 250 | |
| 251 | void spPS_reset_flag_set(kal_uint8 val) |
| 252 | { |
| 253 | spPS_reset_flag = val; |
| 254 | } |
| 255 | |
| 256 | |
| 257 | kal_uint8 spPS_reset_flag_get(void) |
| 258 | { |
| 259 | return(spPS_reset_flag); |
| 260 | } |
| 261 | |
| 262 | |
| 263 | bool is_g_codec(uint8 codec) |
| 264 | { |
| 265 | return( sp_ps_codec_g_is_g_codec(codec) ); |
| 266 | } |
| 267 | |
| 268 | |
| 269 | bool is_EVS_codec(uint8 codec) |
| 270 | { |
| 271 | return( sp_ps_codec_evs_is_EVS_codec(codec) ); |
| 272 | } |
| 273 | |
| 274 | |
| 275 | int 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 | |
| 291 | void 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 | |
| 359 | int get_spps_fake_EVS_IO(void) |
| 360 | { |
| 361 | return spPS_fake_EVS_IO; |
| 362 | } |
| 363 | |
| 364 | |
| 365 | int get_sp4g_fake_EVS_IO(void) |
| 366 | { |
| 367 | return( get_spps_fake_EVS_IO() ); |
| 368 | } |
| 369 | |
| 370 | |
| 371 | kal_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 | |
| 385 | kal_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 | |
| 396 | kal_uint32 SP4G_GetGCodecMode(void) |
| 397 | { |
| 398 | return spPS->ul_codec_mode; |
| 399 | |
| 400 | } |
| 401 | |
| 402 | |
| 403 | kal_bool SP4G_IsGCodecMode() |
| 404 | { |
| 405 | return sp_ps_codec_g_is_g_codec(spPS->ul_codec_mode); |
| 406 | } |
| 407 | |
| 408 | |
| 409 | kal_bool SP4G_IsEVSCodecMode() |
| 410 | { |
| 411 | return sp_ps_codec_evs_is_EVS_codec(spPS->ul_codec_mode); |
| 412 | } |
| 413 | |
| 414 | |
| 415 | kal_uint32 SP4G_GetCodecMode(void) |
| 416 | { |
| 417 | if(spPS != NULL) |
| 418 | return spPS->ul_codec_mode; |
| 419 | else |
| 420 | return INIT_CODEC; |
| 421 | } |
| 422 | |
| 423 | |
| 424 | void 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 |
| 515 | kal_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 |
| 551 | kal_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 | |
| 557 | void 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 | |
| 604 | kal_bool spPS_Rab_State_get( void ) |
| 605 | { |
| 606 | return spPS_rab_state; |
| 607 | } |
| 608 | |
| 609 | |
| 610 | kal_bool SP4G_Rab_State( void ) |
| 611 | { |
| 612 | return( spPS_Rab_State_get() ); |
| 613 | } |
| 614 | |
| 615 | |
| 616 | kal_uint32 SP4G_Rab_Id( void ) |
| 617 | { |
| 618 | return spPS_rab_id; |
| 619 | } |
| 620 | |
| 621 | |
| 622 | void 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 | |
| 628 | void 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 | |
| 636 | void 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 | |
| 647 | void 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 | /* |
| 665 | return value: |
| 666 | 0: No more data in ul_buf. |
| 667 | 1: Have more data in ul_buf |
| 668 | */ |
| 669 | int SP4G_PSR_UL_GSeries_IsMoreData(void) |
| 670 | { |
| 671 | return( sp_ps_codec_g_UL_GSeries_IsMoreData() ); |
| 672 | } |
| 673 | |
| 674 | |
| 675 | void sp4g_hisr_ul_g(void *data) |
| 676 | { |
| 677 | sp_ps_codec_g_hisr_ul_g((void *)0); |
| 678 | } |
| 679 | |
| 680 | void sp4g_hisr_dl_g(void *data) |
| 681 | { |
| 682 | sp_ps_codec_g_hisr_dl_g((void *)0); |
| 683 | } |
| 684 | |
| 685 | void SP4G_EVS_CallOpenSetPar(void) |
| 686 | { |
| 687 | sp_ps_codec_evs_CallOpenSetPar(); |
| 688 | } |
| 689 | |
| 690 | |
| 691 | void 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 | |
| 701 | void 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 | |
| 708 | kal_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 | |
| 744 | kal_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 | |
| 778 | void 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 | |
| 798 | void 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 | |
| 810 | void 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 | |
| 841 | void SP4G_Reset( void ) |
| 842 | { |
| 843 | spPS_reset_flag = 1; |
| 844 | } |
| 845 | |
| 846 | |
| 847 | kal_bool spPS_IsDTXOn(void) |
| 848 | { |
| 849 | return spPS_dtx_mode; |
| 850 | } |
| 851 | |
| 852 | |
| 853 | kal_bool SP4G_IsDTXOn(void) |
| 854 | { |
| 855 | return( spPS_IsDTXOn() ); |
| 856 | } |
| 857 | |
| 858 | |
| 859 | void 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 | |
| 874 | void SP4G_PSR_SetDTX(kal_bool on) |
| 875 | { |
| 876 | SP4G_SetDTX(on); |
| 877 | } |
| 878 | |
| 879 | |
| 880 | void 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 | |
| 887 | kal_uint32 SP4G_JBM_GetDLVADFlag() |
| 888 | { |
| 889 | return SAL_GetDLVADFlag(); |
| 890 | } |
| 891 | |
| 892 | |
| 893 | void 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 | |
| 932 | void 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 | |
| 958 | void 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 | |
| 999 | void 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 | |
| 1100 | SP_PSCALL_L2_MODE SP4G_GetL2Mode() |
| 1101 | { |
| 1102 | return spPS->sph_l2_mode; |
| 1103 | } |
| 1104 | //#if defined(__G_CODEC_SUPPORT__) |
| 1105 | void GSeries_Encode_Init(SP4G_Codec codec_) |
| 1106 | { |
| 1107 | sp_ps_codec_g_Encode_Init(codec_); |
| 1108 | } |
| 1109 | |
| 1110 | |
| 1111 | void GSeries_Encode_DeInit() |
| 1112 | { |
| 1113 | |
| 1114 | } |
| 1115 | |
| 1116 | |
| 1117 | void GSeries_Decode_Init(SP4G_Codec codec_) |
| 1118 | { |
| 1119 | sp_ps_codec_g_Decode_Init(codec_); |
| 1120 | } |
| 1121 | |
| 1122 | |
| 1123 | void GSeries_Decode_DeInit() |
| 1124 | { |
| 1125 | |
| 1126 | } |
| 1127 | |
| 1128 | |
| 1129 | void 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 | |
| 1150 | kal_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 | |
| 1174 | void 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 | |
| 1226 | void 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 | |
| 1328 | void 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 | |
| 1371 | void 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 | //===================================== |
| 1407 | kal_uint32 get_is_fake_4g(void); |
| 1408 | kal_uint32 encodebits_buf[1000]; |
| 1409 | kal_uint8 encodebits[128]; |
| 1410 | |
| 1411 | SP4G_Codec pscall_loopback_frame_type; |
| 1412 | kal_uint32 pscall_loopback_bitlen; |
| 1413 | kal_uint8 pscall_loopback_uint8_bitlen; |
| 1414 | |
| 1415 | void 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 | |
| 1439 | void 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 | |
| 1465 | void 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 | |
| 1482 | void 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 | |
| 1487 | void 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 | |
| 1504 | void 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 | |
| 1509 | void 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 | |
| 1527 | void 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 | |
| 1543 | void 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 | |
| 1589 | void 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 | |