Changes in generate mute frame - Use last audio frame configuration info to generate...
authorSu <qsu@ti.com>
Thu, 3 Nov 2016 16:00:51 +0000 (12:00 -0400)
committerSu <qsu@ti.com>
Thu, 3 Nov 2016 16:00:51 +0000 (12:00 -0400)
pasdk/common/aspDecOpCircBuf_common.h
pasdk/test_dsp/framework/aspDecOpCircBuf_master.c

index 7d3decca8034ec7d611209414f4fd5d92e023c26..1ce76065248c599b35e3114ad9cbc30130d9dc9a 100644 (file)
@@ -84,6 +84,7 @@ typedef struct PAF_AST_DecOpCircBuf
     Int8 emptyFlag;         // flag indicates whether reader should empty (drain) remaining frames in CB
     Int8 errUndCnt;         // underflow count
     Int8 errOvrCnt;         // overflow count
+    PAF_AudioFrame lastAf;  // used to store the last valid read out audio frame info to generate mute frame
 } PAF_AST_DecOpCircBuf;
 
 // Decoder output circular buffer control
index 42f5c5c661b30aabbbbbf16c99a13e634a1db074..0221511cf95380c6b8320a5e439463318555b61c 100644 (file)
@@ -55,6 +55,16 @@ static Void cbReadAfMute(
     Int16 strFrameLen           // stream frame length (output transaction size)
 );
 
+// Init last audio frame configuration info 
+static Void cbInitLastAfInfo(
+    PAF_AudioFrame *pAfRd      // last audio frame stored in CB instance
+);
+
+// Generate mute AF on circular buffer read using the last AF configuration info 
+static Void cbReadMuteWithLastAfInfo (
+    PAF_AST_DecOpCircBuf *pCb,    // decoder output circular buffer control
+    PAF_AudioFrame *pAfRd         // audio frame into which to read
+);
 
 // Initialize circular buffer control
 Int cbCtlInit(
@@ -174,6 +184,8 @@ Int cbInit(
     pCb->errUndCnt = 0;
     pCb->errOvrCnt = 0;
     
+    cbInitLastAfInfo(&pCb->lastAf);
+
     // (***) FL: revisit
     // Write back circular buffer configuration
     Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
@@ -509,7 +521,8 @@ Int cbReadAf(
         // No active writer, not draining circular buffer.
         // Skip UNDerflow check, mute output.
         //
-        cbReadAfMute(pAfRd, pCb->strFrameLen);
+        //cbReadAfMute(pAfRd, pCb->strFrameLen);
+               cbReadMuteWithLastAfInfo(pCb, pAfRd);
         
         // Leave the gate
         GateMP_leave(gateHandle, key);
@@ -529,7 +542,8 @@ Int cbReadAf(
             // Mute output on underflow.
             //
             pCb->errUndCnt++;
-            cbReadAfMute(pAfRd, pCb->strFrameLen);
+            //cbReadAfMute(pAfRd, pCb->strFrameLen);
+                   cbReadMuteWithLastAfInfo(pCb, pAfRd);
             //SW_BREAKPOINT; // FL: debug
             
             // Write back circular buffer configuration.
@@ -649,6 +663,7 @@ Int cbReadAf(
             // update number of audio frames in circular buffer
             pCb->numAfCb--;
         }
+               memcpy (&pCb->lastAf, pAfRd, sizeof(PAF_AudioFrame));
     }
     
     if (pCb->emptyFlag == 1)
@@ -702,7 +717,7 @@ static Void cbReadAfMute(
     {
         if ((streamMask >> i) & 0x1)
         {
-            memset(pAfRd->data.sample[i], strFrameLen, 0);
+                       memset(pAfRd->data.sample[i], 0, strFrameLen*sizeof(PAF_AudioData));
         }
         pAfRd->data.samsiz[i] = 0;
     }
@@ -712,3 +727,62 @@ static Void cbReadAfMute(
     pAfRd->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
     pAfRd->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
 }
+// Init last audio frame configuration info 
+static Void cbInitLastAfInfo(
+    PAF_AudioFrame *pAfRd      // last audio frame stored in CB instance
+)
+{
+    pAfRd->sampleDecode = PAF_SOURCE_PCM;
+    PAF_PROCESS_ZERO(pAfRd->sampleProcess);
+    pAfRd->sampleRate = PAF_SAMPLERATE_48000HZ;
+    pAfRd->sampleCount = DEF_DEC_OP_FRAME_LEN;
+    pAfRd->channelConfigurationRequest.full = 0;
+    pAfRd->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
+    pAfRd->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
+    pAfRd->channelConfigurationStream.full = 0;
+    pAfRd->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
+    pAfRd->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
+
+    pAfRd->bsMetadata_type     = PAF_bsMetadata_none;           /* non zero if metadata is attached. */
+    pAfRd->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
+    pAfRd->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
+    pAfRd->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
+}
+
+// Generate mute AF on circular buffer read using the last AF configuration info 
+static Void cbReadMuteWithLastAfInfo (
+    PAF_AST_DecOpCircBuf *pCb,    // decoder output circular buffer control
+    PAF_AudioFrame *pAfRd         // audio frame into which to read
+)
+{
+    PAF_ChannelMask_HD streamMask;
+    Int8 i;
+
+    pAfRd->sampleDecode = pCb->lastAf.sampleDecode;
+    PAF_PROCESS_ZERO(pAfRd->sampleProcess);
+    pAfRd->sampleRate  = pCb->lastAf.sampleRate;
+    pAfRd->sampleCount = pCb->strFrameLen;
+    pAfRd->channelConfigurationRequest.full     = pCb->lastAf.channelConfigurationRequest.full;
+    pAfRd->channelConfigurationRequest.part.sat = pCb->lastAf.channelConfigurationRequest.part.sat;
+    pAfRd->channelConfigurationRequest.part.sub = pCb->lastAf.channelConfigurationRequest.part.sub;
+    pAfRd->channelConfigurationStream.full      = pCb->lastAf.channelConfigurationStream.full;
+    pAfRd->channelConfigurationStream.part.sat  = pCb->lastAf.channelConfigurationStream.part.sat;
+    pAfRd->channelConfigurationStream.part.sub  = pCb->lastAf.channelConfigurationStream.part.sub;
+    
+    // compute stream mask
+    streamMask = pAfRd->fxns->channelMask(pAfRd, pAfRd->channelConfigurationStream);
+    // Clear PCM data
+       for (i = 0; i < ASP_DECOP_CB_MAX_NUM_PCM_CH; i++)
+       {
+               if ((streamMask >> i) & 0x1)
+               {
+                       memset(pAfRd->data.sample[i], 0, pAfRd->sampleCount*sizeof(PAF_AudioData));
+               }
+               pAfRd->data.samsiz[i] = 0;
+       }
+    pAfRd->bsMetadata_type     = PAF_bsMetadata_none;           /* non zero if metadata is attached. */
+    pAfRd->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
+    pAfRd->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
+    pAfRd->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
+}
+