[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6
MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF modem version: NA
Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/driver/audio/src/v1/am.c b/mcu/driver/audio/src/v1/am.c
new file mode 100644
index 0000000..54c096a
--- /dev/null
+++ b/mcu/driver/audio/src/v1/am.c
@@ -0,0 +1,3826 @@
+/*****************************************************************************
+* Copyright Statement:
+* --------------------
+* This software is protected by Copyright and the information contained
+* herein is confidential. The software may not be copied and the information
+* contained herein may not be used or disclosed except with the written
+* permission of MediaTek Inc. (C) 2012
+*
+* BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+* RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
+* AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
+* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
+* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
+* NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
+* SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
+* SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
+* THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
+* NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
+* SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
+*
+* BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
+* LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
+* AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
+* OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
+* MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+*
+* THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
+* WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
+* LAWS PRINCIPLES. ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
+* RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
+* THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
+*
+*****************************************************************************/
+
+/*******************************************************************************
+ *
+ * Filename:
+ * ---------
+ * am.c
+ *
+ * Project:
+ * --------
+ * Maui
+ *
+ * Description:
+ * ------------
+ * Audio Manager(AM) for Audio Mode Changes
+ *
+ * Author:
+ * -------
+ * -------
+ *
+ *------------------------------------------------------------------------------
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+>>>> ORIGINAL //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/am.c#10
+==== THEIRS //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/am.c#11
+ * removed!
+ * removed!
+ * removed!
+ *
+==== YOURS //ws_thomas.chen_work1/VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/am.c
+>>>> ORIGINAL //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/am.c#9
+==== THEIRS //VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/am.c#10
+<<<<
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+==== YOURS //ws_thomas.chen_work1/VMOLY/TRUNK/VMOLY/mcu/driver/audio/src/v1/am.c
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+<<<<
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ * removed!
+ * removed!
+ * removed!
+ *
+ *
+ *******************************************************************************/
+#include "kal_public_api.h"
+#include "kal_general_types.h"
+#include "reg_base.h"
+#include "md2g_drv.h"
+#include "string.h"
+#include "sync_data.h"
+
+#include "media.h"
+#include "l1audio_trace_utmd.h"
+#include "audio_ringbuf.h" // "audio_def.h"
+#include "l1audio.h"
+#include "afe.h"
+#include "ddload.h"
+#include "am.h"
+#include "l1aud_common_def.h"
+#include "speech_def.h"
+#include "afe_def.h"
+
+#include "sp_daca.h"
+#include "pcm4way.h"
+#include "sp_enhance.h"
+
+#include "sal_def.h"
+#include "sal_exp.h"
+#include "sp_cc.h"
+#include "extcodec.h"
+
+#include "us_timer.h"
+#include "DVFS_drv_md_public.h"
+
+#include "sp_drv.h"
+#include "spc_drv.h"
+#include "sp_dsptone_drv.h"
+#include "sp_ps.h"
+
+//#define TK6291_FAKE_COMPILE
+
+
+#define AM_2G_RESYNC_THRESHOLD 1083
+/* ========================================================================= */
+
+/* ========================================================================= */
+#define AM_STATE_KEYTONE (1<<L1SP_KEYTONE )
+#define AM_STATE_TONE (1<<L1SP_TONE )
+#define AM_STATE_SPEECH (1<<L1SP_SPEECH )
+#define AM_STATE_VOIP (1<<(L1SP_MAX_AUDIO+0) )
+#define AM_STATE_VOICE (1<<L1SP_VOICE )
+// #define AM_STATE_DAI (1<<L1SP_DAI )
+// #define AM_STATE_AUDIO (1<<L1SP_AUDIO )
+#define AM_STATE_SND_EFFECT (1<<L1SP_SND_EFFECT)
+// #define AM_STATE_AvBT (1 << (L1SP_MAX_AUDIO + 1))
+// #define AM_STATE_AVSYNC (1 << (L1SP_MAX_AUDIO + 2))
+#define AM_STATE_DACA (1 << (L1SP_MAX_AUDIO + 3))
+
+#define AM_CONFLICT_STATE (AM_STATE_SPEECH + AM_STATE_VOIP + AM_STATE_VOICE ) // + AM_STATE_AUDIO) // no audio state exist
+
+/*======== Speech State : record features in dedicated-mode speech ========= */
+#define SP_STATE_VMR (1 << 0)
+#define SP_STATE_PCM8K_REC (1 << 1)
+#define SP_STATE_PCMNWAY (1 << 2)
+#define SP_STATE_DACA (1 << 3)
+#define SP_STATE_VMR_EPL (1 << 4) // VM record with EPL
+
+/*======== VoIP State ======================================= */
+#define VOIP_STATE_VMR (1 << 0)
+
+#define VOIP_STATE_REC_ONLY_CAL (1 << 1)
+#define VOIP_STATE_REC_PLAY_CAL (1 << 2)
+
+
+/*============= DSP&AFE IO types ============================ */
+#define NORMAL_MODE 0
+// #define DAI_MODE 1
+// #define BT_CORDLESS_MODE 2
+#define BT_EARPHONE_MODE 3
+// #define PCM_MODE 4
+
+/*============= low byte flags of *DP_AUDIO_PAR ============================ */
+// #define VOICE_INPUT_FILTER_FLAG 0x1
+// #define VOICE_OUTPUT_FILTER_FLAG 0x2
+// #define VOICE_WB_AMR_FLAG 0x8
+// #define VOICE_16K_SWITCH_FLAG 0x10
+// #define VOICE_MIC_MUTE_FLAG 0x20
+// #define VOICE_SIDETONE_FILTER_FLAG 0
+
+
+/* ========================================================================= */
+
+/* To work around the bug of DSP when handover in short time,
+ Do not set handover flag to DSP, but VBI_Reset and other setting remain */
+#define NOT_HANDOVER_IN_SHORT_TIME
+
+#define VBI_Reset() { ASSERT(0); }
+#define VBI_End() { ASSERT(0); }
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_DSP_TurnOffC2KSDSP(uint32 data , uint32 extraInfo);
+#endif
+/* =========== Block Filter Switch Between old/New Usage===================== */
+volatile kal_uint16 *g_Compen_Blk_Flt;
+extern ps_conf_test_mode_enum query_ps_conf_test_mode(void);
+typedef struct {
+ void (*code)(uint32, uint32);
+ uint32 data;
+ uint32 data2;
+} AM_QFunction;
+#define RAMP_QUEUE_SIZE 8
+typedef struct {
+ uint16 RampPoint;
+ bool MuteState;
+} RampStatus;
+
+static struct {
+#if defined( NOT_HANDOVER_IN_SHORT_TIME )
+ uint32 l1FN_HO;
+#endif
+ uint16 state;
+ uint16 pre_speech_mode;
+ uint8 is_reset_enh;
+ uint16 speech_mode;
+ uint16 ul_speech_mode; //behavior is the same as 3/4G
+ // int16 speech_off_delay;
+ int8 sub_channel;
+ int8 ul_sub_channel; //behavior is the same as 3/4G
+
+ // uint16 audioDigitalGain;
+ uint16 speechDigitalGain;
+ uint16 speechUplinkSwAgcGain;
+ uint16 speechDlEnhRefDigtalGain;
+
+ // uint16 bt_digital_gain; // temporary value for keeping origial dl volume in other mode
+ // uint16 bt_mic_gain; // temporary value for keeping origial up volume in other mode
+ // uint16 bt_dlEnhRef_digital_gain; // temporary value for keeping origial dl enhancement reference volum in the other mode
+
+
+ RINGBUFFER_T(AM_QFunction,8) qfunc;
+#if __SP3G_PLATFORM__
+ RINGBUFFER_T(AM_QFunction,8) qfunc2; // modem-unrelated
+#endif
+
+ uint8 speech_state;
+ // uint8 voip_state;
+ uint8 io_type;
+
+ // bool fLoopBack;
+ // kal_bool pre_isWBLink;
+
+#if defined(_SPE_ENH_MD_PARSE_)
+ bool isFirCoeffSet;
+ bool isIirCoeffSet;
+ int16 in_coeff_tmp[90];
+ int16 out_coeff_tmp[90];
+ int16 IIR_in_coeff_tmp[42];
+ int16 IIR_out_coeff_tmp[42];
+ int16 MIC1_IIR_coeff_tmp[20];
+ int16 MIC2_IIR_coeff_tmp[20];
+ int16 wb_in_coeff_tmp[90];
+ int16 wb_out_coeff_tmp[90];
+ int16 wb_IIR_in_coeff_tmp[42];
+ int16 wb_IIR_out_coeff_tmp[42];
+ int16 wb_MIC1_IIR_coeff_tmp[20];
+ int16 wb_MIC2_IIR_coeff_tmp[20];
+ int16 swb_in_coeff_tmp[90];
+ int16 swb_out_coeff_tmp[90];
+ int16 swb_IIR_in_coeff_tmp[42];
+ int16 swb_IIR_out_coeff_tmp[42];
+ int16 swb_MIC1_IIR_coeff_tmp[20];
+ int16 swb_MIC2_IIR_coeff_tmp[20];
+#endif
+ // bool toneLoopbackRec;
+ bool sp3g_flag;
+
+
+ RINGBUFFER_T(RampStatus, RAMP_QUEUE_SIZE) ramp_point_queue;
+#if defined(__C2K_SPEECH_SUPPORT__)
+ bool spc2k_flag;
+ bool c2k_flag;
+#endif
+#if defined(__VOLTE_SUPPORT__)
+ bool sp4g_flag;
+ int codec_4g;
+#endif
+
+ AM_RECORD_FORMAT record_format;
+ bool dsp_2g_reset;
+} am;
+
+#if defined(__C2K_SPEECH_SUPPORT__)
+#if defined(__VOLTE_SUPPORT__)
+#define IsWBLink(speech_codec) ((SP4G_CODEC_G722 == speech_codec ) || ((speech_codec >= 0x20) && (speech_codec <= 0x28)) || (SPH_CODEC_C2K_SO73WB == speech_codec))
+#else
+#define IsWBLink(speech_codec) (((speech_codec) >= 0x20) || (SPH_CODEC_C2K_SO73WB == (speech_codec)))
+#endif
+#else
+#if defined(__VOLTE_SUPPORT__)
+#define IsWBLink(speech_codec) ((SP4G_CODEC_G722 == speech_codec ) || ((speech_codec >= 0x20) && (speech_codec <= 0x28)))
+#else
+#define IsWBLink(speech_codec) ((speech_codec) >= 0x20)
+#endif
+#endif
+
+
+
+
+/* --------------------------------------------------------------------------*/
+void SP4G_Call_Close(void);
+void SP4G_Call_Open(uint16 codec, PS_RESET_TYPE_t resetType);
+kal_uint32 SP4G_GetCodecMode(void);
+bool is_EVS_codec(uint8 codec);
+bool is_g_codec(uint8 codec);
+int get_sp4g_fake_EVS_IO(void);
+
+static void AM_ReloadDSPCoefficient( void );
+
+
+static void AM_Enqueue( void (*code)(uint32, uint32), uint32 data, uint32 data2, bool isCritical )
+{
+ /* For 65nm process, MCU has to reload DSP coefficient at each wake-up */
+ if (am.state == 0){
+ AM_ReloadDSPCoefficient();
+ }
+
+ code( data , data2 );
+}
+
+
+
+const signed short Sph_Mic1_IIR_In[20] =
+{
+-7815, 16002, 7900, -15800, 7900, -8033, 16219, 8192,-16384, 8192, /* UL SWB HP-IIR-137Hz (20ms task)*/
+ 0, 0, 8192, 0, 0, 0, 0, 8192, 0, 0 /* not used */
+};
+const signed short Sph_Mic2_IIR_In[20] =
+{
+-7972, 16162, 8000, -16000, 8000, -8095, 16285, 8192,-16384, 8192, /* UL SWB HP-IIR-75Hz (20ms task)*/
+ 0, 0, 8192, 0, 0, 0, 0, 8192, 0, 0 /*not used*/
+};
+const signed short Speech_All_Pass_IIR_Coeff[42] =
+{ /* All pass filter */
+ 0x14, 0x400, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0
+};
+const int16 Speech_All_Pass_FIR_Coeff[45] =
+ { /* All pass filter */
+ 32767, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0
+ };
+
+
+
+
+
+
+const uint16 DSP_PCM_IDLE_DELAY_M_VOLTE = (6*8)+(16<<10)+(2<<8);
+
+
+/* Note: The speech pattern length for amr-wb can be calculated from
+lenSpeechBitsAMR_WB in amr_table.h; therefore, remove them out.
+Those for amr might be removed if vm.c does not handle amr any more. */
+static const uint8 SpeechPatternLength[] = {
+ (uint8)((260 + 15) / 16), /* FR */
+ (uint8)((112 + 15) / 16), /* HR */
+ (uint8)((244 + 15) / 16), /* EFR */
+ (uint8)((244 + 15) / 16), /* AMR 12.2K */
+ (uint8)((204 + 15) / 16), /* AMR 10.2K */
+ (uint8)((159 + 15) / 16), /* AMR 7.95K */
+ (uint8)((148 + 15) / 16), /* AMR 7.4K */
+ (uint8)((134 + 15) / 16), /* AMR 6.7K */
+ (uint8)((118 + 15) / 16), /* AMR 5.9K */
+ (uint8)((103 + 15) / 16), /* AMR 5.15K */
+ (uint8)(( 95 + 15) / 16), /* AMR 4.75K */
+
+ (uint8)((132 + 15) / 16), /* AMR-WB 6.60 */
+ (uint8)((177 + 15) / 16), /* AMR-WB 8.85 */
+ (uint8)((253 + 15) / 16), /* AMR-WB 12.65 */
+ (uint8)((285 + 15) / 16), /* AMR-WB 14.25 */
+ (uint8)((317 + 15) / 16), /* AMR-WB 15.85 */
+ (uint8)((365 + 15) / 16), /* AMR-WB 18.25 */
+ (uint8)((397 + 15) / 16), /* AMR-WB 19.85 */
+ (uint8)((461 + 15) / 16), /* AMR-WB 23.05 */
+ (uint8)((477 + 15) / 16), /* AMR-WB 23.85 */
+
+ (uint8)(1), /* QCELP8K (Not supported)*/ //return 1 to prevent vm codec length check
+ (uint8)(17), /* QCELP13K */
+ (uint8)(11), /* EVRCA */
+ (uint8)(11), /* EVRCB */
+
+ (uint8)(9+2), /* EVS_AWB660 */
+ (uint8)(12+2), /* EVS_AWB885 */
+ (uint8)(16+2), /* EVS_AWB1265 */
+ (uint8)(18+2), /* EVS_AWB1425 */
+ (uint8)(20+2), /* EVS_AWB1585 */
+ (uint8)(23+2), /* EVS_AWB1825 */
+ (uint8)(25+2), /* EVS_AWB1985 */
+ (uint8)(29+2), /* EVS_AWB2305 */
+ (uint8)(30+2), /* EVS_AWB2385 */
+ (uint8)(10+2), /* EVS_PRI590 */
+ (uint8)(9+2), /* EVS_PRI720 */
+ (uint8)(10+2), /* EVS_PRI800 */
+ (uint8)(12+2), /* EVS_PRI960 */
+ (uint8)(17+2), /* EVS_PRI1320 */
+ (uint8)(21+2), /* EVS_PRI1640 */
+ (uint8)(31+2), /* EVS_PRI2440 */
+ (uint8)(40+2), /* EVS_PRI3200 */
+ (uint8)(60+2), /* EVS_PRI4800 */
+ (uint8)(80+2), /* EVS_PRI6400 */
+ (uint8)(120+2), /* EVS_PRI9600 */
+ (uint8)(160+2) /* EVS_PRI12800 */
+};
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+uint16 AM_GetSpeechPatternLength( uint8 speech_mode )
+{
+ if((speech_mode >= 11) && (speech_mode <= 31)) //EVS
+ {
+ speech_mode = speech_mode - 11 + 24;
+ }
+ else if( speech_mode >= 0x30) // c2k related
+ speech_mode = speech_mode - 0x30 + 0x14;
+ else if( speech_mode >= 0x20 )
+ speech_mode = speech_mode - 0x20 + 0x0B;
+ if( speech_mode<(sizeof(SpeechPatternLength)/sizeof(SpeechPatternLength[0])))
+ return (uint16)SpeechPatternLength[speech_mode];
+ else
+ return 1; //return 1 to prevent vm codec length check
+}
+//Need to add new pattern for MT6280
+
+static const uint16 SpeechSilencePattern[][31] = {
+ { 0x4820,0xD617,0x0284,0x2480,0x9249,0x8924,0x8002,0x4924, /* FR */
+ 0x2492,0x0289,0x2480,0x9249,0x8924,0x8002,0x4924,0x2492,
+ 0x0009 },
+ { 0x4E20,0x875E,0x5473,0x8482,0x00E9,0x0000,0x0000 }, /* HR */
+ { 0x7A10,0x092D,0xB55F,0x7C06,0x185C,0xDE06,0x4230,0x0103, /* EFR */
+ 0xA012,0x001A,0x0000,0x0000,0x0D6C,0x0000,0x0000,0x0000 },
+ { 0x00e2,0x5dfc,0xf095,0xcd4e,0x24da,0x0e04,0xf0fb,0x4f2e, /* AMR12.2 */
+ 0x4430,0x9fa8,0x0319,0x56c0,0xc144,0x0278,0x70ea,0x0004 },
+ { 0xe00a,0xf2e7,0x516b,0x19a1,0xc10d,0x145a,0x4c96,0x25e0, /* AMR10.2 */
+ 0x5ce6,0x17b9,0x0982,0x225d,0x00c4 },
+ { 0x033c,0xe5cd,0xd9fb,0x387f,0x420c,0x8c99,0x58d7,0x1156, /* AMR7.95 */
+ 0x397f,0x1074 },
+ { 0xe00a,0xf2e7,0x9ac5,0x4433,0x185b,0x3e05,0xdc64,0xc886, /* AMR7.4 */
+ 0xcd2e,0x0000 },
+ { 0xe00a,0xf2e7,0x7761,0x0486,0x0dd5,0xf47c,0x21b0,0xf547, /* AMR6.7 */
+ 0x0002 },
+ { 0xe00a,0xf2e7,0xb196,0xa8ae,0xbcb7,0x6fb9,0x0193,0x002e }, /* AMR5.9 */
+ { 0x3c0a,0x7e51,0x652c,0x5e91,0xd023,0xea5a,0x005b }, /* AMR5.15 */
+ { 0x3c0a,0x3e51,0x6529,0x3a49,0x977f,0x3565 }, /* AMR4.75 */
+ { 0x1480,0x02ee,0xd706,0x09f4,0x4e01,0x2ada,0x59ef,0x2a20,0x0001 }, /* AMR-WB 6.60 */
+ { 0x1290,0x0460,0x78f1,0xae42,0x2330,0x98c8,0x0120,0x57f8,0xa4b5,0xa681,0x25a0,0x0000 }, /* AMR-WB 8.85 */
+ { 0x1290,0x0460,0x78f1,0x4142,0xc702,0x3f49,0xd446,0x7295,0x55c0,0x1028,0x7159,0xe315,0x96cf,0x8328,0x06a7,0x1f2c }, /* AMR-WB 12.65 */
+ { 0x1290,0x0460,0x78f1,0x1542,0x8839,0x8c07,0x462d,0x59f4,0x3069,0x55c3,0x6028,0xa539,0x1724,0x2ebb,0xa182,0x92da,0xd156,0x1e06 }, /* AMR-WB 14.25 */
+ { 0x1290,0x0460,0x78f1,0x1542,0x00b8,0xc095,0x381e,0xf446,0x6959,0x6870,0x5f5c,0xe028,0xb886,0x2724,0xcbb3,0x820b,0xcaa0,0x5692,0x6053,0x1c05 }, /* AMR-WB 15.85 */
+ { 0x1290,0x0460,0x78f1,0xff42,0x0604,0xd0c8,0x8460,0x63e0,0x7b44,0xce75,0x3c14,0xea27,0x285d,0xf790,0x13eb,0xec97,0x5f93,0x28bb,0x2648,0x3b81,0x2de6,0x1529,0x1529 }, /* AMR-WB 18.25 */
+ { 0x1290,0x0460,0x78f1,0x3942,0xf104,0x2b51,0x40cb,0xd864,0xc463,0x75ce,0x5d7d,0x3c8f,0xfa23,0x285d,0xd690,0xfa27,0xc515,0x93ea,0xbb5f,0x1e28,0xc5ea,0xfa2f,0x2c8c,0x45d8,0x1529 }, /* AMR-WB 19.85 */
+ { 0x1290,0x0460,0x78f1,0x1742,0x2098,0xaa41,0x4330,0xb286,0xd023,0xc463,0x5ce6,0x6e55,0xe3d7,0x14ef,0xb10f,0x2017,0xf1e0,0xf68f,0x8735,0x1c66,0x5b22,0x3765,0xc86c,0xdb41,0x84d3,0x522a,0x8696,0xc4b6,0x1c2a }, /* AMR-WB 23.05 */
+ { 0x1290,0x0460,0x78f1,0x1742,0x2098,0xaa41,0x4330,0xb286,0xd023,0x4f63,0xce6c,0x0555,0x5926,0x4c7e,0x1af1,0xc5df,0xe01e,0x2daf,0xdc74,0x56be,0xe4c0,0xf38a,0xa07a,0x5585,0x41fb,0x784d,0x932d,0x4798,0x914b,0x0f52 } /* AMR-WB 27.85 */
+};
+
+void AM_Reset_Enh(uint32 codec)
+{
+ kal_bool preIsSWB;
+ kal_bool afterIsSWB;
+
+ //Set_Reset_Enh_Status(false);
+ if( (SP4G_CODEC_EVS_32K_005_9 <= codec) && (SP4G_CODEC_EVS_32K_128_0 >= codec) ){
+ afterIsSWB = true;
+ }else{
+ afterIsSWB = false;
+ }
+
+ if( (SP4G_CODEC_EVS_32K_005_9 <= am.pre_speech_mode) && (SP4G_CODEC_EVS_32K_128_0 >= am.pre_speech_mode) ){
+ preIsSWB = true;
+ }else{
+ preIsSWB = false;
+ }
+ kal_prompt_trace(MOD_L1SP, "AM_Reset_Enh,preIsSWB=%x,afterIsSWB=%x,codec=%x,am.pre_speech_mode=%x", preIsSWB,afterIsSWB,codec,am.pre_speech_mode);
+ if(preIsSWB != afterIsSWB ){
+ //SetSpeechEnhancement(false);
+ //SetSpeechEnhancement(true);
+ Set_Reset_Enh_Status(true);
+ }
+ am.pre_speech_mode = codec;
+}
+
+void Set_Reset_Enh_Status(uint8 status)
+{
+ am.is_reset_enh = status;
+}
+
+
+uint8 Get_Reset_Enh_Status(void)
+{
+ return am.is_reset_enh;
+}
+
+void AM_FillSilencePattern( volatile uint16 *addr, uint16 info, uint16 speech_mode )
+{
+#ifndef L1D_TEST
+ const uint16 *pat_info;
+ uint32 I, len;
+ if( speech_mode >= 0x20 )
+ speech_mode = speech_mode - 0x20 + 0x0B;
+
+ if( speech_mode >= (sizeof(SpeechPatternLength)/sizeof(SpeechPatternLength[0])) )
+ return;
+
+ pat_info = SpeechSilencePattern[speech_mode];
+ len = (uint16)SpeechPatternLength[speech_mode];
+
+ *addr++ = info;
+ for( I = 0; I < len; I++ )
+ *addr++ = *pat_info++;
+
+ Data_Sync_Barrier();
+#endif
+}
+
+void AM_FillSilencePatternInBuffer( uint16 *buffer, uint16 speech_mode )
+{
+#ifndef L1D_TEST
+ const uint16 *pat_info;
+ uint32 I, len;
+ if( speech_mode >= 0x20 )
+ speech_mode = speech_mode - 0x20 + 0x0B;
+
+ if( speech_mode >= (sizeof(SpeechPatternLength)/sizeof(SpeechPatternLength[0])) )
+ return;
+
+ pat_info = SpeechSilencePattern[speech_mode];
+ len = (uint16)SpeechPatternLength[speech_mode];
+
+ for( I = 0; I < len; I++ )
+ *buffer++ = *pat_info++;
+#endif
+}
+
+/* -------------------------------------------------------------------------- */
+extern uint32 L1I_GetTimeStamp( void );
+
+void AM_SetDSP2GReset(bool v)
+{
+ am.dsp_2g_reset = v;
+}
+
+void AM_Set2GCodecInfo(uint16 speech_mode, int8 sub_channel)//
+{
+ am.ul_speech_mode = speech_mode;
+ am.ul_sub_channel = sub_channel;
+}
+
+void AM_Get2GCodecInfo(uint16 *speech_mode, int8 *sub_channel)//
+{
+ *speech_mode = am.ul_speech_mode;
+ *sub_channel = am.ul_sub_channel;
+}
+
+void AM_FlushQFunction( void )
+{
+#ifndef L1D_TEST
+ while( !RB_EMPTY(am.qfunc) )
+ kal_sleep_task( AUD_1TICK(1) );
+#endif
+}
+
+/* ========================================================================= */
+/* Interface Functions */
+/* ========================================================================= */
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+
+#if defined(_SPE_ENH_MD_PARSE_)
+static void AM_WriteSpeechCompensationFilter( const int16 in_coeff[90], const int16 out_coeff[90] )
+{
+ int i;
+ volatile uint16* dsp_ptr;
+
+ MD_TRC_SPE_DSP_CHECK_NB_FIR_PAR(in_coeff[0],in_coeff[1],out_coeff[0],out_coeff[1]);
+ /* Write audio FIR filter coeficients */
+ dsp_ptr = SAL_BKF_GetFltCoefAddr_NB_UL();
+
+ for( i=0; i<SAL_FLTCOEFLEN_BKF_NB; i++ )
+#if 1 // ndef __HQA_AUDIO__
+ *dsp_ptr ++ = *in_coeff++;
+#else
+/* under construction !*/
+#endif
+
+ dsp_ptr = SAL_BKF_GetFltCoefAddr_NB_DL();
+
+ for( i=0; i<SAL_FLTCOEFLEN_BKF_NB; i++ )
+#if 1 // ndef __HQA_AUDIO__
+ *dsp_ptr ++ = *out_coeff++;
+#else
+/* under construction !*/
+#endif
+
+
+ Data_Sync_Barrier();
+}
+static void AM_WriteSpeechIIRCompensationFilter( const int16 in_coeff[42], const int16 out_coeff[42],const int16 Mic1_coeff[20],const int16 Mic2_coeff[20] )
+{
+ int i;
+ volatile uint16* dsp_ptr;
+ /* Write audio IIR filter coeficients */
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_ENH_IIR_COEF_UL_NB);
+
+ for( i=0; i<SAL_FLTCOEFLEN_ENH_IIR; i++ )
+ {
+ *dsp_ptr ++ = *in_coeff++;
+ }
+
+
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_ENH_IIR_COEF_DL_NB);
+ for( i=0; i<SAL_FLTCOEFLEN_ENH_IIR; i++ )
+ {
+ *dsp_ptr ++ = *out_coeff++;
+ }
+
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_MIC1_IIR_COEF_UL_NB);
+ for( i=0; i<SAL_FLTCOEFLEN_MIC_IIR; i++ )
+ {
+ *dsp_ptr ++ = *Mic1_coeff++;
+ }
+
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_MIC2_IIR_COEF_UL_NB);
+ for( i=0; i<SAL_FLTCOEFLEN_MIC_IIR; i++ )
+ {
+ *dsp_ptr ++ = *Mic2_coeff++;
+ }
+ Data_Sync_Barrier();
+
+
+}
+void AM_WriteFirCoeffs( const int16 in_coeff[90], const int16 out_coeff[90] )
+{
+
+
+ memcpy(am.in_coeff_tmp, in_coeff, 90*sizeof(int16));
+ memcpy(am.out_coeff_tmp, out_coeff, 90*sizeof(int16));
+
+
+ am.isFirCoeffSet= true;
+
+ /* Write audio FIR filter coeficients */
+ AM_WriteSpeechCompensationFilter(in_coeff, out_coeff);
+
+
+
+}
+
+void AM_WriteIirCoeffs( const int16 in_coeff[42], const int16 out_coeff[42],const int16 Mic1_coeff[20],const int16 Mic2_coeff[20] )
+{
+ memcpy(am.IIR_in_coeff_tmp, in_coeff, 42*sizeof(int16));
+ memcpy(am.IIR_out_coeff_tmp, out_coeff, 42*sizeof(int16));
+ memcpy(am.MIC1_IIR_coeff_tmp, Mic1_coeff, 20*sizeof(int16));
+ memcpy(am.MIC2_IIR_coeff_tmp, Mic2_coeff, 20*sizeof(int16));
+ am.isIirCoeffSet= true;
+ /* Write audio IIR filter coeficients */
+ AM_WriteSpeechIIRCompensationFilter(in_coeff, out_coeff,Mic1_coeff,Mic2_coeff);
+
+
+
+}
+static void AM_WriteWbSpeechCompensationFilter( const int16 wb_in_coeff[90], const int16 wb_out_coeff[90] )
+{
+ int i;
+ volatile uint16* dsp_ptr;
+ MD_TRC_SPE_DSP_CHECK_WB_FIR_PAR(wb_in_coeff[0],wb_in_coeff[1],wb_out_coeff[0],wb_out_coeff[1]);
+ /* Write audio FIR filter coeficients */
+ dsp_ptr = SAL_BKF_GetFltCoefAddr_WB_UL();
+
+ for( i=0; i<SAL_FLTCOEFLEN_BKF_WB; i++ ){
+#if 1 // ndef __HQA_AUDIO__
+ *dsp_ptr ++ = *wb_in_coeff++;
+#else
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ }
+ dsp_ptr = SAL_BKF_GetFltCoefAddr_WB_DL();
+
+ for( i=0; i<SAL_FLTCOEFLEN_BKF_WB; i++ ){
+#if 1 // ndef __HQA_AUDIO__
+ *dsp_ptr ++ = *wb_out_coeff++;
+#else
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ }
+
+ Data_Sync_Barrier();
+}
+static void AM_WriteWbSpeechIIRCompensationFilter( const int16 wb_in_coeff[42], const int16 wb_out_coeff[42],const int16 wb_Mic1_coeff[20],const int16 wb_Mic2_coeff[20] )
+{
+ int i;
+ volatile uint16* dsp_ptr;
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_ENH_IIR_COEF_UL_WB);
+ for( i=0; i<SAL_FLTCOEFLEN_ENH_IIR; i++ )
+ {
+ *dsp_ptr ++ = *wb_in_coeff++;
+ }
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_ENH_IIR_COEF_DL_WB);
+ for( i=0; i<SAL_FLTCOEFLEN_ENH_IIR; i++ )
+ {
+ *dsp_ptr ++ = *wb_out_coeff++;
+ }
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_MIC1_IIR_COEF_UL_WB);
+ for( i=0; i<SAL_FLTCOEFLEN_MIC_IIR; i++ )
+ {
+ *dsp_ptr ++ = *wb_Mic1_coeff++;
+ }
+
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_MIC2_IIR_COEF_UL_WB);
+ for( i=0; i<SAL_FLTCOEFLEN_MIC_IIR; i++ )
+ {
+ *dsp_ptr ++ = *wb_Mic2_coeff++;
+ }
+ Data_Sync_Barrier();
+
+
+
+
+}
+static void AM_WriteSWbSpeechCompensationFilter( const int16 swb_in_coeff[90], const int16 swb_out_coeff[90] )
+{
+ int i;
+ volatile uint16* dsp_ptr;
+ MD_TRC_SPE_DSP_CHECK_SWB_FIR_PAR(swb_in_coeff[0],swb_in_coeff[1],swb_out_coeff[0],swb_out_coeff[1]);
+ /* Write audio FIR filter coeficients */
+ dsp_ptr = SAL_BKF_GetFltCoefAddr_SWB_UL();
+
+ for( i=0; i<SAL_FLTCOEFLEN_BKF_SWB; i++ ){
+#if 1 // ndef __HQA_AUDIO__
+ *dsp_ptr ++ = *swb_in_coeff++;
+#else
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ }
+ dsp_ptr = SAL_BKF_GetFltCoefAddr_SWB_DL();
+
+ for( i=0; i<SAL_FLTCOEFLEN_BKF_SWB; i++ ){
+#if 1 // ndef __HQA_AUDIO__
+ *dsp_ptr ++ = *swb_out_coeff++;
+#else
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+}
+ Data_Sync_Barrier();
+}
+static void AM_WriteSWbSpeechIIRCompensationFilter( const int16 swb_in_coeff[42], const int16 swb_out_coeff[42],const int16 swb_Mic1_coeff[20],const int16 swb_Mic2_coeff[20] )
+{
+ volatile uint16* dsp_ptr;
+ int i;
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_ENH_IIR_COEF_UL_SWB);
+ for( i=0; i<SAL_FLTCOEFLEN_ENH_IIR; i++ )
+ {
+ *dsp_ptr ++ = *swb_in_coeff++;
+ }
+
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_ENH_IIR_COEF_DL_SWB);
+ for( i=0; i<SAL_FLTCOEFLEN_ENH_IIR; i++ )
+ {
+ *dsp_ptr ++ = *swb_out_coeff++;
+ }
+
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_MIC1_IIR_COEF_UL_SWB);
+ for( i=0; i<SAL_FLTCOEFLEN_MIC_IIR; i++ )
+ {
+ *dsp_ptr ++ = *swb_Mic1_coeff++;
+ }
+
+ dsp_ptr = SAL_IIR_Coef_GetBuf(SAL_MIC2_IIR_COEF_UL_SWB);
+ for( i=0; i<SAL_FLTCOEFLEN_MIC_IIR; i++ )
+ {
+ *dsp_ptr ++ = *swb_Mic2_coeff++;
+ }
+ MO_Sync();//Data_Sync_Barrier();
+
+}
+void AM_WriteWbFirCoeffs( const int16 wb_in_coeff[90], const int16 wb_out_coeff[90] )
+{
+
+
+ memcpy(am.wb_in_coeff_tmp, wb_in_coeff, 90*sizeof(int16));
+ memcpy(am.wb_out_coeff_tmp, wb_out_coeff, 90*sizeof(int16));
+
+
+ //write FIR coefiicient when some application is running.
+ // Otherwise, the coefficient will be reloaed under AM_Enqueue()
+ if(am.state !=0) {
+ AM_WriteWbSpeechCompensationFilter(am.wb_in_coeff_tmp, am.wb_out_coeff_tmp);
+ }
+}
+void AM_WriteWbIirCoeffs( const int16 wb_in_coeff[42], const int16 wb_out_coeff[42],const int16 wb_Mic1_coeff[20],const int16 wb_Mic2_coeff[20] )
+{
+// #if __RELOAD_DSP_COEFF__
+ memcpy(am.wb_IIR_in_coeff_tmp, wb_in_coeff, 42*sizeof(int16));
+ memcpy(am.wb_IIR_out_coeff_tmp, wb_out_coeff, 42*sizeof(int16));
+ memcpy(am.wb_MIC1_IIR_coeff_tmp, wb_Mic1_coeff, 20*sizeof(int16));
+ memcpy(am.wb_MIC2_IIR_coeff_tmp, wb_Mic2_coeff, 20*sizeof(int16));
+// #endif
+ if(am.state !=0) {
+ AM_WriteWbSpeechIIRCompensationFilter(am.wb_IIR_in_coeff_tmp, am.wb_IIR_out_coeff_tmp,am.wb_MIC1_IIR_coeff_tmp,am.wb_MIC2_IIR_coeff_tmp);
+ }
+}
+void AM_WriteSWbFirCoeffs( const int16 swb_in_coeff[90], const int16 swb_out_coeff[90] )
+{
+
+
+ memcpy(am.swb_in_coeff_tmp, swb_in_coeff, 90*sizeof(int16));
+ memcpy(am.swb_out_coeff_tmp, swb_out_coeff, 90*sizeof(int16));
+
+
+ //write FIR coefiicient when some application is running.
+ // Otherwise, the coefficient will be reloaed under AM_Enqueue()
+ if(am.state !=0) {
+ AM_WriteSWbSpeechCompensationFilter(am.swb_in_coeff_tmp, am.swb_out_coeff_tmp);
+ }
+}
+void AM_WriteSWbIirCoeffs( const int16 swb_in_coeff[42], const int16 swb_out_coeff[42],const int16 swb_Mic1_coeff[20],const int16 swb_Mic2_coeff[20] )
+{
+
+// #if __RELOAD_DSP_COEFF__
+ memcpy(am.swb_IIR_in_coeff_tmp, swb_in_coeff, 42*sizeof(int16));
+ memcpy(am.swb_IIR_out_coeff_tmp, swb_out_coeff, 42*sizeof(int16));
+ memcpy(am.swb_MIC1_IIR_coeff_tmp, swb_Mic1_coeff, 20*sizeof(int16));
+ memcpy(am.swb_MIC2_IIR_coeff_tmp, swb_Mic2_coeff, 20*sizeof(int16));
+// #endif
+
+ //writeIIR coefiicient when some application is running.
+ // Otherwise, the coefficient will be reloaed under AM_Enqueue()
+ if(am.state !=0) {
+ AM_WriteSWbSpeechIIRCompensationFilter(am.swb_IIR_in_coeff_tmp, am.swb_IIR_out_coeff_tmp,am.swb_MIC1_IIR_coeff_tmp,am.swb_MIC2_IIR_coeff_tmp);
+ }
+}
+#endif
+// SRC coefiicient using in DSP
+const signed short Audio_Flt_Coeff[82] =
+{
+ 0, 96, 162, -92, -488, -302, 408, 372, -660, -780,
+ 782, 1272, -958, -2094, 1088, 3458, -1200, -6426, 1266, 20318,
+ 30834, 20318, 1266, -6426, -1200, 3458, 1088, -2094, -958, 1272,
+ 782, -780, -660, 372, 408, -302, -488, -92, 162, 96,
+ 0, /* SRC Up-Sampling */
+ 0, 0, -36, -175, -262, -51, 277, 146, -376, -317,
+ 489, 595, -597, -1034, 689, 1777, -744, -3351, 727, 10500,
+ 15852, 10500, 727, -3351, -744, 1777, 689, -1034, -597, 595,
+ 489, -317, -376, 146, 277, -51, -262, -175, -36, 0,
+ 0 /* SRC Down-Sampling */
+};
+
+const signed short Sph_SRCPlus_Flt_Coeff[148] =
+{
+ 50, 163, 186, 27, -141, -49, 157, 87, -185, -143, 211,
+218, -233, -313, 243, 431, -239, -573, 214, 743, -160, -945,
+68, 1188, 76,-1486, -297, 1867, 639,-2392,-1199, 3213, 2245,
+-4839,-4904,10502,28344,28344,10502,-4904,-4839, 2245, 3213,-1199,
+-2392, 639, 1867, -297,-1486, 76, 1188, 68, -945, -160, 743,
+214, -573, -239, 431, 243, -313, -233, 218, 211, -143, -185,
+87, 157, -49, -141, 27, 186, 163, 50, /* SRC Up-Sampling */
+ 25, 82, 93, 14, -71, -25, 79, 44, -93, -72, 106,
+ 109, -117, -157, 122, 216, -120, -287, 107, 372, -80, -473,
+ 34, 594, 38, -743, -149, 934, 320, -1196, -600, 1607, 1123,
+ -2420, -2452, 5251, 14172, 14172, 5251, -2452, -2420, 1123, 1607, -600,
+ -1196, 320, 934, -149, -743, 38, 594, 34, -473, -80, 372,
+ 107, -287, -120, 216, 122, -157, -117, 109, 106, -72, -93,
+ 44, 79, -25, -71, 14, 93, 82, 25 /* SRC Down-Sampling */
+
+/* -12, 16, 48, -98, -312, -234, 100, 180, -130, -238, 136, 312, -134, -404, 122, 512, -94, -640,
+ 46, 792, 28, -970, -134, 1188, 286, -1458, -510, 1818, 852, -2336, -1464, 3052, 2446, -4652, -5070, 10232,
+28264, 28264, 10232, -5070, -4652, 2446, 3052, -1464, -2336, 852, 1818, -510, -1458, 286, 1188, -134, -970, 28,
+ 92, 46, -640, -94, 512, 122, -404, -134, 312, 136, -238, -130, 180, 100, -234, -312, -98, 48,
+ 16, -12, 0 // SRC Up-Sampling */
+};
+
+const signed short Sph_SRCPlus_Flt_SWB_Coeff[296] =
+{
+25, 82, 130, 185, 199, 166, 81, -27, -117, -146, -99, 7, 119, 177, 141, 20, -128, -222, -202, -64,
+128, 272, 279, 127, -117, -325, -372, -212, 89, 376, 482, 324, -38, -421, -607, -466, -42, 456, 748, 645,
+158, -475, -907, -867, -323, 471, 1086, 1147, 552, -435, -1291, -1506, -873, 351, 1535, 1986, 1339, -191, -1845, -2678,
+-2063, -106, 2295, 3811, 3351, 711, -3116, -6193, -6400, -2401, 5617, 15802, 25197, 30823, 30823, 25197, 15802, 5617, -2401, -6400,
+-6193, -3116, 711, 3351, 3811, 2295, -106, -2063, -2678, -1845, -191, 1339, 1986, 1535, 351, -873, -1506, -1291, -435, 552,
+1147, 1086, 471, -323, -867, -907, -475, 158, 645, 748, 456, -42, -466, -607, -421, -38, 324, 482, 376, 89,
+-212, -372, -325, -117, 127, 279, 272, 128, -64, -202, -222, -128, 20, 141, 177, 119, 7, -99, -146, -117,
+-27, 81, 166, 199, 185, 130, 82, 25, /* SRC Up-Sampling */
+6, 21, 33, 46, 50, 42, 20, -7, -29, -37, -25, 2, 30, 44, 35, 5, -32, -56, -51, -16,
+32, 68, 70, 32, -29, -81, -93, -53, 22, 94, 121, 81, -10, -105, -152, -117, -11, 114, 187, 161,
+40, -119, -227, -217, -81, 118, 272, 287, 138, -109, -323, -377, -218, 88, 384, 497, 335, -48, -461, -670,
+-516, -27, 574, 953, 838, 178, -779, -1548, -1600, -600, 1404, 3951, 6299, 7706, 7706, 6299, 3951, 1404, -600, -1600,
+-1548, -779, 178, 838, 953, 574, -27, -516, -670, -461, -48, 335, 497, 384, 88, -218, -377, -323, -109, 138,
+287, 272, 118, -81, -217, -227, -119, 40, 161, 187, 114, -11, -117, -152, -105, -10, 81, 121, 94, 22,
+-53, -93, -81, -29, 32, 70, 68, 32, -16, -51, -56, -32, 5, 35, 44, 30, 2, -25, -37, -29,
+-7, 20, 42, 50, 46, 33, 21, 6 /* SRC Down-Sampling */
+};
+
+const signed short Sph_SRC_IIR_Flt_Coeff[12] =
+{
+29909, 35641, 17819, 28766, 5421, 21716, 24199, 32394, 11027, 24904, 10224, 32768
+};
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+signed short Sph_Notch_Filter_Param[SAL_PARAMETERLEN_NOTCH] = {
+ -7708, 15853, 7980, -15929, 7980,
+ -7788, 15937, 8180, -16330, 8180,
+ -7948, 16103, 8190, -16346, 8190
+};
+
+void AM_SetNotchFilterParam(int16 *param)
+{
+ memcpy(Sph_Notch_Filter_Param, param, SAL_PARAMETERLEN_NOTCH*sizeof(int16));
+}
+
+/**
+ This function should used when DSP is turn on
+*/
+void AM_DSP_WriteNotchFilterParam( void )
+{
+ int I;
+ volatile uint16* toPtr = SAL_Notch_GetFltCoefAddr();
+ int16 *fromPtr = Sph_Notch_Filter_Param;
+
+ for( I = SAL_PARAMETERLEN_NOTCH; --I >= 0 ; )
+ *toPtr++ = *fromPtr++;
+
+ Data_Sync_Barrier();
+}
+
+
+
+/* For 65nm process, MCU has to reload DSP coefficient at each wake-up */
+static void AM_ReloadDSPCoefficient( void )
+{
+ // AM_WriteSidetoneFIR(); // 93 not dsp sidetone so remove it
+
+ // if(!am.toneLoopbackRec) lagency
+
+#if defined(_SPE_ENH_MD_PARSE_)
+ AM_WriteSpeechCompensationFilter(am.in_coeff_tmp, am.out_coeff_tmp);
+ AM_WriteSpeechIIRCompensationFilter(am.IIR_in_coeff_tmp, am.IIR_out_coeff_tmp,am.MIC1_IIR_coeff_tmp,am.MIC2_IIR_coeff_tmp);
+ AM_WriteWbSpeechCompensationFilter(am.wb_in_coeff_tmp, am.wb_out_coeff_tmp);
+ AM_WriteWbSpeechIIRCompensationFilter(am.wb_IIR_in_coeff_tmp, am.wb_IIR_out_coeff_tmp,am.wb_MIC1_IIR_coeff_tmp,am.wb_MIC2_IIR_coeff_tmp);
+ AM_WriteSWbSpeechCompensationFilter(am.swb_in_coeff_tmp, am.swb_out_coeff_tmp);
+ AM_WriteWbSpeechIIRCompensationFilter(am.swb_IIR_in_coeff_tmp, am.swb_IIR_out_coeff_tmp,am.swb_MIC1_IIR_coeff_tmp,am.swb_MIC2_IIR_coeff_tmp);
+#endif
+ // AM_WriteAntiAliasFilter();
+ // L1SP_Reload_MagiClarity_Para();
+
+ if ( !(am.state & AM_STATE_SPEECH) )
+ L1SP_Reload_SPE_Para();
+}
+
+
+/* ========================================================================= */
+/* internal function Functions */
+/* ========================================================================= */
+
+/**
+ This function should call "after AFE_Turnoff8K" and "before AFE_TurnOn8K".
+ No user, so phase it out. The AFE_SetVoice8KMode is set directly by AP
+*/
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+// static void AM_DSP_VMRecordOff( uint32 data , uint32 extraInfo);
+
+extern kal_uint32 SP3G_GetCodecMode(void);
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_DSP_TurnOnC2KSDSP(int codec, uint32 extraInfo );
+void AM_TurnOffC2KSDSP(void);
+#endif
+static void AM_DSP_SpeechOn( uint32 rat_mode, uint32 extraInfo )
+{
+ ASSERT_REBOOT( !(am.state & AM_CONFLICT_STATE) );
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(5), L1AUDIO_Str_onoff(1) );
+
+ SAL_UltraSound_Removal_Switch(false);
+ SAL_Set_OpenDsp(L1SP_GetOpenDSPFlag());
+
+ if(rat_mode == RAT_2G_MODE)
+ {
+#if defined(__VOLTE_SUPPORT__)
+ am.sp4g_flag = false;
+#endif
+ am.sp3g_flag = false;
+ if(L1SP_TCH_State()){
+ AM_Get2GCodecInfo(&am.speech_mode, &am.sub_channel);
+ }else{
+ am.speech_mode = 0;
+ am.sub_channel = 0;
+ }
+
+#if defined(__SMART_PHONE_MODEM__)
+ if(spc_isAcLoopback()){
+ if(L1SP_TCH_State() == KAL_FALSE) {
+ cc_Standby_Call_Open(0x3);
+ }
+ else {
+ cc_2G_Call_Open(0, 0, am.sub_channel, ((extraInfo&1)? SAL_SRST_TYPE_DEV: SAL_SRST_TYPE_CALLON));
+ }
+ }
+ else
+#endif // __SMART_PHONE_MODEM__
+ {
+ if(L1SP_TCH_State() == KAL_FALSE) {
+ cc_Standby_Call_Open(0x3);
+ }
+ else {
+ cc_2G_Call_Open(am.speech_mode, am.speech_mode, am.sub_channel,
+ ((extraInfo&1)? SAL_SRST_TYPE_DEV: SAL_SRST_TYPE_CALLON));
+ }
+ }
+
+ }
+
+#if defined( __UMTS_RAT__ )
+ else if(rat_mode == RAT_3G_MODE
+#ifdef __VIDEO_CALL_SUPPORT__
+ || rat_mode == RAT_3G324M_MODE
+#endif
+ ){
+ kal_uint16 delayR, delayW, delayM;
+ kal_uint32 u32CurTime64us;
+
+ am.speech_mode = SP3G_GetCodecMode();
+ am.sp3g_flag = true;
+#if defined(__VOLTE_SUPPORT__)
+ am.sp4g_flag = false;
+#endif
+ // only use Bit[0] to inidicate the resync require
+
+
+ SP3G_GetSyncDelayRW( &delayR, &delayW, &delayM, &u32CurTime64us);
+
+ cc_3G_Call_Open(am.speech_mode, am.speech_mode, SP3G_IsDTXOn(), delayR, delayW, delayM, u32CurTime64us,
+ ((extraInfo&1)? SAL_SRST_TYPE_DEV: SAL_SRST_TYPE_CALLON));
+ }
+#endif
+#if defined(__VOLTE_SUPPORT__)
+ else if(rat_mode == RAT_4G_MODE){
+ am.speech_mode = SP4G_GetCodecMode();
+ am.sp3g_flag = false;
+ am.sp4g_flag = true;
+ //get InitCodec
+ //SAL_4G_Call_Open(am.speech_mode);
+ SP4G_Call_Open(am.speech_mode, ((extraInfo&1)? PS_SRST_TYPE_DEV: PS_SRST_TYPE_CALLON));
+ }
+#endif
+#if defined(__C2K_SPEECH_SUPPORT__)
+ else if(rat_mode == RAT_C2K_MODE){
+ am.sp3g_flag = false;
+#if defined(__VOLTE_SUPPORT__)
+ am.sp4g_flag = false;
+#endif
+ am.spc2k_flag = true;
+ AM_DSP_TurnOnC2KSDSP(L1SP_GetC2KSO_Codec(), (extraInfo&1)? SAL_SRST_TYPE_DEV: SAL_SRST_TYPE_CALLON);
+ }
+#endif
+ am.state |= AM_STATE_SPEECH;
+ am.pre_speech_mode = am.speech_mode;
+
+ l1sp_NetworkStatusNotification();
+ RB_INIT(am.ramp_point_queue);
+}
+
+uint32 AM_GetNetworkRate()
+{
+ switch(L1SP_GetState()){
+ case L1SP_STATE_2G_SPEECH_ON:
+ return RAT_2G_MODE;
+#if defined( __UMTS_RAT__ )
+ case L1SP_STATE_3G_SPEECH_ON:
+ case L1SP_STATE_3G_SPEECH_CLOSING:
+ return RAT_3G_MODE;
+#ifdef __VIDEO_CALL_SUPPORT__
+ case L1SP_STATE_3G324M_SPEECH_ON:
+ return RAT_3G324M_MODE;
+#endif
+#endif
+#if defined(__VOLTE_SUPPORT__)
+ case L1SP_STATE_4G_SPEECH_ON:
+ case L1SP_STATE_4G_SPEECH_CLOSING:
+ return RAT_4G_MODE;
+#endif
+#if defined(__C2K_SPEECH_SUPPORT__)
+ case L1SP_STATE_C2K_SPEECH_ON:
+ return RAT_C2K_MODE;
+#endif
+ default:
+ return RAT_NONE_MODE;
+ }
+}
+
+/**
+ @rat_mode: indicat the 2g/3g call status
+ @extraInfo: bit[0]: 1 for device change to resync
+*/
+void AM_SpeechOn(uint32 rat_mode, uint32 extraInfo)
+{
+ MD_TRC_L1Audio_Msg_AM_Speech(1);
+ AFE_TurnOn8K();//SAL user need to handle this for DSP Speech
+
+ AM_Enqueue( AM_DSP_SpeechOn, rat_mode, extraInfo, (rat_mode == RAT_2G_MODE) && L1SP_TCH_State() );
+
+ if(rat_mode == RAT_2G_MODE)
+ AM_FlushQFunction();
+}
+
+
+static void AM_DSP_SpeechOff( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(5), L1AUDIO_Str_onoff(0) );
+ // am.speech_off_delay = 10;
+ //fix BIANCO
+ //DP_KT_ATT = 0x0; // avoid SD buffer repeating if tone/keytone continues
+
+ Data_Sync_Barrier();
+// cc_set_VBI_for_FSM(1);
+ /*
+ if( am.speech_state & SP_STATE_VMR ) // call drop while conversation recording
+ AM_DSP_VMRecordOff( 0 , 0 );
+ */
+
+ am.state &= ~AM_STATE_SPEECH;
+
+#if defined(__VOLTE_SUPPORT__)
+ if(am.sp4g_flag){
+ SP4G_Call_Close();
+ am.sp4g_flag = false;
+ }else
+#endif
+#if defined( __UMTS_RAT__ )
+ if( am.sp3g_flag ){
+ cc_3G_Call_Close(true);
+
+ am.sp3g_flag = false;
+ }
+ else
+#endif
+#if defined(__C2K_SPEECH_SUPPORT__)
+ if( am.spc2k_flag ){
+
+ AM_TurnOffC2KSDSP();
+
+ am.spc2k_flag = false;
+ } else
+#endif
+ cc_2G_Call_Close(true );
+ //am.speech_mode = SAL_C2K_COD_MODE_UNDEF;
+
+
+// cc_set_VBI_for_FSM(2);
+}
+
+
+/**
+ @info: bit[0]: need to force dsp8k off or not; 1 for force, 0 for not
+*/
+void AM_SpeechOff( uint32 info )
+{
+ SP_DSPTone_ForceEnd();
+
+ // if((info == 0)|| ((info&1)!=0))
+ cc_set_VBI_for_FSM(1);
+
+ MD_TRC_L1Audio_Msg_AM_Speech(0);
+ AM_Enqueue( AM_DSP_SpeechOff, info, 0, false );
+
+ AM_FlushQFunction();
+
+ // if((info == 0)|| ((info&1)!=0))
+ cc_set_VBI_for_FSM(2);
+
+ if( (am.state == 0) || ((info&1)!=0))
+ AFE_TurnOff8K();
+}
+
+bool AM_IsSpeechOn( void )
+{
+ return( (bool)((am.state & AM_STATE_SPEECH) != 0) );
+}
+
+bool AM_IsDataCardOn( void )
+{
+ return( (bool)((am.speech_state &= SP_STATE_DACA) != 0) );
+}
+
+bool AM_IsAmInSpeechState( void )
+{
+ if ((am.state & (AM_STATE_SPEECH | AM_STATE_VOICE | AM_STATE_VOIP )) != 0)
+ return true;
+ else
+ return false;
+}
+
+void AM_SetSpeechMode( uint16 speech_mode, int8 sub_channel )
+{
+ am.speech_mode = speech_mode;
+ am.sub_channel = sub_channel;
+}
+
+uint16 AM_GetSpeechMode(void)
+{
+ return am.speech_mode;
+}
+
+kal_bool AM_IsSpeechWB( void )
+{
+ return IsWBLink(am.speech_mode);
+}
+
+#if defined( __UMTS_RAT__ )
+/**
+ extraInfo: come from rate
+*/
+void AM_DSP_RAT_sub_2G( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+ if(L1SP_TCH_State()){
+ AM_Get2GCodecInfo(&am.speech_mode, &am.sub_channel);
+ }else{
+ am.speech_mode = 0;
+ am.sub_channel = 0;
+ }
+ if( !(am.state & AM_STATE_SPEECH) )
+ return;
+ //VBI_End(); //When DSP in NB-AMR, driver set SC,SD mode as WB-AMR, and DSP will assert, and vice versa
+ if(extraInfo == SAL_APP_TYPE_2GCall){
+ cc_2G_Call_Close(true);
+ }
+ else if(extraInfo == SAL_APP_TYPE_3GCall){
+ cc_3G_Call_Close(true);
+ am.sp3g_flag = false;
+ }
+#if defined(__C2K_SPEECH_SUPPORT__)
+ else if(extraInfo == SAL_APP_TYPE_C2KCall){
+ AM_DSP_TurnOffC2KSDSP(0, 0);
+ }
+#endif
+#if defined(__VOLTE_SUPPORT__)
+ else if(extraInfo == SAL_APP_TYPE_4GCall){
+ SP4G_Call_Close();
+ am.sp4g_flag = false;
+ }
+#endif
+ cc_2G_Call_Open(am.speech_mode, am.speech_mode, am.sub_channel, SAL_SRST_TYPE_HO);
+ AM_Reset_Enh(am.speech_mode);
+ l1sp_NetworkStatusNotification();
+ // l1sp_CodecStatusNotification(am.speech_mode);
+}
+
+void AM_DSP_InterRAT_3G_to_2G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_2G(0, SAL_APP_TYPE_3GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_3G_TO_2G(am.speech_mode);
+}
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_DSP_InterRAT_C2K_to_2G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_2G(0, SAL_APP_TYPE_C2KCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_C2K_TO_2G(am.speech_mode);
+}
+#endif
+#if defined(__VOLTE_SUPPORT__)
+void AM_DSP_InterRAT_4G_to_2G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_2G(0, SAL_APP_TYPE_4GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_4G_TO_2G(am.speech_mode);
+}
+#endif
+void AM_DSP_InterRAT_Standby_to_2G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_2G(0, SAL_APP_TYPE_2GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_STANDBY_TO_2G(am.speech_mode);
+}
+
+void AM_InterRAT_3G_to_2G()
+{
+ AM_Enqueue( AM_DSP_InterRAT_3G_to_2G, 0, 0, false );
+ AM_FlushQFunction();
+}
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_InterRAT_C2K_to_2G()
+{
+ AM_Enqueue( AM_DSP_InterRAT_C2K_to_2G, 0, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+#if defined(__VOLTE_SUPPORT__)
+void AM_InterRAT_4G_to_2G()
+{
+ AM_Enqueue( AM_DSP_InterRAT_4G_to_2G, 0, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+void AM_InterRAT_Standby_to_2G()
+{
+ AM_Enqueue( AM_DSP_InterRAT_Standby_to_2G, 0, 0, false );
+ AM_FlushQFunction();
+}
+
+void AM_DSP_RAT_sub_3G(uint32 codec , uint32 extraInfo)
+{
+ kal_uint16 u16DelayR, u16DelayW, u16DelayM;
+ kal_uint32 u32CurTime64us;
+ am.speech_mode = codec;
+ if( !(am.state & AM_STATE_SPEECH) )
+ return;
+ if(extraInfo == SAL_APP_TYPE_2GCall){
+ cc_2G_Call_Close(true);
+ }else if(extraInfo == SAL_APP_TYPE_3GCall){
+ cc_3G_Call_Close(true);
+ }
+#if defined(__C2K_SPEECH_SUPPORT__)
+ else if(extraInfo == SAL_APP_TYPE_C2KCall){
+ AM_DSP_TurnOffC2KSDSP(0, 0);
+ }
+#endif
+#if defined(__VOLTE_SUPPORT__)
+ else if(extraInfo == SAL_APP_TYPE_4GCall){
+ SP4G_Call_Close();
+ am.sp4g_flag = false;
+ }
+#endif
+
+ SP3G_GetSyncDelayRW( &u16DelayR, &u16DelayW, &u16DelayM, &u32CurTime64us);
+ SAL_3G_Upd_Enc_Cod(codec);//for 3g codec internal, MT6280
+ SAL_3G_Upd_Dec_Cod(codec);//for 3g codec internal, MT6280
+#if defined(_MODEM_RESYNC_3G_)
+ MD_TRC_L1Audio_Msg_AM_3G_Reset_Time_Drift();
+#if defined( __UMTS_RAT__ )
+ switch(L1SP_GetSIMStatus()){
+ case SP_3G_SIM_FDD_ACTIVE:
+ UL1D_Speech_Resync_Reset_Time_Offset();
+ break;
+#if defined(__UMTS_TDD128_MODE__)
+ case SP_3G_SIM_TDD_ACTIVE:
+ TL1C_Reset_Time_Drift();
+ break;
+#endif
+ default:
+ ASSERT(0);
+ }
+#endif
+#endif
+
+#if defined( __UMTS_RAT__ ) && !defined(__L1_STANDALONE__)
+ switch(L1SP_GetSIMStatus()){
+ case SP_3G_SIM_FDD_ACTIVE:
+ if(query_ps_conf_test_mode()==PS_CONF_TEST_FTA)
+ SP3G_SetDTX(false);
+ else
+ SP3G_SetDTX(true);
+ break;
+ case SP_3G_SIM_TDD_ACTIVE:
+ break;
+ default:
+ ASSERT(0);
+ }
+#endif
+ cc_3G_Call_Open(codec, codec, SP3G_IsDTXOn(), u16DelayR, u16DelayW, u16DelayM, u32CurTime64us, SAL_SRST_TYPE_HO);
+ MD_TRC_L1Audio_Msg_SP3G_FORCE_RESYNC( codec, codec, u16DelayR, u16DelayW);
+ am.sp3g_flag = true;
+ AM_Reset_Enh(codec);
+ l1sp_NetworkStatusNotification();
+ // l1sp_CodecStatusNotification(am.speech_mode);
+}
+
+void AM_DSP_InterRAT_2G_to_3G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_3G(codec, SAL_APP_TYPE_2GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_2G_TO_3G(codec);
+}
+
+void AM_DSP_3G_INTRARAT (uint32 codec, uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_3G(codec, SAL_APP_TYPE_3GCall);
+ MD_TRC_L1Audio_Msg_3G_INTRARAT(codec);
+}
+
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_DSP_InterRAT_C2K_to_3G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_3G(codec, SAL_APP_TYPE_C2KCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_C2K_TO_3G(codec);
+}
+#endif
+
+#if defined(__VOLTE_SUPPORT__)
+void AM_DSP_InterRAT_4G_to_3G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_3G(codec, SAL_APP_TYPE_4GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_4G_TO_3G(codec);
+}
+#endif
+
+void AM_InterRAT_2G_to_3G(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_2G_to_3G, codec, 0, false );
+ AM_FlushQFunction();
+}
+
+void AM_3G_INTRARAT(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_3G_INTRARAT, codec, 0, false );
+ AM_FlushQFunction();
+}
+
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_InterRAT_C2K_to_3G(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_C2K_to_3G, codec, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+
+#if defined(__VOLTE_SUPPORT__)
+void AM_InterRAT_4G_to_3G(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_4G_to_3G, codec, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+#endif
+
+#if defined(__C2K_SPEECH_SUPPORT__)
+/*
+ extraInfo: 0:call on; 1: HO; 2: resync; 3: dev Change
+*/
+void AM_DSP_TurnOnC2KSDSP(int codec, uint32 extraInfo ){
+
+ uint16 DelR, DelW, DelM;
+
+ MD_TRC_C2K_AM_DSP_TurnOnC2KSDSP(am.speech_mode, codec);
+
+ SPC2K_GetSyncDelayRW( &DelR, &DelW, &DelM);
+ if((am.speech_mode != codec) && (!am.c2k_flag)) {
+ cc_C2K_Call_Open (codec, _C2K_DTX_SUPPORT_, DelR, DelW, DelM, extraInfo); //VBIRest();
+
+ am.speech_mode = codec;
+ am.c2k_flag = true; // ys
+ }else{
+ cc_C2K_Call_Open (codec, _C2K_DTX_SUPPORT_, DelR, DelW, DelM, extraInfo);//check by daniel//VBIRest();
+ }
+}
+void AM_DSP_TurnOffC2KSDSP(uint32 data , uint32 extraInfo)
+{
+ MD_TRC_C2K_AM_DSP_TurnOffC2KSDSP();
+
+ cc_C2K_Call_Close(true);
+
+ //am.speech_mode = SAL_C2K_COD_MODE_UNDEF;
+ am.c2k_flag = false;
+}
+
+void AM_TurnOffC2KSDSP(void)
+{
+ //TO , move c2kflag here for symmetry
+ AM_Enqueue( AM_DSP_TurnOffC2KSDSP, 0, 0, false );
+ AM_FlushQFunction();
+}
+
+void AM_DSP_RAT_sub_C2K(uint32 codec , uint32 extraInfo)
+{
+ if( !(am.state & AM_STATE_SPEECH) )
+ return;
+ if(extraInfo == SAL_APP_TYPE_2GCall){
+ cc_2G_Call_Close(true);
+ } else if(extraInfo == SAL_APP_TYPE_3GCall){
+ cc_3G_Call_Close(true);
+ am.sp3g_flag = false;
+ }
+#if defined(__VOLTE_SUPPORT__)
+ else if(extraInfo == SAL_APP_TYPE_4GCall){
+ SP4G_Call_Close();
+ am.sp4g_flag = false;
+ }
+#endif
+#if defined(__C2K_SPEECH_SUPPORT__)
+ else if(extraInfo == SAL_APP_TYPE_C2KCall){
+ AM_DSP_TurnOffC2KSDSP(0, 0);
+ }
+#endif
+ AM_DSP_TurnOnC2KSDSP(codec, 1);
+ am.spc2k_flag = true;
+ AM_Reset_Enh(codec);
+ l1sp_NetworkStatusNotification();
+}
+
+void AM_DSP_InterRAT_2G_to_C2K( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_C2K(codec, SAL_APP_TYPE_2GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_2G_TO_C2K(codec);
+}
+
+void AM_DSP_C2K_IntraRAT (uint32 codec, uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_C2K(codec, SAL_APP_TYPE_C2KCall);
+ MD_TRC_L1Audio_Msg_C2K_INTRARAT(codec);
+}
+
+#if defined( __UMTS_RAT__ )
+void AM_DSP_InterRAT_3G_to_C2K( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_C2K(codec, SAL_APP_TYPE_3GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_3G_TO_C2K(codec);
+}
+#endif
+#if defined(__VOLTE_SUPPORT__)
+void AM_DSP_InterRAT_4G_to_C2K( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_C2K(codec, SAL_APP_TYPE_4GCall);
+ MD_TRC_L1Audio_Msg_INTERRAT_4G_TO_C2K(codec);
+}
+#endif
+
+void AM_InterRAT_2G_to_C2K(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_2G_to_C2K, codec, 0, false );
+ AM_FlushQFunction();
+}
+
+void AM_C2K_IntraRAT(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_C2K_IntraRAT, codec, 0, false );
+ AM_FlushQFunction();
+}
+#if defined( __UMTS_RAT__ )
+void AM_InterRAT_3G_to_C2K(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_3G_to_C2K, codec, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+#if defined(__VOLTE_SUPPORT__)
+void AM_InterRAT_4G_to_C2K(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_4G_to_C2K, codec, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+#endif
+
+#if defined(__VOLTE_SUPPORT__)
+void AM_DSP_RAT_sub_4G(uint32 codec , uint32 extraInfo, uint32 resetType)
+{
+ //kal_uint16 u16DelayR, u16DelayW; //unused
+ am.speech_mode = codec;
+ if( !(am.state & AM_STATE_SPEECH) )
+ return;
+
+ if(PS_SRST_TYPE_HO_WITH_VBIEND == resetType)
+ {
+ if(extraInfo == SAL_APP_TYPE_2GCall){
+ cc_2G_Call_Close(true);
+ } else if(extraInfo == SAL_APP_TYPE_3GCall){
+ cc_3G_Call_Close(true);
+ am.sp3g_flag = false;
+ }
+#if defined(__C2K_SPEECH_SUPPORT__)
+ else if(extraInfo == SAL_APP_TYPE_C2KCall){
+ AM_DSP_TurnOffC2KSDSP(0, 0);
+ }
+#endif
+ else if(extraInfo == SAL_APP_TYPE_4GCall){
+ SP4G_Call_Close();
+ }
+ }
+
+ //SP3G_GetSyncDelayRW( &u16DelayR, &u16DelayW);//????
+ //SAL_4G_Upd_Enc_Cod(codec);//for 3g codec internal, MT6280
+ //SAL_4G_Upd_Dec_Cod(codec);//for 3g codec internal, MT6280
+ switch(SP4G_GetL2Mode()){
+#if defined(__LTE_RAT__)
+ case SP_PSCALL_EMAC:
+ SAL_Set_PSRANType(SAL_PSRAN_TYPE_LTE);
+ break;
+#endif
+#if defined(__NR_RAT__)
+ case SP_PSCALL_NMAC:
+ SAL_Set_PSRANType(SAL_PSRAN_TYPE_NR);
+ break;
+#endif
+ case SP_PSCALL_NONE:
+ SAL_Set_PSRANType(SAL_PSRAN_TYPE_NONE);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ //SAL_4G_Call_Open(codec);
+ SP4G_Call_Open(codec, resetType);
+ AM_Reset_Enh(codec);
+ l1sp_NetworkStatusNotification();
+ // l1sp_CodecStatusNotification(am.speech_mode);
+ am.sp4g_flag = true;
+}
+
+void AM_DSP_InterRAT_2G_to_4G( uint32 codec , uint32 extraInfo)
+{
+ //ASSERT(codec < SP4G_CODEC_G711 || codec > SP4G_CODEC_G729);//context is under task level, so g-series cannot be used
+ AM_DSP_RAT_sub_4G(codec, SAL_APP_TYPE_2GCall, PS_SRST_TYPE_HO_WITH_VBIEND);
+ MD_TRC_L1Audio_Msg_INTERRAT_2G_TO_4G(codec, PS_SRST_TYPE_HO_WITH_VBIEND);
+}
+#if defined( __UMTS_RAT__ )
+void AM_DSP_InterRAT_3G_to_4G( uint32 codec , uint32 extraInfo)
+{
+ //ASSERT(codec < SP4G_CODEC_G711 || codec > SP4G_CODEC_G729);//context is under task level, so g-series cannot be used
+ AM_DSP_RAT_sub_4G(codec, SAL_APP_TYPE_3GCall, PS_SRST_TYPE_HO_WITH_VBIEND);
+ MD_TRC_L1Audio_Msg_INTERRAT_3G_TO_4G(codec, PS_SRST_TYPE_HO_WITH_VBIEND);
+}
+#endif
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_DSP_InterRAT_C2K_to_4G( uint32 codec , uint32 extraInfo)
+{
+ AM_DSP_RAT_sub_4G(codec, SAL_APP_TYPE_C2KCall, PS_SRST_TYPE_HO_WITH_VBIEND);
+ MD_TRC_L1Audio_Msg_INTERRAT_C2K_TO_4G(codec, PS_SRST_TYPE_HO_WITH_VBIEND);
+}
+#endif
+
+void AM_DSP_4G_INTRARAT (uint32 codec, uint32 resetType)
+{
+ //ASSERT(codec < SP4G_CODEC_G711 || codec > SP4G_CODEC_G729); context is under task level, so g-series can be used
+ AM_DSP_RAT_sub_4G(codec, SAL_APP_TYPE_4GCall, resetType);
+ MD_TRC_L1Audio_Msg_4G_INTRARAT(codec, resetType);
+}
+
+void AM_InterRAT_2G_to_4G(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_2G_to_4G, codec, 0, false );
+ AM_FlushQFunction();
+}
+#if defined( __UMTS_RAT__ )
+void AM_InterRAT_3G_to_4G(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_3G_to_4G, codec, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+#if defined(__C2K_SPEECH_SUPPORT__)
+void AM_InterRAT_C2K_to_4G(uint32 codec)
+{
+ AM_Enqueue( AM_DSP_InterRAT_C2K_to_4G, codec, 0, false );
+ AM_FlushQFunction();
+}
+#endif
+void AM_4G_INTRARAT(uint32 codec, uint32 resetType)
+{
+ AM_Enqueue( AM_DSP_4G_INTRARAT, codec, resetType, false );
+ AM_FlushQFunction();
+}
+
+void SAL_4G_AMRCall_Open(int codec, kal_bool isDTX, kal_uint16 u16DelayR, kal_uint16 u16DelayW, const uint16 idle_delay, kal_uint32 u32CurTime64us, kal_uint32 resetType);
+void SAL_4G_AMRCall_Close();
+#if defined(__G_CODEC_SUPPORT__)
+void SAL_4G_GSeriesCall_Open(int codec, kal_uint16 u16DelayR, kal_uint16 u16DelayW, const uint16 idle_delay, kal_uint32 u32CurTime64us, kal_uint32 resetType);
+void SAL_4G_GSeriesCall_Close(int codec);
+#endif
+#if defined(__EVS_CODEC_SUPPORT__)
+void SAL_4G_EVSCall_Open(int codec, kal_bool isDTX, kal_uint16 u16DelayR, kal_uint16 u16DelayW, const uint16 idle_delay, kal_uint32 u32CurTime64us, kal_uint32 resetType);
+void SAL_4G_EVSCall_Close(void);
+#endif //#if defined(__EVS_CODEC_SUPPORT__)
+
+void SP4G_Call_Open(uint16 codec, PS_RESET_TYPE_t resetType)
+{
+ kal_uint16 delayR, delayW, delayM;
+ kal_uint32 u32CurTime64us;
+
+ if(PS_SRST_TYPE_HO_WITH_VBIEND == resetType)
+ {
+ ASSERT(am.codec_4g == -1);
+ }
+ SAL_Set_AWBPlusFlag(0);
+ am.codec_4g = codec;
+ SP4G_GetSyncDelayRW( &delayR, &delayW, &delayM, &u32CurTime64us);
+#if defined(__G_CODEC_SUPPORT__)
+ if((codec >= SP4G_CODEC_G711) && (codec <= SP4G_CODEC_G729)){
+ SAL_4G_GSeriesCall_Open(codec, delayR, delayW, delayM, u32CurTime64us, resetType);
+ }else
+#endif
+ {
+#if defined(__EVS_CODEC_SUPPORT__)
+ if(is_EVS_codec((uint8)codec)){
+ if( get_sp4g_fake_EVS_IO() )
+ {
+ SAL_Set_AWBPlusFlag(1);
+ }
+ SAL_4G_EVSCall_Open((kal_uint32)codec, (kal_uint32)SP4G_IsDTXOn(), (kal_uint32)delayR, (kal_uint32)delayW, (kal_uint32)delayM, (kal_uint32)u32CurTime64us, resetType);
+ }else
+#endif //#if defined(__EVS_CODEC_SUPPORT__)
+ {
+ SAL_4G_AMRCall_Open(codec, SP4G_IsDTXOn(), delayR, delayW, delayM, u32CurTime64us, resetType);
+ }
+ }
+}
+
+void SP4G_Call_Close(void){
+ ASSERT(am.codec_4g != -1);
+ SAL_Set_AWBPlusFlag(0);
+#if defined(__G_CODEC_SUPPORT__)
+ if( is_g_codec(am.codec_4g) ){
+ SAL_4G_GSeriesCall_Close(SAL_PCM_NARROWBAND);
+ }else
+#endif
+ {
+#if defined(__EVS_CODEC_SUPPORT__)
+ if(is_EVS_codec(am.codec_4g)){
+ SAL_4G_EVSCall_Close();
+ }else
+#endif //#if defined(__EVS_CODEC_SUPPORT__)
+ {
+ SAL_4G_AMRCall_Close();
+ }
+ }
+ am.codec_4g = -1;
+}
+//extern void SAL_Set4G(bool b);
+void SAL_4G_AMRCall_Open(int codec, kal_bool isDTX, kal_uint16 u16DelayR, kal_uint16 u16DelayW, const uint16 idle_delay, kal_uint32 u32CurTime64us, kal_uint32 resetType)
+{
+ //SP4G_GetSyncDelayRW( &u16DelayR, &u16DelayW);
+ SAL_3G_Upd_Enc_Cod(codec);
+ SAL_3G_Upd_Dec_Cod(codec);
+ //cc_3G_Call_Open(codec, codec, SP4G_IsDTXOn(), u16DelayR, u16DelayW, DSP_PCM_IDLE_DELAY_TABLE[6][2]);
+ //SAL_Set4G(true);
+ cc_4G_Call_Open_temp(codec, codec, isDTX, u16DelayR, u16DelayW, idle_delay, u32CurTime64us, resetType);
+ MD_TRC_L1Audio_Msg_SP4G_FORCE_RESYNC( codec, codec, u16DelayR, u16DelayW);
+};
+
+void SAL_4G_AMRCall_Close()
+{
+ cc_4G_Call_Close_temp(true);
+ //SAL_Set4G(false);
+}
+
+
+void SAL_4G_GSeriesCall_Open(int codec, kal_uint16 u16DelayR, kal_uint16 u16DelayW, const uint16 idle_delay, kal_uint32 u32CurTime64us,
+ kal_uint32 resetType){
+ int band_mod = SAL_NB;
+ if(SP4G_CODEC_G722 == codec )
+ band_mod = SAL_WB;
+
+ //SAL_Set4G(true);
+ //memset(&cfg, 0, sizeof(Sal_PCMEx_Config_t));
+ //cfg.idle = false;//true;
+ //cfg.swi = SAL_PCMEX_SWITCH_ON;
+ //cfg.type = SAL_PCMEX_TYPE_VOLTE;
+ //cfg.band = band;//SAL_PCM_NARROWBAND
+ //SAL_PcmEx_Config(&cfg);
+
+ /*if(band == SAL_PCM_WIDEBAND)
+ {
+ AMR_codec_temp = SP4G_CODEC_WBAMR_12_65;
+ }
+ else
+ {
+ AMR_codec_temp = SP4G_CODEC_AMR_12_2;
+ }
+ SAL_3G_Upd_Enc_Cod(AMR_codec_temp);
+ SAL_3G_Upd_Dec_Cod(AMR_codec_temp);*/
+ cc_4G_G_Codec_Call_Open(band_mod, u16DelayR, u16DelayW, idle_delay, u32CurTime64us, resetType);
+
+ {
+ void GSeries_Encode_Init(SP4G_Codec codec);
+ void GSeries_Decode_Init(SP4G_Codec codec);
+ GSeries_Encode_Init(codec);
+ GSeries_Decode_Init(codec);
+ //SP4G_SetCodec(codec);//fix
+ }
+ Extcodec_Call_Open();
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#else /*#if 0*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif /*#if 0*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#ifndef L1D_TEST
+/* under construction !*/
+/* under construction !*/
+#endif
+/* under construction !*/
+#endif
+ kal_prompt_trace(MOD_L1SP, "[SAL_4G_GSeriesCall_Open] SAL_PcmEx_CheckState OK");
+
+
+}
+
+
+void SAL_4G_GSeriesCall_Close(int codec){
+ Extcodec_Call_Close();
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ ////SAL_Set4G(false);
+ {
+ void GSeries_Encode_DeInit();
+ void GSeries_Decode_DeInit();
+ }
+
+ //fsju
+ cc_4G_G_Codec_Call_Close(true);
+}
+
+
+#if defined(__EVS_CODEC_SUPPORT__)
+void SP4G_EVS_CallOpenSetPar(void);
+#endif //#if defined(__EVS_CODEC_SUPPORT__)
+void SAL_4G_EVSCall_Open(int codec, kal_bool isDTX, kal_uint16 u16DelayR, kal_uint16 u16DelayW, const uint16 idle_delay, kal_uint32 u32CurTime64us, kal_uint32 resetType)
+{
+#if defined(__EVS_CODEC_SUPPORT__)
+ SP4G_EVS_CallOpenSetPar();
+#endif //#if defined(__EVS_CODEC_SUPPORT__)
+
+ //cc_4G_EVS_Codec_Call_Open(codec, codec, 0/*isDTX*/, u16DelayR, u16DelayW, idle_delay, u32CurTime64us);
+ cc_4G_EVS_Codec_Call_Open((kal_uint32)codec, (kal_uint32)isDTX, (kal_uint32)u16DelayR, (kal_uint32)u16DelayW, (kal_uint32)idle_delay, (kal_uint32)u32CurTime64us, resetType);
+
+ //kal_prompt_trace(MOD_L1SP, "[SAL_4G_EVSCall_Open] SAL_PcmEx_CheckState OK");
+ MD_TRC_L1Audio_Msg_SP4G_EVSSeriesCall_Open_OK();
+}
+
+
+void SAL_4G_EVSCall_Close(void)
+{
+ cc_4G_EVS_Codec_Call_Close(1);
+}
+
+
+#endif
+
+kal_bool AM_Is_4G()
+{
+#if defined(__VOLTE_SUPPORT__)
+ return am.sp4g_flag;
+#else
+ return KAL_FALSE;
+#endif
+}
+
+
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+static void AM_DSP_VMRecordOn( uint32 speech_mode , uint32 extraInfo)
+{
+ Sal_VM_Config_t cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_VM_Config_t));
+
+ cfg_t.swi = SAL_VM_SWITCH_ON;
+
+ if( am.state & (AM_STATE_SPEECH |AM_STATE_VOIP |AM_STATE_VOICE) ) { /* Conversation Recording */
+ ASSERT(!(am.speech_state & SP_STATE_VMR));
+ cfg_t.idle = false;
+ am.speech_state |= SP_STATE_VMR;
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(0) , L1AUDIO_Str_onoff(1) );
+ }
+ else { /* VM in idle mode */
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#if defined(AMRWB_ENCODE) // not define in samrt phone
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif//#if defined(AMRWB_ENCODE)
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ }
+
+ SAL_VM_Config(&cfg_t);
+
+}
+
+void AM_VMRecordOn( void )
+{
+ AM_Enqueue( AM_DSP_VMRecordOn, 0, 0, false );
+
+ AM_FlushQFunction();
+}
+
+
+static void AM_DSP_VMRecordOff( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+ Sal_VM_Config_t cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_VM_Config_t));
+
+ cfg_t.swi = SAL_VM_SWITCH_OFF;
+ cfg_t.idle = false;
+
+ if(am.speech_state & SP_STATE_VMR) /* Conversation Recording */
+ {
+ am.speech_state &= ~SP_STATE_VMR;
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(0) , L1AUDIO_Str_onoff(0) );
+ SAL_VM_Config(&cfg_t);
+ }
+ else /* VM in idle mode */
+ {
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ }
+}
+
+void AM_VMRecordOff( void )
+{
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ AM_Enqueue( AM_DSP_VMRecordOff, 0, 0, false );
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+static void AM_DSP_KeyToneOn( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+ ASSERT(!(am.state & AM_STATE_KEYTONE));
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(0), L1AUDIO_Str_onoff(1) );
+
+ if ( am.state == 0 ) { // ( (am.state & ~AM_STATE_AVSYNC) == 0 ) {
+ AFE_TurnOn8K();
+ // AM_Write_Idle_Delay(4); // driver dost not support idle playback function, remove
+ VBI_Reset();
+ }
+ am.state |= AM_STATE_KEYTONE;
+}
+
+void AM_KeyToneOn( void )
+{
+ AM_Enqueue( AM_DSP_KeyToneOn, 0, 0, false );
+}
+
+static void AM_DSP_KeyToneOff( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(0), L1AUDIO_Str_onoff(0) );
+ am.state &= ~AM_STATE_KEYTONE;
+
+ if(am.state == 0)
+ VBI_End();
+
+ if( am.state == 0 ) // (am.state & ~AM_STATE_AUDIO) == 0 ) // no audio state exist
+ AFE_TurnOff8K();
+}
+
+void AM_KeyToneOff( void )
+{
+ AM_Enqueue( AM_DSP_KeyToneOff, 0, 0, false );
+}
+
+bool AM_IsKeyToneOn( void )
+{
+ if (am.state & AM_STATE_KEYTONE)
+ return true;
+ return false;
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+static void AM_DSP_ToneOn( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+ ASSERT(!(am.state & AM_STATE_TONE));
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(1), L1AUDIO_Str_onoff(1) );
+
+ if( am.state == 0 ) { // ( (am.state & ~AM_STATE_AVSYNC) == 0) {
+ AFE_TurnOn8K();
+ // AM_Write_Idle_Delay(4); // driver not support idle playback function, so remove
+ VBI_Reset();
+ }
+ am.state |= AM_STATE_TONE;
+}
+
+void AM_ToneOn( void )
+{
+ AM_Enqueue( AM_DSP_ToneOn, 0, 0, false );
+
+
+}
+
+static void AM_DSP_ToneOff( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(1), L1AUDIO_Str_onoff(0) );
+ am.state &= ~AM_STATE_TONE;
+
+ if( am.state == 0 )
+ VBI_End();
+
+ if( am.state == 0 ) // (am.state & ~AM_STATE_AUDIO) == 0 ) // no audio state exist
+ AFE_TurnOff8K();
+}
+
+void AM_ToneOff( void )
+{
+ AM_Enqueue( AM_DSP_ToneOff, 0, 0, false );
+}
+
+bool AM_IsToneOn( void )
+{
+ if (am.state & AM_STATE_TONE)
+ return true;
+ return false;
+}
+
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+static void AM_DSP_PCM8K_PlaybackOn( uint32 data , uint32 extraInfo)
+{
+ uint16 u16DelayR, u16DelayW, u16DelayM;
+
+ (void)data;
+
+ if( am.state == 0 ) {
+ AFE_TurnOn8K();
+ SAL_Get_Delay(SAL_DEALY_PCM8K_PB, SAL_DELAY_NA, SAL_DELAY_NA, &u16DelayR, &u16DelayW, &u16DelayM);
+ SAL_App_Open(u16DelayR, u16DelayW, u16DelayM);
+ }
+// #if defined(BGSND_ENABLE) || defined(__SMART_PHONE_MODEM__)
+ if ( data == 1 )
+ {
+ ASSERT(!(am.state & AM_STATE_SND_EFFECT));
+ am.state |= AM_STATE_SND_EFFECT;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(9), L1AUDIO_Str_onoff(1) );
+ }
+ else
+// #endif // #if defined(BGSND_ENABLE) || defined(__SMART_PHONE_MODEM__)
+ {
+ ASSERT_REBOOT( !(am.state & AM_CONFLICT_STATE) );
+ am.state |= AM_STATE_VOICE;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(2), L1AUDIO_Str_onoff(1) );
+ }
+}
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+static void AM_DSP_PCM8K_PlaybackOff( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+
+// #if defined(BGSND_ENABLE) || defined(__SMART_PHONE_MODEM__)
+ if( data == 1 )
+ {
+ am.state &= ~AM_STATE_SND_EFFECT;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(9), L1AUDIO_Str_onoff(0) );
+ }
+ else
+// #endif // #if defined(BGSND_ENABLE) || defined(__SMART_PHONE_MODEM__)
+ {
+ am.state &= ~AM_STATE_VOICE;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(2), L1AUDIO_Str_onoff(0) );
+ }
+ SAL_App_Close(am.state == 0);
+
+ if( am.state == 0 ) // (am.state & ~AM_STATE_AUDIO) == 0 ) // no audio state exist
+ AFE_TurnOff8K();
+}
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+
+uint32 AM_GetRecordFormat()
+{
+ return am.record_format;
+}
+
+/**
+ @data: bit[0:3] DL position
+*/
+static void AM_DSP_PCM16K_RecordOn( uint32 data , uint32 extraInfo)
+{
+ (void)extraInfo;
+ Sal_PCMEx_Config_t cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_PCMEx_Config_t));
+
+ ASSERT_REBOOT( !(am.state & AM_CONFLICT_STATE) );
+ am.record_format = AM_RECORD_16K;
+
+
+ cfg_t.idle = true;
+ cfg_t.band = SAL_PCM_WIDEBAND;
+ cfg_t.type = SAL_PCMEX_TYPE_REC_NML;
+ cfg_t.swi = SAL_PCMEX_SWITCH_ON;
+ cfg_t.PCMRec_DL_Pos = (data&0xF);
+ SAL_Get_Delay(SAL_DEALY_PCM16K, SAL_DELAY_NA, SAL_DELAY_NA, &cfg_t.delR, &cfg_t.delW, &cfg_t.delM);
+
+ //config related digital device(nb/wb),
+ // am_SetDevice();
+
+ AFE_TurnOn8K();
+
+ SAL_PcmEx_Config(&cfg_t);
+
+ am.state |= AM_STATE_VOICE;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(10), L1AUDIO_Str_onoff(1) );
+}
+
+void AM_PCM16K_RecordOn( uint8 dlPos )
+{
+
+ if(!(am.state & AM_STATE_SPEECH))
+ {
+ AM_Enqueue( AM_DSP_PCM16K_RecordOn, dlPos, 0, false );
+ AM_FlushQFunction();
+
+ // enable enhancement
+ if(!AM_IsBTCordlessMode())
+ {
+ SetSpeechEnhancement(true);
+ }
+ } else {
+ DEBUG_ASSERT(0);
+ }
+
+}
+
+static void AM_DSP_PCM16K_RecordOff( uint32 data , uint32 extraInfo)
+{
+ (void)data;
+ (void)extraInfo;
+ Sal_PCMEx_Config_t cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_PCMEx_Config_t));
+
+ cfg_t.swi = SAL_PCMEX_SWITCH_OFF;
+ am.state &= ~AM_STATE_VOICE;
+ am.record_format = AM_RECORD_NONE;
+ cfg_t.idle = false;
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(10), L1AUDIO_Str_onoff(0) );
+
+ if( am.state == 0 ) {
+ cfg_t.idle = true;
+ }
+ cfg_t.type = SAL_PCMEX_TYPE_REC_NML;
+
+ SAL_PcmEx_Config(&cfg_t);
+
+ if( am.state == 0 ) {
+ AFE_TurnOff8K();
+ }
+}
+
+void AM_PCM16K_RecordOff( bool wait )
+{
+ // turn off speech enhancment
+ if(!(am.state & AM_STATE_SPEECH))
+ {
+ if(!AM_IsBTCordlessMode())
+ {
+ SetSpeechEnhancement(false);
+ }
+
+ AM_Enqueue( AM_DSP_PCM16K_RecordOff, 0, 0, false );
+ if( wait )
+ AM_FlushQFunction();
+ } else {
+ DEBUG_ASSERT(0);
+ }
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+/**
+ @extraInfo: bit[0:3] DL position when appType is AM_PCM8KREC_APP_TYPE_PCMREC
+*/
+static void AM_DSP_PCM8K_RecordOn( uint32 appType , uint32 extraInfo)
+{
+ (void)extraInfo;
+
+ Sal_PCMEx_Config_t cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_PCMEx_Config_t));
+
+ cfg_t.idle = false;
+ cfg_t.swi = SAL_PCMEX_SWITCH_ON;
+
+ am.record_format = AM_RECORD_8K;
+
+ if( am.state & (AM_STATE_SPEECH | AM_STATE_VOIP)) {
+ // REMIND: Call record and VM EPL can work in the same time,
+ // but they use same interrupt and setting.
+
+ if (AM_PCM8KREC_APP_TYPE_PCMREC == appType) { // Conversation Recording
+ if (!(am.speech_state & SP_STATE_PCM8K_REC)) {
+ cfg_t.type = SAL_PCMEX_TYPE_REC_NML;
+ cfg_t.PCMRec_DL_Pos = (extraInfo&0xF);
+ am.speech_state |= SP_STATE_PCM8K_REC;
+
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(1) , L1AUDIO_Str_onoff(1) );
+ } else {
+ return;
+ }
+ } else if(AM_PCM8KREC_APP_TYPE_VMEPL == appType) { // VM EPL
+ if (!(am.speech_state & SP_STATE_VMR_EPL)) {
+ cfg_t.type = SAL_PCMEX_TYPE_REC_EPL;
+ am.speech_state |= SP_STATE_VMR_EPL;
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(4) , L1AUDIO_Str_onoff(1) );
+ } else {
+ return;
+ }
+ } else {
+ DEBUG_ASSERT(0); // unknown application type
+ return;
+ }
+
+ }else{
+ if(AM_PCM8KREC_APP_TYPE_VMEPL == appType) { // idle epl
+ if((am.state & AM_STATE_VOICE)
+ && (!(am.speech_state & SP_STATE_VMR_EPL))) {
+
+ am.speech_state |= SP_STATE_VMR_EPL;
+ cfg_t.idle = false;
+ cfg_t.type = SAL_PCMEX_TYPE_REC_EPL;
+ } else {
+ return;
+ }
+ } else { // idle record
+ if( !(am.state & AM_CONFLICT_STATE) ){
+ am.state |= AM_STATE_VOICE;
+
+ cfg_t.idle = true;
+ cfg_t.type = SAL_PCMEX_TYPE_REC_NML;
+ cfg_t.band = SAL_PCM_NARROWBAND;
+ cfg_t.PCMRec_DL_Pos = (extraInfo&0xF);
+ SAL_Get_Delay(SAL_DEALY_NOTAMR, SAL_DELAY_NA, SAL_DELAY_NA, &cfg_t.delR, &cfg_t.delW, &cfg_t.delM);
+ } else {
+ return;
+ }
+ }
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(4), L1AUDIO_Str_onoff(1) );
+ }
+
+ if(cfg_t.idle)
+ AFE_TurnOn8K();
+
+ SAL_PcmEx_Config(&cfg_t);
+}
+
+void AM_PCM8K_RecordOn( AM_PCM8KREC_APP_TYPE appType, uint8 dlPos )
+{
+
+ AM_Enqueue( AM_DSP_PCM8K_RecordOn, (uint32)appType, dlPos, false );
+ AM_FlushQFunction();
+
+ if(!(am.state & (AM_STATE_SPEECH | AM_STATE_VOIP)))
+ {
+ if(!AM_IsBTCordlessMode())
+ {
+ SetSpeechEnhancement(true);
+ }
+ }
+}
+
+static void AM_DSP_PCM8K_RecordOff( uint32 appType , uint32 extraInfo)
+{
+ Sal_PCMEx_Config_t cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_PCMEx_Config_t));
+
+ am.record_format = AM_RECORD_NONE;
+ cfg_t.swi = SAL_PCMEX_SWITCH_OFF;
+ cfg_t.idle = false;
+
+ if(AM_PCM8KREC_APP_TYPE_PCMREC == appType)
+ cfg_t.type = SAL_PCMEX_TYPE_REC_NML;
+ if(AM_PCM8KREC_APP_TYPE_VMEPL == appType)
+ cfg_t.type = SAL_PCMEX_TYPE_REC_EPL;
+
+ if(am.speech_state & (SP_STATE_PCM8K_REC|SP_STATE_VMR_EPL) ) // under call
+ {
+ if(AM_PCM8KREC_APP_TYPE_PCMREC == appType) {
+ am.speech_state &= ~SP_STATE_PCM8K_REC;
+ } else if(AM_PCM8KREC_APP_TYPE_VMEPL == appType){
+ am.speech_state &= ~SP_STATE_VMR_EPL;
+ } else {
+ DEBUG_ASSERT(0); // unknow application type
+ return;
+ }
+
+ if(AM_PCM8KREC_APP_TYPE_PCMREC == appType) {
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(1) , L1AUDIO_Str_onoff(0) );
+ } else if(AM_PCM8KREC_APP_TYPE_VMEPL == appType){
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(4) , L1AUDIO_Str_onoff(0) );
+ }
+ }
+ else
+ {
+ if(AM_PCM8KREC_APP_TYPE_VMEPL == appType) { // idle VM epl
+ am.speech_state &= ~SP_STATE_VMR_EPL;
+ } else { // idle record
+ am.state &= ~AM_STATE_VOICE;
+ }
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(4), L1AUDIO_Str_onoff(0) );
+ }
+
+ if( am.state == 0 ) {
+ cfg_t.idle = true;
+ }
+
+ SAL_PcmEx_Config(&cfg_t);
+ if( am.state == 0 ) // (am.state & ~AM_STATE_AUDIO) == 0 ) // no audio state exist
+ AFE_TurnOff8K();
+}
+
+void AM_PCM8K_RecordOff( bool wait , AM_PCM8KREC_APP_TYPE appType)
+{
+ if(!(am.state & (AM_STATE_SPEECH | AM_STATE_VOIP)))
+ {
+ if(!AM_IsBTCordlessMode())
+
+ {
+ SetSpeechEnhancement(false);
+ }
+ }
+
+ AM_Enqueue( AM_DSP_PCM8K_RecordOff, (uint32)appType, 0, false );
+
+ if( wait )
+ AM_FlushQFunction();
+}
+
+/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */
+int16 AM_IsAudioPlaybackOn( void )
+{
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+ return -1;
+}
+
+int16 AM_IsIdleState( void )
+{
+ if( am.state == 0 )
+ return true;
+ return false;
+}
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+bool AM_IsVoiceOn( void )
+{
+ if(am.state !=0 ) // ( am.state & ~AM_STATE_AUDIO) // no audio state exist
+ return true;
+ return false;
+}
+
+/* ==========================================================================*/
+static void RampPush( RampStatus status)
+{
+ if(RB_FULL(am.ramp_point_queue)) {
+ MD_TRC_L1SP_MUTE_DSP_RAMP_QUEUE_FULL();
+ } else {
+ RB_PUT(am.ramp_point_queue, status);
+ }
+}
+
+static void RampPop( void )
+{
+ if(RB_EMPTY(am.ramp_point_queue)) {
+ MD_TRC_L1SP_MUTE_DSP_RAMP_QUEUE_EMPTY();
+ ASSERT(0);
+ } else {
+ RB_CONSUME(am.ramp_point_queue);
+ }
+}
+
+void AM_RAMP_INIT(bool mute, uint16 ramp_point)
+{
+ Sal_Ramp_State_t preState = SAL_Ramp_GetState(ramp_point);
+ RampStatus rampStatus;
+ rampStatus.RampPoint = ramp_point;
+ rampStatus.MuteState = mute;
+ MD_TRC_L1SP_MUTE_DSP_RAMP_CONTROL(0, ramp_point, preState, mute, am.state);
+ if(AM_IsAmInSpeechState())
+ {
+ if(mute) {
+ if( SAL_RAMP_DOWN_DONE == preState) {
+#if defined(__SMART_PHONE_MODEM__)
+ spc_sendRampDoneAck(rampStatus.RampPoint);
+#endif
+ } else { // if state in RAMP_DOWN_INIT or RAMP_DOWN_RUN, it won't take effect
+ SAL_RampDown_SetInit(ramp_point);
+ RampPush(rampStatus);
+ }
+ } else { // unmute
+ if( SAL_RAMP_DOWN_DONE == preState) { // no sound, so ramp up
+ SAL_RampUp_SetInit(ramp_point);
+ RampPush(rampStatus);
+ } else { // if state in RAMP_UP_INIT or RAMP_UP_RUN, it won't take effect
+#if defined(__SMART_PHONE_MODEM__)
+ spc_sendRampDoneAck(rampStatus.RampPoint);
+#endif
+ }
+ }
+ } else {
+ if( mute) {
+ SAL_Ramp_SetMute(rampStatus.RampPoint);
+ } else {
+ SAL_Ramp_SetUnMute(rampStatus.RampPoint);
+ }
+ kal_prompt_trace(MOD_L1SP, "[AM_Ramp_Point] No in speech state!");
+#if defined(__SMART_PHONE_MODEM__)
+ spc_sendRampDoneAck(rampStatus.RampPoint);
+#endif
+ }
+ MD_TRC_L1SP_MUTE_DSP_RAMP_CONTROL(1, ramp_point, SAL_Ramp_GetState(ramp_point),mute,am.state);
+}
+void AM_RAMP_DONE(void)
+{
+ RampStatus rampStatus;
+ while (!RB_EMPTY(am.ramp_point_queue)) {
+ RB_PEEK(am.ramp_point_queue, rampStatus);
+ MD_TRC_L1SP_MUTE_DSP_RAMP_DONE_STATE(rampStatus.MuteState, rampStatus.RampPoint, am.state);
+ if(AM_IsAmInSpeechState()) {
+ if(rampStatus.MuteState) {
+ if(SAL_RampDown_IsDone(rampStatus.RampPoint)) {
+ kal_prompt_trace(MOD_L1SP, "[AM_Ramp_Point] ramp down pass!");
+ } else {
+ MD_TRC_L1SP_MUTE_DSP_RAMP_DELAY_MUTE();
+ break;
+ }
+ } else {
+ if(SAL_RampUp_IsDone(rampStatus.RampPoint)) {
+ kal_prompt_trace(MOD_L1SP, "[AM_Ramp_Point] ramp up pass!");
+ SAL_Ramp_SetFinal(rampStatus.RampPoint);
+ } else {
+ MD_TRC_L1SP_MUTE_DSP_RAMP_DELAY_UNMUTE();
+ break;
+ }
+ }
+ } else { // force mute/unmute when call end
+ if(rampStatus.MuteState) {
+ SAL_Ramp_SetFinal(rampStatus.RampPoint);
+ SAL_Ramp_SetMute(rampStatus.RampPoint);
+ MD_TRC_L1SP_MUTE_DSP_RAMP_FORCE_MUTE();
+ } else {
+ SAL_Ramp_SetFinal(rampStatus.RampPoint);
+ MD_TRC_L1SP_MUTE_DSP_RAMP_FORCE_UNMUTE();
+ }
+ }
+ RampPop();
+#if defined(__SMART_PHONE_MODEM__)
+ spc_sendRampDoneAck(rampStatus.RampPoint);
+#endif
+ }
+}
+void AM_Mute_UL_EnhResult_Speech(bool mute)
+{
+ MD_TRC_L1SP_MUTE_DSP_UL_ENH_RESULT_CONTROL(mute);
+ SAL_Mute_Ctrl(SAL_MUTE_UL_IN_EN, mute); // in the enhancement end point, which is set -60db to the result.
+}
+
+void AM_Mute_UL_Source_Speech(bool mute)
+{
+ AM_RAMP_INIT(mute, SAL_RAMP_UL_PRE_EN);
+}
+
+void AM_Mute_UL_Codec_Speech( bool mute )
+{
+ MD_TRC_L1SP_MUTE_DSP_UL_CODEC_CONTROL(mute);
+ SAL_Mute_Ctrl(SAL_MUTE_UL_PRE_EXTCOD, mute); // need to under this position, or background sound won't be mute.
+}
+
+void AM_Mute_UL_POS_EN_Speech( bool mute )
+{
+ AM_RAMP_INIT(mute, SAL_RAMP_UL_POS_EN);
+
+}
+
+void AM_Mute_DL_8K_Speech( bool mute )
+{
+ AM_RAMP_INIT(mute, SAL_RAMP_DL_PRE_DACA);
+}
+
+void AM_Mute_DL_Speech_Traffic( bool mute )
+{
+ MD_TRC_L1SP_MUTE_DSP_DL_TRAFFIC_CONTROL(mute);
+ SAL_Mute_Ctrl(SAL_MUTE_DL_POS_EXTCOD, mute); //considering the VT case using P2W, so mute data at this point , not at SAL_MUTE_DL_PRE_SD
+}
+
+void AM_Mute_DL_PRE_PcmMixer(bool mute)
+{
+ AM_RAMP_INIT(mute, SAL_RAMP_DL_PRE_MIXER2);
+}
+
+
+
+void AM_Init( void )
+{
+ am.dsp_2g_reset = false;
+
+ am.record_format = AM_RECORD_NONE;
+ RB_INIT( am.qfunc );
+ am.state = 0;
+ am.speech_mode = 0;
+ am.pre_speech_mode = 0;
+ am.sub_channel = 0;
+ am.is_reset_enh = 0;
+ // am.speech_off_delay = 0;
+ // am.pre_isWBLink = KAL_FALSE;
+#if defined(_SPE_ENH_MD_PARSE_)
+ am.isFirCoeffSet = false;
+#endif
+
+ SAL_Dsp_Sph_Init();
+
+ // AM_WriteSidetoneFIR(); // 93 not dsp sidetone, so remove
+
+#if defined(_SPE_ENH_MD_PARSE_)
+
+ if( am.isFirCoeffSet == KAL_FALSE ) {
+ AM_WriteWbFirCoeffs( WB_Speech_Input_FIR_Coeff[0], WB_Speech_Output_FIR_Coeff[0] );
+ AM_WriteFirCoeffs( WB_Speech_Input_FIR_Coeff[0], WB_Speech_Output_FIR_Coeff[0] );
+ }
+ #endif
+ // AM_WriteAntiAliasFilter();
+
+ am.io_type = NORMAL_MODE;
+ am.speech_state = 0;
+ // am.voip_state = 0;
+ // am.fLoopBack = false;
+ am.sp3g_flag = false;
+#if defined(__C2K_SPEECH_SUPPORT__)
+ am.spc2k_flag = false;
+ am.c2k_flag = false;
+#endif
+#if defined(__VOLTE_SUPPORT__)
+ am.sp4g_flag = false;
+ am.codec_4g = -1;
+#endif
+
+ // AM_DSP_SetSpeechDigitalGain(DG_DL_Speech); // replace by spGain_Init()
+ // AM_DSP_SetSpeechEnhRefDigitalGain(DG_DL_Speech); //am.speechDlEnhRefDigtalGain init // replace by spGain_Init
+}
+
+/* ========================================================================= */
+/* Bluetooth control Functions */
+/* ========================================================================= */
+
+
+static void AM_DSP_BluetoothOn( uint32 data , uint32 extraInfo)
+{
+ Sal_BT_Config cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_BT_Config));
+ cfg_t.feed_cfg = true;
+
+
+ // leave the gain control to AP. do not do any backup now
+ // am.bt_digital_gain = AM_DSP_GetSpeechDigitalGain(); //*DP_VOL_OUT_PCM;
+ // am.bt_dlEnhRef_digital_gain = AM_GetSpeechEnhRefDigitalGain(); // use am.speechDlEnhRefDigtalGain
+
+ // Zero-pending
+ cfg_t.linear_ctrl = SAL_BT_LINEAR_GAIN_CONFIG_ZPAD;
+ cfg_t.mode = SAL_BT_MODE_LINEAR;
+ // MSB first
+ cfg_t.linear_reverse = false;
+
+ //set mode and uplink gain
+ cfg_t.linear_ul_gain = 1;
+
+ // leave the gain control to AP. do not do any backup now
+ // AM_DSP_SetSpeechDigitalGain(default_bt_pcm_out_vol); // *DP_VOL_OUT_PCM = 0x1000;
+ // AM_DSP_SetSpeechUplinkSwAgcGain(0); // AGC set to 0 db
+ // AM_DSP_SetSpeechEnhRefDigitalGain(default_bt_pcm_out_enh_ref_vol); // 0db
+
+
+ SAL_BT_Config(&cfg_t);
+
+ am.io_type = BT_EARPHONE_MODE;
+ MD_TRC_L1Audio_Msg_AM_IO_Switch( AM_IO_Name(am.io_type) );
+}
+
+static void AM_DSP_BluetoothOff( uint32 data , uint32 extraInfo)
+{
+ Sal_BT_Config cfg_t;
+ memset(&cfg_t, 0, sizeof(Sal_BT_Config));
+
+ cfg_t.feed_cfg = false;
+
+ // AFE_SetBtFlag(KAL_FALSE);
+
+ // leave the gain control to AP. do not do restore the value to default now
+ // AM_DSP_SetSpeechDigitalGain(am.bt_digital_gain);
+ // AM_DSP_SetSpeechUplinkSwAgcGain(am.speechUplinkSwAgcGain);
+ // AM_DSP_SetSpeechEnhRefDigitalGain(am.speechDlEnhRefDigtalGain);
+
+ SAL_BT_Config(&cfg_t);
+
+ am.io_type = NORMAL_MODE;
+ MD_TRC_L1Audio_Msg_AM_IO_Switch( AM_IO_Name(am.io_type) );
+}
+
+//*******************************************************************//
+//* bt_mode: 1 for cordless mode, 2 for earphone mode *//
+//* bt_sync_type: 0 for short sync, 1 for long sync *//
+//* bt_sync_length: range from 1 to 8 *//
+//*******************************************************************//
+#if 0 // [FIXME] useless??
+/* under construction !*/
+/* under construction !*/
+#endif
+
+void AM_BluetoothOn( uint8 bt_mode )
+{
+ ASSERT(bt_mode == 2); // expected earphone mode only
+
+ AM_Enqueue( AM_DSP_BluetoothOn, 0, 0, false );
+
+ AM_FlushQFunction();
+}
+
+void AM_BluetoothOff( void )
+{
+ SP_DSPTone_ForceEnd();
+
+ AM_Enqueue( AM_DSP_BluetoothOff, 0, 0, false );
+ AM_FlushQFunction();
+}
+
+bool AM_IsBluetoothOn( void )
+{
+ return SAL_BT_IsEnable();
+}
+
+bool AM_IsBTCordlessMode( void )
+{
+ return false;//( (*DP_AUDIO_PAR&0x1000)!=0 );
+}
+
+
+/* ========================================================================= */
+
+
+void AM_SND_PlaybackOn( void )
+{
+ AM_Enqueue( AM_DSP_PCM8K_PlaybackOn, 1, 0, false );
+
+ AM_FlushQFunction();
+}
+
+void AM_SND_PlaybackOff( bool wait )
+{
+
+ AM_Enqueue( AM_DSP_PCM8K_PlaybackOff, 1, 0, false );
+
+ if( wait )
+ AM_FlushQFunction();
+}
+// #endif // defined(BGSND_ENABLE) || defined(__SMART_PHONE_MODEM__)
+
+/* ========================================================================= */
+/* PCM_EX control Functions */
+/* ========================================================================= */
+
+void AM_DSP_PCM_EX_On(uint32 type, uint32 data)
+{
+ kal_bool flag;
+ // uint8 voip_state = 0;
+
+ Sal_PCMEx_Config_t cfg;
+ memset(&cfg, 0, sizeof(Sal_PCMEx_Config_t));
+
+
+ flag = true; //this flag is used to choose one among multiple options
+ switch(type)
+ {
+ case AM_PCMEX_TYPE_DACA_DEDICATION: // 100: //DACA ACTIVE
+ if(flag){
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(3) , L1AUDIO_Str_onoff(1) );
+ ASSERT(!(am.speech_state & SP_STATE_DACA));
+ am.speech_state |= SP_STATE_DACA;
+
+ cfg.idle = false;
+
+ flag=false;
+ }
+ case AM_PCMEX_TYPE_DACA_IDLE_WO_ENH: //101: //DACA IDLE
+ if(flag){
+ ASSERT_REBOOT( !(am.state & AM_STATE_DACA) );
+ ASSERT(am.state == 0);
+ am.state |= AM_STATE_DACA;
+
+ cfg.idle = true;
+
+ flag=false;
+ }
+ cfg.swi = SAL_PCMEX_SWITCH_ON;
+ cfg.type = SAL_PCMEX_TYPE_DACA;
+ {
+ _DACA_EX_T *dacaExData = (_DACA_EX_T *)data;
+ kal_uint32 app_type = dacaExData->app_type;
+ //cfg.band = (dacaExData->app_type & DACA_USE_NB) ? SAL_PCM_NARROWBAND : SAL_PCM_WIDEBAND;
+ if(app_type & DACA_USE_NB){
+ cfg.band = SAL_PCM_NARROWBAND;
+ }else if(app_type & DACA_USE_WB){
+ cfg.band = SAL_PCM_WIDEBAND;
+ }else if(app_type & DACA_USE_SWB){
+ cfg.band = SAL_PCM_SUPERWIDEBAND;
+ }else if(app_type & DACA_USE_FB){
+ cfg.band = SAL_PCM_FULLBAND;
+ }else{
+ ASSERT(0);
+ }
+ }
+
+ break;
+ // ======================================================================
+ case AM_PCMEX_TYPE_DEDICATION: // 0: //PCM4WAY CTM
+ if(flag){
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(2) , L1AUDIO_Str_onoff(1) );
+ ASSERT(!(am.speech_state & SP_STATE_PCMNWAY));
+
+ am.speech_state |= SP_STATE_PCMNWAY;
+
+ cfg.idle = false;
+
+ flag=false;
+ }
+ /*
+ case AM_PCMEX_TYPE_IDLE_WO_ENH: // 1: //PCM2WAY Voice
+ if(flag){
+ ASSERT_REBOOT( !(am.state & AM_CONFLICT_STATE) );
+ ASSERT(am.state == 0);
+ am.state |= AM_STATE_VOICE;
+
+ cfg.idle = true;
+
+ flag = false;
+ }
+ */
+ case AM_PCMEX_TYPE_IDLE: //2: PCM2WAY VoIP
+ if(flag){
+ ASSERT_REBOOT( !(am.state & AM_CONFLICT_STATE) );
+ ASSERT(am.state == 0);
+ am.state |= AM_STATE_VOIP;
+
+ cfg.idle = true;
+ flag = false;
+ }
+
+ cfg.swi = SAL_PCMEX_SWITCH_ON;
+ cfg.type = SAL_PCMEX_TYPE_PNW;
+
+ {
+
+ _PCMEX_T *pcmExData = (_PCMEX_T *)data;
+
+ cfg.D2M_ul1 = (0!=(pcmExData->cfgUL1 & USE_D2M_PATH));
+ cfg.M2D_ul1 = (0!=(pcmExData->cfgUL1 & USE_M2D_PATH));
+ cfg.afterEnh_ul1 = (0!=(pcmExData->cfgUL1 & DATA_SELECT_AFTER_ENH));
+
+ cfg.D2M_ul2 = (0!=(pcmExData->cfgUL2 & USE_D2M_PATH));
+ cfg.M2D_ul2 = (0!=(pcmExData->cfgUL2 & USE_M2D_PATH));
+ cfg.afterEnh_ul2 = (0!=(pcmExData->cfgUL2 & DATA_SELECT_AFTER_ENH));
+
+ cfg.D2M_ul3 = (0!=(pcmExData->cfgUL3 & USE_D2M_PATH));
+ cfg.M2D_ul3 = (0!=(pcmExData->cfgUL3 & USE_M2D_PATH));
+ cfg.afterEnh_ul3 = (0!=(pcmExData->cfgUL3 & DATA_SELECT_AFTER_ENH));
+
+ cfg.D2M_ul4 = (0!=(pcmExData->cfgUL4 & USE_D2M_PATH));
+ cfg.M2D_ul4 = (0!=(pcmExData->cfgUL4 & USE_M2D_PATH));
+ cfg.afterEnh_ul4 = (0!=(pcmExData->cfgUL4 & DATA_SELECT_AFTER_ENH));
+
+ cfg.D2M_dl = (0!=(pcmExData->cfgDL & USE_D2M_PATH));
+ cfg.M2D_dl = (0!=(pcmExData->cfgDL & USE_M2D_PATH));
+ cfg.afterEnh_dl = (0!=(pcmExData->cfgDL & DATA_SELECT_AFTER_ENH));
+
+
+ if(cfg.idle){
+ if(pcmExData->bandInfo == PCMEX_BAND_WB){
+ cfg.band = SAL_PCM_WIDEBAND;
+ }else if (pcmExData->bandInfo == PCMEX_BAND_NB){
+ cfg.band = SAL_PCM_NARROWBAND;
+ }else if (pcmExData->bandInfo == PCMEX_BAND_SWB){
+ cfg.band = SAL_PCM_SUPERWIDEBAND;
+ }else if (pcmExData->bandInfo == PCMEX_BAND_FB){
+ cfg.band = SAL_PCM_FULLBAND;
+ }else{ // should never been here
+ ASSERT(0);
+ }
+ } else {
+ cfg.band = SAL_PCM_DYNAMIC;
+ }
+
+ }
+
+ break;
+ default:
+ ASSERT(0); break;
+ }
+
+ if(cfg.idle == true){
+ SAL_Get_Delay(SAL_DEALY_PCM8K_PB_VOIP, SAL_DELAY_NA, SAL_DELAY_NA, &cfg.delR, &cfg.delW, &cfg.delM);
+ AFE_TurnOn8K();
+ }
+
+ SAL_PcmEx_Config(&cfg);
+}
+
+
+void AM_DSP_PCM_EX_Off(uint32 type, uint32 data)
+{
+ kal_bool flag;
+ // uint8 voip_state = 0;
+
+ Sal_PCMEx_Config_t cfg;
+ memset(&cfg, 0, sizeof(Sal_PCMEx_Config_t));
+
+ flag = true; //this flag is used to choose one among multiple options
+ switch(type)
+ {
+ case AM_PCMEX_TYPE_DACA_DEDICATION: //100: DACA ACTIVE
+ if(flag ){
+ am.speech_state &= ~SP_STATE_DACA;
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(3) , L1AUDIO_Str_onoff(0) );
+
+ cfg.idle = false;
+
+ flag = false;
+ }
+ case AM_PCMEX_TYPE_DACA_IDLE_WO_ENH: //101: DACA IDLE
+ if(flag ){
+ am.state &= ~AM_STATE_DACA;
+ ASSERT(am.state == 0);
+
+ cfg.idle = true;
+
+ flag =false;
+ }
+
+ cfg.swi = SAL_PCMEX_SWITCH_OFF;
+ cfg.type = SAL_PCMEX_TYPE_DACA;
+
+ break;
+ // ======================================================================
+ case AM_PCMEX_TYPE_DEDICATION: //PCM4WAY CTM
+ if(flag ){
+ am.speech_state &= ~SP_STATE_PCMNWAY;
+ MD_TRC_L1Audio_Msg_AM_SetSpeech( AM_Speech_Feature_Name(2) , L1AUDIO_Str_onoff(0) );
+
+ cfg.idle = false;
+
+ flag = false;
+ }
+ /*
+ case AM_PCMEX_TYPE_IDLE_WO_ENH: //PCM2WAY Voice
+ if(flag ){
+ am.state &= ~AM_STATE_VOICE;
+ ASSERT(am.state == 0);
+
+ cfg.idle = true;
+
+ flag = false;
+ }
+ */
+ case AM_PCMEX_TYPE_IDLE: //PCM2WAY VoIP
+ if(flag ){
+ am.state &= ~AM_STATE_VOIP;
+ ASSERT(am.state == 0);
+
+ cfg.idle = true;
+
+ flag = false;
+ }
+
+ cfg.swi = SAL_PCMEX_SWITCH_OFF;
+ cfg.type = SAL_PCMEX_TYPE_PNW;
+
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+
+ if(cfg.idle == true){
+ cc_set_VBI_for_FSM(1);
+ SAL_PcmEx_Config(&cfg);
+ cc_set_VBI_for_FSM(2);
+ AFE_TurnOff8K();
+ } else {
+ SAL_PcmEx_Config(&cfg);
+ }
+}
+
+/**
+ @type: AM_PCMEX_TYPE, indicate the PCM EX type
+ @p2exData: Addess of "glable variable" like pcmEx, dacaEx
+*/
+void AM_PCM_EX_On( AM_PCMEX_TYPE type, uint32 p2exData)
+{
+ // kal_uint8 aud_func;
+ if(type == AM_PCMEX_TYPE_IDLE
+#if 0
+/* under construction !*/
+/* under construction !*/
+#endif
+ || type == AM_PCMEX_TYPE_DACA_IDLE )
+ {
+
+
+ // aud_func = L1SP_SPEECH;
+ }
+/*
+ else
+ {
+ // aud_func = L1SP_VOICE;
+ }
+*/
+
+
+ AM_Enqueue( AM_DSP_PCM_EX_On, type, p2exData, false );
+
+ AM_FlushQFunction();
+}
+
+
+void AM_PCM_EX_Off( AM_PCMEX_TYPE type, uint32 p2exData)
+{
+/*
+ // find out the aud_func
+ kal_uint8 aud_func = L1SP_MAX_AUDIO;
+
+ if( type == AM_PCMEX_TYPE_IDLE
+#if 0
+ || type == AM_PCMEX_TYPE_REC_ONLY_CAL
+ || type == AM_PCMEX_TYPE_REC_PLAY_CAL
+#endif
+ || type == AM_PCMEX_TYPE_DACA_IDLE ) {
+ aud_func = L1SP_SPEECH;
+ } else {
+ aud_func = L1SP_VOICE;
+ }
+*/
+
+ AM_Enqueue(AM_DSP_PCM_EX_Off, type, p2exData, false );
+ AM_FlushQFunction();
+}
+
+bool AM_IsVoIPOn( void )
+{
+ return( (bool)((am.state & AM_STATE_VOIP) != 0) );
+}
+
+/* ========================================================================= */
+
+uint16 AM_Status( void )
+{
+ return am.state;
+}
+
+/* phase out. lagency
+void AM_EnableToneLoopBackFlag( kal_bool param )
+{
+ if(param)
+ am.toneLoopbackRec = KAL_TRUE;
+ else
+ am.toneLoopbackRec = KAL_FALSE;
+}
+*/
+/* ========================================================================= */
+/* Functions for DSP PCM Router */
+/* ========================================================================= */
+#define PCM_ROUTER_DELAY_READ 0
+#define PCM_ROUTER_DELAY_WRITE 0xF0
+#define PCM_ROUTER_DELAY_DL 0x38
+#define PCM_ROUTER_DELAY_UL 0x118
+
+void AM_DSP_PcmRouter_On( uint32 voiceMode, uint32 extraInfo )
+{
+
+ Sal_PCM_Router_t pcmrt;
+
+ ASSERT_REBOOT( !(am.state & AM_CONFLICT_STATE) );
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(11), L1AUDIO_Str_onoff(1) );
+
+ // setting
+ memset(&pcmrt, 0 , sizeof(Sal_PCM_Router_t));
+
+ pcmrt.cod_band = 0; //voiceMode;
+ pcmrt.dev_band = voiceMode;
+ pcmrt.delR = PCM_ROUTER_DELAY_READ;
+ pcmrt.delW = PCM_ROUTER_DELAY_WRITE;
+ pcmrt.delM_DL = PCM_ROUTER_DELAY_DL;
+ pcmrt.delM_UL = PCM_ROUTER_DELAY_UL;
+
+ // turn on 8k
+ AFE_TurnOn8K();
+
+ SAL_PCM_Router_Open(&pcmrt, ((extraInfo&1)? SAL_SRST_TYPE_DEV: SAL_SRST_TYPE_CALLON));
+
+ am.state |= AM_STATE_VOIP;
+}
+
+
+/**
+ @extraInfo: bit[0]: 1 for device change to resync
+*/
+void AM_PcmRouter_On(uint32 extraInfo)
+{
+ kal_uint8 voiceMode;
+
+ // the following chips did not provide the function
+
+ voiceMode = AFE_GetVoice8KMode();
+
+ AM_Enqueue( AM_DSP_PcmRouter_On, voiceMode, extraInfo, false );
+
+ AM_FlushQFunction();
+
+}
+
+void AM_DSP_PcmRouter_Off( uint32 info, uint32 extraInfo )
+{
+ MD_TRC_L1Audio_Msg_AM_Switch( AM_Switch_Name(11), L1AUDIO_Str_onoff(0) );
+
+ SAL_PCM_Router_Close(true);
+
+ AFE_TurnOff8K();
+
+ am.state &= (~AM_STATE_VOIP);
+}
+
+
+void AM_PcmRouter_Off(void)
+{
+
+ AM_Enqueue( AM_DSP_PcmRouter_Off, 0, 0, false );
+
+ AM_FlushQFunction();
+}
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+#if 0
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+/* under construction !*/
+#endif
+
+bool AM_IsConflictState( void )
+{
+ if( am.state & AM_CONFLICT_STATE )
+ return true;
+ else
+ return false;
+}
+
+
+kal_uint32 AM_Get2GResyncThreshold(void)
+{
+ return AM_2G_RESYNC_THRESHOLD;
+}
+
+//=============================================================================
+// sw digital gain related
+//=============================================================================
+
+void AM_DSP_SetSpeechDigitalGain(kal_uint16 digitalVol)
+{
+ am.speechDigitalGain = digitalVol;
+ SAL_DGain_Set_DL(digitalVol);
+
+ MD_TRC_L1Audio_Msg_AM_DSP_GAIN(AM_Gain_Name(1), digitalVol);
+}
+
+kal_uint16 AM_DSP_GetSpeechDigitalGain(void)
+{
+ return SAL_DGain_Get_DL();
+}
+
+
+void AM_DSP_SetSpeechUplinkSwAgcGain(kal_uint16 digitalVol)
+{
+ am.speechUplinkSwAgcGain = digitalVol;
+ SAL_AGC_SetGain(digitalVol);
+
+ MD_TRC_L1Audio_Msg_AM_DSP_GAIN(AM_Gain_Name(3), digitalVol);
+}
+
+kal_uint16 AM_GetSpeechEnhRefDigitalGain(void)
+{
+ return am.speechDlEnhRefDigtalGain;
+}
+
+void AM_DSP_SetSpeechEnhRefDigitalGain(kal_uint16 digitalVol)
+{
+ am.speechDlEnhRefDigtalGain = digitalVol;
+ SAL_ENH_Gain_Set_DL(digitalVol);
+
+ MD_TRC_L1Audio_Msg_AM_DSP_GAIN(AM_Gain_Name(4), digitalVol);
+}
+