]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/performance-audio-sr.git/blobdiff - pasdk/test_arm/framework/audioStreamDecodeProc.c
PASDK-53: Experimental code for circular buffer overflow/underflow handling
[processor-sdk/performance-audio-sr.git] / pasdk / test_arm / framework / audioStreamDecodeProc.c
index c73ae2a9fef4070a19937e38dda99c953ab75814..effd395e41d8ea41477dd533e450733145de04b1 100644 (file)
@@ -61,6 +61,9 @@ All rights reserved.
 #include "audioStreamProc_common.h"
 #include "audioStreamDecodeProc.h"
 
+#include "statusOp_common.h"
+
+
 // FL: debug
 //#include "fwkSim.h"
 #include "dbgCapAf.h"
@@ -98,7 +101,7 @@ PAF_AudioData  *gDecAudioFrameChannelPointers[PAF_MAXNUMCHAN_AF];
 PAF_AudioSize  gDecAudioFrameChannelSizes[PAF_MAXNUMCHAN_AF];
 PAF_AudioData  *gDecOrigAudioFrameChannelPointers[PAF_MAXNUMCHAN_AF];
 
-// Underflow threshold before returning error to Top-Level FSM
+// Underflow threshold before circular buffer reset and return error to Top-Level FSM
 #define DEC_OP_CB_WRTAF_OVR_THR  ( 20 ) // FL: arbitrary setting
 UInt32 gDecOpCbWrtAfOvr  =0; // decoder output circular buffer overflow count
 
@@ -115,40 +118,11 @@ UInt32 gSlaveDecInfoCnt         =0;
 UInt32 gSlaveDecDecodeCnt       =0;
 UInt32 gSlaveDecDeactivateCnt   =0;
 
+// debug
+UInt32 gCbWrtAfErrCnt           =0; // decoder output circular buffer write error count
 
-// TODO: upadate with Decoder beta number
-const UInt32 pafBetaMap[] =
-{
-    -1,                // PAF_SOURCE_UNKNOWN,
-    -1,                // PAF_SOURCE_NONE,
-    -1,                // PAF_SOURCE_PASS,
-    -1,                // PAF_SOURCE_SNG,
-    -1,                // PAF_SOURCE_AUTO,
-    -1,                // PAF_SOURCE_BITSTREAM,
-    -1,                // PAF_SOURCE_DTSALL,
-    -1,                // PAF_SOURCE_PCMAUTO,
-    STD_BETA_PCM,      // PAF_SOURCE_PCM,
-    -1,                // PAF_SOURCE_PC8,
-    -1,                // PAF_SOURCE_AC3,
-    -1,                // PAF_SOURCE_DTS,
-    -1,                // PAF_SOURCE_AAC,
-    -1,                // PAF_SOURCE_MPEG,
-    -1,                // PAF_SOURCE_DTS12,
-    -1,                // PAF_SOURCE_DTS13,
-    -1,                // PAF_SOURCE_DTS14,
-    -1,                // PAF_SOURCE_DTS16,
-    -1,                // PAF_SOURCE_WMA9PRO,
-    -1,                // PAF_SOURCE_MP3,
-    -1,                // PAF_SOURCE_DSD1,
-    -1,                // PAF_SOURCE_DSD2,
-    -1,                // PAF_SOURCE_DSD3,
-    STD_BETA_DDP,      // PAF_SOURCE_DDP,
-    -1,                // PAF_SOURCE_DTSHD,
-    STD_BETA_THD,      // PAF_SOURCE_THD,
-    -1,                // PAF_SOURCE_DXP,
-    -1,                // PAF_SOURCE_WMA,
-    -1                 // PAF_SOURCE_N
-};
+// FL: (***) debug
+#include "evmc66x_gpio_dbg.h"
 
 
 /*
@@ -190,6 +164,7 @@ Void taskAsdpFxn(
     Int status;
     Int zI;
     Int bufEnd, wrapSize, currentBufSize, chunkSize;
+    Int8 temp8;
 
     
     Log_info0("Enter taskAsdpFxn()");
@@ -306,6 +281,28 @@ Void taskAsdpFxn(
         pP->fxns->memStatusPrint(HEAP_INTERNAL, HEAP_INTERNAL1, HEAP_EXTERNAL, HEAP_INTERNAL1_SHM);
     }
     
+#ifdef NON_CACHE_STATUS
+    //
+    // init Status structure Gate
+    //
+    if (statusOp_Init(GATEMP_INDEX_DEC) == STATUSOP_INIT_FAIL)
+    {
+        TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_DEC);
+    }
+    if (statusOp_Init(GATEMP_INDEX_DDP) == STATUSOP_INIT_FAIL)
+    {
+        TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_DDP);
+    }
+    if (statusOp_Init(GATEMP_INDEX_PCM) == STATUSOP_INIT_FAIL)
+    {
+        TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_PCM);
+    }
+    if (statusOp_Init(GATEMP_INDEX_THD) == STATUSOP_INIT_FAIL)
+    {
+        TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_THD);
+    }
+#endif
+
     // (***) FL: revisit
     // write back Status structure addresses for Beta Units initialized on Slave
     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
@@ -313,26 +310,28 @@ Void taskAsdpFxn(
     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM2]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP2]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
+    Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_THD]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
+    Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_THD2]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
     Cache_wait();
     
     // (***) FL: revisit
     // write back Status structures for Beta Units initialized on Slave
-    size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
-    Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
+   /* size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
+    Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
-    Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
+    Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM2]->size;
-    Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM2]), size, Cache_Type_ALLD, 0);
+    Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM2]), size, Cache_Type_ALLD, 0);
     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]->size;
-    Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
+    Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP2]->size;
-    Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP2]), size, Cache_Type_ALLD, 0);
+    Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP2]), size, Cache_Type_ALLD, 0);
     Cache_wait();
 
     // (***) FL: revisit
     // write back Dec configuration
-    Cache_wb(&pAstCfg->xDec[0], DECODEN*sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
-    Cache_wait();
+    Cache_wbInv(&pAstCfg->xDec[0], DECODEN*sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
+    Cache_wait();*/
     
     // Send initialization complete message to master
     queId = MessageQ_getReplyQueue(pAspMsg);
@@ -474,11 +473,11 @@ Void taskAsdpFxn(
                     // invalidate Status structures for shared Beta Units
                     //size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
                     //Cache_inv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
-                    size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
+                    /*size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
                     Cache_inv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
                     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]->size;
                     Cache_inv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
-                    Cache_wait();
+                    Cache_wait();*/
                     
                     argIdx = 0; // get decIdx
                     z = *(Int32 *)&pAspMsg->buf[argIdx];
@@ -500,6 +499,8 @@ Void taskAsdpFxn(
                     {
                         SW_BREAKPOINT;
                     }
+                    gCbWrtAfErrCnt=0;   // debug
+                    gDecOpCbWrtAfOvr=0; // decoder output circular buffer overflow count
                     // FL: debug, log circular buffer control variables
                     cbLog(pCbCtl, z, 1, "cbWriteStart");
                     // Reset audio frame
@@ -543,11 +544,11 @@ Void taskAsdpFxn(
                     // write back Status structures for shared Beta Units
                     //size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
                     //Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
-                    size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
-                    Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
+                   /* size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
+                    Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
                     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]->size;
-                    Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
-                    Cache_wait();
+                    Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
+                    Cache_wait();*/
                     
                     // send dec reset complete message to master
                     queId = MessageQ_getReplyQueue(pAspMsg);
@@ -575,11 +576,6 @@ Void taskAsdpFxn(
                     TRACE_TERSE2("slaveCmd=%d,decIdx=%d", slaveCmd, z);
                     // Get input associated w/ decoder
                     zI = pP->inputsFromDecodes[z];
-                    
-                    // invalidate Status structures for Beta Units initialized on Slave
-                    size = IACP_STD_BETA_TABLE.pStatus[pafBetaMap[sourceSelect]]->size;
-                    Cache_inv((Ptr)(IACP_STD_BETA_TABLE.pStatus[pafBetaMap[sourceSelect]]), size, Cache_Type_ALLD, 0);
-                    Cache_wait();
 
                     // (***) FL: revisit
                     // invalidate Inp configuration
@@ -606,8 +602,8 @@ Void taskAsdpFxn(
                     wrapSize = size - chunkSize;
                     // invalidate input data
                     Cache_inv((Ptr)pIpBufConfig->pntr.pSmInt, chunkSize, Cache_Type_ALLD, 0);
-                    TRACE_MSG2("IBUF : pIpBufConfig->pntr.pSmInt: 0x%x and chunkSize: %d", pIpBufConfig->pntr.pSmInt, chunkSize);
                     // invalidate Dec configuration
+                    TRACE_MSG2("IBUF : pIpBufConfig->pntr.pSmInt: 0x%x and chunkSize: %d", (IArg)pIpBufConfig->pntr.pSmInt, chunkSize);
                     Cache_inv(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
                     // status for selected decoder should be invalidated
                     Cache_wait();
@@ -618,7 +614,7 @@ Void taskAsdpFxn(
                     {
                         // invalidate input data
                         Cache_inv((Ptr)pIpBufConfig->base.pSmInt, wrapSize, Cache_Type_ALLD, 0);
-                        TRACE_MSG2("IBUF : pIpBufConfig->base.pSmInt: 0x%x and wrapSize: %d",pIpBufConfig->base.pSmInt, wrapSize);
+                        TRACE_MSG2("IBUF : pIpBufConfig->base.pSmInt: 0x%x and wrapSize: %d", (IArg)pIpBufConfig->base.pSmInt, wrapSize);
                         // status for selected decoder should be invalidated
                         Cache_wait();
                     }
@@ -635,12 +631,25 @@ Void taskAsdpFxn(
                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
                     Cache_wait();            
                     
-                    // Re-initialize audio frame if decoder is disabled or 
-                    // doesn't have a valid input 
+#ifdef NON_CACHE_STATUS
+                    statusOp_read(&(temp8),
+                                  &(pAstCfg->xDec[z].decodeStatus.mode),
+                                  sizeof(Int8),
+                                  GATEMP_INDEX_DEC);
+                    // Re-initialize audio frame if decoder is disabled or
+                    // doesn't have a valid input
+                    if (!temp8 || !pAstCfg->xInp[zI].hRxSio)
+                    {
+                        pP->fxns->initFrame1(pP, pQ, pC, z, 0);
+                    }
+#else
+                    // Re-initialize audio frame if decoder is disabled or
+                    // doesn't have a valid input
                     if (!pAstCfg->xDec[z].decodeStatus.mode || !pAstCfg->xInp[zI].hRxSio)
                     {
                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
                     }
+#endif
 
                     // send dec info complete message to master
                     queId = MessageQ_getReplyQueue(pAspMsg);
@@ -690,15 +699,10 @@ Void taskAsdpFxn(
                         errno = dec->fxns->decode(dec, NULL, &pAstCfg->xDec[z].decodeInStruct, &pAstCfg->xDec[z].decodeOutStruct);
                         if (errno < 0)
                         {
-                            SW_BREAKPOINT;
+                            //SW_BREAKPOINT;
                         }
                         TRACE_TERSE0("Dec:decode done");
                         
-                        // write back Status structures for Beta Units initialized on Slave
-                        size = IACP_STD_BETA_TABLE.pStatus[pafBetaMap[sourceSelect]]->size;
-                        Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[pafBetaMap[sourceSelect]]), size, Cache_Type_ALLD, 0);
-                        Cache_wait();
-
                         // copy decoder output to decoder output circular buffers
                         //pCb = &pAstCfg->xDecOpCb[z];
                         //TRACE_TERSE1("Dec:pCb=0x%04x", (IArg)pCb);
@@ -716,13 +720,13 @@ Void taskAsdpFxn(
                         cbErrno = cbWriteAf(pCbCtl, z, pAfWrt);
                         if (cbErrno < 0)
                         {
-                            SW_BREAKPOINT; // FL: debug
+                            gCbWrtAfErrCnt++;
+                            //SW_BREAKPOINT; // FL: debug
                             
                             if (cbErrno == ASP_DECOP_CB_WRITE_OVERFLOW)
                             {
-                                // Reset circular buffer
-                                cbReset(pCbCtl, z);
-                                // Update overflow count, return if above threshold
+                                // Update underflow count.
+                                // If above underflow threshold, reset circular buffer underflow count.
                                 gDecOpCbWrtAfOvr++;
                                 if (gDecOpCbWrtAfOvr < DEC_OP_CB_WRTAF_OVR_THR)
                                 {
@@ -730,12 +734,28 @@ Void taskAsdpFxn(
                                 }
                                 else 
                                 {
+                                    // Reset circular buffer
+                                    cbReset(pCbCtl, z);
+                                    // 
                                     gDecOpCbWrtAfOvr = 0;
                                 }
                             }
                         }
                         TRACE_TERSE0("Dec:cbWriteAf() complete");
                         
+#if 1 // (***) FL: shows timing of CB write
+                        // (***) debug // B9
+                        {
+                            static Uint8 toggleState = 0;
+                            if (toggleState == 0)
+                                GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_107);
+                            else
+                                GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_107);
+                            toggleState = ~(toggleState);
+                        }
+#endif        
+                        
+                        
                         // FL: debug, log circular buffer control variables
                         cbLog(pCbCtl, z, 1, "cbWriteAf");
                     }
@@ -744,13 +764,25 @@ Void taskAsdpFxn(
                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
                     Cache_wait();
                     
+#ifdef NON_CACHE_STATUS
+                    statusOp_read(&(temp8),
+                                  &(pAstCfg->xDec[z].decodeStatus.mode),
+                                  sizeof(Int8),
+                                  GATEMP_INDEX_DEC);
                     // Re-initialize audio frame if decoder is disabled or 
                     // doesn't have a valid input 
+                    if (!temp8 || !pAstCfg->xInp[zI].hRxSio)
+                    {
+                        pP->fxns->initFrame1(pP, pQ, pC, z, 0);
+                    }
+#else
+                    // Re-initialize audio frame if decoder is disabled or
+                    // doesn't have a valid input
                     if (!pAstCfg->xDec[z].decodeStatus.mode || !pAstCfg->xInp[zI].hRxSio)
                     {
                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
                     }
-
+#endif
                     // send dec info complete message to master
                     queId = MessageQ_getReplyQueue(pAspMsg);
                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
@@ -1031,11 +1063,12 @@ PAF_ASDT_initPhaseCommon(
 
     TRACE_TERSE0("PAF_ASDT_initPhaseCommon: calling PAF_ALG_setup.");
     PAF_ALG_setup(&pafAlgConfig, 
-        HEAP_ID_INTERNAL,       HEAP_INTERNAL, 
-        HEAP_ID_INTERNAL1,      HEAP_INTERNAL1, 
-        HEAP_ID_EXTERNAL,       HEAP_EXTERNAL, 
-        HEAP_ID_INTERNAL1_SHM,  HEAP_INTERNAL1_SHM, 
-        HEAP_ID_EXTERNAL_SHM,   HEAP_EXTERNAL_SHM, 
+        HEAP_ID_INTERNAL,               HEAP_INTERNAL, 
+        HEAP_ID_INTERNAL1,              HEAP_INTERNAL1, 
+        HEAP_ID_EXTERNAL,               HEAP_EXTERNAL, 
+        HEAP_ID_INTERNAL1_SHM,          HEAP_INTERNAL1_SHM, 
+        HEAP_ID_EXTERNAL_SHM,           HEAP_EXTERNAL_SHM, 
+        HEAP_ID_EXTERNAL_NONCACHED_SHM, HEAP_EXTERNAL_NONCACHED_SHM,
         HEAP_CLEAR);
 
     if (pP->fxns->headerPrint)
@@ -1273,7 +1306,9 @@ PAF_ASDT_initFrame0(
     Error_init(&eb); 
     
     //maxFrameLength += PA_MODULO - maxFrameLength % PA_MODULO; // compute maximum framelength (needed for ARC support)
-    aLen = numchan[z] * maxFrameLength;
+    //aLen = numchan[z] * maxFrameLength;
+    aLen = numchan[z] * maxFrameLength + (maxFrameLength - FRAMELENGTH); /* Qin - need additional memory for starting offset
+                                                                                     See line 1301 */
 
     //
     // Initialize audio frame elements directly
@@ -1468,6 +1503,9 @@ Int resetAf(
         case PAF_SOURCE_DDP:
             pAudioFrame->data.nSamples = 1536;
             break;
+        case PAF_SOURCE_THD:
+            pAudioFrame->data.nSamples = 5120; //QIN FIX ME
+            break;
         default:  
             pAudioFrame->data.nSamples = FRAMELENGTH;
             break;