blob: 54c096ae6ad47ea78453bf8d769de96716bd6fa6 [file] [log] [blame]
/*****************************************************************************
* 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);
}