]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - processor-sdk/performance-audio-sr.git/blobdiff - processor_audio_sdk_1_00_00_00/pasdk/common/paf_decOpCircBuf.c
Split Decoder Output Circular Buffer code between Master (DSP:init,read) and Slave...
[processor-sdk/performance-audio-sr.git] / processor_audio_sdk_1_00_00_00 / pasdk / common / paf_decOpCircBuf.c
diff --git a/processor_audio_sdk_1_00_00_00/pasdk/common/paf_decOpCircBuf.c b/processor_audio_sdk_1_00_00_00/pasdk/common/paf_decOpCircBuf.c
deleted file mode 100644 (file)
index 425496a..0000000
+++ /dev/null
@@ -1,681 +0,0 @@
-
-/*
-Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/
-All rights reserved.
-
-* Redistribution and use in source and binary forms, with or without 
-* modification, are permitted provided that the following conditions
-* are met:
-*
-* Redistributions of source code must retain the above copyright
-* notice, this list of conditions and the following disclaimer.
-*
-* Redistributions in binary form must reproduce the above copyright
-* notice, this list of conditions and the following disclaimer in the
-* documentation and/or other materials provided with the
-* distribution.
-*
-* Neither the name of Texas Instruments Incorporated nor the names of
-* its contributors may be used to endorse or promote products derived
-* from this software without specific prior written permission.
-*
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*
-*/
-
-#include <string.h> // for memset()
-#include <xdc/std.h>
-#include <ti/sysbios/hal/Cache.h>
-#include <xdc/runtime/Log.h>
-
-#include "common.h"
-#include "pafdec.h"
-#include "pafsp.h"
-#include "paf_decOpCircBuf.h"
-
-// Generate mute AF on circular buffer read
-static Void cbReadAfMute(
-    PAF_AudioFrame *pAfRd,      // audio frame into which to read
-    Int16 strFrameLen           // stream frame length (output transaction size)
-);
-
-#define MAX_NUM_AF_PCM      ( 4 )
-#define CB_INIT_RD_LAG_PCM  ( 2 ) // 0...3
-
-#define MAX_NUM_AF_DDP      ( 2 )
-#define CB_INIT_RD_LAG_DDP  ( 4 ) // 0...5
-
-// Initialize circular buffer
-Int cbInit(
-    Int8 sourceSelect,          // source select (PCM, DDP, etc.)
-    Int16 decOpFrameLen,        // decoder output frame length (PCM samples)
-    Int16 strFrameLen,          // stream frame length (PCM samples)
-    PAF_AST_DecOpCircBuf *pCb,  // decoder output circular buffer
-    Int8 resetRwFlags           // whether to reset reader, writer, and empty flags
-)
-{
-    PAF_AudioFrame *pAfCb;
-    PAF_AudioData *pPcmBuf;
-    UInt8 *pMetaBuf; //QIN
-    Int8 n;
-    Int8 i;
-
-    // set input frame length
-    pCb->decOpFrameLen = decOpFrameLen;
-    
-    // set output frame length
-    pCb->strFrameLen = strFrameLen;
-    
-    // initialize circular buffer maximum number of audio frames
-    if (sourceSelect == PAF_SOURCE_PCM)
-    {
-        pCb->maxNumAfCb = MAX_NUM_AF_PCM;
-        pCb->afWrtIdx = CB_INIT_RD_LAG_PCM;
-        pCb->afRdIdx = 0;
-        pCb->pcmRdIdx = 0; // 2*256 in behind
-        
-        // initialize audio frames
-        for (n=0; n<pCb->maxNumAfCb; n++)
-        {
-            pAfCb = &pCb->afCb[n];
-            pAfCb->sampleDecode = PAF_SOURCE_PCM;
-            PAF_PROCESS_ZERO(pAfCb->sampleProcess);
-            pAfCb->sampleRate = PAF_SAMPLERATE_48000HZ;
-            pAfCb->sampleCount = decOpFrameLen;
-            pAfCb->channelConfigurationRequest.full = 0;
-            pAfCb->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
-            pAfCb->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
-            pAfCb->channelConfigurationStream.full = 0;
-            pAfCb->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
-            pAfCb->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
-        }
-    }
-    else if (sourceSelect == PAF_SOURCE_DDP)
-    {
-        pCb->maxNumAfCb = MAX_NUM_AF_DDP;
-        pCb->afWrtIdx = 1;
-        pCb->afRdIdx = 0;
-        pCb->pcmRdIdx = decOpFrameLen - CB_INIT_RD_LAG_DDP*strFrameLen; // 4*256 behind
-        
-        // initialize audio frames
-        for (n=0; n<pCb->maxNumAfCb; n++)
-        {
-            pAfCb = &pCb->afCb[n];
-            pAfCb->sampleDecode = PAF_SOURCE_DDP;
-            PAF_PROCESS_ZERO(pAfCb->sampleProcess);
-            pAfCb->sampleRate = PAF_SAMPLERATE_48000HZ;
-            pAfCb->sampleCount = decOpFrameLen;
-            pAfCb->channelConfigurationRequest.full = 0;
-            pAfCb->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
-            pAfCb->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
-            pAfCb->channelConfigurationStream.full = 0;
-            pAfCb->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
-            pAfCb->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
-        }
-    }
-    else
-    {
-        return PAF_DECOP_CB_INIT_INV_SOURCE_SEL;
-    }
-
-    // initialize circular buffer current number of frames
-    pCb->numAfCb = pCb->afWrtIdx - pCb->afRdIdx;
-    
-    // initialize audio frame PCM buffers
-    pPcmBuf = pCb->pcmBuf;
-    pMetaBuf = pCb->metaBuf; //QIN
-    for (n=0; n<pCb->maxNumAfCb; n++)
-    {
-        pAfCb = &pCb->afCb[n];
-        pAfCb->data.nChannels = PAF_DECOP_CB_MAX_NUM_PCM_CH;
-        pAfCb->data.nSamples = decOpFrameLen;
-        for (i=0; i<PAF_DECOP_CB_MAX_NUM_PCM_CH; i++)
-        {
-            pAfCb->data.sample[i] = pPcmBuf;
-            memset(pAfCb->data.sample[i], decOpFrameLen, 0);
-            pPcmBuf += decOpFrameLen;
-            
-            pAfCb->data.samsiz[i] = 0;
-        }
-        
-        // Initialize metadata buffers //QIN
-        for (i=0; i<PAF_MAX_NUM_PRIVATE_MD; i++)
-        {
-            pAfCb->pafPrivateMetadata[i].offset = 0; 
-            pAfCb->pafPrivateMetadata[i].size   = 0; 
-            pAfCb->pafPrivateMetadata[i].pMdBuf = pMetaBuf;
-            pMetaBuf += PAF_MAX_PRIVATE_MD_SZ;
-        }
-    }
-    
-    // reset read/write flags
-    if (resetRwFlags)
-    {
-        pCb->writerActiveFlag = 0;
-        pCb->readerActiveFlag = 0;
-        pCb->emptyFlag = 0;
-    }
-    // reset error counts
-    pCb->errUndCnt = 0;
-    pCb->errOvrCnt = 0;
-    
-    // (***) FL: revisit
-    // Write back circular buffer configuration
-    Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    // Write back AF circular buffer
-    Cache_wb(pCb->afCb, pCb->maxNumAfCb*sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
-    // Write back PCM data
-    for (n=0; n<pCb->maxNumAfCb; n++)
-    {
-        pAfCb = &pCb->afCb[n];
-        Cache_wb(pAfCb->data.samsiz, PAF_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
-        Cache_wb(pAfCb->data.sample, PAF_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0);
-        for (i=0; i<PAF_DECOP_CB_MAX_NUM_PCM_CH; i++)
-        {
-            Cache_wb(pAfCb->data.sample[i], decOpFrameLen*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
-        }
-        // FL: unnecessary since part of AF
-        //for (i=0; i<PAF_MAX_NUM_PRIVATE_MD; i++)     // Write back metadata //QIN
-        //{
-        //    Cache_wb(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0);
-        //}
-    }
-    Cache_wait();
-
-    return PAF_DECOP_CB_SOK;
-}
-
-// Start writes to circular buffer
-Int cbWriteStart(
-    PAF_AST_DecOpCircBuf *pCb   // decoder output circular buffer
-)
-{
-    PAF_AudioFrame *pAfCb;
-    Int8 n;
-    //Int8 i;
-
-    // (***) FL: revisit
-    // Invalidate circular buffer configuration.
-    // NOTE: Probably only a subset of this information needs to be updated.
-    Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-    
-    // Invalidate AF circular buffer
-    Cache_inv(pCb->afCb, pCb->maxNumAfCb*sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
-    for (n=0; n<pCb->maxNumAfCb; n++)
-    {
-        pAfCb = &pCb->afCb[n];
-        Cache_inv(pAfCb->data.sample, PAF_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0);
-        // FL: unnecessary since part of AF
-        //for (i=0; i<PAF_MAX_NUM_PRIVATE_MD; i++) //QIN
-        //{
-        //     Cache_inv(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0);
-        //}
-    }
-    Cache_wait();
-            
-    // update flags
-    pCb->writerActiveFlag = 1;
-    pCb->emptyFlag = 0;
-    
-    // (***) FL: revisit
-    // Write back circular buffer configuration
-    Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-
-    return PAF_DECOP_CB_SOK;
-};
-
-// Stop writes to circular buffer
-Int cbWriteStop(
-    PAF_AST_DecOpCircBuf *pCb   // decoder output circular buffer
-)
-{
-    // Invalidate circular buffer configuration
-    Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-    
-    // update flags
-    pCb->writerActiveFlag = 0;
-    pCb->emptyFlag = 1;
-
-    // (***) FL: revisit
-    // Write back circular buffer configuration
-    Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-    
-    return PAF_DECOP_CB_SOK;
-}
-
-// Start reads from circular buffer
-Int cbReadStart(
-    PAF_AST_DecOpCircBuf *pCb   // decoder output circular buffer
-)
-{
-    // Invalidate circular buffer configuration
-    Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-    
-    // update flags
-    pCb->readerActiveFlag = 1;
-    
-    // (***) FL: revisit
-    // Write back circular buffer configuration
-    Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-
-    return PAF_DECOP_CB_SOK;
-}
-
-// Stop reads from circular buffer
-Int cbReadStop(
-    PAF_AST_DecOpCircBuf *pCb   // decoder output circular buffer
-)
-{
-    // Invalidate circular buffer configuration
-    Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-    
-    // update flags
-    pCb->readerActiveFlag = 0;
-    
-    // (***) FL: revisit
-    // Write back circular buffer configuration
-    Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-
-    return PAF_DECOP_CB_SOK;
-}
-
-// Read audio frame from circular buffer
-Int cbReadAf(
-    PAF_AST_DecOpCircBuf *pCb,  // decoder output circular buffer
-    PAF_AudioFrame *pAfRd       // audio frame into which to read
-)
-{
-    PAF_AudioFrame *pAfCb;
-    PAF_ChannelMask_HD streamMask;
-    Int8 i;
-    Int16 j;
-
-    // (***) FL: revisit
-    // Invalidate circular buffer configuration.
-    Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-
-    if ((pCb->writerActiveFlag == 1) && (pCb->emptyFlag == 1))
-    {
-        // This shouldn't occur:
-        //  writer is active AND draining circular buffer
-        Log_info2("cbReadAf: ERROR: writerActiveFlag=%d, emptyFlag=%d", pCb->writerActiveFlag, pCb->emptyFlag);
-        SW_BREAKPOINT; // FL: debug
-        return PAF_DECOP_CB_READ_INVSTATE;
-    }
-
-    if ((pCb->writerActiveFlag == 0) && (pCb->emptyFlag == 0))
-    {
-        //
-        // No active writer, not draining circular buffer.
-        // Skip UNDerflow check, mute output.
-        //
-        cbReadAfMute(pAfRd, pCb->strFrameLen);
-        
-        return PAF_DECOP_CB_SOK;
-    }
-        
-    if ((pCb->writerActiveFlag == 1))
-    {
-        // check underflow
-        if (pCb->numAfCb <= 0)
-        {
-            // 
-            // Increment underflow count.
-            // Mute output on underflow.
-            //
-            pCb->errUndCnt++;
-            cbReadAfMute(pAfRd, pCb->strFrameLen);
-            //SW_BREAKPOINT; // FL: debug
-            
-            // Write back circular buffer configuration.
-            Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-            Cache_wait();    
-            
-            return PAF_DECOP_CB_READ_UNDERFLOW;
-        }
-    }
-    
-    if ((pCb->writerActiveFlag == 1) || (pCb->emptyFlag == 1))
-    {
-        //
-        // Writer active or draining remaining frames in circular buffer.
-        // Get next output audio frame.
-        //
-        
-        // get pointer to current audio frame in circular buffer
-        pAfCb = &pCb->afCb[pCb->afRdIdx];
-
-        // (***) FL: revisit
-        // Invalidate audio frame
-        Cache_inv(pAfCb, sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
-        Cache_inv(pAfCb->data.samsiz, PAF_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
-        for (i=0; i<pAfCb->numPrivateMetadata; i++) //QIN // FL: only invalidate numPrivateMetadata
-        {
-            //Cache_inv(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0); // FL: unnecessary since part of AF
-            Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0); // FL: only update metadata package size
-        }
-        Cache_wait();
-
-        // compute stream mask
-        streamMask = pAfRd->fxns->channelMask(pAfRd, pAfCb->channelConfigurationStream);
-
-        // Invalidate PCM data
-        for (i = 0; i < PAF_DECOP_CB_MAX_NUM_PCM_CH; i++)
-        {
-            if ((streamMask >> i) & 0x1)
-            {
-                Cache_inv(&pAfCb->data.sample[i][pCb->pcmRdIdx], pCb->strFrameLen*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
-            }
-        }
-        Cache_wait();        
-        
-        // read audio frame information updated by decoder
-        pAfRd->sampleDecode = pAfCb->sampleDecode;
-        PAF_PROCESS_COPY(pAfRd->sampleProcess, pAfCb->sampleProcess);
-        pAfRd->sampleRate = pAfCb->sampleRate;
-        pAfRd->sampleCount = pCb->strFrameLen;
-        pAfRd->channelConfigurationRequest = pAfCb->channelConfigurationRequest;
-        pAfRd->channelConfigurationStream = pAfCb->channelConfigurationStream;
-        
-        // read metadata information updated by decoder //QIN
-        pAfRd->bsMetadata_type     = pAfCb->bsMetadata_type;        /* non zero if metadata is attached. */
-        pAfRd->pafBsMetadataUpdate = pAfCb->pafBsMetadataUpdate;    /* indicates whether bit-stream metadata update */
-        pAfRd->numPrivateMetadata  = pAfCb->numPrivateMetadata;     /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
-        pAfRd->bsMetadata_offset   = pAfCb->bsMetadata_offset;      /* offset into audio frame for change in bsMetadata_type field */
-        
-        // read PCM samples
-        for (i = 0; i < PAF_DECOP_CB_MAX_NUM_PCM_CH; i++)
-        {
-            if ((streamMask >> i) & 0x1)
-            {
-                for (j = 0; j < pCb->strFrameLen; j++)
-                {
-                    pAfRd->data.sample[i][j] = pAfCb->data.sample[i][pCb->pcmRdIdx+j];
-                }
-
-                pAfRd->data.samsiz[i] = pAfCb->data.samsiz[i];
-            }
-        }
-        // read metadata //QIN
-        for (i = 0; i < pAfCb->numPrivateMetadata; i++) // FL: only read numPrivateMetadata
-        {
-            // FL: this is done above
-            ////Invalidate metadata data
-            //Cache_inv(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0);
-            //Cache_wait();        
-            
-            if ((pAfCb->pafPrivateMetadata[i].offset >= pCb->pcmRdIdx) 
-                 &&(pAfCb->pafPrivateMetadata[i].offset < (pCb->pcmRdIdx + pCb->strFrameLen))
-                 &&(pAfCb->pafPrivateMetadata[i].size))
-            {
-                // FL: this is done above
-                ////Invalidate metadata data
-                //Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0);
-                //Cache_wait();        
-        
-                // the offset is adjusted for segment [pCb->pcmRdIdx, (pCb->pcmRdIdx + pCb->pafFrameLen)]
-                pAfRd->pafPrivateMetadata[i].offset = 0; //pAfCb->pafPrivateMetadata[i].offset - pCb->pcmRdIdx;
-                pAfRd->pafPrivateMetadata[i].size   = pAfCb->pafPrivateMetadata[i].size;
-                memcpy(pAfRd->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size);
-            }
-            else //reset un-used buf
-            {
-                pAfRd->pafPrivateMetadata[i].offset = 0;
-                pAfRd->pafPrivateMetadata[i].size   = 0;
-            }
-        }
-        
-        pCb->pcmRdIdx += pCb->strFrameLen; // update PCM read index
-        if (pCb->pcmRdIdx == pCb->decOpFrameLen)
-        {
-            // update audio frame read index
-            pCb->afRdIdx++;
-            if (pCb->afRdIdx >= pCb->maxNumAfCb)
-            {
-                pCb->afRdIdx = 0;
-            }
-            
-            // update PCM read index
-            pCb->pcmRdIdx = 0;
-            
-            // update number of audio frames in circular buffer
-            pCb->numAfCb--;
-        }
-    }
-    
-    if (pCb->emptyFlag == 1)
-    {
-        //
-        // Writer inactive, but remaining frames in circular buffer.
-        // Update empty flag.
-        //
-        if (pCb->numAfCb <= 0)
-        {
-            pCb->emptyFlag = 0;
-        }
-    }
-    
-    // (***) FL: revisit
-    // Write back circular buffer configuration.
-    // NOTE: Probably only a subset of this information needs to be updated.
-    Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();    
-        
-    return PAF_DECOP_CB_SOK;
-}
-
-// Write audio frame to circular buffer
-Int cbWriteAf(
-    PAF_AST_DecOpCircBuf *pCb,  // decoder output circular buffer
-    PAF_AudioFrame *pAfWrt      // audio frame from which to write
-)
-{
-    PAF_AudioFrame *pAfCb;
-    PAF_ChannelMask_HD streamMask;
-    Int8 i;
-    Int16 j;
-
-    // (***) FL: revisit
-    // Invalidate circular buffer configuration.
-    // NOTE: Probably only a subset of this information nexeds to be updated.
-    Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-    Cache_wait();
-    
-    if (pCb->readerActiveFlag == 1)
-    {
-        //
-        // Normal case, reader active.
-        // If reader not active, don't write to circular buffer or check OVRflow.
-
-#if 0        
-        if (pCb->cbWriteAfInit == 0)
-        {
-            // Invalidate AF circular buffer
-            Cache_inv(pCb->afCb, pCb->maxNumAfCb*sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
-            for (n=0; n<pCb->maxNumAfCb; n++)
-            {
-                pAfCb = &pCb->afCb[n];
-                Cache_inv(pAfCb->data.sample, PAF_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0);
-            }
-            Cache_wait();
-
-            pCb->cbWriteAfInit = 1;
-        }
-#endif        
-
-        // check overflow
-        if (pCb->numAfCb >= pCb->maxNumAfCb)
-        {
-            pCb->errOvrCnt++;
-            //SW_BREAKPOINT;
-            Log_info1("cbWriteAf: ERROR: overflow, numAfCb=%d", pCb->numAfCb);
-            return PAF_DECOP_CB_WRITE_OVERFLOW;
-        }
-        
-        // get pointer to current audio frame in circular buffer
-        pAfCb = &pCb->afCb[pCb->afWrtIdx];
-           
-        // write audio frame information updated by decoder
-        pAfCb->sampleDecode = pAfWrt->sampleDecode;
-        PAF_PROCESS_COPY(pAfCb->sampleProcess, pAfWrt->sampleProcess);
-        pAfCb->sampleRate = pAfWrt->sampleRate;
-        pAfCb->sampleCount = pAfWrt->sampleCount;
-        pAfCb->channelConfigurationRequest = pAfWrt->channelConfigurationRequest;
-        pAfCb->channelConfigurationStream = pAfWrt->channelConfigurationStream;
-        // write metadata information updated by decoder //QIN
-        pAfCb->bsMetadata_type     = pAfWrt->bsMetadata_type;        /* non zero if metadata is attached. */
-        pAfCb->pafBsMetadataUpdate = pAfWrt->pafBsMetadataUpdate;    /* indicates whether bit-stream metadata update */
-        pAfCb->numPrivateMetadata  = pAfWrt->numPrivateMetadata;     /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
-        pAfCb->bsMetadata_offset   = pAfWrt->bsMetadata_offset;      /* offset into audio frame for change in bsMetadata_type field */
-        // write PCM samples
-        streamMask = pAfWrt->fxns->channelMask(pAfWrt, pAfCb->channelConfigurationStream);
-        for (i = 0; i < PAF_DECOP_CB_MAX_NUM_PCM_CH; i++)
-        {
-            if ((streamMask >> i) & 0x1)
-            {
-                for (j = 0; j < pCb->decOpFrameLen; j++)
-                {
-                    pAfCb->data.sample[i][j] = pAfWrt->data.sample[i][j];
-                }            
-                
-                pAfCb->data.samsiz[i] = pAfWrt->data.samsiz[i];
-            }
-        }
-        
-        // Write metadata to circular buffer
-        for (i = 0; i < pAfCb->numPrivateMetadata; i++) // FL: only copy numPrivateMetadata
-        {
-            pAfCb->pafPrivateMetadata[i].offset = pAfWrt->pafPrivateMetadata[i].offset; 
-            pAfCb->pafPrivateMetadata[i].size   = pAfWrt->pafPrivateMetadata[i].size; 
-            memcpy(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfWrt->pafPrivateMetadata[i].pMdBuf, pAfWrt->pafPrivateMetadata[i].size); 
-        }
-        
-        // update audio frame write index
-        pCb->afWrtIdx++;
-        if (pCb->afWrtIdx >= pCb->maxNumAfCb)
-        {
-            pCb->afWrtIdx = 0;
-        }
-        
-        // update number of audio frames in circular buffer
-        pCb->numAfCb++;
-
-        // (***) FL: revisit
-        // Write back circular buffer configuration
-        Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
-        // write back audio frame
-        Cache_wb(pAfCb, sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
-        Cache_wb(pAfCb->data.samsiz, PAF_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
-        // write back PCM data
-        for (i = 0; i < PAF_DECOP_CB_MAX_NUM_PCM_CH; i++)
-        {
-            if ((streamMask >> i) & 0x1)
-            {
-                Cache_wb(pAfCb->data.sample[i], pCb->decOpFrameLen*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
-            }
-        }
-        
-        // write back private metadata // QIN
-        for (i=0; i<pAfCb->numPrivateMetadata; i++) // FL: only write back numPrivateMetadata
-        {
-            //Cache_wb(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0); // FL: unnecessary since part of AF
-            Cache_wb(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0);
-        }
-        Cache_wait();
-    }  
-    
-    return PAF_DECOP_CB_SOK;
-}
-
-// Get next audio frame to write in circular buffer
-Int cbGetNextWriteAf(
-    PAF_AST_DecOpCircBuf *pCb, // decoder output circular buffer
-    PAF_AudioFrame **ppAfWrt   // audio frame next to be written
-)
-{
-    // get pointer to current audio frame in circular buffer
-    *ppAfWrt = &pCb->afCb[pCb->afWrtIdx];
-    
-    // update audio frame write index
-    pCb->afWrtIdx++;
-    if (pCb->afWrtIdx > pCb->maxNumAfCb)
-    {
-        pCb->afWrtIdx = 0;
-    }    
-    
-    return PAF_DECOP_CB_SOK;
-}
-
-// Output log of circular buffer control variables (debug)
-Int cbLog(
-    PAF_AST_DecOpCircBuf *pCb,
-    Int8 fullLog, 
-    char *locInfo
-)
-{
-    Log_info1("CB: %s", (IArg)locInfo);
-    Log_info3("CB: readerActiveFlag=%d, writerActiveFlag=%d, emptyFlag=%d", pCb->readerActiveFlag, pCb->writerActiveFlag, pCb->emptyFlag);
-    Log_info4("CB: afRdIdx=%d, pcmRdIdx=%d, afWrtIdx=%d, numAfCb=%d", pCb->afRdIdx, pCb->pcmRdIdx, 
-        pCb->afWrtIdx, 
-        pCb->numAfCb);
-    if (fullLog)
-    {
-        Log_info1("CB: maxNumAfCb=%d", pCb->maxNumAfCb);  
-        Log_info2("CB: decOpFrameLen=%d, strFrameLen=%d", pCb->decOpFrameLen, pCb->strFrameLen);
-        //Log_info1("cbWriteInit=%d", pCb->cbWriteAfInit);
-    }
-    
-    return 0;
-}
-
-// Generate mute AF on circular buffer read
-static Void cbReadAfMute(
-    PAF_AudioFrame *pAfRd,      // audio frame into which to read
-    Int16 strFrameLen           // stream frame length (output transaction size)
-)
-{
-    PAF_ChannelMask_HD streamMask;
-    Int8 i;
-    
-    pAfRd->sampleDecode = PAF_SOURCE_PCM;
-    PAF_PROCESS_ZERO(pAfRd->sampleProcess);
-    pAfRd->sampleRate = PAF_SAMPLERATE_48000HZ;
-    pAfRd->sampleCount = strFrameLen;
-    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;
-    
-    // compute stream mask
-    streamMask = pAfRd->fxns->channelMask(pAfRd, pAfRd->channelConfigurationStream);
-    // Clear PCM data
-    for (i = 0; i < PAF_DECOP_CB_MAX_NUM_PCM_CH; i++)
-    {
-        if ((streamMask >> i) & 0x1)
-        {
-            memset(pAfRd->data.sample[i], strFrameLen, 0);
-        }
-        pAfRd->data.samsiz[i] = 0;
-    }
-}