blob: abf3a36e6892a0cf82b5de2ac2a73ccb3aa025f5 [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 * l1sp.c
41 *
42 * Project:
43 * --------
44 * MAUI
45 *
46 * Description:
47 * ------------
48 * L1SP Interface
49 *
50 * Author:
51 * -------
52 * -------
53 *
54 *==============================================================================
55 * HISTORY
56 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
57 *------------------------------------------------------------------------------
58 * removed!
59 * removed!
60 * removed!
61 *
62 * removed!
63 * removed!
64 * removed!
65 * removed!
66 *
67 * removed!
68 * removed!
69 *
70 * removed!
71 * removed!
72 * removed!
73 * removed!
74 *
75 * removed!
76 * removed!
77 * removed!
78 * removed!
79 *
80 * removed!
81 * removed!
82 * removed!
83 * removed!
84 *
85 * removed!
86 * removed!
87 * removed!
88 * removed!
89 *
90 * removed!
91 * removed!
92 * removed!
93 * removed!
94 *
95 * removed!
96 * removed!
97 * removed!
98 * removed!
99 * removed!
100 *
101 * removed!
102 * removed!
103 *
104 * removed!
105 * removed!
106 * removed!
107 *
108 * removed!
109 * removed!
110 *
111 * removed!
112 * removed!
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 * removed!
131 * removed!
132 * removed!
133 * removed!
134 *
135 * removed!
136 * removed!
137 * removed!
138 * removed!
139 * removed!
140 *
141 * removed!
142 * removed!
143 * removed!
144 *
145 * removed!
146 * removed!
147 * removed!
148 *
149 * removed!
150 * removed!
151 * removed!
152 * removed!
153 *
154 * removed!
155 * removed!
156 * removed!
157 * removed!
158 *
159 * removed!
160 * removed!
161 * removed!
162 *
163 * removed!
164 * removed!
165 * removed!
166 *
167 * removed!
168 * removed!
169 *
170 * removed!
171 * removed!
172 * removed!
173 *
174 * removed!
175 * removed!
176 * removed!
177 *
178 * removed!
179 * removed!
180 * removed!
181 * removed!
182 *
183 * removed!
184 * removed!
185 * removed!
186 * removed!
187 *
188 * removed!
189 * removed!
190 * removed!
191 * removed!
192 *
193>>>> ORIGINAL //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/sp_drv.c#15
194==== THEIRS //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/sp_drv.c#16
195 * removed!
196 * removed!
197 * removed!
198 * removed!
199 *
200 * removed!
201 * removed!
202 * removed!
203 *
204==== YOURS //ws_thomas.chen_work1/VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/sp_drv.c
205>>>> ORIGINAL //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/sp_drv.c#14
206==== THEIRS //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/sp_drv.c#15
207<<<<
208 * removed!
209 * removed!
210 * removed!
211==== YOURS //ws_thomas.chen_work1/VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/sp_drv.c
212 * removed!
213 * removed!
214 * removed!
215 * removed!
216 *
217 * removed!
218 * removed!
219 * removed!
220 * removed!
221 *
222 * removed!
223 * removed!
224 * removed!
225 * removed!
226<<<<
227 *
228 * removed!
229 * removed!
230 * removed!
231 *
232 * removed!
233 * removed!
234 * removed!
235 *
236 * removed!
237 * removed!
238 * removed!
239 * removed!
240 *
241 * removed!
242 * removed!
243 * removed!
244 *
245 * removed!
246 * removed!
247 * removed!
248 *
249 * removed!
250 * removed!
251 * removed!
252 *
253 * removed!
254 * removed!
255 * removed!
256 *
257 * removed!
258 * removed!
259 * removed!
260 *
261 * removed!
262 * removed!
263 * removed!
264 * removed!
265 *
266 * removed!
267 * removed!
268 * removed!
269 *
270 * removed!
271 * removed!
272 * removed!
273 *
274 * removed!
275 * removed!
276 * removed!
277 *
278 * removed!
279 * removed!
280 * removed!
281 *
282 * removed!
283 * removed!
284 * removed!
285 *
286 * removed!
287 * removed!
288 * removed!
289 *
290 * removed!
291 * removed!
292 * removed!
293 *
294 * removed!
295 * removed!
296 * removed!
297 * removed!
298 *
299 * removed!
300 * removed!
301 * removed!
302 *
303 * removed!
304 * removed!
305 * removed!
306 *
307 * removed!
308 * removed!
309 * removed!
310 *
311 * removed!
312 * removed!
313 * removed!
314 *
315 * removed!
316 * removed!
317 * removed!
318 *
319 * removed!
320 * removed!
321 * removed!
322 *
323 * removed!
324 * removed!
325 * removed!
326 *
327 * removed!
328 * removed!
329 * removed!
330 *
331 * removed!
332 * removed!
333 * removed!
334 *
335 * removed!
336 * removed!
337 * removed!
338 *
339 * removed!
340 * removed!
341 * removed!
342 *
343 * removed!
344 * removed!
345 * removed!
346 *
347 * removed!
348 * removed!
349 * removed!
350 *
351 * removed!
352 * removed!
353 * removed!
354 *
355 * removed!
356 * removed!
357 * removed!
358 *
359 * removed!
360 * removed!
361 * removed!
362 * removed!
363 *
364 * removed!
365 * removed!
366 * removed!
367 * removed!
368 * removed!
369 * removed!
370 * removed!
371 *
372 * removed!
373 * removed!
374 * removed!
375 * removed!
376 * removed!
377 * removed!
378 * removed!
379 * removed!
380 *
381 * removed!
382 * removed!
383 * removed!
384 *
385 * removed!
386 * removed!
387 * removed!
388 *
389 * removed!
390 * removed!
391 * removed!
392 * removed!
393 *
394 * removed!
395 * removed!
396 * removed!
397 * removed!
398 * removed!
399 *
400 * removed!
401 * removed!
402 * removed!
403 *
404 * removed!
405 * removed!
406 * removed!
407 *
408 * removed!
409 * removed!
410 * removed!
411 * removed!
412 * removed!
413 * removed!
414 *
415 * removed!
416 * removed!
417 * removed!
418 *
419 * removed!
420 * removed!
421 * removed!
422 *
423 * removed!
424 * removed!
425 * removed!
426 *
427 * removed!
428 * removed!
429 * removed!
430 *
431 * removed!
432 * removed!
433 * removed!
434 *
435 * removed!
436 * removed!
437 * removed!
438 * removed!
439 * removed!
440 * removed!
441 *
442 * removed!
443 * removed!
444 * removed!
445 *
446 * removed!
447 * removed!
448 * removed!
449 *
450 * removed!
451 * removed!
452 * removed!
453 * removed!
454 *
455 * removed!
456 * removed!
457 * removed!
458 *
459 * removed!
460 * removed!
461 * removed!
462 *
463 * removed!
464 * removed!
465 * removed!
466 *
467 * removed!
468 * removed!
469 * removed!
470 *
471 * removed!
472 * removed!
473 * removed!
474 *
475 * removed!
476 * removed!
477 * removed!
478 * removed!
479 * removed!
480 * removed!
481 *
482 * removed!
483 * removed!
484 * removed!
485 *
486 * removed!
487 * removed!
488 * removed!
489 *
490 * removed!
491 * removed!
492 * removed!
493 *
494 * removed!
495 * removed!
496 * removed!
497 *
498 * removed!
499 * removed!
500 * removed!
501 * removed!
502 *
503 * removed!
504 * removed!
505 * removed!
506 *
507 * removed!
508 * removed!
509 * removed!
510 *
511 * removed!
512 * removed!
513 * removed!
514 *
515 * removed!
516 * removed!
517 * removed!
518 *
519 * removed!
520 * removed!
521 * removed!
522 *
523 * removed!
524 * removed!
525 * removed!
526 *
527 * removed!
528 * removed!
529 * removed!
530 *
531 * removed!
532 * removed!
533 * removed!
534 *
535 * removed!
536 * removed!
537 * removed!
538 *
539 * removed!
540 * removed!
541 * removed!
542 *
543 * removed!
544 * removed!
545 * removed!
546 *
547 * removed!
548 * removed!
549 * removed!
550 *
551 * removed!
552 * removed!
553 * removed!
554 *
555 * removed!
556 * removed!
557 * removed!
558 *
559 * removed!
560 * removed!
561 * removed!
562 *
563 * removed!
564 * removed!
565 * removed!
566 *
567 * removed!
568 * removed!
569 * removed!
570 *
571 * removed!
572 * removed!
573 * removed!
574 *
575 * removed!
576 * removed!
577 * removed!
578 *
579 * removed!
580 * removed!
581 * removed!
582 *
583 * removed!
584 * removed!
585 * removed!
586 *
587 * removed!
588 * removed!
589 * removed!
590 *
591 * removed!
592 * removed!
593 * removed!
594 *
595 * removed!
596 * removed!
597 * removed!
598 *
599 * removed!
600 * removed!
601 * removed!
602 *
603 * removed!
604 * removed!
605 * removed!
606 *
607 * removed!
608 * removed!
609 * removed!
610 *
611 * removed!
612 * removed!
613 *
614 * removed!
615 * removed!
616 *
617 * removed!
618 * removed!
619 * removed!
620 *
621 * removed!
622 * removed!
623 * removed!
624 *
625 * removed!
626 * removed!
627 * removed!
628 *
629 * removed!
630 * removed!
631 * removed!
632 *
633 * removed!
634 * removed!
635 * removed!
636 *
637 * removed!
638 * removed!
639 * removed!
640 * removed!
641 * removed!
642 * removed!
643 * removed!
644 * removed!
645 * removed!
646 *
647 * removed!
648 * removed!
649 * removed!
650 * removed!
651 *
652 * removed!
653 * removed!
654 * removed!
655 *
656 * removed!
657 * removed!
658 * removed!
659 * removed!
660 *
661 * removed!
662 * removed!
663 * removed!
664 *
665 * removed!
666 * removed!
667 * removed!
668 *
669 * removed!
670 * removed!
671 * removed!
672 *
673 * removed!
674 * removed!
675 * removed!
676 *
677 * removed!
678 * removed!
679 * removed!
680 *
681 * removed!
682 * removed!
683 * removed!
684 *
685 * removed!
686 * removed!
687 * removed!
688 *
689 * removed!
690 * removed!
691 * removed!
692 *
693 * removed!
694 * removed!
695 * removed!
696 *
697 * removed!
698 * removed!
699 * removed!
700 *
701 * removed!
702 * removed!
703 * removed!
704 *
705 * removed!
706 * removed!
707 * removed!
708 *
709 * removed!
710 * removed!
711 * removed!
712 *
713 * removed!
714 * removed!
715 * removed!
716 *
717 * removed!
718 * removed!
719 * removed!
720 *
721 * removed!
722 * removed!
723 * removed!
724 *
725 * removed!
726 * removed!
727 * removed!
728 *
729 * removed!
730 * removed!
731 * removed!
732 *
733 * removed!
734 * removed!
735 * removed!
736 *
737 * removed!
738 * removed!
739 * removed!
740 * removed!
741 * removed!
742 * removed!
743 * removed!
744 * removed!
745 * removed!
746 * removed!
747 * removed!
748 *
749 * removed!
750 * removed!
751 * removed!
752 *
753 * removed!
754 * removed!
755 * removed!
756 *
757 * removed!
758 * removed!
759 * removed!
760 *
761 * removed!
762 * removed!
763 * removed!
764 *
765 * removed!
766 * removed!
767 * removed!
768 *
769 * removed!
770 * removed!
771 * removed!
772 *
773 * removed!
774 * removed!
775 * removed!
776 *
777 * removed!
778 * removed!
779 * removed!
780 *
781 * removed!
782 * removed!
783 * removed!
784 *
785 * removed!
786 * removed!
787 * removed!
788 *
789 * removed!
790 * removed!
791 * removed!
792 *
793 * removed!
794 * removed!
795 * removed!
796 *
797 * removed!
798 * removed!
799 *
800 * removed!
801 * removed!
802 * removed!
803 *
804 * removed!
805 * removed!
806 * removed!
807 *
808 * removed!
809 * removed!
810 * removed!
811 *
812 * removed!
813 * removed!
814 * removed!
815 *
816 * removed!
817 * removed!
818 * removed!
819 *
820 * removed!
821 * removed!
822 * removed!
823 *
824 * removed!
825 * removed!
826 * removed!
827 * removed!
828 * removed!
829 * removed!
830 * removed!
831 *
832 * removed!
833 * removed!
834 * removed!
835 *
836 * removed!
837 * removed!
838 * removed!
839 *
840 *------------------------------------------------------------------------------
841 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
842 *==============================================================================
843 *******************************************************************************/
844#include "kal_public_api.h"
845#include "kal_general_types.h"
846#include "kal_trace.h"
847#include "string.h"
848#include "reg_base.h"
849// #include "custom_equipment.h" /* custom_cfg_audio_ec_range() */
850#include "device.h" /* MAX_VOL_LEVEL, in ps\l4\include */
851#include "audcoeff_default.h"
852#include "gmss_public.h"
853//#include "l4_ps_api.h" //for query_ps_conf_test_mode()
854
855// #include "audio_def.h"
856#include "l1audio.h"
857#include "l1audio_trace_utmd.h"
858#include "l1audio_voc_utmd.h"
859#include "l1sp_trc.h"
860#include "l1audio_sph_trc.h"
861
862#include "media.h"
863#include "sp_enhance.h"
864#include "afe.h"
865#include "am.h"
866#include "vm.h"
867#include "sal_def.h"
868#include "sal_exp.h"
869#include "bgSnd.h"
870#include "spc_drv.h"
871#include "extcodec.h"
872
873#include "mml1_rf_global.h"
874#include "sp_drv.h"
875
876#include "ps_em_exported_enum.h"
877#include "ps_public_utility.h"
878
879#if defined(__DATA_CARD_SPEECH__) || defined(__BT_SCO_CODEC_SUPPORT__)
880#include "sp_daca.h"
881#endif
882
883#ifdef __TWOMICNR_SUPPORT__
884#include "two_mic_NR_custom_if.h"
885#endif
886
887#if !defined(__SMART_PHONE_MODEM__)
888#include "apAudSysConfig.h"
889#else
890
891#endif
892
893#if defined(__CVSD_CODEC_SUPPORT__)
894#include "bt_sco_drv.h"
895#endif
896
897#if defined(__VOLTE_SUPPORT__)
898#include "l1audio.h"
899#include "sp_ps.h"
900#endif
901
902#include "speech_service.h"
903#include "sp_cc.h"
904
905// for modem project, DONGLE product use
906
907#include "audio_msgid.h"
908#include "drv_sap.h"
909// #include "aud_common_config.h" // for DEFAULT_SPEECH_COMMON_PARA. in customer folder
910#if defined(__C2K_SPEECH_SUPPORT__)
911#include "lmd_audio.h"
912#endif
913
914#if defined( __UMTS_RAT__ )
915//#include "uas_export_api.h"
916#include "csr_export_api.h"
917#endif
918#include "sp_dsptone_drv.h"
919#include "ctm_drv.h"
920
921#if defined(__HIF_CCCI_SUPPORT__)
922#include "ccci_if.h"
923#endif
924
925#include "cache_sw.h"
926/* ------------------------------------------------------------------------------ */
927/* Speech Interface */
928/* ------------------------------------------------------------------------------ */
929
930static struct {
931 uint8 devSr;
932 sp_device_info_t devInfo;
933 sp_ext_dev_info_t extDevInfo;
934
935 uint16 aud_id;
936 uint16 aud_id_network_status;
937 uint16 aud_id_em_codec_update;
938 uint16 aud_id_voice_quality_event;
939
940 uint16 sph_c_para[NUM_COMMON_PARAS];
941
942#if defined(_SPE_ENH_MD_PARSE_)
943 uint16 sph_m_para[NUM_MODE_PARAS];
944 // uint16 sph_v_para[NUM_VOL_PARAS]; // useless, should fine time to remove it
945 uint16 sph_m_paraWb[NUM_MODE_PARAS];
946 uint16 sph_m_paraSWb[NUM_MODE_PARAS];
947#endif
948 uint8 mic_volume; // [analog+digital gain]value corrently set to DSP&HW; when ANALOG_AFE_PATH_EXIST is NOT defined, this is 0
949
950 uint16 isULMute; // flag to keep the DSP UL MUTE states
951 bool isDLMute; // flag to keep the DSP DL MUTE states
952
953 bool isUlSourceMute;
954 bool codec_mute;
955 bool dl_codec_mute_by_ap;
956 bool dl_pre_PcmMixer_mute;
957 L1SP_L4C_Event_Mode codec_mute_mode;
958 bool tch_state; // true: TCH on; false: TCH off
959 uint8 state; // recording the network is 2G or 3G
960 bool isStandByMode; // recording any RAB exist
961
962 L1SP_L4C_Codec pre_l4c_codec; // remind to clean the codec in MED task
963#if defined( __UMTS_RAT__ )
964 bool interRAT;
965#endif
966
967#if defined(__DATA_CARD_SPEECH__)
968 void (*strmOnHandler)(void *);
969 void (*strmOffHandler)(void *);
970 void (*strmHdl)(kal_uint32 event, void *param);
971#endif
972
973
974#if defined(__ECALL_SUPPORT__)
975 void (*pcm4wayOnHandler)(void *);
976 void (*pcm4wayOffHandler)(void *);
977#endif
978
979 bool isEmCodecNotifyOff;
980
981#if defined(__C2K_SPEECH_SUPPORT__)
982 int c2k_so_codec;
983 bool isSO_Connected;
984 bool isConSSO_Done;
985#endif
986 void (*rampDoneHandler)(void *);
987 kal_uint32 AUIF_EMI_addr;
988 kal_uint32 AUIF_EMI_size;
989
990 kal_uint32 *SphParamBuffer;
991 kal_uint32 SphParamBufferSize;
992
993 kal_uint32 *SphOpenDSPBuffer;
994 kal_uint32 SphOpenDSPBufferSize;
995
996 kal_uint8 opendsp_flag;/* 0: internal SPE, 1: OpenDSP */
997} l1sp = {0};
998extern kal_enhmutexid sp_handover_mutex;
999
1000static kal_timerid sp_vmFilterChk_timer;
1001static kal_timerid sp_emCodec_timer;
1002static SP_EM_VOICE_QUALITY_INFO sp_emVoiceQuality;
1003extern void vt_SP3G_Callback( kal_uint8 event, void *data );
1004extern void CSR_Codec_Ready(int rab_id);
1005extern void CSR_Codec_Close(int rab_id);
1006extern kal_uint32 SP3G_GetCodecMode(void);
1007extern kal_uint32 SP4G_GetCodecMode(void);
1008
1009extern void l1audio_sph_srv_SMMT_Start(void);
1010extern void l1audio_sph_srv_SMMT_End(void);
1011
1012
1013#if defined( __UMTS_RAT__ )
1014SP_3G_SIM L1SP_GetSIMStatus()
1015{
1016#ifdef __FAKE_3G_LOOPBACK__
1017 return SP_3G_SIM_FDD_ACTIVE;
1018#else
1019 if( gmss_is_wcdma_mode_activated( FDD_CSR_ACTIVE_SIM()) ) {
1020 return SP_3G_SIM_FDD_ACTIVE;
1021 }else if( gmss_is_tdscdma_mode_activated( TDD_CSR_ACTIVE_SIM())){
1022 return SP_3G_SIM_TDD_ACTIVE;
1023 }else{
1024 return SP_3G_SIM_IDLE;
1025 }
1026#endif
1027}
1028#endif
1029
1030#if defined(__C2K_SPEECH_SUPPORT__)
1031
1032
1033void L1SP_C2K_IntraRAT( int codec )
1034{
1035 int16 aud_id;
1036 ASSERT(l1sp.isSO_Connected);
1037 MD_TRC_C2K_SPH_INTRARAT(0);
1038 kal_take_enh_mutex( sp_handover_mutex );
1039 aud_id = L1SP_GetAudID();
1040 AM_C2K_IntraRAT(codec);
1041 L1SP_FreeAudID(aud_id);
1042 kal_give_enh_mutex( sp_handover_mutex );
1043 MD_TRC_C2K_SPH_INTRARAT(1);
1044}
1045
1046
1047
1048
1049void sub_SPC2K_DisconSSO_Done(void)
1050{
1051 uint16 aud_id;
1052 MD_TRC_C2K_SPH_SO_DISCON_DONE(0);
1053 aud_id = L1SP_GetAudID();
1054 l1sp.isConSSO_Done = false;//clear
1055 SPC2K_DisconSSO_Done();
1056 L1SP_FreeAudID(aud_id);
1057 MD_TRC_C2K_SPH_SO_DISCON_DONE(1);
1058}
1059
1060void L1SP_C2K_DeEst( void )
1061{
1062 uint16 aud_id;
1063 MD_TRC_C2K_SPH_SO_DISCON(0);
1064 kal_take_enh_mutex( sp_handover_mutex );
1065 aud_id = L1SP_GetAudID();
1066 ASSERT(l1sp.isSO_Connected);
1067#ifndef __FAKE_C2K_LOOPBACK__
1068 SP_L4C_SetEvent(L1SP_L4C_ESPEECH_0, L1SP_L4C_EVENT_CS);
1069#endif
1070 //SAL_C2K_SetValue(SAL_C2K_DL_RATE, IPC_SPCH_ERASURE);
1071 //l1sp.c2k_so_codec = SAL_C2K_COD_MODE_UNDEF;
1072 l1sp.isSO_Connected = false;
1073//#if !defined(__WAIT_SP1__)
1074 sub_SPC2K_DisconSSO_Done();
1075//#endif
1076
1077#if defined(__VOLTE_SUPPORT__)
1078 if( SP4G_Rab_State() && L1SP_GetState() != L1SP_STATE_4G_SPEECH_ON && L1SP_GetState() != L1SP_STATE_IDLE ){//3G->4G
1079 PSR_SP4G_Callback(SP4G_CODEC_READY, (void*)0 );
1080 SP4G_Reset();
1081 AM_InterRAT_C2K_to_4G(SP4G_GetCodecMode());
1082 L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
1083 }else
1084#endif
1085 if( SP3G_Rab_State() && L1SP_GetState() != L1SP_STATE_3G_SPEECH_ON && L1SP_GetState() != L1SP_STATE_IDLE ){//4G->3G
1086 CSR_Codec_Ready(SP3G_Rab_Id());
1087 AM_InterRAT_C2K_to_3G(SP3G_GetCodecMode());
1088 L1SP_SetState( L1SP_STATE_3G_SPEECH_ON );
1089 }else
1090 if( L1SP_TCH_State() && L1SP_GetState() != L1SP_STATE_2G_SPEECH_ON && L1SP_GetState() != L1SP_STATE_IDLE ){//2G->3G fail case
1091 AM_InterRAT_C2K_to_2G();
1092 L1SP_SetState( L1SP_STATE_2G_SPEECH_ON );
1093 }
1094 L1SP_FreeAudID(aud_id);
1095 kal_give_enh_mutex( sp_handover_mutex );
1096 MD_TRC_C2K_SPH_SO_DISCON(1);
1097}
1098
1099int L1SP_GetC2KSO_Codec( void )
1100{
1101 return l1sp.c2k_so_codec;
1102}
1103
1104void sub_SPC2K_ConSSO_Done(void)
1105{
1106 if(!l1sp.isConSSO_Done){
1107 MD_TRC_C2K_SPH_SKIP_SO_CON_DONE(0);
1108 l1sp.isConSSO_Done = true;
1109 SPC2K_ConSSO_Done();
1110 }else{//skip
1111 MD_TRC_C2K_SPH_SKIP_SO_CON_DONE(1);
1112 //log
1113 }
1114}
1115
1116void L1SP_C2K_Est(int codec)//ESpeech:1 is presumed before this is invoked.
1117{
1118 MD_TRC_C2K_SPH_SO_CONNECT(codec);
1119
1120 ASSERT(!l1sp.isSO_Connected);
1121 kal_take_enh_mutex( sp_handover_mutex );
1122 l1sp.c2k_so_codec = codec;
1123
1124 if(AM_IsSpeechOn()){ //speech On(2G) -> SO connect or during a call, SO change
1125 MD_TRC_C2K_SPH_SO_CONNECT2(1);
1126 if( L1SP_GetState() == L1SP_STATE_2G_SPEECH_ON ){
1127 MD_TRC_C2K_SPH_SO_CONNECT2(2);
1128 AM_InterRAT_2G_to_C2K(codec);
1129 L1SP_SetState( L1SP_STATE_C2K_SPEECH_ON );
1130 }else if( L1SP_GetState() == L1SP_STATE_3G_SPEECH_ON ){
1131 MD_TRC_C2K_SPH_SO_CONNECT2(3);
1132 CSR_Codec_Close(SP3G_Rab_Id());
1133 AM_InterRAT_3G_to_C2K(codec);
1134 L1SP_SetState( L1SP_STATE_C2K_SPEECH_ON );
1135 }
1136#if defined(__VOLTE_SUPPORT__)
1137 else if( L1SP_GetState() == L1SP_STATE_4G_SPEECH_ON ){
1138 MD_TRC_C2K_SPH_SO_CONNECT2(4);
1139 PSR_SP4G_Callback(SP4G_CODEC_CLOSED, (void*)0 );
1140 AM_InterRAT_4G_to_C2K(codec);
1141 L1SP_SetState( L1SP_STATE_C2K_SPEECH_ON );
1142 }
1143#endif
1144 else if( L1SP_GetState() == L1SP_STATE_C2K_SPEECH_ON ){
1145 MD_TRC_C2K_SPH_SO_CONNECT2(5);
1146 AM_C2K_IntraRAT(codec);
1147 L1SP_SetState( L1SP_STATE_C2K_SPEECH_ON );
1148 }else{//others
1149 MD_TRC_C2K_SPH_SO_CONNECT2(6);
1150 ASSERT(0);
1151 }
1152
1153 sub_SPC2K_ConSSO_Done();
1154
1155 MD_TRC_C2K_SPH_SO_CONNECT2(7);
1156
1157 }else{
1158 MD_TRC_C2K_SPH_SO_CONNECT2(8);
1159 //don't send ack until SpeechOn
1160 }
1161 l1sp.isSO_Connected = true;
1162#ifndef __FAKE_C2K_LOOPBACK__
1163 SP_L4C_SetEvent(L1SP_L4C_ESPEECH_1, L1SP_L4C_EVENT_CS);
1164#endif
1165 kal_give_enh_mutex( sp_handover_mutex );
1166
1167 MD_TRC_C2K_SPH_SO_CONNECT2(9);
1168}
1169
1170bool L1SP_isC2KSO_Connected()
1171{
1172 return l1sp.isSO_Connected;
1173}
1174
1175#endif
1176
1177
1178bool L1SP_IsBluetoothOn( void )
1179{
1180 return ((l1sp.devInfo == SPH_DEVINFO_BT_CVSD_MSBC)
1181 || (l1sp.devInfo == SPH_DEVINFO_BT_CVSD)
1182 || (l1sp.devInfo == SPH_DEVINFO_BT_MSBC)
1183 || (l1sp.devInfo == SPH_DEVINFO_BT_PCM));
1184}
1185
1186
1187#if defined(_SPE_ENH_MD_PARSE_)
1188void SP_SetSpeechPara( uint16 sph_m_para[NUM_MODE_PARAS] )
1189{
1190 memcpy(l1sp.sph_m_para, sph_m_para, NUM_MODE_PARAS*sizeof(uint16));
1191}
1192#endif
1193
1194
1195kal_uint16 L1SP_GetAudID(void)/*Be careful.Before Locking SleepMode, to access DSP sherrif tasks much time. So access DSP must be after SetFlag*/
1196{
1197 kal_uint16 aud_id;
1198 aud_id = L1Audio_GetAudioID();
1199 L1Audio_SetFlag( aud_id );
1200 return aud_id;
1201}
1202void L1SP_FreeAudID(kal_uint16 aud_id)
1203{
1204 L1Audio_ClearFlag( aud_id );
1205 L1Audio_FreeAudioID( aud_id );
1206}
1207
1208
1209/*******************************************************************/
1210/* The new interface for DSP speech enhancement function / Bluetooth */
1211/*******************************************************************/
1212/*
1213void sp_setBtOn(bool on)
1214{
1215 l1sp.bt_on = on;
1216}
1217
1218bool sp_getIsBtOn(void)
1219{
1220 return l1sp.bt_on;
1221}
1222*/
1223
1224
1225
1226void L1SP_Reload_SPE_Para( void )
1227{
1228
1229#if defined(_SPE_ENH_MD_PARSE_)
1230 SPE_LoadSpeechPara(l1sp.sph_c_para, l1sp.sph_m_para, l1sp.sph_m_paraWb,l1sp.sph_m_paraSWb);
1231 #else // for 95,97
1232 SPE_LoadCommonPara(l1sp.sph_c_para);
1233#endif
1234}
1235
1236
1237
1238
1239
1240void L1SP_LoadCommonSpeechPara( uint16 c_para[NUM_COMMON_PARAS] )
1241{
1242#if defined( MTK_SLEEP_ENABLE )
1243 kal_uint16 aud_id = L1SP_GetAudID();
1244#endif
1245
1246 memcpy(l1sp.sph_c_para, c_para, NUM_COMMON_PARAS*sizeof(uint16));
1247
1248 // Some common parameters are used in non-speech function
1249 // Force to load common parameter
1250
1251#if defined(_SPE_ENH_MD_PARSE_)
1252 SPE_LoadSpeechPara(l1sp.sph_c_para, NULL, NULL, NULL);
1253 #else // for 97,95
1254 SPE_LoadCommonPara(l1sp.sph_c_para);
1255#endif
1256#if defined( MTK_SLEEP_ENABLE )
1257 L1SP_FreeAudID(aud_id);
1258#endif
1259}
1260
1261uint16 *Sp_GetCommonSpeechPara(void)
1262{
1263 return l1sp.sph_c_para;
1264}
1265
1266
1267
1268#if defined(_SPE_ENH_MD_PARSE_)
1269uint16 *Sp_GetSpeechPara(void)
1270{
1271 return l1sp.sph_m_para;
1272}
1273
1274
1275void SP_SetWbSpeechPara( kal_uint16 m_para[NUM_MODE_PARAS] )
1276{
1277 memcpy( l1sp.sph_m_paraWb, m_para, NUM_MODE_PARAS*sizeof(uint16));
1278}
1279void SP_SetSWbSpeechPara( kal_uint16 m_para[NUM_MODE_PARAS] )
1280{
1281 memcpy( l1sp.sph_m_paraSWb, m_para, NUM_MODE_PARAS*sizeof(uint16));
1282}
1283
1284uint16 *Sp_GetWbSpeechPara(void)
1285{
1286 return l1sp.sph_m_paraWb;
1287}
1288
1289#endif
1290void SP_SetUSIP_MPU_Info()
1291{
1292 l1sp.AUIF_EMI_addr = 0;
1293 l1sp.AUIF_EMI_size = 0;
1294 l1sp.SphParamBuffer = NULL;
1295 l1sp.SphParamBufferSize = 0;
1296 l1sp.SphOpenDSPBuffer = NULL;
1297 l1sp.SphOpenDSPBufferSize = 0;
1298
1299#if defined(__HIF_CCCI_SUPPORT__)
1300
1301 CCCI_RUNTIME_FEATURE_SUPPORT_T feature_support;
1302 CCCI_RUNTIME_SHARE_MEMORY_FORMAT_T shm;
1303
1304 feature_support = ccci_runtime_data_query(AP_CCCI_RUNTIME_MD_USIP_SHARE_MEMORY, &shm, sizeof(CCCI_RUNTIME_SHARE_MEMORY_FORMAT_T ));
1305
1306 if (feature_support.support_mask == CCCI_RUNTIME_FEATURE_MUST_SUPPORT){
1307 if(0 == shm.size){
1308 ASSERT(0);
1309 }
1310 l1sp.AUIF_EMI_addr = shm.addr;
1311 l1sp.AUIF_EMI_size = shm.size;
1312 }
1313#endif
1314 SAL_ExtAUIF_SetMemAddr(SAL_EXTAUIF_MEM_TYPE_SPHALL, l1sp.AUIF_EMI_addr, l1sp.AUIF_EMI_size);
1315 //invalidate_dcache(l1sp.AUIF_EMI_addr, l1sp.AUIF_EMI_size);
1316}
1317
1318#define NUM_MPU_REGION 3
1319typedef unsigned int SP_EMI_LAYOUT_VERSION;
1320
1321typedef enum {
1322 SP_EMI_AP_USIP_PARAMETER,
1323 SP_EMI_ADSP_USIP_PHONECALL,
1324 SP_EMI_ADSP_USIP_SMARTPA
1325}SP_EMI_TYPE;
1326
1327typedef enum {
1328 SP_MPU_READ_BIT = 0,
1329 SP_MPU_WRITE_BIT = 1,
1330 SP_MPU_CACHEABLE_BIT = 2,
1331}SP_MPU_BIT;
1332
1333typedef unsigned short SP_MPU_ATTRIBUTE;
1334
1335typedef struct SP_EMI_Entry{
1336 SP_EMI_TYPE TYPE;
1337 int OFFSET;
1338 int SIZE;
1339
1340 SP_MPU_ATTRIBUTE AP_MPU;
1341 SP_MPU_ATTRIBUTE ADSP_MPU; //HIFI3
1342}SP_EMI_Entry_t;
1343
1344typedef struct SP_EMI_Info{
1345 SP_EMI_LAYOUT_VERSION version;
1346 SP_EMI_Entry_t EMI_Entry[NUM_MPU_REGION];
1347 int EMI_Entry_Num;
1348}SP_EMI_Info_t;
1349
1350SP_EMI_Info_t sp_emi_info;
1351SP_EMI_Entry_t sp_emi_entry;
1352
1353
1354int EMI_TABLE[3][3]={{0, 0, 0x30000},{1, 0x30000, 0x8000},{2, 0x38000, 0x28000}};
1355void SP_Parse_EMI_Info()
1356{
1357#if defined(__HIF_CCCI_SUPPORT__)
1358 if(0 != l1sp.AUIF_EMI_size){
1359 int i = 0;
1360 //volatile kal_uint32* p = (volatile kal_uint32* )l1sp.AUIF_EMI_addr;
1361 int number = 3;
1362 //int start_id = 4;
1363 for(i = 0; i < number; i++){
1364 sp_emi_info.EMI_Entry[i].TYPE = EMI_TABLE[i][0];
1365 sp_emi_info.EMI_Entry[i].OFFSET = EMI_TABLE[i][1];
1366 sp_emi_info.EMI_Entry[i].SIZE = EMI_TABLE[i][2];
1367 }
1368 for(i = 0; i < number; i++)
1369 kal_prompt_trace(MOD_L1SP, "SP_Parse_EMI_Info %d %d %d %d", i, sp_emi_info.EMI_Entry[i].TYPE, sp_emi_info.EMI_Entry[i].OFFSET, sp_emi_info.EMI_Entry[i].SIZE);
1370
1371
1372 //temp solution. allocate the whole memory to enh
1373 l1sp.SphParamBuffer = (kal_uint32 *)(l1sp.AUIF_EMI_addr + sp_emi_info.EMI_Entry[(int)SP_EMI_AP_USIP_PARAMETER].OFFSET); //send address to DSP, not offset
1374 l1sp.SphParamBufferSize = sp_emi_info.EMI_Entry[(int)SP_EMI_AP_USIP_PARAMETER].SIZE;
1375 l1sp.SphOpenDSPBuffer = (kal_uint32 *)(l1sp.AUIF_EMI_addr + sp_emi_info.EMI_Entry[(int)SP_EMI_ADSP_USIP_PHONECALL].OFFSET); //send address to DSP, not offset
1376 l1sp.SphOpenDSPBufferSize = sp_emi_info.EMI_Entry[(int)SP_EMI_ADSP_USIP_PHONECALL].SIZE;
1377
1378 kal_prompt_trace(MOD_L1SP, "SP_Parse_EMI_Info_2 %d %d %d %d", l1sp.SphParamBuffer, l1sp.SphParamBufferSize, l1sp.SphOpenDSPBuffer, l1sp.SphOpenDSPBufferSize);
1379 kal_prompt_trace(MOD_L1SP, "SP_Parse_EMI_Info_3 %d %d", l1sp.AUIF_EMI_addr, l1sp.AUIF_EMI_size);
1380
1381
1382 }/*else{
1383 ASSERT(0);
1384 }*/
1385#endif
1386
1387 SAL_ExtAUIF_SetMemAddr(SAL_EXTAUIF_MEM_TYPE_OD, (kal_uint32)l1sp.SphOpenDSPBuffer, l1sp.SphOpenDSPBufferSize);
1388 SAL_ExtAUIF_SetMemAddr(SAL_EXTAUIF_MEM_TYPE_ENH, (kal_uint32)l1sp.SphParamBuffer, l1sp.SphParamBufferSize);
1389
1390
1391}
1392
1393kal_uint32* SP_GetSphParamBufAddr()
1394{//possible , NULL
1395 kal_prompt_trace(MOD_L1SP, "[DBG] %d", (kal_uint32)l1sp.SphParamBuffer);
1396 return l1sp.SphParamBuffer;
1397}
1398
1399kal_uint32 SP_GetSphParamBufSize()
1400{ //possible , 0
1401 return l1sp.SphParamBufferSize;
1402}
1403
1404#if 0
1405/* under construction !*/
1406/* under construction !*/
1407/* under construction !*/
1408/* under construction !*/
1409#endif
1410
1411
1412// TODO: this function should phase out
1413
1414/**
1415 @index: [Input] Identify which LID is going to provide
1416 @buffer: [Output] Buffer with the contain the result
1417 @len: [Input] Length of the output buffer
1418*/
1419void L1SP_GetNvramInfoByIndex(L1SP_NVRAM_INFO_INDEX index, void *buffer, uint16 len)
1420{
1421 switch(index)
1422 {
1423
1424 case L1SP_NVRAM_INFO_INDEX_WB_SPEECH_INPUT_FIR:
1425 {
1426 ASSERT(len == (NUM_SPH_INPUT_FIR * NUM_WB_FIR_COEFFS));
1427 }
1428 break;
1429 case L1SP_NVRAM_INFO_INDEX_WB_SPEECH_OUTPUT_FIR:
1430 {
1431 ASSERT(len == (NUM_SPH_OUTPUT_FIR * NUM_WB_FIR_COEFFS));
1432 }
1433 break;
1434 case L1SP_NVRAM_INFO_INDEX_WB_SPEECH_MODE_PARAM:
1435 {
1436 ASSERT(len == (NUM_SPH_MODE * NUM_MODE_PARAS));
1437 }
1438 break;
1439
1440 default:
1441 ASSERT(0);
1442 }
1443}
1444/**
1445 MED can put all nvram structure to AUD via this function. Audio/Speech driver will parsing the LID by itself.
1446
1447 @index: [Input] Identify which LID is used to parsing the buffer
1448 @buffer: [Input] Buffer with the contain from nvram
1449 @len: [Input] Length of the input buffer
1450*/
1451void L1SP_SetNvramInfoByIndex(L1SP_NVRAM_INFO_INDEX index, uint8* buffer, uint16 len)
1452{
1453 {
1454 bool L1Audio_IsInitialized();
1455 while( !L1Audio_IsInitialized()){
1456 kal_sleep_task(AUD_1TICK(1));
1457 }
1458 }
1459 return;
1460
1461}
1462
1463
1464
1465/**
1466 @device: device using in speech. pleae refer to
1467 #define L1SP_BUFFER_0 0x01 // NOTE: Don't use buffer definition directly
1468 #define L1SP_BUFFER_1 0x02 // Use speaker definition below
1469 #define L1SP_BUFFER_ST 0x04
1470 #define L1SP_BUFFER_EXT 0x08
1471 #define L1SP_BUFFER_EXT_G 0x10
1472 #define L1SP_STEREO2MONO 0x20 // Do not use this term for speaker definition
1473 #define L1SP_BUFFER_ST_M (L1SP_BUFFER_ST|L1SP_STEREO2MONO)
1474 #define L1SP_EXT_DAC_BUF0 0x40
1475 #define L1SP_EXT_DAC_BUF1 0x80
1476 Phase-out function without using
1477*/
1478void L1SP_SetOutputDevice( uint8 device )
1479{
1480}
1481
1482
1483/**
1484 Function is used when MODEM side has PGA gain & DSP digital gain control
1485 i.e. ANALOG_AFE_PATH_EXIST is defined
1486
1487 @volume1: MMI(EM) value from 0 to 256
1488 @digital_gain_index:unit is 0.5 db. Value from 0 to -64db (seems option)
1489*/
1490void L1SP_SetOutputVolume( uint8 volume1, int8 digital_gain_index )
1491{
1492}
1493#if 0
1494/* under construction !*/
1495/* under construction !*/
1496/* under construction !*/
1497/* under construction !*/
1498/* under construction !*/
1499/* under construction !*/
1500/* under construction !*/
1501/* under construction !*/
1502/* under construction !*/
1503/* under construction !*/
1504#endif
1505
1506
1507/**
1508 this function is to replace L1SP_SetSpeechVolumeLevel()
1509
1510 @level: [input] speech volume level for speech
1511 @v_paraIndex: [input] volume paramter (saving in nvram) index
1512*/
1513void L1SP_SetSpeechVolumeLevelByIndex(kal_uint8 level, kal_uint8 v_paraIndex)
1514{
1515// phase out.
1516// L1SP_SetSpeechVolumeLevel(level, l1sp.sph_allVolumePara[v_paraIndex][level]);
1517}
1518
1519/**
1520 Phase out function without using
1521 @src: microhpone source for speech, plese refer to
1522 #define L1SP_LNA_0 0
1523 #define L1SP_LNA_1 1
1524 #define L1SP_LNA_DIGITAL 2
1525 #define L1SP_LNA_FMRR 3
1526
1527*/
1528void L1SP_SetInputSource( uint8 src )
1529{
1530
1531}
1532
1533/**
1534 Phase out function without using
1535 @return: microphone source for speech
1536*/
1537uint8 L1SP_GetInputSource( void )
1538{
1539 return 0; // AFE_GetInputSource();
1540}
1541
1542
1543
1544/**
1545 @mic_volume: MMI(EM) value. Including Analog & digital gain
1546*/
1547void L1SP_SetMicrophoneVolume( uint8 mic_volume )
1548{
1549
1550
1551}
1552
1553#if 0
1554/* under construction !*/
1555/* under construction !*/
1556/* under construction !*/
1557/* under construction !*/
1558#endif
1559
1560
1561uint8 L1SP_GetMicrophoneVolume( void )
1562{
1563 return 0;
1564}
1565void L1SP_SetOpenDSPFlag(kal_uint8 flag)
1566{/* 0: internal SPE, 1: OpenDSP */
1567 l1sp.opendsp_flag = flag;
1568 MD_TRC_L1SP_SETOPENDSP_FLAG(flag);
1569}
1570kal_uint8 L1SP_GetOpenDSPFlag(void)
1571{/* 0: internal SPE, 1: OpenDSP */
1572 return l1sp.opendsp_flag;
1573}
1574/**
1575 Phase out function without using
1576 @sidetone: value from EM, which is 0~255.
1577*/
1578void L1SP_SetSidetoneVolume( uint8 sidetone )
1579{
1580 // keep API header to avoid link error
1581}
1582
1583
1584/**
1585 Phase out function without using
1586 @return: value from EM, which is 0~255.
1587*/
1588uint8 L1SP_GetSidetoneVolume( void )
1589{
1590 // keep API header to avoid link error,
1591 return 0;
1592}
1593
1594
1595void SP_MuteUlSource(bool mute)
1596{
1597#if defined( MTK_SLEEP_ENABLE )
1598 kal_uint16 aud_id = L1SP_GetAudID();
1599#endif
1600 l1sp.isUlSourceMute = mute;
1601 AM_Mute_UL_Source_Speech(mute);
1602
1603#if defined( MTK_SLEEP_ENABLE )
1604 L1SP_FreeAudID(aud_id);
1605#endif
1606
1607}
1608
1609/**
1610 running inside speech is active
1611 @mute: true for mute, false for unmute
1612*/
1613void SP_MuteDl_beforePcmMixer(bool mute)
1614{
1615 l1sp.dl_pre_PcmMixer_mute = mute;
1616 AM_Mute_DL_PRE_PcmMixer(mute);
1617}
1618
1619
1620void L1SP_SetCodecMuteByAp( bool mute )
1621{
1622 l1sp.dl_codec_mute_by_ap = mute;
1623
1624 AM_Mute_DL_Speech_Traffic(l1sp.codec_mute || l1sp.dl_codec_mute_by_ap);
1625}
1626
1627#if 0
1628/* under construction !*/
1629/* under construction !*/
1630/* under construction !*/
1631/* under construction !*/
1632/* under construction !*/
1633/* under construction !*/
1634/* under construction !*/
1635/* under construction !*/
1636/* under construction !*/
1637/* under construction !*/
1638/* under construction !*/
1639/* under construction !*/
1640/* under construction !*/
1641#endif
1642
1643void SP_MuteUlFromDiffPos(bool mute, SP_MIC_MUTE_POS pos)
1644{
1645#if defined( MTK_SLEEP_ENABLE )
1646 kal_uint16 aud_id = L1SP_GetAudID();
1647#endif
1648
1649 if(mute)
1650 l1sp.isULMute |= pos;
1651 else
1652 l1sp.isULMute &= (~pos);
1653
1654 AM_Mute_UL_POS_EN_Speech(0 != l1sp.isULMute); // use raming if possible
1655
1656#if defined( MTK_SLEEP_ENABLE )
1657 L1SP_FreeAudID(aud_id);
1658#endif
1659}
1660
1661/**
1662 For MED use ONLY!!!
1663 other function please use void SP_MuteUlFromDiffPos(bool mute, SP_MIC_MUTE_POS pos)
1664*/
1665void L1SP_MuteMicrophone( bool mute )
1666{
1667
1668 //AFE_MuteMicrophone( mute ); // do not use AFE_MuteMicrophone for speech enhancement
1669 // AM_MuteULSpeech( mute );
1670 // l1sp.isULMute = mute;
1671 SP_MuteUlFromDiffPos(mute, SP_MIC_MUTE_POS_FROM_MED);
1672}
1673
1674void L1SP_MuteSpeaker( bool mute )
1675{
1676#if 0 //def ANALOG_AFE_PATH_EXIST
1677/* under construction !*/
1678#else
1679
1680#if defined( MTK_SLEEP_ENABLE )
1681 kal_uint16 aud_id = L1SP_GetAudID();
1682#endif
1683 l1sp.isDLMute = mute;
1684 AM_Mute_DL_8K_Speech(l1sp.isDLMute);
1685#if defined( MTK_SLEEP_ENABLE )
1686 L1SP_FreeAudID(aud_id);
1687#endif
1688
1689#endif
1690}
1691
1692bool SP_IsSpeakerMute(void)
1693{
1694 return (l1sp.isDLMute!=0);
1695}
1696
1697bool SP_IsMicMute(void)
1698{
1699 return (l1sp.isULMute!=0);
1700}
1701
1702/**
1703 For MED use ONLY!!!
1704 other function please use SP_IsMicMute() instead
1705*/
1706bool L1SP_IsMicrophoneMuted( void )
1707{
1708 return (l1sp.isULMute&SP_MIC_MUTE_POS_FROM_MED)!=0;
1709 // return AM_IsULSpeechMuted();
1710}
1711
1712
1713#if defined( __UMTS_RAT__ )
1714
1715void L1SP_3G_Request(void)
1716{
1717 if(l1sp.state == L1SP_STATE_3G_SPEECH_ON)
1718 {
1719 CSR_Codec_Ready(SP3G_Rab_Id());
1720 return;
1721 }
1722}
1723#endif
1724
1725void L1SP_SetState(uint8 state)
1726{
1727#if defined( __UMTS_RAT__ )
1728 if(( l1sp.state == L1SP_STATE_2G_SPEECH_ON && state == L1SP_STATE_3G_SPEECH_ON ) ||
1729 ( l1sp.state == L1SP_STATE_2G_SPEECH_ON && state == L1SP_STATE_4G_SPEECH_ON ) ||
1730 ( l1sp.state == L1SP_STATE_3G_SPEECH_ON && state == L1SP_STATE_2G_SPEECH_ON ) ||
1731 ( l1sp.state == L1SP_STATE_3G_SPEECH_ON && state == L1SP_STATE_4G_SPEECH_ON ) ||
1732 ( l1sp.state == L1SP_STATE_4G_SPEECH_ON && state == L1SP_STATE_2G_SPEECH_ON ) ||
1733 ( l1sp.state == L1SP_STATE_4G_SPEECH_ON && state == L1SP_STATE_3G_SPEECH_ON ) )
1734 l1sp.interRAT = true;
1735#endif
1736 l1sp.state = state;
1737 MD_TRC_L1Audio_Msg_Speech_State(L1Audio_Speech_State(state));
1738}
1739
1740uint8 L1SP_GetState( void )
1741{
1742 return l1sp.state;
1743}
1744
1745
1746void L1SP_Set_isStandByMode(bool RAB_status)
1747{
1748 l1sp.isStandByMode = RAB_status;
1749 //TRC_MSG(L1SP_SET_ISSTANDBYMODE ,"L1SP_Set_isStandByMode: %d")
1750 MD_TRC_L1SP_SET_ISSTANDBYMODE((int)RAB_status);
1751}
1752
1753
1754bool L1SP_Get_isStandByMode( void )
1755{
1756 return l1sp.isStandByMode;
1757}
1758
1759
1760kal_bool L1SP_IsSpeechOn( void )
1761{
1762 return (AM_IsSpeechOn());
1763}
1764
1765bool voc_flag = false;
1766
1767void vmFilteChkTimerCallback(void)
1768{
1769 kal_prompt_trace(MOD_L1SP, "enter call back,%d, %d", voc_flag, ChkL1ClsFltr_L1Audio_VoC_TRACE_VM());
1770#ifdef __SENSITIVE_DATA_MOSAIC__
1771 if (dhl_mask_sensitive_trace_on())
1772 {
1773 kal_set_timer(sp_vmFilterChk_timer, (kal_timer_func_ptr)(vmFilteChkTimerCallback), NULL, KAL_TICKS_50_MSEC*20, AUD_1TICK(0));
1774 } else
1775#endif
1776 {
1777 if (false == voc_flag && ChkL1ClsFltr_L1Audio_VoC_TRACE_VM()) {
1778 // trigger VM start
1779 msg_send4(MOD_L1SP, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_VM_START);
1780 } else if(true == voc_flag && !ChkL1ClsFltr_L1Audio_VoC_TRACE_VM()) {
1781 msg_send4(MOD_L1SP, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_VM_STOP);
1782 } else {
1783 kal_set_timer(sp_vmFilterChk_timer, (kal_timer_func_ptr)(vmFilteChkTimerCallback), NULL, KAL_TICKS_50_MSEC*20, AUD_1TICK(0));
1784 }
1785 }
1786}
1787
1788void vocEnable(void)
1789{
1790 kal_uint32 voc_ptn = TVCI_CREATE_FILE;
1791 kal_uint32 *voc_ptn_ptr = &voc_ptn;
1792
1793 if(ChkL1ClsFltr_L1Audio_VoC_TRACE_VM())
1794 {
1795 MD_TRC_L1SP_PHONE_CALL(5, 1, 1);
1796 if(ChkL1ClsFltr_L1Audio_VoC_TRACE_EPL()) {
1797 MD_TRC_L1SP_PHONE_CALL(5, 1, 2);
1798 }
1799
1800#ifdef __SENSITIVE_DATA_MOSAIC__
1801 if (dhl_mask_sensitive_trace_on())
1802 {
1803 voc_flag = false;
1804 MD_TRC_L1SP_PHONE_CALL(5, 1, 4);
1805 } else
1806#endif
1807 {
1808 tst_vc_response(TVCI_VM_LOGGING, (const kal_uint8*)voc_ptn_ptr, 4);
1809 VMREC_Start(NULL, true);
1810 voc_flag = true;
1811 MD_TRC_L1SP_PHONE_CALL(5, 1, 3);
1812 }
1813 }
1814 else {
1815 MD_TRC_L1SP_PHONE_CALL(5, 1, 0);
1816 }
1817}
1818
1819void vocDisable(void)
1820{
1821
1822 kal_uint32 voc_ptn = TVCI_CLOSE_FILE;
1823 kal_uint32 *voc_ptn_ptr = &voc_ptn;
1824
1825 if(voc_flag)
1826 {
1827 tst_vc_response(TVCI_VM_LOGGING, (const kal_uint8*)voc_ptn_ptr, 4);
1828 VMREC_Stop(true);
1829 voc_flag = false;
1830 }
1831}
1832
1833
1834void L1SP_extcodec_hisr_ul(void *data)
1835{
1836#if defined(__SMART_PHONE_MODEM__)
1837 if(spc_isAcLoopback()) {
1838 Extcodec_hisr_ul_loopback(0);
1839 }
1840#endif
1841#if defined(__G_CODEC_SUPPORT__)
1842 else if( SP4G_Rab_State()){
1843 sp4g_hisr_ul_g(0);
1844 }
1845#endif
1846}
1847
1848void L1SP_extcodec_hisr_dl(void *data)
1849{
1850#if defined(__SMART_PHONE_MODEM__)
1851 if(spc_isAcLoopback()) {
1852 Extcodec_hisr_dl_loopback(0);
1853 }
1854#endif
1855#if defined(__G_CODEC_SUPPORT__)
1856 else if( SP4G_Rab_State()) {
1857 sp4g_hisr_dl_g(0);
1858 }
1859#endif
1860}
1861
1862/**
1863 MED task
1864*/
1865#include "med_spcio.h"
1866void L1SP_RampDone(void)
1867{
1868 AM_RAMP_DONE();
1869}
1870
1871void RAMP_DONE_Hisr(void * param)
1872{
1873 // Send notification to MED to begin data transfer
1874 msg_send4(MOD_L1SP, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_RAMP_DONE);
1875}
1876
1877void sp_enableBT_SCO(sp_device_info_t newDev, kal_uint8 voice8kMode)
1878{
1879#if defined(__CVSD_CODEC_SUPPORT__)
1880 if(!BT_SCO_IS_SPEECH_ON())
1881 {
1882 if (SPH_DEVINFO_BT_CVSD_MSBC == newDev) {
1883 ASSERT( (voice8kMode==0) || (voice8kMode==1) );
1884 BT_SCO_SPEECH_ON((voice8kMode == 1));
1885 } else if (SPH_DEVINFO_BT_CVSD == newDev) {
1886 BT_SCO_SPEECH_ON(false);
1887 } else if (SPH_DEVINFO_BT_MSBC == newDev){
1888 BT_SCO_SPEECH_ON(true);
1889 }
1890 }
1891#endif
1892
1893}
1894
1895void L1SP_Speech_On( uint8 RAT_Mode )
1896{
1897 MD_TRC_L1SP_PHONE_CALL(0, RAT_Mode, -1);
1898
1899 SPLog_GetFlagSetting(); //get logging flag setting from engineer mode
1900 if( AM_IsSpeechOn() )
1901 {
1902 sp_enableBT_SCO(l1sp.devInfo, l1sp.devSr);
1903 return;
1904 }
1905
1906#if defined(__G_CODEC_SUPPORT__)
1907 L1Audio_HookHisrHandler(DP_D2C_4G_PCM_DONE_UL,(L1Audio_EventHandler)L1SP_extcodec_hisr_ul, 0);
1908 L1Audio_HookHisrHandler(DP_D2C_4G_PCM_DONE_DL,(L1Audio_EventHandler)L1SP_extcodec_hisr_dl, 0);
1909#endif //#if defined(__G_CODEC_SUPPORT__)
1910
1911 l1sp.pre_l4c_codec = L1SP_L4C_NONE;
1912 // for phone call used.
1913 l1sp.aud_id = L1Audio_GetAudioID();
1914 L1Audio_SetFlag( l1sp.aud_id ); /* To lock sleep mode */
1915
1916 sp_emVoiceQuality.isNotify = KAL_FALSE;
1917 L1Audio_HookHisrHandler(DP_D2C_VOICE_QUALITY_ID,(L1Audio_EventHandler)sp_voiceQualityHisrHdl, 0);
1918
1919 //Check the mute status, this should always unmute.
1920 ASSERT(SAL_Mute_Check(SAL_MUTE_DL_8K)==0);
1921
1922 SP_DSPTone_ForceEnd();
1923
1924 spGain_Refresh2DSP();
1925
1926
1927#if defined(__VOLTE_SUPPORT__)
1928 sp4g_speech_init( RAT_4G_MODE );
1929#endif
1930
1931#if defined( __UMTS_RAT__ )
1932#ifdef __VIDEO_CALL_SUPPORT__
1933 if( RAT_Mode == RAT_3G324M_MODE )
1934 sp3g_speech_init( RAT_3G324M_MODE );
1935 else
1936#endif
1937 //In Dual mode, allow 2G/3G capability at initialization stage for InterRAT HO
1938 //if 3G324M, there is no InterRAT
1939 sp3g_speech_init( RAT_3G_MODE );
1940#endif
1941 MD_TRC_L1Audio_Msg_SP(0);
1942 kal_take_enh_mutex( sp_handover_mutex );
1943 // choose the mode is 2g /3g
1944#if defined(__VOLTE_SUPPORT__)
1945 if( SP4G_Rab_State()){
1946 RAT_Mode = RAT_4G_MODE;
1947 }else
1948#endif
1949#if defined( __UMTS_RAT__ )
1950 if( SP3G_Rab_State() && RAT_Mode != RAT_3G324M_MODE ){
1951 RAT_Mode = RAT_3G_MODE;
1952 }else
1953#endif
1954#if defined(__C2K_SPEECH_SUPPORT__)
1955 if (l1sp.isSO_Connected){
1956 RAT_Mode = RAT_C2K_MODE;
1957 }else
1958#endif
1959 if ( l1sp.tch_state ){
1960 RAT_Mode = RAT_2G_MODE;
1961 }
1962#if defined( __UMTS_RAT__ )
1963 else if(RAT_Mode != RAT_3G324M_MODE ){
1964 RAT_Mode = RAT_2G_MODE;
1965 }
1966 l1sp.interRAT = false;
1967#endif
1968#if defined(__VOLTE_SUPPORT__)
1969 MD_TRC_L1SP_PHONE_CALL(1, SP4G_Rab_State(), SP3G_Rab_State());
1970#endif
1971#if defined(__C2K_SPEECH_SUPPORT__)
1972 MD_TRC_L1SP_PHONE_CALL(2, l1sp.isSO_Connected, l1sp.tch_state);
1973#else
1974 MD_TRC_L1SP_PHONE_CALL(2, -1, l1sp.tch_state);
1975#endif
1976 MD_TRC_L1SP_PHONE_CALL(3, RAT_Mode, -1);
1977 MD_TRC_L1SP_PHONE_CALL(3, -1, -1);
1978
1979 MD_TRC_L1Audio_Msg_SP(1);
1980 AM_SpeechOn(RAT_Mode, 0);
1981 MD_TRC_L1Audio_Msg_SP(2);
1982
1983 switch(RAT_Mode)
1984 {
1985 case RAT_2G_MODE:
1986 L1SP_SetState(L1SP_STATE_2G_SPEECH_ON);
1987 break;
1988#if defined( __UMTS_RAT__ )
1989 case RAT_3G_MODE:
1990 L1SP_SetState(L1SP_STATE_3G_SPEECH_ON);
1991 CSR_Codec_Ready(SP3G_Rab_Id());
1992 break;
1993#ifdef __VIDEO_CALL_SUPPORT__
1994 case RAT_3G324M_MODE:
1995 L1SP_SetState(L1SP_STATE_3G324M_SPEECH_ON);
1996 vt_SP3G_Callback( (kal_uint8)SP3G_CODEC_READY, (void*)0 );
1997 break;
1998#endif
1999#endif
2000#if defined(__VOLTE_SUPPORT__)
2001 case RAT_4G_MODE:
2002 L1SP_SetState(L1SP_STATE_4G_SPEECH_ON);
2003 PSR_SP4G_Callback(SP4G_CODEC_READY, (void*)SP4G_Rab_Id());
2004 break;
2005#endif
2006#if defined(__C2K_SPEECH_SUPPORT__)
2007 case RAT_C2K_MODE:
2008 L1SP_SetState(L1SP_STATE_C2K_SPEECH_ON);
2009 sub_SPC2K_ConSSO_Done();
2010 break;
2011#endif
2012 default:
2013 ASSERT(false);
2014 }
2015 MD_TRC_L1SP_PHONE_CALL(4, -1, -1);
2016 kal_give_enh_mutex( sp_handover_mutex );
2017 MD_TRC_L1SP_PHONE_CALL(5, -1, -1);
2018
2019#ifndef __L1_STANDALONE__ // avoid link error
2020 vocEnable();
2021 kal_set_timer(sp_vmFilterChk_timer, (kal_timer_func_ptr)(vmFilteChkTimerCallback), NULL, KAL_TICKS_50_MSEC*20, AUD_1TICK(0));
2022#endif
2023 emCodecTimerOn();
2024
2025 //always unmute DSP uplink when speech on (This is to keep the mute definition)
2026
2027 SetSpeechEnhancement( true );
2028
2029// for phone call usage
2030#if !DATA_CARD_DISABLE_INTERNAL
2031#if defined(__DATA_CARD_SPEECH__)
2032 if (l1sp.strmOnHandler != NULL)
2033 l1sp.strmOnHandler( NULL );
2034#endif
2035#endif
2036
2037#if defined(__ECALL_SUPPORT__)
2038 if (l1sp.pcm4wayOnHandler != NULL)
2039 l1sp.pcm4wayOnHandler( (void *)0);
2040#endif
2041
2042 sp_enableBT_SCO(l1sp.devInfo, l1sp.devSr);
2043
2044 MD_TRC_L1Audio_Msg_SP(4);
2045
2046 if(L1SP_L4C_EVENT_NONE != l1sp.codec_mute_mode) {
2047 l1audio_sph_srv_SMMT_Start();
2048 }
2049
2050}
2051
2052
2053#if defined(__DATA_CARD_SPEECH__)
2054void L1SP_Register_Strm_Handler(
2055 void (*onHandler)(void *hdl),
2056 void (*offHandler)(void *hdl),
2057 void (*hdl)(kal_uint32 event, void *param))
2058{
2059 l1sp.strmOnHandler = onHandler;
2060 l1sp.strmOffHandler = offHandler;
2061 l1sp.strmHdl = hdl;
2062 //For MOLY00004781, sometimes auto script hit that register handler later than speech on. In this case, we let daca run.
2063 if( AM_IsSpeechOn() ){
2064 l1sp.strmOnHandler(NULL);
2065 }
2066}
2067
2068void L1SP_UnRegister_Strm_Handler( void )
2069{
2070 if(AM_IsDataCardOn() && (l1sp.strmOffHandler != NULL)){
2071 /* Normal Case: PLUGIN(RegisterHandler)-->SpeechOn(OnHandler)-->SpeechOff(OffHandler) -->PLUGOUT(UnRegisterHandler)
2072 Unexpected Case: PLUGIN(RegisterHandler)-->SpeechOn(OnHandler)-->PLUGOUT(UnRegisterHandler), registerHandler again -->SpeechOff(OffHandler) */
2073 DACA_Stop(DACA_APP_TYPE_ACTIVE_UL_DL_WB);
2074 }
2075 l1sp.strmOnHandler = NULL;
2076 l1sp.strmOffHandler = NULL;
2077}
2078#endif
2079
2080#if defined(__ECALL_SUPPORT__)
2081void L1SP_Register_Pcm4WayService(void (*onHandler)(void *), void (*offHandler)(void *))
2082{
2083 l1sp.pcm4wayOnHandler = onHandler;
2084 l1sp.pcm4wayOffHandler = offHandler;
2085}
2086
2087void L1SP_UnRegister_Pcm4Way_Service( void )
2088{
2089 l1sp.pcm4wayOnHandler = NULL;
2090 l1sp.pcm4wayOffHandler = NULL;
2091}
2092#endif
2093
2094void L1SP_Speech_Off( void )
2095{
2096
2097#if defined(__CVSD_CODEC_SUPPORT__)
2098 if(BT_SCO_IS_SPEECH_ON())
2099 {
2100 BT_SCO_SPEECH_OFF();
2101 }
2102#endif
2103
2104 if( !AM_IsSpeechOn() )
2105 return;
2106
2107 // due to AP will close DL directly before speech off, so md can mute dl directly without ramping
2108 // This will prevent sound pushes to hardware buffer then cause noise
2109 SAL_Mute_Ctrl(SAL_MUTE_DL_8K, KAL_TRUE);
2110
2111 l1audio_sph_srv_SMMT_End();
2112
2113#if !DATA_CARD_DISABLE_INTERNAL
2114//FIXME: for phone call usage
2115#if defined(__DATA_CARD_SPEECH__)
2116 if (l1sp.strmOffHandler != NULL)
2117 l1sp.strmOffHandler( NULL );
2118#endif
2119#endif
2120
2121#if defined(__ECALL_SUPPORT__)
2122 if (l1sp.pcm4wayOffHandler != NULL)
2123 l1sp.pcm4wayOffHandler( (void *)0 );
2124#endif
2125
2126 SetSpeechEnhancement( false );
2127
2128 emCodecTimerOff();
2129 kal_cancel_timer(sp_vmFilterChk_timer);
2130#ifndef __L1_STANDALONE__ // avoid link error
2131 vocDisable();
2132#endif
2133 MD_TRC_L1SP_PHONE_CALL(20, -1, -1);
2134 kal_take_enh_mutex( sp_handover_mutex );
2135 MD_TRC_L1SP_PHONE_CALL(21, -1, -1);
2136
2137 AM_SpeechOff(0);
2138
2139#if defined(__VOLTE_SUPPORT__)
2140 {
2141 uint8 state;
2142 state = l1sp.state;
2143
2144 if(l1sp.state == L1SP_STATE_4G_SPEECH_ON || l1sp.interRAT ){
2145 L1SP_SetState(L1SP_STATE_4G_SPEECH_CLOSING);
2146 }
2147 sp4g_speech_close();
2148
2149 /* only these cases should wait state, if only 2G happen, then return to idle */
2150 if( state == L1SP_STATE_4G_SPEECH_ON || l1sp.interRAT
2151 ){
2152 PSR_SP4G_Callback(SP4G_CODEC_CLOSED, (void*)SP4G_Rab_Id());
2153 }
2154 }
2155#endif
2156
2157#if defined( __UMTS_RAT__ )
2158 {
2159 if(l1sp.state == L1SP_STATE_3G_SPEECH_ON || l1sp.interRAT
2160#ifdef __VIDEO_CALL_SUPPORT__
2161 || l1sp.state == L1SP_STATE_3G324M_SPEECH_ON
2162#endif
2163 ){
2164 L1SP_SetState(L1SP_STATE_3G_SPEECH_CLOSING);
2165 }
2166 sp3g_speech_close(l1sp.interRAT);
2167 }
2168#endif
2169
2170#if defined(__C2K_SPEECH_SUPPORT__)
2171 {
2172 uint8 state;
2173 state = l1sp.state;
2174
2175 if(l1sp.state == L1SP_STATE_C2K_SPEECH_ON || l1sp.isSO_Connected){
2176 L1SP_SetState(L1SP_STATE_C2K_SPEECH_CLOSING);
2177 }
2178
2179 if( state == L1SP_STATE_C2K_SPEECH_ON || l1sp.isSO_Connected){
2180 //uint32 waitTime;
2181 ;//TODO : Daniel : CSR_Codec_Close(SP3G_Rab_Id());
2182 }
2183 }
2184#endif
2185
2186 L1SP_SetState( L1SP_STATE_IDLE );
2187 L1SP_Set_isStandByMode( false );
2188 MD_TRC_L1SP_PHONE_CALL(22, -1, -1);
2189 kal_give_enh_mutex( sp_handover_mutex );
2190 MD_TRC_L1SP_PHONE_CALL(23, -1, -1);
2191
2192#if defined(__VIBRATION_SPEAKER_SUPPORT__)
2193 VIBR_Vibration_Activate();
2194#endif
2195
2196 SAL_Mute_Ctrl(SAL_MUTE_DL_8K, KAL_FALSE);
2197 //always unmute DSP uplink after speech off to keep the mute definition
2198 SP_MuteUlFromDiffPos(false, SP_MIC_MUTE_POS_FROM_ALL);
2199 L1SP_MuteSpeaker(false);
2200 L1SP_SetCodecMuteByAp(false);
2201 SP_MuteUlSource(false);
2202 SP_MuteDl_beforePcmMixer(false);
2203 L1SP_RampDone();
2204
2205#if defined(__G_CODEC_SUPPORT__)
2206 L1Audio_UnhookHisrHandler(DP_D2C_4G_PCM_DONE_UL);
2207 L1Audio_UnhookHisrHandler(DP_D2C_4G_PCM_DONE_DL);
2208#endif //#if defined(__G_CODEC_SUPPORT__)
2209
2210 L1Audio_UnhookHisrHandler(DP_D2C_VOICE_QUALITY_ID);
2211
2212 L1Audio_ClearFlag( l1sp.aud_id );
2213 L1Audio_FreeAudioID( l1sp.aud_id );
2214
2215 // clean emCodec
2216 SP_updateEmCodecEvent();
2217 MD_TRC_L1SP_PHONE_CALL(24, -1, -1);
2218}
2219
2220#if 0
2221/* under construction !*/
2222/* under construction !*/
2223/* under construction !*/
2224/* under construction !*/
2225#endif
2226
2227void L1SP_SetAfeLoopback( bool enable )
2228{
2229#if defined( MTK_SLEEP_ENABLE )
2230 kal_uint16 aud_id = L1SP_GetAudID();
2231#endif
2232 if( enable )
2233 AFE_TurnOnLoopback();
2234 else
2235 AFE_TurnOffLoopback();
2236#if defined( MTK_SLEEP_ENABLE )
2237 L1SP_FreeAudID(aud_id);
2238#endif
2239}
2240
2241#if 0
2242/* under construction !*/
2243/* under construction !*/
2244/* under construction !*/
2245/* under construction !*/
2246/* under construction !*/
2247/* under construction !*/
2248/* under construction !*/
2249/* under construction !*/
2250#endif
2251
2252
2253
2254#if defined(_SPE_ENH_MD_PARSE_)
2255void L1SP_LoadSpeechPara( void )
2256{
2257#if defined( MTK_SLEEP_ENABLE )
2258 kal_uint16 aud_id = L1SP_GetAudID();
2259#endif
2260 SPE_LoadSpeechPara(l1sp.sph_c_para, l1sp.sph_m_para, l1sp.sph_m_paraWb,l1sp.sph_m_paraSWb);
2261#if defined( MTK_SLEEP_ENABLE )
2262 L1SP_FreeAudID(aud_id);
2263#endif
2264}
2265#endif
2266
2267// ----------------------------------------------------------------------------
2268// codec information update
2269// ----------------------------------------------------------------------------
2270
2271#include "em_audio_public_struct.h"
2272#include "em_msgid.h"
2273#include "md_sap.h"
2274
2275void emCodecTimerCallback(void)
2276{
2277 SP_updateEmCodecEvent();
2278 if (false == voc_flag && (true == AM_IsSpeechOn()) && (false==l1sp.isEmCodecNotifyOff)) {
2279 kal_set_timer(sp_emCodec_timer, (kal_timer_func_ptr)(emCodecTimerCallback), NULL, AUD_1TICK(4), AUD_1TICK(0));
2280 }
2281}
2282
2283void emCodecTimerOn(void)
2284{
2285 if (false == voc_flag && (true == AM_IsSpeechOn()) && (false==l1sp.isEmCodecNotifyOff)) {
2286 kal_set_timer(sp_emCodec_timer, (kal_timer_func_ptr)(emCodecTimerCallback), NULL, AUD_1TICK(4), AUD_1TICK(0));
2287 }
2288}
2289
2290void emCodecTimerOff(void)
2291{
2292 kal_cancel_timer(sp_emCodec_timer);
2293}
2294
2295/**
2296 call from MED, to turn/off EM codec filter
2297 @isOff:
2298*/
2299void SP_setEmCodecNotifyOff(bool isOff){
2300
2301 bool orgValue = l1sp.isEmCodecNotifyOff;
2302 l1sp.isEmCodecNotifyOff = isOff;
2303
2304 if(true==isOff && false==orgValue){ // turn off
2305 emCodecTimerOff();
2306 } else if(false==isOff && true==orgValue){ // turn on
2307 emCodecTimerOn();
2308 }
2309
2310
2311}
2312
2313#if 0
2314/* under construction !*/
2315/* under construction !*/
2316/* under construction !*/
2317/* under construction !*/
2318/* under construction !*/
2319/* under construction !*/
2320/* under construction !*/
2321/* under construction !*/
2322/* under construction !*/
2323/* under construction !*/
2324/* under construction !*/
2325/* under construction !*/
2326/* under construction !*/
2327/* under construction !*/
2328/* under construction !*/
2329/* under construction !*/
2330/* under construction !*/
2331/* under construction !*/
2332/* under construction !*/
2333/* under construction !*/
2334/* under construction !*/
2335#endif
2336
2337void SP_updateEmCodecEvent(void)
2338{
2339 if(true == l1sp.isEmCodecNotifyOff) {
2340 MD_TRC_SP_EM_UPDATE_CODEC(l1sp.isEmCodecNotifyOff,
2341 SAL_Get_Codec_Mode(0), SAL_Get_Codec_Mode(1),
2342 voc_flag, L1SP_GetState());
2343 return;
2344 } else { // set event
2345 if(kal_if_lisr())
2346 L1Audio_LSetEvent(l1sp.aud_id_em_codec_update, NULL);
2347 else
2348 L1Audio_SetEvent(l1sp.aud_id_em_codec_update, NULL);
2349 }
2350}
2351
2352void sp_updateEmCodecEventHandler(void)
2353{
2354 ilm_struct ilm;
2355 em_speech_info_sph_codec_ind_struct *em_para_ptr;
2356
2357 if((true == AM_IsSpeechOn()) && (true==l1sp.codec_mute)){ //During ESPEECH OFF, skip
2358 return;
2359 }
2360
2361 ilm.src_mod_id = MOD_L1SP;
2362 ilm.dest_mod_id = MOD_DHL;
2363 ilm.sap_id = EM_PS_SAP;
2364 ilm.msg_id = MSG_ID_EM_SPEECH_INFO_SPH_CODEC_IND;
2365 em_para_ptr = (em_speech_info_sph_codec_ind_struct *)(construct_local_para(sizeof(em_speech_info_sph_codec_ind_struct ), TD_RESET));
2366
2367 em_para_ptr->em_info = EM_SPEECH_INFO_SPH_CODEC;
2368
2369 if(true == AM_IsSpeechOn()) {
2370 em_para_ptr->ulSphCodec = SAL_Get_Codec_Mode(0);
2371 em_para_ptr->dlSphCodec = SAL_Get_Codec_Mode(1);
2372 } else {
2373 em_para_ptr->ulSphCodec = SPH_CODEC_CODEC_NONE;
2374 em_para_ptr->dlSphCodec = SPH_CODEC_CODEC_NONE;
2375 }
2376 em_para_ptr->sphNetwork = L1SP_GetState();
2377
2378 ilm.local_para_ptr = (local_para_struct*)em_para_ptr;
2379 ilm.peer_buff_ptr = NULL;
2380 dhl_EM_logger(&ilm);
2381
2382 destroy_ilm(&ilm); //or free_local_para((local_para_struct*)em_para_ptr );
2383}
2384
2385
2386void l1sp_NetworkStatusNotification(void)
2387{
2388 if(kal_if_lisr())
2389 L1Audio_LSetEvent(l1sp.aud_id_network_status, NULL );
2390 else
2391 L1Audio_SetEvent(l1sp.aud_id_network_status, NULL);
2392}
2393
2394//AUDIO task
2395void l1sp_send_codec_status_notify(uint32 codec)//to L4C
2396{
2397#if !defined(__L1_STANDALONE__)
2398 // uint32 codec = (uint32) data;
2399 L1SP_L4C_Codec l4c_codec = L1SP_L4C_NONE;
2400
2401 switch(codec){
2402 case 0:
2403 l4c_codec = L1SP_L4C_GSM_FR;
2404 break;
2405 case 1:
2406 l4c_codec = L1SP_L4C_GSM_HR;
2407 break;
2408 case 2:
2409 l4c_codec = L1SP_L4C_GSM_EFR;
2410 break;
2411
2412 // c2k
2413 case SPH_CODEC_C2K_SO3:
2414 l4c_codec = L1SP_L4C_EVRC;
2415 break;
2416 case SPH_CODEC_C2K_SO17:
2417 l4c_codec = L1SP_L4C_QCELP13K;
2418 break;
2419 case SPH_CODEC_C2K_SO68:
2420 l4c_codec = L1SP_L4C_EVRC_B;
2421 break;
2422 case SPH_CODEC_C2K_SO73:
2423 l4c_codec = L1SP_L4C_EVRC_NW;
2424 break;
2425 case SPH_CODEC_C2K_SO73WB:
2426 l4c_codec = L1SP_L4C_EVRC_WB;
2427 break;
2428
2429 default:
2430
2431 if(codec >= 0x3 && codec <= 0xA ){
2432 l4c_codec = L1SP_L4C_AMR_NB;
2433 }else if(codec >= 0x20 && codec <= 0x28 ){
2434 l4c_codec = L1SP_L4C_AMR_WB;
2435 }else if(codec >= SPH_CODEC_EVS_08K_005_9 && codec <= SPH_CODEC_EVS_08K_000_0_NODATA ){
2436
2437 l4c_codec = L1SP_L4C_EVS_NB;
2438 }else if(codec >= SPH_CODEC_EVS_16K_005_9 && codec <= SPH_CODEC_EVS_16K_000_0_NODATA ){
2439
2440 l4c_codec = L1SP_L4C_EVS_WB;
2441 }else if(codec >= SPH_CODEC_EVS_32K_005_9 && codec <= SPH_CODEC_EVS_32K_000_0_NODATA ){
2442
2443 l4c_codec = L1SP_L4C_EVS_SW;
2444 }else if(codec >= SPH_CODEC_EVS_48K_005_9 && codec <= SPH_CODEC_EVS_48K_000_0_NODATA ){
2445
2446 l4c_codec = L1SP_L4C_EVS_FB;
2447 }else if(codec >= SPH_CODEC_EVS_AWB_06_60 && codec <= SPH_CODEC_EVS_AWB_00_00_NODATA ){
2448
2449 l4c_codec = L1SP_L4C_EVS_AWB;
2450 }
2451 break;
2452 }
2453
2454 if(l1sp.pre_l4c_codec != l4c_codec){
2455 MD_TRC_L1SP_L4C_SEND_CODEC(codec, l4c_codec, l1sp.pre_l4c_codec);
2456 l4c_report_voice_codec(l4c_codec);
2457 l1sp.pre_l4c_codec = l4c_codec;
2458 }else{
2459 MD_TRC_L1SP_L4C_SEND_CODEC_SKIP3(l4c_codec);
2460 }
2461#endif
2462}
2463
2464void l1sp_notify_network_status( void )
2465{
2466
2467 uint32 amCodec = AM_GetSpeechMode();
2468
2469 MD_TRC_L1SP_NOTIFY_NETWORK_STATUS(amCodec);
2470 msg_send6(MOD_L1SP, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_SP_UPDATE_SPEECH_ENHANCEMENT_PARAMETER, NULL, NULL);
2471 if(l1sp.codec_mute){//During ESPEECH OFF, skip all codec notification
2472 MD_TRC_L1SP_L4C_SEND_CODEC_SKIP(amCodec);
2473 return;
2474 }
2475
2476 if(!L1SP_IsSpeechOn()){//During ESPEECH OFF, skip all codec notification
2477 MD_TRC_L1SP_L4C_SEND_CODEC_SKIP2();
2478 return;
2479 }
2480 // send via L4C. too keep original process
2481 l1sp_send_codec_status_notify(amCodec);
2482
2483#if defined(__SMART_PHONE_MODEM__)
2484 extern void spc_send_network_status_notify(em_speech_info_SpeechCodecType codec);
2485 spc_send_network_status_notify((em_speech_info_SpeechCodecType)amCodec);
2486#endif
2487
2488 //msg_send6(MOD_L1SP, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_SP_UPDATE_SPEECH_ENHANCEMENT_PARAMETER, NULL, NULL);
2489 MD_TRC_L1SP_NOTIFY_NETWORK_STATUS(-1);
2490}
2491
2492#if defined(_SPE_ENH_MD_PARSE_)
2493extern const unsigned short Speech_Normal_Mode_Para[16];
2494extern const unsigned short WB_Speech_Normal_Mode_Para[16];
2495#endif
2496void L1SP_Init( void )
2497{
2498 l1sp.tch_state = KAL_FALSE;
2499 uint16 commonP[] = DEFAULT_SPEECH_COMMON_PARA;
2500
2501 memset(&l1sp.sph_c_para, 0, NUM_COMMON_PARAS*sizeof(uint16));
2502#if defined(_SPE_ENH_MD_PARSE_)
2503 memset(&l1sp.sph_m_para, 0, NUM_MODE_PARAS*sizeof(uint16));
2504 // memset(&l1sp.sph_v_para, 0, NUM_VOL_PARAS*sizeof(uint16));
2505 memset(&l1sp.sph_m_paraWb, 0, NUM_MODE_PARAS*sizeof(uint16));
2506 memset(&l1sp.sph_m_paraSWb, 0, NUM_MODE_PARAS*sizeof(uint16));
2507 memcpy(l1sp.sph_m_para, Speech_Normal_Mode_Para, 16*sizeof(uint16));
2508 memcpy( l1sp.sph_m_paraWb, WB_Speech_Normal_Mode_Para, 16*sizeof(uint16));
2509 memcpy( l1sp.sph_m_paraSWb, WB_Speech_Normal_Mode_Para, 16*sizeof(uint16));
2510 L1SP_LoadCommonSpeechPara(commonP);
2511#endif
2512 memcpy(l1sp.sph_c_para, commonP, NUM_COMMON_PARAS*sizeof(uint16));
2513
2514
2515 l1sp.devInfo = 0;
2516 l1sp.devSr = 2; // similar to afe.voice8kMode = 2 but keeping in driver. for
2517 SP_SetDevicePath(l1sp.devInfo, l1sp.devSr);
2518
2519#if 0 // def ANALOG_AFE_PATH_EXIST
2520/* under construction !*/
2521#else
2522 l1sp.mic_volume = 0;
2523#endif
2524
2525
2526#if defined( __UMTS_RAT__ )
2527 sp3g_init();
2528 l1sp.interRAT = false;
2529#endif
2530#if defined(__VOLTE_SUPPORT__)
2531 sp4g_init();
2532#endif
2533#if defined(__C2K_SPEECH_SUPPORT__)
2534 SPC2K_init();
2535#endif
2536 SPE_Init();
2537 // l1sp.spe_flag = true;
2538 l1sp.isDLMute = l1sp.isULMute = false;
2539 l1sp.codec_mute = true;
2540 l1sp.codec_mute_mode = L1SP_L4C_EVENT_NONE;
2541 l1sp.dl_codec_mute_by_ap = false;
2542
2543
2544#if defined(__DATA_CARD_SPEECH__)
2545 l1sp.strmOnHandler = NULL;
2546 l1sp.strmOffHandler = NULL;
2547 l1sp.strmHdl = NULL;
2548#endif
2549#if defined(__ECALL_SUPPORT__)
2550 l1sp.pcm4wayOnHandler = NULL;
2551 l1sp.pcm4wayOffHandler = NULL;
2552#endif
2553 L1SP_Set_isStandByMode( false );
2554 l1sp.pre_l4c_codec = L1SP_L4C_NONE;
2555 L1SP_SetState(L1SP_STATE_IDLE);
2556 l1sp.aud_id_network_status = L1Audio_GetAudioID();
2557 sp_vmFilterChk_timer = kal_create_timer("vmFltChk");
2558
2559 L1Audio_SetEventHandler(l1sp.aud_id_network_status, (L1Audio_EventHandler)l1sp_notify_network_status);
2560
2561 l1sp.aud_id_em_codec_update = L1Audio_GetAudioID();
2562 L1Audio_SetEventHandler(l1sp.aud_id_em_codec_update, (L1Audio_EventHandler)sp_updateEmCodecEventHandler);
2563 sp_emCodec_timer = kal_create_timer("emCodec");
2564
2565 l1sp.aud_id_voice_quality_event = L1Audio_GetAudioID();
2566 l1sp.isEmCodecNotifyOff = true;
2567 L1Audio_SetEventHandler(l1sp.aud_id_voice_quality_event, (L1Audio_EventHandler)sp_voiceQualityEventHdl);
2568
2569#if defined(__C2K_SPEECH_SUPPORT__)
2570 l1sp.c2k_so_codec = SAL_C2K_COD_MODE_UNDEF;
2571 l1sp.isConSSO_Done = l1sp.isSO_Connected = false;
2572#endif
2573 l1sp.opendsp_flag = 0;
2574 l1sp.rampDoneHandler = RAMP_DONE_Hisr;
2575 L1Audio_HookHisrHandler(DP_D2C_RAMP_DONE_INT_ID, (L1Audio_EventHandler)l1sp.rampDoneHandler , 0);
2576}
2577kal_bool L1SP_TCH_State( void )
2578{
2579 return l1sp.tch_state;
2580}
2581
2582void ChangeRAT_Mode(SP_CHANGERAT_EVENT event, kal_uint32 param1, kal_uint32 param2)
2583{
2584 MD_TRC_SP_CHANGERAT_MODE(event, param1, param2);
2585 switch(event){
2586 case SP_2G_HANDOVER:
2587 //param1 : codec
2588 //param2 : sub_channel
2589 {
2590 void cc_2G_Call_Handover(kal_uint32 speech_mode, kal_uint32 sub_channel);
2591 cc_2G_Call_Handover(param1, param2);
2592 AM_SetSpeechMode(param1, param2);
2593 }
2594 l1sp_NetworkStatusNotification();
2595 // l1sp_CodecStatusNotification((uint16)param1);
2596 break;
2597 case SP_2G_AUDIOMANAGER_INFO:
2598 AM_Set2GCodecInfo((uint16)param1, (int8)param2);
2599 break;
2600 case SP_2G_TCH:
2601 //param1 : on / off
2602 {
2603 void L1SP_TCH_Notify( bool bOn );
2604 L1SP_TCH_Notify( param1);
2605 }
2606 break;
2607 case SP_3G_RAB:
2608 //param1 : on / off
2609 //param2 : codec
2610 break;
2611 case SP_4G_RAB:
2612 //param1 : on / off
2613 //param2 : codec
2614 break;
2615 }
2616
2617
2618 if( AM_IsSpeechOn() ){
2619 //original
2620 //switch( L1SP_GetState() == L1SP_STATE_4G_SPEECH_ON )
2621 //new
2622 }else{
2623
2624 }
2625}
2626
2627// This is invoked by 2G L1D(LISR)
2628void L1SP_TCH_Notify( bool bOn )
2629{
2630 kal_take_enh_mutex( sp_handover_mutex );
2631 if( !bOn ){ // for 2G->3G handover, mute speech in case Speech_Off command too late to avoid noise
2632 MD_TRC_L1Audio_Msg_TCH_NOTIFY(L1AUDIO_Str_onoff(0), L1Audio_Speech_State(l1sp.state));
2633 l1sp.tch_state = KAL_FALSE;
2634 SAL_Set_LinkStatus(SAL_LINKSTATUS_2G , false);
2635 //mute speech
2636#if defined(__VOLTE_SUPPORT__)
2637 if( SP4G_Rab_State() && l1sp.state != L1SP_STATE_4G_SPEECH_ON && l1sp.state != L1SP_STATE_IDLE){//2G->4G fail case, TCH will be off
2638 SP4G_Reset();
2639 AM_InterRAT_2G_to_4G(SP4G_GetCodecMode());
2640 L1SP_SetState( L1SP_STATE_4G_SPEECH_ON );
2641 }else
2642#endif
2643#if defined( __UMTS_RAT__ )
2644 if( SP3G_Rab_State() && l1sp.state != L1SP_STATE_3G_SPEECH_ON && l1sp.state != L1SP_STATE_IDLE){//3G->2G fail case, TCH will be off
2645 SP3G_Reset();
2646 AM_InterRAT_2G_to_3G(SP3G_GetCodecMode());
2647 L1SP_SetState( L1SP_STATE_3G_SPEECH_ON );
2648 }
2649#endif
2650#if defined(__C2K_SPEECH_SUPPORT__)
2651 if( L1SP_isC2KSO_Connected() && (l1sp.state != L1SP_STATE_C2K_SPEECH_ON) && (l1sp.state != L1SP_STATE_IDLE) ){
2652 //reset
2653 AM_InterRAT_2G_to_C2K(L1SP_GetC2KSO_Codec());
2654 L1SP_SetState( L1SP_STATE_C2K_SPEECH_ON );
2655 }
2656#endif
2657 }
2658 else{
2659 MD_TRC_L1Audio_Msg_TCH_NOTIFY(L1AUDIO_Str_onoff(1), L1Audio_Speech_State(l1sp.state));
2660 l1sp.tch_state = KAL_TRUE;
2661 SAL_Set_LinkStatus(SAL_LINKSTATUS_2G , true);
2662 //*DP_SC_MUTE &= ~0x0002;
2663#if defined(__VOLTE_SUPPORT__)
2664 if( l1sp.state == L1SP_STATE_4G_SPEECH_ON ){//4G->2G HO
2665 AM_InterRAT_4G_to_2G();
2666 L1SP_SetState( L1SP_STATE_2G_SPEECH_ON );
2667 }else
2668#endif
2669#if defined( __UMTS_RAT__ )
2670 if( l1sp.state == L1SP_STATE_3G_SPEECH_ON ){//3G->2G HO
2671 AM_InterRAT_3G_to_2G();
2672 L1SP_SetState( L1SP_STATE_2G_SPEECH_ON );
2673 }
2674#endif
2675#if defined(__C2K_SPEECH_SUPPORT__)
2676 if( l1sp.state == L1SP_STATE_C2K_SPEECH_ON ){//3G->2G HO
2677 AM_InterRAT_C2K_to_2G();
2678 L1SP_SetState( L1SP_STATE_2G_SPEECH_ON );
2679 }
2680#endif
2681 if( L1SP_Get_isStandByMode() ){//Standby->2G HO
2682 AM_InterRAT_Standby_to_2G();
2683 L1SP_SetState( L1SP_STATE_2G_SPEECH_ON );
2684 }
2685 }
2686 kal_give_enh_mutex( sp_handover_mutex );
2687}
2688
2689em_speech_info_SpeechCodecType L1SP_QuerySpeechDlCodec(void)
2690{
2691 em_speech_info_SpeechCodecType dlCodec = SPH_CODEC_CODEC_NONE;
2692
2693
2694 if(L1SP_STATE_IDLE != L1SP_GetState()) {
2695 // need to ensure the DSP is alive to query the value
2696 dlCodec = SAL_3G_GetValue(SAL_3G_VALUE_RX_CODEC_MODE);
2697
2698 } else {
2699
2700 }
2701
2702 return dlCodec;
2703
2704}
2705
2706void L1SP_SpeechLoopBackEnable(kal_bool fgEnable)
2707{
2708 SAL_LBK_Codec(fgEnable);
2709}
2710
2711//-----------------------------------------------------------------------------
2712// Line in related. Phase out
2713/*
2714
2715void LINEIN_SetOutputDevice( uint8 device )
2716{
2717 AFE_SetOutputDevice( L1SP_LINEIN, device );
2718}
2719
2720void LINEIN_SetOutputVolume( uint8 volume1, int8 digital_gain_index )
2721{
2722 AFE_SetOutputVolume( L1SP_LINEIN, volume1, digital_gain_index );
2723}
2724
2725void LINEIN_Open()
2726{
2727
2728 if (!lineon_flag){
2729 ktLock();
2730#if 0 // def ANALOG_AFE_PATH_EXIST
2731 AFE_TurnOnSpeaker(L1SP_LINEIN);
2732#endif
2733 lineon_flag = KAL_TRUE;
2734 }
2735}
2736
2737void LINEIN_Close()
2738{
2739 if(lineon_flag){
2740#if defined(MT6252H) || defined(MT6252)
2741 AFE_SetGainFastRamp(KAL_TRUE);
2742#endif
2743
2744#if 0 // def ANALOG_AFE_PATH_EXIST
2745 AFE_TurnOffSpeaker(L1SP_LINEIN);
2746#endif
2747
2748#if defined(MT6252H) || defined(MT6252)
2749 kal_sleep_task( AUD_1TICK(3) );
2750 AFE_SetGainFastRamp(KAL_FALSE);
2751#endif
2752
2753 ktUnlock();
2754 lineon_flag = KAL_FALSE;
2755 }
2756#if defined(__VIBRATION_SPEAKER_SUPPORT__)
2757 VIBR_Vibration_Activate();
2758#endif
2759}
2760
2761void LINEIN_MuteSpeaker( bool mute )
2762{
2763 AFE_MuteSpeaker( L1SP_LINEIN, mute );
2764}
2765
2766#if 0 // defined(__GAIN_TABLE_SUPPORT__)
2767void LINEIN_SetOutputGainControl( kal_uint32 gain ){
2768}
2769
2770void LINEIN_SetOutputGainControlDualPath( kal_uint32 ext_amp_gain ){
2771}
2772#endif
2773*/
2774//-----------------------------------------------------------------------------
2775void L1SP_MutePCMOuputPort ( kal_bool fMute )
2776{
2777
2778}
2779
2780//-----------------------------------------------------------------------------
2781
2782
2783bool SP_is_codec_mute()
2784{
2785 return l1sp.codec_mute;
2786}
2787
2788#if defined(__ECALL_SUPPORT__)
2789#if defined(__L5_SUPPORT__)
2790void SP_L5ECALL_SetEvent(L1SP_L5ECALL_Event event, kal_uint8 *data)
2791{
2792 ilm_SP_L5ECALL_SET_EVENT_t *local_para;
2793
2794 local_para = (ilm_SP_L5ECALL_SET_EVENT_t *) construct_local_para( sizeof(ilm_SP_L5ECALL_SET_EVENT_t), TD_CTRL );
2795 local_para->event = event;
2796 local_para->data = data;
2797 msg_send6(MOD_L1SP, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_SP_L5ECALL_SET_EVENT, (local_para_struct *)local_para, NULL);
2798}
2799
2800void SP_L5ECALL_SetEvent_Execute(L1SP_L5ECALL_Event event, kal_uint8 *data)
2801{
2802 switch(event){
2803 case L1SP_L5ECALL_INITIAL:
2804 Set_eCall_Par_Crtl_Switch(0);
2805 spc_gain_DlMuteSet(KAL_TRUE, KAL_FALSE);
2806 spc_gain_UlMuteSet(KAL_TRUE, KAL_FALSE);
2807 spc_eCall_IVS_Open();
2808 eCall_IVS_PutMSD(data,140,1);
2809 eCall_IVS_SendStart();
2810 break;
2811 case L1SP_L5ECALL_UPDATE_MSD:
2812 eCall_IVS_PutMSD(data,140,1);
2813 spc_gain_DlMuteSet(KAL_TRUE, KAL_FALSE);
2814 spc_gain_UlMuteSet(KAL_TRUE, KAL_FALSE);
2815 spc_eCall_IVS_Open();
2816 eCall_IVS_PutMSD(data,140,1);
2817 break;
2818 case L1SP_L5ECALL_RESET:
2819 spc_eCall_IVS_Close();
2820 spc_gain_DlMuteSet(KAL_FALSE, KAL_FALSE);
2821 spc_gain_UlMuteSet(KAL_FALSE, KAL_FALSE);
2822 break;
2823 default:
2824 ASSERT(0);
2825 }
2826}
2827#endif
2828#endif
2829
2830void SP_L4C_SetEvent(L1SP_L4C_Event event, L1SP_L4C_Event_Mode mode)
2831{
2832 #if defined(__SMART_PHONE_MODEM__)
2833 kal_prompt_trace(MOD_L1SP, "SP_L4C_SetEvent = %d %d %d", event, L1SP_GetState(), spc_isPCM());
2834 if(L1SP_STATE_C2K_SPEECH_ON == L1SP_GetState() && event){
2835 if(spc_isPCM()){
2836 L1Ctm_Close();
2837 }
2838 spc_C2KCtmStart(spc_getCtmMode());
2839 }
2840 #endif
2841 ilm_SP_L4C_SET_EVENT_t *local_para;
2842 MD_TRC_SP_L4C_SETEVENT_ENTER();
2843 local_para = (ilm_SP_L4C_SET_EVENT_t *) construct_local_para( sizeof(ilm_SP_L4C_SET_EVENT_t), TD_CTRL );
2844 local_para->event = event;
2845 local_para->mode = mode;
2846 msg_send6(MOD_L1SP, MOD_MED, AUDIO_SAP, MSG_ID_AUDIO_M2M_SP_L4C_SET_EVENT, (local_para_struct *)local_para, NULL);
2847 MD_TRC_SP_L4C_SETEVENT_LEAVE();
2848}
2849
2850
2851void SP_L4C_SetEvent_Execute(L1SP_L4C_Event event, L1SP_L4C_Event_Mode mode)
2852{
2853 MD_TRC_L1SP_L4C_EVENT(event, mode, l1sp.codec_mute_mode);
2854 MD_TRC_L1SP_MUTE_CONTROL_STATUS(0, l1sp.isULMute, l1sp.isDLMute, l1sp.codec_mute);
2855
2856 ASSERT( L1SP_L4C_EVENT_NONE == l1sp.codec_mute_mode || mode == l1sp.codec_mute_mode );
2857
2858 switch(event){
2859 case L1SP_L4C_ESPEECH_0:
2860 ASSERT(!l1sp.codec_mute);
2861 l1sp.codec_mute = true;
2862 l1sp.codec_mute_mode = L1SP_L4C_EVENT_NONE;
2863
2864 l1sp.pre_l4c_codec = L1SP_L4C_NONE; // reset codec when speech on / espeech off. (MED task)
2865 break;
2866 case L1SP_L4C_ESPEECH_1:
2867 ASSERT(l1sp.codec_mute);
2868 l1sp.codec_mute = false;
2869 l1sp.codec_mute_mode = mode;
2870 if(AM_IsSpeechOn()){
2871 l1audio_sph_srv_SMMT_Start();
2872 }
2873 break;
2874 default:
2875 ASSERT(0);
2876 }
2877 if(AM_IsSpeechOn()){
2878 l1sp_NetworkStatusNotification();
2879 }else{
2880 MD_TRC_SP_L4C_SKIP_NETWORKNOTIFICATION();
2881 }
2882 {
2883#if defined( MTK_SLEEP_ENABLE )
2884 kal_uint16 aud_id = L1SP_GetAudID();
2885#endif
2886 AM_Mute_DL_Speech_Traffic(l1sp.codec_mute || l1sp.dl_codec_mute_by_ap);
2887 AM_Mute_UL_Codec_Speech(l1sp.codec_mute);
2888#if defined( MTK_SLEEP_ENABLE )
2889 L1SP_FreeAudID(aud_id);
2890#endif
2891 MD_TRC_L1SP_MUTE_CONTROL_STATUS(1, l1sp.isULMute, l1sp.isDLMute, l1sp.codec_mute);
2892 }
2893}
2894
2895#if defined(__VOLTE_SUPPORT__)
2896static const L1SP_Tones tone_call_waiting[] = { { 440, 0, 200, 100, 1 },
2897 { 440, 0, 200,3500, 0 } };
2898
2899extern void spc_BgSndConfig(kal_uint8 ulGainLevel, kal_uint8 dlGainLevel);
2900int spc_ul_gain = 7;
2901int spc_dl_gain = 7;
2902#endif
2903void SpeechDVT(int item){
2904#if defined(__VOLTE_SUPPORT__)
2905 switch(item){
2906 case 0:
2907 spc_ul_gain --;
2908 if(spc_ul_gain<0)spc_ul_gain = 0;
2909 spc_BgSndConfig(spc_ul_gain, spc_dl_gain);
2910 break;
2911 case 1:
2912 spc_ul_gain ++;
2913 if(spc_ul_gain>7)spc_ul_gain = 7;
2914 spc_BgSndConfig(spc_ul_gain, spc_dl_gain);
2915 break;
2916 case 2:
2917 spc_dl_gain --;
2918 if(spc_dl_gain<0)spc_dl_gain = 0;
2919 spc_BgSndConfig(spc_ul_gain, spc_dl_gain);
2920 break;
2921 case 3:
2922 spc_dl_gain ++;
2923 if(spc_dl_gain>7)spc_dl_gain = 7;
2924 spc_BgSndConfig(spc_ul_gain, spc_dl_gain);
2925 break;
2926
2927 case 6:
2928 L1SP_Speech_On(RAT_2G_MODE);
2929 break;
2930 case 7:
2931 L1SP_Speech_Off();
2932 break;
2933
2934 case 57:
2935 SP4G_PSR_DL_KT_Play(300, 1300, 20000);
2936 break;
2937 case 58:
2938 SP4G_PSR_DL_KT_Stop();
2939 break;
2940 case 67:
2941 SP4G_PSR_UL_KT_Play(1000, 0, 20000);
2942 break;
2943 case 68:
2944 SP4G_PSR_UL_KT_Stop();
2945 break;
2946 case 69:
2947 //KT_SetOutputVolume(100,4096*2); //avoid build warning
2948 break;
2949 case 71:
2950 {
2951 SP4G_PSR_UL_Tone_Play( tone_call_waiting );
2952 }
2953 break;
2954 case 72:
2955 {
2956 SP4G_PSR_UL_Tone_Stop( );
2957 }
2958 break;
2959 case 73:
2960 {
2961 SP4G_PSR_DL_Tone_Play( tone_call_waiting );
2962 }
2963 break;
2964 case 74:
2965 {
2966 SP4G_PSR_DL_Tone_Stop( );
2967 }
2968 break;
2969 }
2970#endif
2971}
2972
2973#if defined(__VOLTE_SUPPORT__)
2974#include "l1sp_el2_struct.h"
2975#if defined(__MCU_DTMF_SUPPORT__)
2976uint32 VolteToneGetID();
2977void VolteToneSetID(uint32 u32val);
2978bool VolteToneGetUsed();
2979void VolteToneSetUsed(bool bval);
2980#endif //#if defined(__MCU_DTMF_SUPPORT__)
2981#endif //#if defined(__VOLTE_SUPPORT__)
2982#ifdef __FAKE_3G_LOOPBACK__
2983kal_uint8 tmp_buf[1000];
2984void SP3GHSPA_UL_GetSpeechFrame(kal_uint8 *frame_type, kal_uint8 *rab_byte_array, kal_uint8 *len);
2985void SP3GHSPA_DL_PutSpeechFrame(kal_uint32 CFN, kal_uint8 frame_type, kal_bool crc_status, kal_uint8 *subflow);
2986#endif
2987void SP_M2M_Handler(ilm_struct *ilm_ptr)
2988{
2989 switch (ilm_ptr->msg_id) {
2990#if defined(__C2K_SPEECH_SUPPORT__)
2991 case MSG_ID_AUDIO_M2M_SP_C2K_EVENT:
2992 {
2993 ASSERT(0);
2994 }
2995 break;
2996 case MSG_ID_AUDIO_M2M_SP_C2K_RATE_REDUCTION:
2997 {
2998#if defined(__SMART_PHONE_MODEM__)
2999 extern void spc_codecInfoNotify_soRateUpdate(uint16 newRate);
3000 ilm_SP_C2K_RATE_NOTI_t *local_para;
3001 local_para = (ilm_SP_C2K_RATE_NOTI_t *)(ilm_ptr->local_para_ptr);
3002 spc_codecInfoNotify_soRateUpdate(local_para->rate);
3003#endif
3004 }
3005 break;
3006#endif
3007 case MSG_ID_AUDIO_M2M_CHANGERATE_EVENT:
3008 {
3009 ilm_SP_CHANGERATE_EVENT_t *local_para;
3010 local_para = (ilm_SP_CHANGERATE_EVENT_t *)(ilm_ptr->local_para_ptr);
3011
3012 ChangeRAT_Mode(local_para->event, local_para->param[0], local_para->param[1]);
3013 }
3014 break;
3015 case MSG_ID_AUDIO_M2M_SP_L4C_SET_EVENT:
3016 {
3017 ilm_SP_L4C_SET_EVENT_t *local_para;
3018 MD_TRC_SP_M2M_HANDLER(1);
3019 local_para = (ilm_SP_L4C_SET_EVENT_t *)(ilm_ptr->local_para_ptr);
3020 SP_L4C_SetEvent_Execute(local_para->event, local_para->mode);
3021 }
3022 break;
3023#if defined(__ECALL_SUPPORT__)
3024#if defined(__L5_SUPPORT__)
3025 case MSG_ID_AUDIO_M2M_SP_L5ECALL_SET_EVENT:
3026 {
3027 ilm_SP_L5ECALL_SET_EVENT_t *local_para;
3028 local_para = (ilm_SP_L5ECALL_SET_EVENT_t *)(ilm_ptr->local_para_ptr);
3029 SP_L5ECALL_SetEvent_Execute(local_para->event, local_para->data);
3030 }
3031 break;
3032#endif
3033#endif
3034 case MSG_ID_AUDIO_M2M_SP_UPDATE_SPEECH_ENHANCEMENT_PARAMETER:
3035 {
3036 MD_TRC_SP_M2M_HANDLER(2);
3037 kal_prompt_trace(MOD_L1SP, "Get_Reset_Enh_Status()=%x",Get_Reset_Enh_Status() );
3038 if(Get_Reset_Enh_Status()==true)
3039 {
3040 SetSpeechEnhancement( false );
3041 SetSpeechEnhancement( true );
3042 Set_Reset_Enh_Status(false);
3043 }
3044 else
3045 {
3046 SetSpeechEnhancement( true );
3047 }
3048
3049 }
3050 break;
3051#if defined(__VOLTE_SUPPORT__)
3052 case MSG_ID_AUDIO_M2M_VOLTE_MAC_TIMING_INFO:
3053 case MSG_ID_AUDIO_M2M_VONR_MAC_TIMING_INFO:
3054 {
3055 sub_SP4G_emac_timing_update((l1sp_emac_resync_info_struct*)ilm_ptr->local_para_ptr, ilm_ptr->src_mod_id);
3056 }
3057 break;
3058#if defined(__MCU_DTMF_SUPPORT__)
3059 case MSG_ID_AUDIO_M2M_VOLTE_TONE_BGSND_CLOSE:
3060 {
3061 void volte_Tone_BgSndClose(void);
3062 volte_Tone_BgSndClose();
3063 }
3064 break;
3065 case MSG_ID_AUDIO_M2M_VOLTE_DL_KT_PLAY:
3066 {
3067 //SP4G_PSR_DL_KT_Play(5000, 8000, 100000);
3068 ilm_PSR_DL_KT_t *local_para;
3069 local_para = (ilm_PSR_DL_KT_t *)(ilm_ptr->local_para_ptr);
3070 //KT_Play(local_para->freq1, local_para->freq2, local_para->duration, DSP_TONE);
3071 SP_DSPTone_DL_KT_Play(local_para->freq1, local_para->freq2, local_para->duration);
3072 }
3073 break;
3074 case MSG_ID_AUDIO_M2M_VOLTE_DL_KT_STOP:
3075 {
3076 //SP4G_PSR_DL_KT_Stop();
3077 //KT_Stop(DSP_TONE);
3078 SP_DSPTone_DL_KT_Stop();
3079 }
3080 break;
3081 case MSG_ID_AUDIO_M2M_VOLTE_UL_KT_PLAY:
3082 {
3083 //SP4G_PSR_UL_KT_Play(5000, 8000, 100000);
3084 ilm_PSR_DL_KT_t *local_para;
3085 local_para = (ilm_PSR_DL_KT_t *)(ilm_ptr->local_para_ptr);
3086 /*if( KAL_FALSE == VolteToneGetUsed() ){
3087 KT_Play(local_para->freq1, local_para->freq2, local_para->duration, MCU_TONE);
3088 VolteToneSetID( EXT_BGSND_Start(volte_KT_bgSnd_closeHandler, NULL, volte_BGSND_ULHdr, 7, 7) );
3089 VolteToneSetUsed(KAL_TRUE);
3090 }else{
3091 MD_TRC_SP4G_PSR_UL_KT_PLAY_SKIP();
3092 }*/
3093 SP_DSPTone_UL_KT_Play(local_para->freq1, local_para->freq2, local_para->duration);
3094 }
3095 break;
3096 case MSG_ID_AUDIO_M2M_VOLTE_UL_KT_STOP:
3097 {
3098 //SP4G_PSR_UL_KT_Stop();
3099 /*if( KAL_TRUE == VolteToneGetUsed() ){
3100 EXT_BGSND_Flush( VolteToneGetID() );
3101 KT_Stop(MCU_TONE);
3102 }else{
3103 MD_TRC_SP4G_PSR_UL_KT_STOP_SKIP();
3104 }*/
3105 SP_DSPTone_UL_KT_Stop();
3106 }
3107 break;
3108 case MSG_ID_AUDIO_M2M_VOLTE_DL_TONE_PLAY:
3109 {
3110 //SP4G_PSR_DL_Tone_Play( tone_call_waiting );
3111 //ilm_PSR_DL_TONE_t *local_para;
3112 //local_para = (ilm_PSR_DL_TONE_t *)(ilm_ptr->local_para_ptr);
3113 //TONE_Play(local_para->pToneList, DSP_TONE);
3114 kal_prompt_trace(MOD_L1SP, "DSP tone not ready skip MSG_ID_AUDIO_M2M_VOLTE_DL_TONE_PLAY");
3115 }
3116 break;
3117 case MSG_ID_AUDIO_M2M_VOLTE_DL_TONE_STOP:
3118 {
3119 //SP4G_PSR_DL_Tone_Stop();
3120 //TONE_Stop(DSP_TONE);
3121 kal_prompt_trace(MOD_L1SP, "DSP tone not ready skip MSG_ID_AUDIO_M2M_VOLTE_DL_TONE_STOP");
3122 }
3123 break;
3124#endif //#if defined(__MCU_DTMF_SUPPORT__)
3125#endif //#if defined(__VOLTE_SUPPORT__)
3126#ifdef __FAKE_3G_LOOPBACK__
3127 case MSG_ID_AUDIO_M2M_SP3G_UL_EVENT:
3128 {
3129 kal_uint8 frame_type, len;
3130 kal_prompt_trace(MOD_L1SP, "MSG_ID_AUDIO_M2M_SP3G_UL_EVENT 1");
3131 //if(use_sleep == 1){
3132 // kal_sleep_task( AUD_1TICK(1) );
3133 //}
3134 kal_prompt_trace(MOD_L1SP, "MSG_ID_AUDIO_M2M_SP3G_UL_EVENT 2");
3135 SP3GHSPA_UL_GetSpeechFrame(&frame_type, tmp_buf, &len);
3136 SP3GHSPA_DL_PutSpeechFrame(1, frame_type, 1, tmp_buf);
3137 break;
3138 }
3139#endif
3140 case MSG_ID_AUDIO_M2M_RAMP_DONE:
3141 {
3142 L1SP_RampDone();
3143 }
3144 break;
3145 case MSG_ID_AUDIO_M2M_SPC_SETLOOPBACK_DL_UL:
3146 {
3147 ilm_SPC_SETLOOPBACK_DL_UL_t *local_para;
3148 local_para = (ilm_SPC_SETLOOPBACK_DL_UL_t *)(ilm_ptr->local_para_ptr);
3149
3150 SAL_LBK_PCM_D2U(local_para->enable);
3151 }
3152 break;
3153 case MSG_ID_AUDIO_M2M_VM_START:
3154 vocEnable();
3155 break;
3156 case MSG_ID_AUDIO_M2M_VM_STOP:
3157 vocDisable();
3158 break;
3159
3160 default:
3161 {
3162 MD_TRC_SP_M2M_HANDLER_SKIP_COMMAND(ilm_ptr->msg_id);
3163 break;
3164 }
3165 }
3166}
3167
3168void SP_SetDevSamplingRate(kal_uint8 voice8kMode)
3169{
3170 l1sp.devSr = voice8kMode;
3171}
3172
3173uint8 SP_GetDevSamplingRate(void)
3174{
3175 return l1sp.devSr;
3176}
3177
3178
3179sp_device_info_t SP_GetDevInfo(void)
3180{
3181 return l1sp.devInfo;
3182}
3183
3184void sp_turnOffPath(kal_bool isSpeechOn, kal_bool isPcmRoutOn)
3185{
3186 if(true == isSpeechOn) {
3187 AM_SpeechOff(1); // turn off 8k and speech off
3188 } else if (true == isPcmRoutOn){
3189 AM_PcmRouter_Off();
3190 } else { // cordless mode AM_BTCordlessOff ()/ speech
3191 }
3192}
3193
3194void sp_turnOnPath(kal_bool isSpeechOn, kal_bool isPcmRoutOn)
3195{
3196 if(true == isSpeechOn) {
3197 uint32 rat = AM_GetNetworkRate();
3198 // [REMIND]L1SP_STATE_xx can mapping to RAT_2G_MODE using "index -1"
3199 ASSERT(L1SP_STATE_IDLE != L1SP_GetState());
3200 ASSERT(RAT_NONE_MODE != rat );
3201 AM_SpeechOn(rat, 1);
3202
3203 } else if (true == isPcmRoutOn){
3204 AM_PcmRouter_On(1);
3205 } else { // cordless mode / speech
3206 }
3207}
3208
3209void SP_SetDevicePath(sp_device_info_t newDev, kal_uint8 voice8kMode)
3210{
3211 kal_bool isSpeechOn;
3212 kal_bool isPcmRoutOn;
3213 kal_bool isAmInSpeechState;
3214 kal_bool needOffOn;
3215 kal_uint16 audId;
3216
3217 audId = L1SP_GetAudID();
3218
3219 sp_device_info_t beforeDev = l1sp.devInfo;
3220
3221 isSpeechOn = AM_IsSpeechOn();
3222 isPcmRoutOn = AM_IsVoIPOn();
3223 isAmInSpeechState = AM_IsAmInSpeechState();
3224
3225 MD_TRC_SP_DEV_MODE_SETTING(beforeDev, newDev, SP_GetDevSamplingRate(), voice8kMode);
3226 if((SPH_DEVINFO_NORMAL == beforeDev && SPH_DEVINFO_NORMAL== newDev)
3227 || (SPH_DEVINFO_NORMAL == beforeDev && SPH_DEVINFO_BT_PCM== newDev)
3228 || (SPH_DEVINFO_BT_PCM == beforeDev && SPH_DEVINFO_NORMAL == newDev)
3229 || (SPH_DEVINFO_BT_PCM == beforeDev && SPH_DEVINFO_BT_PCM == newDev) ){
3230 needOffOn = ((true == isAmInSpeechState) && (SP_GetDevSamplingRate()!=voice8kMode));
3231
3232 // off
3233 if(true == needOffOn) {
3234 sp_turnOffPath(isSpeechOn, isPcmRoutOn);
3235 }
3236 if(SPH_DEVINFO_BT_PCM == beforeDev) {
3237 AM_BluetoothOff();
3238 }
3239
3240 // change setting
3241 if(SPH_DEVINFO_BT_PCM== newDev) {
3242 ASSERT( (voice8kMode==0) || (voice8kMode==1) );
3243 if(0== voice8kMode) { // NB
3244 SAL_Set_Device(SAL_DEV_BT_EARPHONE_NB, SAL_NB);
3245 } else { //WB
3246 SAL_Set_Device(SAL_DEV_BT_EARPHONE_WB, SAL_WB);
3247 }
3248 } else {
3249 SAL_Set_Device(SAL_DEV_NORMAL, voice8kMode);
3250 }
3251 SP_SetDevSamplingRate(voice8kMode);
3252 AFE_SetVoice8KMode(voice8kMode);
3253
3254 // on
3255 if(SPH_DEVINFO_BT_PCM == newDev) {
3256 AM_BluetoothOn(2);
3257 }
3258 if(true == needOffOn){
3259 sp_turnOnPath(isSpeechOn, isPcmRoutOn);
3260 }
3261 }
3262#if defined(__CVSD_CODEC_SUPPORT__)
3263 else if((SPH_DEVINFO_NORMAL == beforeDev
3264 || SPH_DEVINFO_BT_CVSD_MSBC == beforeDev
3265 || SPH_DEVINFO_BT_CVSD == beforeDev
3266 || SPH_DEVINFO_BT_MSBC == beforeDev)
3267 && (SPH_DEVINFO_BT_CVSD_MSBC == newDev
3268 || SPH_DEVINFO_BT_CVSD == newDev
3269 || SPH_DEVINFO_BT_MSBC == newDev)) {
3270 // no off
3271 if (isSpeechOn && BT_SCO_IS_SPEECH_ON())
3272 {
3273 BT_SCO_SPEECH_OFF();
3274 }
3275
3276 // change
3277 if (SPH_DEVINFO_BT_CVSD_MSBC == newDev) {
3278 SP_SetDevSamplingRate(voice8kMode);
3279 } else if (SPH_DEVINFO_BT_CVSD == newDev) {
3280 SP_SetDevSamplingRate(0);
3281 } else { // MSBC
3282 SP_SetDevSamplingRate(1);
3283 }
3284
3285 // on
3286 if(isSpeechOn)
3287 {
3288 sp_enableBT_SCO(newDev, voice8kMode);
3289 }
3290 }
3291 else if((SPH_DEVINFO_BT_CVSD_MSBC == beforeDev && SPH_DEVINFO_NORMAL == newDev)
3292 || (SPH_DEVINFO_BT_CVSD == beforeDev && SPH_DEVINFO_NORMAL == newDev)
3293 || (SPH_DEVINFO_BT_MSBC == beforeDev && SPH_DEVINFO_NORMAL == newDev)) {
3294 needOffOn = ((true == isAmInSpeechState) && (AFE_GetVoice8KMode() != voice8kMode));
3295
3296 // off
3297 if (isSpeechOn && BT_SCO_IS_SPEECH_ON())
3298 {
3299 BT_SCO_SPEECH_OFF();
3300 }
3301 if (needOffOn) {
3302 sp_turnOffPath(isSpeechOn, isPcmRoutOn);
3303 }
3304
3305 // change
3306 SAL_Set_Device(SAL_DEV_NORMAL, voice8kMode);
3307 SP_SetDevSamplingRate(voice8kMode);
3308 AFE_SetVoice8KMode(voice8kMode);
3309
3310 // on
3311 if(needOffOn){
3312 sp_turnOnPath(isSpeechOn, isPcmRoutOn);
3313 }
3314 }
3315#endif
3316
3317 l1sp.devInfo = newDev;
3318 if(l1sp.devInfo== SPH_DEVINFO_NORMAL || l1sp.devInfo == SPH_DEVINFO_BT_PCM) {
3319 SAL_Set_DevInfo((Sal_DevInfo_Int_t)(l1sp.devInfo + 1 ), (Sal_DevInfo_Ext_t)(l1sp.extDevInfo));
3320 } else {
3321 SAL_Set_DevInfo(SAL_DEVINFO_INT_CVSD_MSBC, (Sal_DevInfo_Ext_t)(l1sp.extDevInfo));
3322 }
3323 L1SP_FreeAudID(audId);
3324
3325}
3326
3327void SP_SetExtraDevInfo(sp_device_info_t dev, sp_ext_dev_info_t extDevInfo, uint8 smartpa_config, uint16 echoRefDelay, uint8 micDelay)
3328{
3329
3330 kal_uint16 audId;
3331
3332 MD_TRC_SP_EXT_DEV_SETTING(dev, extDevInfo, echoRefDelay, micDelay);
3333
3334 audId = L1SP_GetAudID();
3335 if( 0 == smartpa_config || 1 == smartpa_config){
3336 SAL_Set_SmartPA_Config(SAL_SMARTPA_SINGLE);
3337 }else if( 2 == smartpa_config ){
3338 SAL_Set_SmartPA_Config(SAL_SMARTPA_DUAL);
3339 }
3340
3341 // notch filter setting
3342 switch(extDevInfo) {
3343 case SPH_EXTDEVINFO_VIBRATION_RECEIVER:
3344 case SPH_EXTDEVINFO_VIBRATION_SPEAKER:
3345 case SPH_EXTDEVINFO_SMARTPA_VIBRATION_SPEAKER:
3346 AM_DSP_WriteNotchFilterParam();
3347 SAL_NotchFilter_Enable(true , false);
3348 break;
3349 default:
3350 SAL_NotchFilter_Enable(false , false);
3351 break;
3352 }
3353
3354
3355 // echo ref setting
3356 switch(extDevInfo) {
3357 case SPH_EXTDEVINFO_DUALSMARTPA_SPEAKER:
3358 case SPH_EXTDEVINFO_DUALSMARTPA_VIBRATION_SPEAKER:
3359 SAL_ENH_ExtEchoRef_Switch(true);
3360
3361 SAL_ENH_ExtEchoRef_DelayConfig(0, echoRefDelay, micDelay);
3362 SAL_ENH_ExtEchoRef_DelayConfig(1, echoRefDelay, micDelay);
3363 break;
3364 case SPH_EXTDEVINFO_SMARTPA_SPEAKER:
3365 case SPH_EXTDEVINFO_SMARTPA_VIBRATION_SPEAKER:
3366 case SPH_EXTDEVINFO_USB_AUDIO:
3367 SAL_ENH_ExtEchoRef_Switch(true);
3368
3369 SAL_ENH_ExtEchoRef_DelayConfig(0, echoRefDelay, micDelay);
3370 break;
3371 default:
3372 {
3373 SAL_ENH_ExtEchoRef_Switch(false);
3374 if(SPH_DEVINFO_BT_CVSD_MSBC == dev ) {
3375 SAL_ENH_ExtEchoRef_DelayConfig(0, echoRefDelay, micDelay);
3376 } else { // not delay setting
3377 SAL_ENH_ExtEchoRef_DelayConfig(0, 0, 0);
3378 }
3379 }
3380 break;
3381 }
3382
3383 l1sp.extDevInfo = extDevInfo;
3384 if(l1sp.devInfo== SPH_DEVINFO_NORMAL || l1sp.devInfo == SPH_DEVINFO_BT_PCM) {
3385 SAL_Set_DevInfo((Sal_DevInfo_Int_t)(l1sp.devInfo + 1 ), (Sal_DevInfo_Ext_t)(l1sp.extDevInfo));
3386 } else {
3387 SAL_Set_DevInfo(SAL_DEVINFO_INT_CVSD_MSBC, (Sal_DevInfo_Ext_t)(l1sp.extDevInfo));
3388 }
3389 L1SP_FreeAudID(audId);
3390
3391}
3392
3393sp_ext_dev_info_t SP_GetExtDevInfo (void)
3394{
3395 return l1sp.extDevInfo;
3396
3397}
3398
3399// ============================================================================
3400void SP_setEmVoiceQualityEvent(kal_bool isOn)
3401{
3402 sp_emVoiceQuality.isOn = isOn;
3403}
3404
3405
3406void sp_voiceQualityHisrHdl(void)
3407{
3408 kal_uint16 rate = SAL_Get_DMFRate();
3409 kal_uint16 source = SAL_Get_DMFSource();
3410
3411 if(sp_emVoiceQuality.isNotify) {
3412 // leave log
3413 MD_TRC_DROP_SPEECH_QUALITY_EM(1, rate, source);
3414 return;
3415 }
3416
3417 memset(&(sp_emVoiceQuality.ulInfo), 0, sizeof(Sal_DMF_SPH_UL_Info_t));
3418 if(0!=(source&SAL_DMF_SOURCE_SPH_UL)) {
3419 SAL_Get_DMF_SPH_UL_Info(&(sp_emVoiceQuality.ulInfo));
3420
3421 sp_emVoiceQuality.isNotify = KAL_TRUE;
3422 }
3423
3424 sp_emVoiceQuality.is4gWifi = KAL_FALSE;
3425 memset(&(sp_emVoiceQuality.dlInfo), 0, sizeof(Sal_DMF_SPH_DL_Info_t));
3426 if(0!=(source&SAL_DMF_SOURCE_SPH_DL)) {
3427
3428 SAL_Get_DMF_SPH_DL_Info(&(sp_emVoiceQuality.dlInfo));
3429
3430 sp_emVoiceQuality.isNotify = KAL_TRUE;
3431 sp_emVoiceQuality.is4gWifi = KAL_FALSE;
3432#if defined(__VOLTE_SUPPORT__)
3433 if(SAL_DMF_RATE_4G == sp_emVoiceQuality.dlInfo.DMFRate) {
3434 if(SP4G_PSR_CallType_VoWiFi == SP4G_PSR_GetCallType()
3435 || SP4G_PSR_CallType_ViWiFi == SP4G_PSR_GetCallType()) {
3436 sp_emVoiceQuality.is4gWifi = KAL_TRUE;
3437 }
3438 }
3439#endif
3440 }
3441
3442 memset(&(sp_emVoiceQuality.enhUl), 0, sizeof(Sal_DMF_ENH_UL_Info_t));
3443 if(0!=(source&SAL_DMF_SOURCE_ENH_UL)) {
3444 SAL_Get_DMF_ENH_UL_Info(&(sp_emVoiceQuality.enhUl));
3445
3446 sp_emVoiceQuality.isNotify = KAL_TRUE;
3447 }
3448
3449 if(sp_emVoiceQuality.isOn && sp_emVoiceQuality.isNotify ) {
3450 if(kal_if_lisr())
3451 L1Audio_LSetEvent(l1sp.aud_id_voice_quality_event, &sp_emVoiceQuality);
3452 else
3453 L1Audio_SetEvent(l1sp.aud_id_voice_quality_event, &sp_emVoiceQuality);
3454 } else {
3455 MD_TRC_DROP_SPEECH_QUALITY_EM(2, rate, source);
3456 sp_emVoiceQuality.isNotify = KAL_FALSE;
3457 }
3458}
3459
3460void sp_voiceQualityEventHdl(SP_EM_VOICE_QUALITY_INFO *pEmVQ)
3461{
3462
3463 if(pEmVQ->isNotify) {
3464 ilm_struct ilm;
3465 em_speech_info_voice_quality_event_ind_struct *em_para_ptr;
3466
3467 ilm.src_mod_id = MOD_L1SP;
3468 ilm.dest_mod_id = MOD_DHL;
3469 ilm.sap_id = EM_PS_SAP;
3470 ilm.msg_id = MSG_ID_EM_SPEECH_INFO_VOICE_QUALITY_EVENT_IND;
3471 em_para_ptr = (em_speech_info_voice_quality_event_ind_struct *)(construct_local_para(sizeof(em_speech_info_voice_quality_event_ind_struct ), TD_RESET));
3472
3473 em_para_ptr->em_info = EM_SPEECH_INFO_VOICE_QUALITY_EVENT;
3474 em_para_ptr->event = pEmVQ->dlInfo.DMFDLStatus;
3475 em_para_ptr->dspRate= pEmVQ->dlInfo.DMFRate;
3476 em_para_ptr->is4GWifi = pEmVQ->is4gWifi;
3477 em_para_ptr->isDlHaveSound = pEmVQ->dlInfo.DMFDLVoice;
3478
3479
3480 em_para_ptr->dlCRCFailCnt = pEmVQ->dlInfo.DMFCRCFailCnt;
3481 em_para_ptr->dlSphRstCnt = pEmVQ->dlInfo.DMFSphRstCnt;
3482 em_para_ptr->dlPktLossCnt = pEmVQ->dlInfo.DMFPktLossCnt;
3483 em_para_ptr->dlJitterLossCnt = pEmVQ->dlInfo.DMFJitterLossCnt;
3484 memcpy(em_para_ptr->dlBadFrmCnt, pEmVQ->dlInfo.DMFBadFrmCnt, SAL_DMF_BADFRM_ID_NUM*sizeof(uint16));
3485 memcpy(em_para_ptr->dlHomFrmCnt, pEmVQ->dlInfo.DMFHomFrmCnt, SAL_DMF_HOMFRM_ID_NUM*sizeof(uint16));
3486 memcpy(em_para_ptr->dlNoDataCnt, pEmVQ->dlInfo.DMFNoDataCnt, SAL_DMF_NODATA_ID_NUM*sizeof(uint16));
3487
3488 em_para_ptr->uLMutePosENHCnt = pEmVQ->ulInfo.DMFULMutePosENHCnt;
3489
3490 em_para_ptr->enhUlRobustStatusPre = pEmVQ->enhUl.DMFENHRobustStatusPre;
3491 em_para_ptr->enhUlRobustStatusPos = pEmVQ->enhUl.DMFENHRobustStatusPos;
3492
3493 ilm.local_para_ptr = (local_para_struct*)em_para_ptr;
3494 ilm.peer_buff_ptr = NULL;
3495 dhl_EM_logger(&ilm);
3496
3497 destroy_ilm(&ilm); //or free_local_para((local_para_struct*)em_para_ptr );
3498
3499 pEmVQ->isNotify = KAL_FALSE;
3500 }
3501}
3502