diff options
Diffstat (limited to 'sound/soc/codecs/ymu831/mcparser.c')
-rw-r--r-- | sound/soc/codecs/ymu831/mcparser.c | 1431 |
1 files changed, 1431 insertions, 0 deletions
diff --git a/sound/soc/codecs/ymu831/mcparser.c b/sound/soc/codecs/ymu831/mcparser.c new file mode 100644 index 0000000..9766011 --- /dev/null +++ b/sound/soc/codecs/ymu831/mcparser.c @@ -0,0 +1,1431 @@ +/**************************************************************************** + * + * Copyright(c) 2012-2013 Yamaha Corporation. All rights reserved. + * + * Module : mcparser.c + * + * Description : MC Driver parse control + * + * Version : 1.0.4 2013.01.17 + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any damages + * arising from the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * 3. This notice may not be removed or altered from any source distribution. + * + ****************************************************************************/ + + +#include "mcdriver.h" +#include "mcparser.h" +#include "mcmachdep.h" +#include "mcdevprof.h" +#include "mcbdspdrv.h" +#include "mccdspdrv.h" +#include "mcedspdrv.h" +#include "mcfdspdrv.h" + +#if MCDRV_DEBUG_LEVEL +#include "mcdebuglog.h" +#endif + + + + +#define AEC_MIN_BYTES (12) +#define AEC_REVISION (5) +#define AEC_TARGET (253) +#define AEC_D7_MIN_BYTES (6) +#define AEC_D7_CHUNK_CONFIG (0x01000000) +#define AEC_D7_CHUNK_AE (0x02000000) +#define AEC_D7_CHUNK_BDSP_ES1 (0x00010000) +#define AEC_D7_CHUNK_BDSP (0x00010001) +#define AEC_D7_CHUNK_FDSP_ES1 (0x00020000) +#define AEC_D7_CHUNK_FDSP (0x00020001) +#define AEC_D7_CHUNK_VBOX (0x03000000) +#define AEC_D7_CHUNK_CDSPA (0x00030000) +#define AEC_D7_CHUNK_CDSPB (0x00030001) +#define AEC_D7_CHUNK_CDSP_DEBUG (0x00050000) +#define AEC_D7_CHUNK_OUTPUT0_ES1 (0x04000000) +#define AEC_D7_CHUNK_OUTPUT1_ES1 (0x04000001) +#define AEC_D7_CHUNK_OUTPUT0 (0x04000002) +#define AEC_D7_CHUNK_OUTPUT1 (0x04000003) +#define AEC_D7_CHUNK_SYSEQ_EX (0x00060000) +#define AEC_D7_CHUNK_INPUT0 (0x05000000) +#define AEC_D7_CHUNK_INPUT1 (0x05000001) +#define AEC_D7_CHUNK_INPUT2 (0x05000002) +#define AEC_D7_CHUNK_PDM (0x06000000) +#define AEC_D7_CHUNK_E2 (0x07000000) +#define AEC_D7_CHUNK_E2_CONFIG (0x00040000) +#define AEC_D7_CHUNK_ADJ (0x08000000) +#define AEC_D7_CHUNK_EDSP_MISC (0x09000000) +#define AEC_D7_CHUNK_CONTROL (0x0A000000) + + +static SINT32 AnalyzeAESubChunk( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_INFO *psAECInfo); +static SINT32 AnalyzeVBoxSubChunk( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_INFO *psAECInfo); +static SINT32 AnalyzeSysEqExSubChunk( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_SYSEQ_EX *psSysEqEx); +static SINT32 AnalyzeEDSPSubChunk( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_INFO *psAECInfo); + +/**************************************************************************** + * CreateUINT32 + * + * Description: + * Create UINT32 Value + * Arguments: + * b0 31-24bit value + * b1 23-16bit value + * b2 15-8bit value + * b3 7-0bit value + * Return: + * UINT32 Value + * + ****************************************************************************/ +static UINT32 CreateUINT32(UINT8 b0, UINT8 b1, UINT8 b2, UINT8 b3) +{ + return ((UINT32)b0 << 24) | ((UINT32)b1 << 16) + | ((UINT32)b2 << 8) | (UINT32)b3; +} + +/**************************************************************************** + * McParser_GetD7Chunk + * + * Description: + * D7 chunk acquisition + * Arguments: + * pbPrm AEC data pointer + * dSize data size + * psD7Info MCDRV_AEC_D7_INFO structure pointer + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR_ARGUMENT + * + ****************************************************************************/ +SINT32 McParser_GetD7Chunk( + const UINT8 *pbPrm, + UINT32 dSize, + struct MCDRV_AEC_D7_INFO *psD7Info +) +{ + SINT32 sdRet = MCDRV_SUCCESS; + UINT32 dDataSize; + UINT32 dChunkSize; + UINT32 dPos; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn(""); +#endif + if (dSize < (UINT32)AEC_MIN_BYTES) { + sdRet = MCDRV_ERROR_ARGUMENT; + goto exit; + } + + /* header */ + if ((pbPrm[0] != 0x41) + || (pbPrm[1] != 0x45) + || (pbPrm[2] != 0x43)) { + sdRet = MCDRV_ERROR_ARGUMENT; + goto exit; + } + + /* revision */ + if (pbPrm[3] != AEC_REVISION) { + sdRet = MCDRV_ERROR_ARGUMENT; + goto exit; + } + + /* size */ + dDataSize = CreateUINT32(pbPrm[4], pbPrm[5], pbPrm[6], pbPrm[7]); + if (dSize != (dDataSize + 8)) { + sdRet = MCDRV_ERROR_ARGUMENT; + goto exit; + } + + /* target */ + if (pbPrm[9] != AEC_TARGET) { + sdRet = MCDRV_ERROR_ARGUMENT; + goto exit; + } + + /* Reserved */ + if (pbPrm[11] != 0x00) { + sdRet = MCDRV_ERROR_ARGUMENT; + goto exit; + } + + /* D7 Chunk Search */ + psD7Info->pbChunkTop = NULL; + psD7Info->dChunkSize = 0; + dPos = AEC_MIN_BYTES; + + while ((dPos + AEC_D7_MIN_BYTES) < dSize) { + if ((pbPrm[dPos + 0] == 0x44) + && (pbPrm[dPos + 1] == 0x37)) { + if (psD7Info->pbChunkTop != NULL) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + + dChunkSize = CreateUINT32(pbPrm[dPos + 2], + pbPrm[dPos + 3], + pbPrm[dPos + 4], + pbPrm[dPos + 5]); + if ((dPos + AEC_D7_MIN_BYTES + dChunkSize) > dSize) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psD7Info->pbChunkTop + = &pbPrm[dPos + AEC_D7_MIN_BYTES]; + psD7Info->dChunkSize = dChunkSize; + } else { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + + /* Next Chunk */ + dPos += AEC_D7_MIN_BYTES; + dPos += dChunkSize; + } + + if (psD7Info->pbChunkTop == NULL) + sdRet = MCDRV_ERROR_ARGUMENT; + +exit: +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McParser_GetD7Chunk", &sdRet); +#endif + return sdRet; +} + +/**************************************************************************** + * McParser_AnalyzeD7Chunk + * + * Description: + * D7 chunk analysis + * Arguments: + * psD7Info MCDRV_AEC_D7_INFO structure pointer + * psAECInfo MCDRV_AEC_INFO structure pointer + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR_ARGUMENT + * + ****************************************************************************/ +SINT32 McParser_AnalyzeD7Chunk( + struct MCDRV_AEC_D7_INFO *psD7Info, + struct MCDRV_AEC_INFO *psAECInfo +) +{ + const UINT8 *pbPrm; + UINT32 dChunkEnd; + UINT32 dPos; + UINT32 dChunkId; + UINT32 dSubChunkSize; + SINT32 sdRet = MCDRV_SUCCESS; + int n; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("McParser_AnalyzeD7Chunk"); +#endif + pbPrm = psD7Info->pbChunkTop; + dChunkEnd = psD7Info->dChunkSize-1; + + psAECInfo->sAecConfig.bFDspLocate = 0xFF; + psAECInfo->sAecAudioengine.bEnable = 0; + psAECInfo->sAecAudioengine.sAecBDsp.pbChunkData = NULL; + psAECInfo->sAecAudioengine.sAecBDsp.dwSize = 0; + psAECInfo->sAecAudioengine.sAecFDsp.pbChunkData = NULL; + psAECInfo->sAecAudioengine.sAecFDsp.dwSize = 0; + psAECInfo->sAecVBox.bEnable = 0; + psAECInfo->sAecVBox.sAecCDspA.pbChunkData = NULL; + psAECInfo->sAecVBox.sAecCDspA.dwSize = 0; + psAECInfo->sAecVBox.sAecCDspB.pbChunkData = NULL; + psAECInfo->sAecVBox.sAecCDspB.dwSize = 0; + psAECInfo->sAecVBox.sAecFDsp.pbChunkData = NULL; + psAECInfo->sAecVBox.sAecFDsp.dwSize = 0; + psAECInfo->sAecVBox.sAecCDspDbg.bJtagOn = 0xFF; + psAECInfo->sOutput.bLpf_Pre_Thru[0] = 0xFF; + psAECInfo->sOutput.bLpf_Pre_Thru[1] = 0xFF; + psAECInfo->sInput.bDsf32_L_Type[0] = 0xFF; + psAECInfo->sInput.bDsf32_L_Type[1] = 0xFF; + psAECInfo->sInput.bDsf32_L_Type[2] = 0xFF; + psAECInfo->sPdm.bMode = 0xFF; + psAECInfo->sE2.bEnable = 0; + psAECInfo->sE2.sE2Config.pbChunkData = NULL; + psAECInfo->sE2.sE2Config.dwSize = 0; + psAECInfo->sAdj.bHold = 0xFF; + psAECInfo->sEDspMisc.bI2SOut_Enb = 0xFF; + psAECInfo->sControl.bCommand = 0xFF; + + dPos = 0UL; + while (dPos <= dChunkEnd && sdRet == MCDRV_SUCCESS) { + if ((dPos + 8-1) > dChunkEnd) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + + dChunkId = CreateUINT32(pbPrm[dPos], + pbPrm[dPos+1], + pbPrm[dPos+2], + pbPrm[dPos+3]); + dSubChunkSize = CreateUINT32(pbPrm[dPos+4], + pbPrm[dPos+5], + pbPrm[dPos+6], + pbPrm[dPos+7]); + + dPos += 8; + if ((dPos + dSubChunkSize-1) > dChunkEnd) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + + switch (dChunkId) { + case AEC_D7_CHUNK_CONFIG: + if (dSubChunkSize != 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sAecConfig.bFDspLocate != 0xFF) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecConfig.bFDspLocate = pbPrm[dPos++]; + dSubChunkSize = 0; + break; + case AEC_D7_CHUNK_AE: + if (dSubChunkSize < 8) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sAecAudioengine.bEnable != 0) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bEnable = 1; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bAEOnOff = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bFDspOnOff = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bBDspAE0Src = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bBDspAE1Src = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bMixerIn0Src = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bMixerIn1Src = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bMixerIn2Src = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.bMixerIn3Src = pbPrm[dPos++]; + dSubChunkSize--; + if (dSubChunkSize > 0) { + sdRet = AnalyzeAESubChunk(pbPrm, + &dPos, + &dSubChunkSize, + psAECInfo); + } + break; + case AEC_D7_CHUNK_VBOX: + if (dSubChunkSize < 15) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sAecVBox.bEnable != 0) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bEnable = 1; + if (pbPrm[dPos] > 2) { + if (pbPrm[dPos] != 0x11) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + psAECInfo->sAecVBox.bCDspFuncAOnOff = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + if (pbPrm[dPos] != 0x11) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + psAECInfo->sAecVBox.bCDspFuncBOnOff = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bFDspOnOff = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 0x3F) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bFdsp_Po_Source = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 1) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bISrc2_VSource = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 1) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bISrc2_Ch1_VSource = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 1) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bISrc3_VSource = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 1) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bLPt2_VSource = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 3) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bLPt2_Mix_VolO = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 3) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bLPt2_Mix_VolI = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 3) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bSrc3_Ctrl = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] == 3) + || (pbPrm[dPos] == 7) + || (pbPrm[dPos] == 11) + || ((pbPrm[dPos] > 13) && (pbPrm[dPos] < 0xFF))) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bSrc2_Fs = pbPrm[dPos++]; + dSubChunkSize--; + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if ((pbPrm[dPos] > 1) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bSrc2_Thru = pbPrm[dPos++]; + } else { + dPos++; + } + dSubChunkSize--; + if ((pbPrm[dPos] == 3) + || (pbPrm[dPos] == 7) + || (pbPrm[dPos] == 11) + || ((pbPrm[dPos] > 13) && (pbPrm[dPos] < 0xFF))) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bSrc3_Fs = pbPrm[dPos++]; + dSubChunkSize--; + if ((pbPrm[dPos] > 1) + && (pbPrm[dPos] < 0xFF)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.bSrc3_Thru = pbPrm[dPos++]; + dSubChunkSize--; + if (dSubChunkSize > 0) { + sdRet = AnalyzeVBoxSubChunk(pbPrm, + &dPos, + &dSubChunkSize, + psAECInfo); + } + break; + + case AEC_D7_CHUNK_OUTPUT0_ES1: + case AEC_D7_CHUNK_OUTPUT1_ES1: + case AEC_D7_CHUNK_OUTPUT0: + case AEC_D7_CHUNK_OUTPUT1: + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if ((dChunkId != AEC_D7_CHUNK_OUTPUT0_ES1) + && (dChunkId != AEC_D7_CHUNK_OUTPUT1_ES1)) { + ; + break; + } + n = dChunkId - AEC_D7_CHUNK_OUTPUT0_ES1; + } else { + if ((dChunkId != AEC_D7_CHUNK_OUTPUT0) + && (dChunkId != AEC_D7_CHUNK_OUTPUT1)) { + ; + break; + } + n = dChunkId - AEC_D7_CHUNK_OUTPUT0; + } + if (dSubChunkSize < 47) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sOutput.bLpf_Pre_Thru[n] != 0xFF) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bLpf_Pre_Thru[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bLpf_Post_Thru[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDcc_Sel[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 5) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bSig_Det_Lvl = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bPow_Det_Lvl[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bOsf_Sel[n] = pbPrm[dPos++]; + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } else { + if (pbPrm[dPos] > 7) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + psAECInfo->sOutput.bSys_Eq_Enb[n] = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A0[n][0] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A0[n][1] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A0[n][2] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A1[n][0] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A1[n][1] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A1[n][2] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A2[n][0] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A2[n][1] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_A2[n][2] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_B1[n][0] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_B1[n][1] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_B1[n][2] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_B2[n][0] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_B2[n][1] + = pbPrm[dPos++]; + psAECInfo->sOutput.bSys_Eq_Coef_B2[n][2] + = pbPrm[dPos++]; + if (pbPrm[dPos] > 7) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bClip_Md[n] = pbPrm[dPos++]; + psAECInfo->sOutput.bClip_Att[n] = pbPrm[dPos++]; + psAECInfo->sOutput.bClip_Rel[n] = pbPrm[dPos++]; + psAECInfo->sOutput.bClip_G[n] = pbPrm[dPos++]; + psAECInfo->sOutput.bOsf_Gain[n][0] = pbPrm[dPos++]; + psAECInfo->sOutput.bOsf_Gain[n][1] = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDcl_OnOff[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDcl_Gain[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 0x7F) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDcl_Limit[n][0] = pbPrm[dPos++]; + psAECInfo->sOutput.bDcl_Limit[n][1] = pbPrm[dPos++]; + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bRandom_Dither_OnOff[n] + = pbPrm[dPos++]; + } else { + dPos++; + } + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bRandom_Dither_Level[n] + = pbPrm[dPos++]; + } else { + dPos++; + } + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bRandom_Dither_POS[n] + = pbPrm[dPos++]; + } else { + dPos++; + } + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDc_Dither_OnOff[n] = pbPrm[dPos++]; + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if (pbPrm[dPos] > 15) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDc_Dither_Level[n] + = pbPrm[dPos++]; + } else { + dPos++; + } + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDither_Type[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDng_On[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 31) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDng_Zero[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDng_Time[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sOutput.bDng_Fw[n] = pbPrm[dPos++]; + psAECInfo->sOutput.bDng_Attack = pbPrm[dPos++]; + psAECInfo->sOutput.bDng_Release = pbPrm[dPos++]; + psAECInfo->sOutput.bDng_Target[n] = pbPrm[dPos++]; + psAECInfo->sOutput.bDng_Target_LineOut[n] + = pbPrm[dPos++]; + if (n == 0) + psAECInfo->sOutput.bDng_Target_Rc + = pbPrm[dPos++]; + else + dPos++; + dSubChunkSize -= 47; + if (dSubChunkSize > 0) { + sdRet = AnalyzeSysEqExSubChunk(pbPrm, + &dPos, + &dSubChunkSize, + &psAECInfo->sOutput.sSysEqEx[n]); + } + break; + + case AEC_D7_CHUNK_INPUT0: + case AEC_D7_CHUNK_INPUT1: + case AEC_D7_CHUNK_INPUT2: + n = dChunkId - AEC_D7_CHUNK_INPUT0; + if (dSubChunkSize < 16) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sInput.bDsf32_L_Type[n] != 0xFF) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (n == 0) { + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } else { + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + psAECInfo->sInput.bDsf32_L_Type[n] = pbPrm[dPos++]; + if (n == 0) { + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } else { + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + psAECInfo->sInput.bDsf32_R_Type[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDsf4_Sel[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDcc_Sel[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDng_On[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDng_Att[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDng_Rel[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDng_Fw[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 0x3F) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDng_Tim[n] = pbPrm[dPos++]; + psAECInfo->sInput.bDng_Zero[n][0] = pbPrm[dPos++]; + psAECInfo->sInput.bDng_Zero[n][1] = pbPrm[dPos++]; + psAECInfo->sInput.bDng_Tgt[n][0] = pbPrm[dPos++]; + psAECInfo->sInput.bDng_Tgt[n][1] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDepop_Att[n] = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bDepop_Wait[n] = pbPrm[dPos++]; + if (n == 2) { + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sInput.bRef_Sel = pbPrm[dPos++]; + } else { + dPos++; + } + dSubChunkSize = 0; + break; + + case AEC_D7_CHUNK_PDM: + if (dSubChunkSize != 10) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sPdm.bMode != 0xFF) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bMode = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bStWait = pbPrm[dPos++]; + if (pbPrm[dPos] > 7) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm0_LoadTim = pbPrm[dPos++]; + if (pbPrm[dPos] > 63) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm0_LFineDly = pbPrm[dPos++]; + if (pbPrm[dPos] > 63) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm0_RFineDly = pbPrm[dPos++]; + if (pbPrm[dPos] > 7) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm1_LoadTim = pbPrm[dPos++]; + if (pbPrm[dPos] > 63) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm1_LFineDly = pbPrm[dPos++]; + if (pbPrm[dPos] > 63) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm1_RFineDly = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm0_Data_Delay = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sPdm.bPdm1_Data_Delay = pbPrm[dPos++]; + dSubChunkSize = 0; + break; + + case AEC_D7_CHUNK_E2: + if (dSubChunkSize < 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sE2.bEnable != 0) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sE2.bEnable = 1; + if (pbPrm[dPos] > 4) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sE2.bE2_Da_Sel = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 8) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sE2.bE2_Ad_Sel = pbPrm[dPos++]; + dSubChunkSize--; + if (pbPrm[dPos] > 2) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sE2.bE2OnOff = pbPrm[dPos++]; + dSubChunkSize--; + if (dSubChunkSize > 0) { + sdRet = AnalyzeEDSPSubChunk(pbPrm, + &dPos, + &dSubChunkSize, + psAECInfo); + } + break; + + case AEC_D7_CHUNK_ADJ: + if (dSubChunkSize != 4) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sAdj.bHold != 0xFF) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (pbPrm[dPos] > 0x3F) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAdj.bHold = pbPrm[dPos++]; + if (pbPrm[dPos] > 0x0F) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAdj.bCnt = pbPrm[dPos++]; + psAECInfo->sAdj.bMax[0] = pbPrm[dPos++]; + psAECInfo->sAdj.bMax[1] = pbPrm[dPos++]; + dSubChunkSize = 0; + break; + + case AEC_D7_CHUNK_EDSP_MISC: + if (dSubChunkSize != 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sEDspMisc.bI2SOut_Enb != 0xFF) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sEDspMisc.bI2SOut_Enb = pbPrm[dPos++]; + if (pbPrm[dPos] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sEDspMisc.bChSel = pbPrm[dPos++]; + if (pbPrm[dPos] > 3) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sEDspMisc.bLoopBack = pbPrm[dPos++]; + dSubChunkSize = 0; + break; + + case AEC_D7_CHUNK_CONTROL: + if (dSubChunkSize != 5) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sControl.bCommand != 0xFF) { + /* already done */ + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H) { + if ((pbPrm[dPos] < 1) + || (pbPrm[dPos] > 2)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } else { + if ((pbPrm[dPos] < 1) + || (pbPrm[dPos] > 5)) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + psAECInfo->sControl.bCommand = pbPrm[dPos++]; + psAECInfo->sControl.bParam[0] = pbPrm[dPos++]; + psAECInfo->sControl.bParam[1] = pbPrm[dPos++]; + psAECInfo->sControl.bParam[2] = pbPrm[dPos++]; + psAECInfo->sControl.bParam[3] = pbPrm[dPos++]; + dSubChunkSize = 0; + break; + + default: + /* unknown */ + break; + } + dPos += dSubChunkSize; + } + + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("McParser_AnalyzeD7Chunk", &sdRet); +#endif + return sdRet; +} + +/**************************************************************************** + * AnalyzeAESubChunk + * + * Description: + * AudioEngine Sub chunk analysis + * Arguments: + * pbPrm AEC data pointer + * pdPos AEC sub chunk start pos + * pdSubChunkSize AEC sub chunk byte size + * psAECInfo MCDRV_AEC_INFO structure pointer + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR_ARGUMENT + * + ****************************************************************************/ +static SINT32 AnalyzeAESubChunk +( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_INFO *psAECInfo +) +{ + SINT32 sdRet = MCDRV_SUCCESS; + UINT32 dChunkId; + UINT32 dChunkSize; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("AnalyzeAESubChunk"); +#endif + + while (*pdSubChunkSize > 0) { + if (*pdSubChunkSize < 8) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + dChunkId = CreateUINT32(pbPrm[*pdPos], + pbPrm[*pdPos+1], + pbPrm[*pdPos+2], + pbPrm[*pdPos+3]); + dChunkSize = CreateUINT32(pbPrm[*pdPos+4], + pbPrm[*pdPos+5], + pbPrm[*pdPos+6], + pbPrm[*pdPos+7]); + *pdSubChunkSize -= 8; + if (*pdSubChunkSize < dChunkSize) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if ((dChunkId == AEC_D7_CHUNK_BDSP_ES1) + || (dChunkId == AEC_D7_CHUNK_BDSP)) { + if (((dChunkId == AEC_D7_CHUNK_BDSP_ES1) + && (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H)) + || ((dChunkId == AEC_D7_CHUNK_BDSP) + && (McDevProf_GetDevId() != eMCDRV_DEV_ID_80_90H))) { + if ( + psAECInfo->sAecAudioengine.sAecBDsp.pbChunkData + != NULL) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.sAecBDsp.pbChunkData + = (UINT8 *)&pbPrm[*pdPos]; + psAECInfo->sAecAudioengine.sAecBDsp.dwSize + = dChunkSize; + } + } else if ((dChunkId == AEC_D7_CHUNK_FDSP_ES1) + || (dChunkId == AEC_D7_CHUNK_FDSP)) { + if (((dChunkId == AEC_D7_CHUNK_FDSP_ES1) + && (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H)) + || ((dChunkId == AEC_D7_CHUNK_FDSP) + && (McDevProf_GetDevId() != eMCDRV_DEV_ID_80_90H))) { + if ( + psAECInfo->sAecAudioengine.sAecFDsp.pbChunkData + != NULL) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecAudioengine.sAecFDsp.pbChunkData + = (UINT8 *)&pbPrm[*pdPos]; + psAECInfo->sAecAudioengine.sAecFDsp.dwSize + = dChunkSize; + } + } else { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + *pdPos += (dChunkSize+8); + *pdSubChunkSize -= dChunkSize; + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("AnalyzeAESubChunk", &sdRet); +#endif + return sdRet; +} + +/**************************************************************************** + * AnalyzeVBoxSubChunk + * + * Description: + * V-Box Sub chunk analysis + * Arguments: + * pbPrm AEC data pointer + * pdPos AEC sub chunk start pos + * pdSubChunkSize AEC sub chunk byte size + * psAECInfo MCDRV_AEC_INFO structure pointer + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR_ARGUMENT + * + ****************************************************************************/ +static SINT32 AnalyzeVBoxSubChunk( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_INFO *psAECInfo +) +{ + SINT32 sdRet = MCDRV_SUCCESS; + UINT32 dChunkId; + UINT32 dChunkSize; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("AnalyzeVBoxSubChunk"); +#endif + + while (*pdSubChunkSize > 0) { + if (*pdSubChunkSize < 8) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + dChunkId = CreateUINT32(pbPrm[*pdPos], + pbPrm[*pdPos+1], + pbPrm[*pdPos+2], + pbPrm[*pdPos+3]); + dChunkSize = CreateUINT32(pbPrm[*pdPos+4], + pbPrm[*pdPos+5], + pbPrm[*pdPos+6], + pbPrm[*pdPos+7]); + *pdSubChunkSize -= 8; + if (*pdSubChunkSize < dChunkSize) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (dChunkId == AEC_D7_CHUNK_CDSPA) { + if (psAECInfo->sAecVBox.sAecCDspA.pbChunkData + != NULL) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.sAecCDspA.pbChunkData + = (UINT8 *)&pbPrm[*pdPos]; + psAECInfo->sAecVBox.sAecCDspA.dwSize + = dChunkSize; + } else if (dChunkId == AEC_D7_CHUNK_CDSPB) { + if (psAECInfo->sAecVBox.sAecCDspB.pbChunkData + != NULL) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.sAecCDspB.pbChunkData + = (UINT8 *)&pbPrm[*pdPos]; + psAECInfo->sAecVBox.sAecCDspB.dwSize + = dChunkSize; + } else if ((dChunkId == AEC_D7_CHUNK_FDSP_ES1) + || (dChunkId == AEC_D7_CHUNK_FDSP)) { + if (((dChunkId == AEC_D7_CHUNK_FDSP_ES1) + && (McDevProf_GetDevId() == eMCDRV_DEV_ID_80_90H)) + || ((dChunkId == AEC_D7_CHUNK_FDSP) + && (McDevProf_GetDevId() != eMCDRV_DEV_ID_80_90H))) { + if (psAECInfo->sAecVBox.sAecFDsp.pbChunkData + != NULL) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.sAecFDsp.pbChunkData + = (UINT8 *)&pbPrm[*pdPos]; + psAECInfo->sAecVBox.sAecFDsp.dwSize + = dChunkSize; + } + } else if (dChunkId == AEC_D7_CHUNK_CDSP_DEBUG) { + if (dChunkSize != 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psAECInfo->sAecVBox.sAecCDspDbg.bJtagOn + != 0xFF) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (pbPrm[*pdPos+8] > 1) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sAecVBox.sAecCDspDbg.bJtagOn + = pbPrm[*pdPos+8]; + } else { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + *pdPos += (dChunkSize+8); + *pdSubChunkSize -= dChunkSize; + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("AnalyzeVBoxSubChunk", &sdRet); +#endif + return sdRet; +} + +/**************************************************************************** + * AnalyzeSysEqExSubChunk + * + * Description: + * SYS EQ EX Sub chunk analysis + * Arguments: + * pbPrm AEC data pointer + * pdPos AEC sub chunk start pos + * pdSubChunkSize AEC sub chunk byte size + * psSysEqEx MCDRV_AEC_SYSEQ_EX structure pointer + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR_ARGUMENT + * + ****************************************************************************/ +static SINT32 AnalyzeSysEqExSubChunk +( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_SYSEQ_EX *psSysEqEx +) +{ + SINT32 sdRet = MCDRV_SUCCESS; + UINT32 dChunkId; + UINT32 dChunkSize; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("AnalyzeSysEqExSubChunk"); +#endif + + while (*pdSubChunkSize > 0) { + if (*pdSubChunkSize < 8) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + dChunkId = CreateUINT32(pbPrm[*pdPos], + pbPrm[*pdPos+1], + pbPrm[*pdPos+2], + pbPrm[*pdPos+3]); + dChunkSize = CreateUINT32(pbPrm[*pdPos+4], + pbPrm[*pdPos+5], + pbPrm[*pdPos+6], + pbPrm[*pdPos+7]); + *pdPos += 8; + *pdSubChunkSize -= 8; + if (*pdSubChunkSize < dChunkSize) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + + switch (dChunkId) { + case AEC_D7_CHUNK_SYSEQ_EX: + if (dChunkSize != 30) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + if (psSysEqEx->bEnable != 0) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psSysEqEx->bEnable = 1; + psSysEqEx->sBand[0].bCoef_A0[0] = pbPrm[*pdPos+0]; + psSysEqEx->sBand[0].bCoef_A0[1] = pbPrm[*pdPos+1]; + psSysEqEx->sBand[0].bCoef_A0[2] = pbPrm[*pdPos+2]; + psSysEqEx->sBand[0].bCoef_A1[0] = pbPrm[*pdPos+3]; + psSysEqEx->sBand[0].bCoef_A1[1] = pbPrm[*pdPos+4]; + psSysEqEx->sBand[0].bCoef_A1[2] = pbPrm[*pdPos+5]; + psSysEqEx->sBand[0].bCoef_A2[0] = pbPrm[*pdPos+6]; + psSysEqEx->sBand[0].bCoef_A2[1] = pbPrm[*pdPos+7]; + psSysEqEx->sBand[0].bCoef_A2[2] = pbPrm[*pdPos+8]; + psSysEqEx->sBand[0].bCoef_B1[0] = pbPrm[*pdPos+9]; + psSysEqEx->sBand[0].bCoef_B1[1] = pbPrm[*pdPos+10]; + psSysEqEx->sBand[0].bCoef_B1[2] = pbPrm[*pdPos+11]; + psSysEqEx->sBand[0].bCoef_B2[0] = pbPrm[*pdPos+12]; + psSysEqEx->sBand[0].bCoef_B2[1] = pbPrm[*pdPos+13]; + psSysEqEx->sBand[0].bCoef_B2[2] = pbPrm[*pdPos+14]; + psSysEqEx->sBand[1].bCoef_A0[0] = pbPrm[*pdPos+15]; + psSysEqEx->sBand[1].bCoef_A0[1] = pbPrm[*pdPos+16]; + psSysEqEx->sBand[1].bCoef_A0[2] = pbPrm[*pdPos+17]; + psSysEqEx->sBand[1].bCoef_A1[0] = pbPrm[*pdPos+18]; + psSysEqEx->sBand[1].bCoef_A1[1] = pbPrm[*pdPos+19]; + psSysEqEx->sBand[1].bCoef_A1[2] = pbPrm[*pdPos+20]; + psSysEqEx->sBand[1].bCoef_A2[0] = pbPrm[*pdPos+21]; + psSysEqEx->sBand[1].bCoef_A2[1] = pbPrm[*pdPos+22]; + psSysEqEx->sBand[1].bCoef_A2[2] = pbPrm[*pdPos+23]; + psSysEqEx->sBand[1].bCoef_B1[0] = pbPrm[*pdPos+24]; + psSysEqEx->sBand[1].bCoef_B1[1] = pbPrm[*pdPos+25]; + psSysEqEx->sBand[1].bCoef_B1[2] = pbPrm[*pdPos+26]; + psSysEqEx->sBand[1].bCoef_B2[0] = pbPrm[*pdPos+27]; + psSysEqEx->sBand[1].bCoef_B2[1] = pbPrm[*pdPos+28]; + psSysEqEx->sBand[1].bCoef_B2[2] = pbPrm[*pdPos+29]; + *pdPos += 30; + *pdSubChunkSize -= dChunkSize; + break; + default: + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("AnalyzeSysEqExSubChunk", &sdRet); +#endif + return sdRet; +} + +/**************************************************************************** + * AnalyzeEDSPSubChunk + * + * Description: + * E-DSP Sub chunk analysis + * Arguments: + * pbPrm AEC data pointer + * pdPos AEC sub chunk start pos + * pdSubChunkSize AEC sub chunk byte size + * psAECInfo MCDRV_AEC_INFO structure pointer + * Return: + * MCDRV_SUCCESS + * MCDRV_ERROR_ARGUMENT + * + ****************************************************************************/ +static SINT32 AnalyzeEDSPSubChunk +( + const UINT8 *pbPrm, + UINT32 *pdPos, + UINT32 *pdSubChunkSize, + struct MCDRV_AEC_INFO *psAECInfo +) +{ + SINT32 sdRet = MCDRV_SUCCESS; + UINT32 dChunkId; + UINT32 dChunkSize; + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncIn("AnalyzeEDSPSubChunk"); +#endif + + while (*pdSubChunkSize > 0 && sdRet == MCDRV_SUCCESS) { + if (*pdSubChunkSize < 8) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + dChunkId = CreateUINT32(pbPrm[*pdPos], + pbPrm[*pdPos+1], + pbPrm[*pdPos+2], + pbPrm[*pdPos+3]); + dChunkSize = CreateUINT32(pbPrm[*pdPos+4], + pbPrm[*pdPos+5], + pbPrm[*pdPos+6], + pbPrm[*pdPos+7]); + *pdSubChunkSize -= 8; + if (*pdSubChunkSize < dChunkSize) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + + switch (dChunkId) { + case AEC_D7_CHUNK_E2_CONFIG: + if (psAECInfo->sE2.sE2Config.pbChunkData + != NULL) { + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + psAECInfo->sE2.sE2Config.pbChunkData + = (UINT8 *)&pbPrm[*pdPos]; + psAECInfo->sE2.sE2Config.dwSize + = dChunkSize; + *pdPos += (dChunkSize+8); + *pdSubChunkSize -= dChunkSize; + break; + default: + sdRet = MCDRV_ERROR_ARGUMENT; + break; + } + } + +#if (MCDRV_DEBUG_LEVEL >= 4) + McDebugLog_FuncOut("AnalyzeEDSPSubChunk", &sdRet); +#endif + return sdRet; +} + + + |