[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
+++ /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;
- }
-}