blob: fcd3e97c1b9f01595d9156f5905ec24123f13306 [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:
* ---------
* pcm4way.c
*
* Project:
* --------
* MAUI
*
* Description:
* ------------
* PCM4WAY/PCM2WAY interface
*
* Author:
* -------
* -------
*
*==============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*==============================================================================
*******************************************************************************/
#include "kal_public_api.h"
#include "kal_trace.h"
#include "sync_data.h"
#include "l1sp_trc.h"
#include "l1audio_voc_utmd.h"
#include "l1audio.h"
#include "am.h"
// #include "afe_def.h"
#include "media.h"
#include "pcm4way.h"
#include "sal_def.h"
#include "sal_exp.h"
#include "sp_drv.h"
#include "sp_enhance.h"
#include "vm.h"
#define PCMEX_INTERNAL_BUF_MAX_SIZE 960 // 48 * 20 samples
#define PCMEX_CO_BUFFER_WHEN_RW 1
_PCMEX_T pcmEx;
#if PCMEX_CO_BUFFER_WHEN_RW
static uint16 pcmEx_ul1_tempBufDataSize;
static uint16 pcmEx_ul2_tempBufDataSize;
static uint16 pcmEx_ul3_tempBufDataSize;
static uint16 pcmEx_ul4_tempBufDataSize;
static uint16 pcmEx_dl_tempBufDataSize;
static uint16 pcmEx_ul1_tempBuf[PCMEX_INTERNAL_BUF_MAX_SIZE];
static uint16 pcmEx_ul2_tempBuf[PCMEX_INTERNAL_BUF_MAX_SIZE];
static uint16 pcmEx_ul3_tempBuf[PCMEX_INTERNAL_BUF_MAX_SIZE];
static uint16 pcmEx_ul4_tempBuf[PCMEX_INTERNAL_BUF_MAX_SIZE];
static uint16 pcmEx_dl_tempBuf[PCMEX_INTERNAL_BUF_MAX_SIZE];
#endif
static bool idlePnwVm;
bool pcmEx_isRunInIdleMode(void)
{
return (pcmEx.am_type==AM_PCMEX_TYPE_IDLE);
}
void pcmEx_Init()
{
pcmEx.PCMEXspinLockID = kal_create_spinlock("PCMEX_LOCK");
}
uint16 pcmEx_getDataFromDsp(uint16 *toBuf, Sal_PcmEx_BufId_t bufName, kal_bool isUl)
{
uint32 I;
uint16 bufLen = SAL_PcmEx_GetBufLen(bufName);
// Use address mode to prevent idma being interrupted by other ISR, ie. L1D.
volatile uint16* ptr = SAL_PcmEx_GetBuf(bufName);
MD_TRC_P4W_GETDATAFROMDSP(bufName, ptr, bufLen);
if( SP_IsMicMute() && (KAL_TRUE == isUl) ){
for( I = bufLen; I > 0; I-- )
*toBuf++ = 0;
} else {
for( I = bufLen; I > 0; I-- )
*toBuf++ = *ptr++;
}
return bufLen;
}
uint16 pcmEx_writeDataToDsp(const uint16 *fromBuf, Sal_PcmEx_BufId_t bufName)
{
uint32 I;
uint16 bufLen = SAL_PcmEx_GetBufLen(bufName);
volatile uint16* ptr = SAL_PcmEx_GetBuf(bufName);
MD_TRC_P4W_WRITEDATATODSP(bufName, ptr, bufLen);
for( I = bufLen; I > 0; I-- )
*ptr++ = *fromBuf++;
Data_Sync_Barrier();
return bufLen;
}
uint16 pcmEx_writePatternToDsp(uint16 pattern, Sal_PcmEx_BufId_t bufName)
{
uint32 I;
uint16 bufLen = SAL_PcmEx_GetBufLen(bufName);
volatile uint16* ptr = SAL_PcmEx_GetBuf(bufName);
for( I = bufLen; I > 0; I-- )
*ptr++ = pattern;
Data_Sync_Barrier();
return bufLen;
}
void pcmEx_hisrDlHdlr(void *param)
{
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
if(pcmEx.running == 0){
kal_give_spinlock(pcmEx.PCMEXspinLockID);
return;
}
#if PCMEX_CO_BUFFER_WHEN_RW
// get SD buf data to temp buffer
pcmEx_dl_tempBufDataSize = pcmEx_getDataFromDsp(pcmEx_dl_tempBuf, SAL_PCMEX_PNW_BUF_D2M_DL1, KAL_FALSE);
#endif
// handler callback
kal_give_spinlock(pcmEx.PCMEXspinLockID);
if(pcmEx.pnw_dl_hdlr)
{
pcmEx.pnw_dl_hdlr();
}
}
void pcmEx_hisrUlHdlr(void *param)
{
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
if(pcmEx.running == 0){
kal_give_spinlock(pcmEx.PCMEXspinLockID);
return;
}
kal_give_spinlock(pcmEx.PCMEXspinLockID);
#if PCMEX_CO_BUFFER_WHEN_RW
// mics' data to temp buffer
if(pcmEx.cfgUL1) {
pcmEx_ul1_tempBufDataSize = pcmEx_getDataFromDsp(pcmEx_ul1_tempBuf, SAL_PCMEX_PNW_BUF_D2M_UL1, KAL_TRUE);
}
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
if(pcmEx.running == 0){
kal_give_spinlock(pcmEx.PCMEXspinLockID);
return;
}
kal_give_spinlock(pcmEx.PCMEXspinLockID);
if(pcmEx.cfgUL2) {
pcmEx_ul2_tempBufDataSize = pcmEx_getDataFromDsp(pcmEx_ul2_tempBuf, SAL_PCMEX_PNW_BUF_D2M_UL2, KAL_TRUE);
}
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
if(pcmEx.running == 0){
kal_give_spinlock(pcmEx.PCMEXspinLockID);
return;
}
kal_give_spinlock(pcmEx.PCMEXspinLockID);
if(pcmEx.cfgUL3) {
pcmEx_ul3_tempBufDataSize = pcmEx_getDataFromDsp(pcmEx_ul3_tempBuf, SAL_PCMEX_PNW_BUF_D2M_UL3, KAL_TRUE);
}
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
if(pcmEx.running == 0){
kal_give_spinlock(pcmEx.PCMEXspinLockID);
return;
}
kal_give_spinlock(pcmEx.PCMEXspinLockID);
if(pcmEx.cfgUL4) {
pcmEx_ul4_tempBufDataSize = pcmEx_getDataFromDsp(pcmEx_ul4_tempBuf, SAL_PCMEX_PNW_BUF_D2M_UL4, KAL_TRUE);
}
#endif
// handler callback
if(pcmEx.pnw_ul_hdlr)
{
pcmEx.pnw_ul_hdlr();
}
}
/**
@pcmNway_dl_hdlr
@pcmNway_ul_hdlr:
*/
void Idle_PcmEx_Start(void (*pcmNway_dl_hdlr)(void), void (*pcmNway_ul_hdlr)(void),
uint32 cfgUL1, uint32 cfgUL2, uint32 cfgUL3, uint32 cfgUL4, uint32 cfgDL,
PCMEX_BAND band, PCMEX_IDLE_ENH_SETTING enhSetting)
{
uint32 I;
kal_uint32 voc_ptn = TVCI_CLOSE_FILE;
kal_uint32 *voc_ptn_ptr = &voc_ptn;
// prevent re-entry!!
ASSERT(PNW_STATE_IDLE == pcmEx.state);
pcmEx.aud_id = L1Audio_GetAudioID();
L1Audio_SetFlag( pcmEx.aud_id ); /*Be careful.Before Locking SleepMode, to access DSP sherrif tasks much time. So access DSP must be after SetFlag*/
// band and am type setting
pcmEx.bandInfo = band;
switch(band){
case PCMEX_BAND_NB:
{
ASSERT(enhSetting != PCMEX_IDLE_ENH_SETTING_NONE);
pcmEx.am_type = AM_PCMEX_TYPE_IDLE;
}
break;
case PCMEX_BAND_WB:
{
ASSERT(enhSetting != PCMEX_IDLE_ENH_SETTING_NONE);
pcmEx.am_type = AM_PCMEX_TYPE_IDLE;
}
break;
default: // include PCMEX_BAND_DYNAMIC and PCMEX_BAND_UNSET cases
ASSERT(0);
}
pcmEx.cfgUL1 = cfgUL1;
pcmEx.cfgUL2 = cfgUL2;
pcmEx.cfgUL3 = cfgUL3;
pcmEx.cfgUL4 = cfgUL4;
pcmEx.cfgDL = cfgDL;
pcmEx.pnw_dl_hdlr = pcmNway_dl_hdlr;
pcmEx.pnw_ul_hdlr = pcmNway_ul_hdlr;
L1Audio_HookHisrHandler(DP_D2C_PCM_EX_DL,(L1Audio_EventHandler)pcmEx_hisrDlHdlr, 0);
L1Audio_HookHisrHandler(DP_D2C_PCM_EX_UL,(L1Audio_EventHandler)pcmEx_hisrUlHdlr, 0);
// check DSP state and turn on
ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) && SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF));
AM_PCM_EX_On(pcmEx.am_type, (uint32)(&pcmEx));//to config pnw
SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON);
SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON);
// wait for ready
for(I = 0; ;I ++){
kal_bool is_ready = true;
if( (pcmEx.cfgDL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY)))
is_ready &= false;
if( (pcmEx.cfgUL1 & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY)))
is_ready &= false;
if(is_ready)
break;
#ifndef L1D_TEST
ASSERT(I < 22); // wait 200ms
kal_sleep_task( AUD_1TICK(2) );
#endif
}
pcmEx.state = PNW_STATE_RUN;
#ifndef __L1_STANDALONE__ // avoid link error
if(ChkL1ClsFltr_L1Audio_VoC_TRACE_VM())
{
MD_TRC_L1SP_PHONE_CALL(5, 1, 1);
if(ChkL1ClsFltr_L1Audio_VoC_TRACE_EPL()) {
MD_TRC_L1SP_PHONE_CALL(5, 1, 2);
}
tst_vc_response(TVCI_VM_LOGGING, (const kal_uint8*)voc_ptn_ptr, 4);
VMREC_Start(NULL, true);
idlePnwVm = true;
}
else {
MD_TRC_L1SP_PHONE_CALL(5, 1, 0);
}
#endif
if(PCMEX_IDLE_ENH_SETTING_WITH == enhSetting) {
pcmEx.isEnhOn = true;
SetSpeechEnhancement(true);
}
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
pcmEx.running = 1;
kal_give_spinlock(pcmEx.PCMEXspinLockID);
/* the end of configure the SAL */
}
void Del_PcmEx_Start(void (*pcmNway_dl_hdlr)(void), void (*pcmNway_ul_hdlr)(void),
uint32 cfgUL1, uint32 cfgUL2, uint32 cfgUL3, uint32 cfgUL4, uint32 cfgDL)
{
uint32 I;
//kal_bool flag;
// prevent re-entry!!
ASSERT(PNW_STATE_IDLE == pcmEx.state);
pcmEx.aud_id = L1Audio_GetAudioID();
L1Audio_SetFlag( pcmEx.aud_id ); /*Be careful.Before Locking SleepMode, to access DSP sherrif tasks much time. So access DSP must be after SetFlag*/
// band and am type setting
pcmEx.bandInfo = PCMEX_BAND_DYNAMIC;
pcmEx.am_type = AM_PCMEX_TYPE_DEDICATION;
// pcmEx.dspPcmExMicLen = 0;
// pcmEx.dspPcmExSpkLen = 0;
pcmEx.cfgUL1 = cfgUL1;
pcmEx.cfgUL2 = cfgUL2;
pcmEx.cfgUL3 = cfgUL3;
pcmEx.cfgUL4 = cfgUL4;
pcmEx.cfgDL = cfgDL;
pcmEx.pnw_dl_hdlr = pcmNway_dl_hdlr;
pcmEx.pnw_ul_hdlr = pcmNway_ul_hdlr;
L1Audio_HookHisrHandler(DP_D2C_PCM_EX_DL,(L1Audio_EventHandler)pcmEx_hisrDlHdlr, 0);
L1Audio_HookHisrHandler(DP_D2C_PCM_EX_UL,(L1Audio_EventHandler)pcmEx_hisrUlHdlr, 0);
// check DSP state and turn on
ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) && SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF));
AM_PCM_EX_On(pcmEx.am_type, (uint32)(&pcmEx));//to config pnw
SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON);
SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_ON);
// wait for ready
for(I = 0; ;I ++){
kal_bool is_ready = true;
if( (pcmEx.cfgDL & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY)))
is_ready &= false;
if( (pcmEx.cfgUL1 & (USE_D2M_PATH+USE_M2D_PATH)) && (!SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY)))
is_ready &= false;
if(is_ready)
break;
#ifndef L1D_TEST
ASSERT(I < 22); // wait 200ms
kal_sleep_task( AUD_1TICK(2) );
#endif
}
pcmEx.state = PNW_STATE_RUN;
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
pcmEx.running = 1;
kal_give_spinlock(pcmEx.PCMEXspinLockID);
/* the end of configure the SAL */
}
void PcmEx_Stop(void)
{
kal_uint32 voc_ptn = TVCI_CLOSE_FILE;
kal_uint32 *voc_ptn_ptr = &voc_ptn;
ASSERT( PNW_STATE_RUN == pcmEx.state);
kal_take_spinlock(pcmEx.PCMEXspinLockID, KAL_INFINITE_WAIT);
pcmEx.running = 0;
kal_give_spinlock(pcmEx.PCMEXspinLockID);
if(true == pcmEx.isEnhOn) {
SetSpeechEnhancement(false);
}
if(idlePnwVm)
{
tst_vc_response(TVCI_VM_LOGGING, (const kal_uint8*)voc_ptn_ptr, 4);
VMREC_Stop(true);
idlePnwVm = false;
}
/* the begining of configure the SAL */
ASSERT(SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) || SAL_PcmEx_CheckStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY));
ASSERT(SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF) || SAL_PcmEx_CheckStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_RDY));
SAL_PcmEx_SetStateUL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF);
SAL_PcmEx_SetStateDL(SAL_PCMEX_TYPE_PNW, SAL_PCMEX_OFF);
AM_PCM_EX_Off(pcmEx.am_type, (uint32)(&pcmEx));
L1Audio_UnhookHisrHandler(DP_D2C_PCM_EX_DL);
L1Audio_UnhookHisrHandler(DP_D2C_PCM_EX_UL);
L1Audio_ClearFlag( pcmEx.aud_id );
L1Audio_FreeAudioID( pcmEx.aud_id );
// set to default.
pcmEx.pnw_dl_hdlr = pcmEx.pnw_ul_hdlr = NULL;
pcmEx.cfgUL1 = 0;
pcmEx.cfgUL2 = 0;
pcmEx.cfgUL3 = 0;
pcmEx.cfgUL4 = 0;
pcmEx.cfgDL = 0;
// pcmEx.dspPcmExMicLen = 0;
// pcmEx.dspPcmExSpkLen = 0;
pcmEx.bandInfo = PCMEX_BAND_UNSET;
pcmEx.am_type = AM_PCMEX_TYPE_UNDEF;
pcmEx.state = PNW_STATE_IDLE;
}
uint16 PcmEx_GetFromMic1(uint16 *ul_buf)
{
#if PCMEX_CO_BUFFER_WHEN_RW
memcpy(ul_buf, pcmEx_ul1_tempBuf, pcmEx_ul1_tempBufDataSize*sizeof(uint16));
return pcmEx_ul1_tempBufDataSize;
#else
return pcmEx_getDataFromDsp(ul_buf, SAL_PCMEX_PNW_BUF_D2M_UL1, KAL_TRUE);
#endif
}
uint16 PcmEx_GetFromMic2(uint16 *ul_buf)
{
#if PCMEX_CO_BUFFER_WHEN_RW
memcpy(ul_buf, pcmEx_ul2_tempBuf, pcmEx_ul2_tempBufDataSize*sizeof(uint16));
return pcmEx_ul2_tempBufDataSize;
#else
return pcmEx_getDataFromDsp(ul_buf, SAL_PCMEX_PNW_BUF_D2M_UL2, KAL_TRUE);
#endif
}
uint16 PcmEx_GetFromMic3(uint16 *ul_buf)
{
#if PCMEX_CO_BUFFER_WHEN_RW
memcpy(ul_buf, pcmEx_ul3_tempBuf, pcmEx_ul3_tempBufDataSize*sizeof(uint16));
return pcmEx_ul3_tempBufDataSize;
#else
return 0;
#endif
}
uint16 PcmEx_GetFromMic4(uint16 *ul_buf)
{
#if PCMEX_CO_BUFFER_WHEN_RW
memcpy(ul_buf, pcmEx_ul4_tempBuf, pcmEx_ul4_tempBufDataSize*sizeof(uint16));
return pcmEx_ul4_tempBufDataSize;
#else
return 0 ;
#endif
}
uint16 PcmEx_PutToSE1(const uint16 *ul_data)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writeDataToDsp(ul_data, SAL_PCMEX_PNW_BUF_M2D_UL1);
#else
return pcmEx_writeDataToDsp(ul_data, SAL_PCMEX_PNW_BUF_M2D_UL2);
#endif
}
uint16 PcmEx_FillSE1(uint16 value)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writePatternToDsp(value, SAL_PCMEX_PNW_BUF_M2D_UL1);
#else
return pcmEx_writePatternToDsp(value, SAL_PCMEX_PNW_BUF_M2D_UL2);
#endif
}
uint16 PcmEx_PutToSE2(const uint16 *ul_data)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writeDataToDsp(ul_data, SAL_PCMEX_PNW_BUF_M2D_UL2);
#else
return 0;
#endif
}
uint16 PcmEx_FillSE2(uint16 value)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writePatternToDsp(value, SAL_PCMEX_PNW_BUF_M2D_UL2);
#else
return 0;
#endif
}
uint16 PcmEx_PutToSE3(const uint16 *ul_data)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writeDataToDsp(ul_data, SAL_PCMEX_PNW_BUF_M2D_UL3);
#else
return 0;
#endif
}
uint16 PcmEx_FillSE3(uint16 value)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writePatternToDsp(value, SAL_PCMEX_PNW_BUF_M2D_UL3);
#else
return 0;
#endif
}
uint16 PcmEx_PutToSE4(const uint16 *ul_data)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writeDataToDsp(ul_data, SAL_PCMEX_PNW_BUF_M2D_UL4);
#else
return 0;
#endif
}
uint16 PcmEx_FillSE4(uint16 value)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writePatternToDsp(value, SAL_PCMEX_PNW_BUF_M2D_UL4);
#else
return 0;
#endif
}
// --------------------------
uint16 PcmEx_GetFromSD(uint16 *dl_buf)
{
#if PCMEX_CO_BUFFER_WHEN_RW
memcpy(dl_buf, pcmEx_dl_tempBuf, pcmEx_dl_tempBufDataSize*sizeof(uint16));
return pcmEx_dl_tempBufDataSize;
#else
return pcmEx_getDataFromDsp(dl_buf,SAL_PCMEX_PNW_BUF_D2M_DL1 , KAL_FALSE);
#endif
}
uint16 PcmEx_PutToSpk(const uint16 *dl_data)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writeDataToDsp(dl_data, SAL_PCMEX_PNW_BUF_M2D_DL1);
#else
return pcmEx_writeDataToDsp(dl_data, SAL_PCMEX_PNW_BUF_M2D_DL1);
#endif
}
uint16 PcmEx_FillSpk(uint16 value)
{
#if PCMEX_CO_BUFFER_WHEN_RW
return pcmEx_writePatternToDsp(value, SAL_PCMEX_PNW_BUF_M2D_DL1);
#else
return pcmEx_writePatternToDsp(value, SAL_PCMEX_PNW_BUF_M2D_DL1);
#endif
}
//************** PCM 4-WAY ****************************************************
void PCM4WAY_Start(void (*pcm4way_hdlr)(void), uint32 type)
{
kal_prompt_trace(MOD_L1SP, "[Test] PCM4WAY_Start config type:%x", type);
switch(type) {
case P4W_APP_CTM:
Del_PcmEx_Start(pcm4way_hdlr, NULL,
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul1
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul2
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul3
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul4
USE_D2M_PATH + USE_M2D_PATH );
break;
case P4W_APP_TYPE_UNDER_CALL:
Del_PcmEx_Start(pcm4way_hdlr, NULL,
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul1
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul2
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul3
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul4
USE_D2M_PATH + USE_M2D_PATH);
break;
case P4W_APP_TYPE_WITHOUT_CALL:
Idle_PcmEx_Start(pcm4way_hdlr, NULL,
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul1
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul2
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul3
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul4
USE_D2M_PATH + USE_M2D_PATH,
PCMEX_BAND_NB, PCMEX_IDLE_ENH_SETTING_WITH); // nb
break;
case P4W_APP_TYPE_WITHOUT_CALL_WB:
Idle_PcmEx_Start(pcm4way_hdlr, NULL,
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul1
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul2
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul3
USE_D2M_PATH + USE_M2D_PATH + DATA_SELECT_AFTER_ENH, // ul4
USE_D2M_PATH + USE_M2D_PATH,
PCMEX_BAND_WB, PCMEX_IDLE_ENH_SETTING_WITH);
break;
case P4W_APP_ECALL_DETECT:
Del_PcmEx_Start(pcm4way_hdlr, NULL,
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul1
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul2
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul3
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul4
USE_D2M_PATH );
break;
default:
ASSERT(0);
}
}
void PCM4WAY_Stop(uint32 type)
{
PcmEx_Stop();
}
uint16 PCM4WAY_GetFromMic(uint16 *ul_buf)
{
return PcmEx_GetFromMic1(ul_buf);
}
uint16 PCM4WAY_GetFromMic2(uint16 *ul_buf)
{
return PcmEx_GetFromMic2(ul_buf);
}
uint16 PCM4WAY_PutToSE(const uint16 *ul_data)
{
return PcmEx_PutToSE1(ul_data);
}
uint16 PCM4WAY_PutToSE2(const uint16 *ul_data)
{
return PcmEx_PutToSE2(ul_data);
}
uint16 PCM4WAY_FillSE(uint16 value)
{
return PcmEx_FillSE1(value);
}
uint16 PCM4WAY_FillSE2(uint16 value)
{
return PcmEx_FillSE2(value);
}
uint16 PCM4WAY_GetFromSD(uint16 *dl_buf)
{
return PcmEx_GetFromSD(dl_buf);
}
uint16 PCM4WAY_PutToSpk(const uint16 *dl_data)
{
return PcmEx_PutToSpk(dl_data);
}
uint16 PCM4WAY_FillSpk(uint16 value)
{
return PcmEx_FillSpk(value);
}
//************** PCM 2-WAY ****************************************************
void PCM2WAY_Start(void (*pcm2way_hdlr)(void), uint32 type)
{
switch(type) {
case P2W_APP_TYPE_UNDER_CALL:
Del_PcmEx_Start(pcm2way_hdlr, NULL,
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul1
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul2
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul3
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul4
USE_M2D_PATH);
break;
case P2W_APP_TYPE_VOIP:
case P2W_APP_TYPE_WITHOUT_CALL:
Idle_PcmEx_Start(pcm2way_hdlr, NULL,
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul1
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul2
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul3
USE_D2M_PATH + DATA_SELECT_AFTER_ENH, // ul4
USE_M2D_PATH,
PCMEX_BAND_NB, PCMEX_IDLE_ENH_SETTING_WITH); // nb
break;
default:
ASSERT(0);
}
}
void PCM2WAY_Stop(uint32 type)
{
PcmEx_Stop();
}
uint16 PCM2WAY_GetFromMic(uint16 *ul_buf)
{
#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
return PcmEx_GetFromMic1(ul_buf);
// }
}
uint16 PCM2WAY_PutToSpk(const uint16 *dl_data)
{
return PcmEx_PutToSpk(dl_data);
}
uint16 PCM2WAY_FillSpk(uint16 value)
{
return PcmEx_FillSpk(value);
}