summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 6c2b770)
raw | patch | inline | side by side (parent: 6c2b770)
author | Frank Livingston <frank-livingston@ti.com> | |
Fri, 23 Jun 2017 00:18:52 +0000 (19:18 -0500) | ||
committer | Frank Livingston <frank-livingston@ti.com> | |
Fri, 23 Jun 2017 00:18:52 +0000 (19:18 -0500) |
- readAfWriterInactiveCnt
- wrtAfReaderInactiveCnt
- wrtAfZeroSampsCnt
- wrtAfReaderInactiveCnt
- wrtAfZeroSampsCnt
index 8b69e794ed3788a8d429a50bfcc31711ea60ee9b..39dc3128f1920d7621ef9b29612f3b21d2bb69b0 100644 (file)
pAfCb->numPrivateMetadata = 0;
}
- // reset error counts
+ // reset stats
+ pCb->readAfWriterInactiveCnt = 0;
+ pCb->wrtAfReaderInactiveCnt = 0;
+ pCb->wrtAfZeroSampsCnt = 0;
pCb->errUndCnt = 0;
pCb->errOvrCnt = 0;
index dd872ec4523fb0ac99a0e9ad5742bd3314923ac4..cc4a7fc4baaea83b001b4379dcd391aae939213c 100644 (file)
// Decoder output circular buffer
typedef struct PAF_AST_DecOpCircBuf
{
- PAF_AudioFrame *afCb; // audio frame CB
- PAF_AudioData *pcmBuf; // PCM buffer, contains PCM data associated with audio frames
- UInt8 *metaBuf; // metadata buffer, contains metadata associated with audio frames
- Int8 sourceSel; // selected source
- Int8 primedFlag; // flag indicated whether CB is primed: FALSE - CB not primed, TRUE - CB primed
- Int16 targetNDSamps; // target CB Nominal Delay number of samples
- Int16 deltaSamps; // number of 256 (N) sample output frames to block reader
- Int8 afRdIdx; // audio frame CB read index
- Int8 afWrtIdx; // audio frame CB write index
- //Int8 afLagIdx; // audio frame CB Lag idx,
- //Int8 afInitialLag; // Initial delay/lag between CB write and read
- Int16 pcmRdIdx; // pcm buffer read index
- Int8 numAfCb; // current number frames in CB
- Int8 maxNumAfCb; // maximum number of audio frames in CB
- Int16 decOpFrameLen; // selected decoder output frame length (input transaction size)
- Int16 strFrameLen; // stream frame length (output transaction size)
- Int8 writerActiveFlag; // flag indicates whether CB writer is active: FALSE - writer not active, TRUE - writer active
- Int8 readerActiveFlag; // flag indicates whether CB reader is active: FALSE - reader not active, TRUE - reader active
- Int8 drainFlag; // flag indicates whether reader should drain (empty) remaining frames in CB: FALSE - reader should not drain, TRUE - reader should drain
- Int8 errUndCnt; // underflow count
- Int8 errOvrCnt; // overflow count
- PAF_AudioData *pcmBufEnd; // PCM buffer, contains PCM data associated with audio frames end
- UInt8 *metaBufEnd; // metadata buffer, contains metadata associated with audio frames end
- Int8 maxAFChanNum; // maximum number of audio data channels in audio frame
- Int16 maxAFSampCount; // maximum number of sample counts in audio frame
- PAF_AudioFrame lastAf; // used to store the last valid read out audio frame info to generate mute frame
- #ifdef CB_RW_OP_CAP_PP // debug
- UInt32 *cb_samples_op; // should be in shared memory, preferred NON cache
- UInt8 *cb_op_owner; // should be in shared memory, preferred NON cache
- UInt8 *cb_afRdIdx; // should be in shared memory, preferred NON cache
- UInt8 *cb_afWrtIdx; // should be in shared memory, preferred NON cache
- UInt8 *cb_numAfCb; // should be in shared memory, preferred NON cache
- UInt32 cb_opCnt; // range (0 - CB_OP_COUNT_MAX)
- #endif
+ PAF_AudioFrame *afCb; // audio frame CB
+ PAF_AudioData *pcmBuf; // PCM buffer, contains PCM data associated with audio frames
+ UInt8 *metaBuf; // metadata buffer, contains metadata associated with audio frames
+ Int8 sourceSel; // selected source
+ Int8 primedFlag; // flag indicated whether CB is primed: FALSE - CB not primed, TRUE - CB primed
+ Int16 targetNDSamps; // target CB Nominal Delay number of samples
+ Int16 deltaSamps; // number of 256 (N) sample output frames to block reader
+ Int8 afRdIdx; // audio frame CB read index
+ Int8 afWrtIdx; // audio frame CB write index
+ //Int8 afLagIdx; // audio frame CB Lag idx,
+ //Int8 afInitialLag; // Initial delay/lag between CB write and read
+ Int16 pcmRdIdx; // pcm buffer read index
+ Int8 numAfCb; // current number frames in CB
+ Int8 maxNumAfCb; // maximum number of audio frames in CB
+ Int16 decOpFrameLen; // selected decoder output frame length (input transaction size)
+ Int16 strFrameLen; // stream frame length (output transaction size)
+ Int8 writerActiveFlag; // flag indicates whether CB writer is active: FALSE - writer not active, TRUE - writer active
+ Int8 readerActiveFlag; // flag indicates whether CB reader is active: FALSE - reader not active, TRUE - reader active
+ Int8 drainFlag; // flag indicates whether reader should drain (empty) remaining frames in CB: FALSE - reader should not drain, TRUE - reader should drain
+ Int32 readAfWriterInactiveCnt; // count of read audio frames with inactive writer & not draining
+ Int32 wrtAfReaderInactiveCnt; // count of write audio frames with inactive reader
+ Int32 wrtAfZeroSampsCnt; // count of write audio frames with zero samples
+ Int32 errUndCnt; // read error underflow count
+ Int32 errOvrCnt; // write error overflow count
+ PAF_AudioData *pcmBufEnd; // PCM buffer, contains PCM data associated with audio frames end
+ UInt8 *metaBufEnd; // metadata buffer, contains metadata associated with audio frames end
+ Int8 maxAFChanNum; // maximum number of audio data channels in audio frame
+ Int16 maxAFSampCount; // maximum number of sample counts in audio frame
+ PAF_AudioFrame lastAf; // used to store the last valid read out audio frame info to generate mute frame
+#ifdef CB_RW_OP_CAP_PP // debug
+ UInt32 *cb_samples_op; // should be in shared memory, preferred NON cache
+ UInt8 *cb_op_owner; // should be in shared memory, preferred NON cache
+ UInt8 *cb_afRdIdx; // should be in shared memory, preferred NON cache
+ UInt8 *cb_afWrtIdx; // should be in shared memory, preferred NON cache
+ UInt8 *cb_numAfCb; // should be in shared memory, preferred NON cache
+ UInt32 cb_opCnt; // range (0 - CB_OP_COUNT_MAX)
+#endif
} PAF_AST_DecOpCircBuf;
// Decoder output circular buffer control
diff --git a/pasdk/test_arm/framework/aspDecOpCircBuf_slave.c b/pasdk/test_arm/framework/aspDecOpCircBuf_slave.c
index 1ed6f66fbcd5a153a4f7e199354ae8cc7a5e8987..d2f34413148dfb19ebb7ae5703d194af92514c9f 100644 (file)
//Log_info1("cbWriteAf:afCb=0x%04x", (IArg)pCb->afCb); // debug
//Log_info2("cbWriteAf:pCb->readerActiveFlag=%d, pCb->writerActiveFlag=%d", (IArg)pCb->readerActiveFlag, (IArg)pCb->writerActiveFlag); // debug
- if ((pCb->readerActiveFlag == 1) && (pAfWrt->sampleCount)) //QIN ?
+ 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)
+ //
+
+ if (pAfWrt->sampleCount != 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++)
+ //Log_info2("cbWriteAf:pCb->numAfCb=%d, pCb->maxNumAfCb=%d", (IArg)pCb->readerActiveFlag, (IArg)pCb->maxNumAfCb); // debug
+
+ // check overflow
+ //while (pCb->numAfCb >= pCb->maxNumAfCb); // debug
+ if (pCb->numAfCb >= pCb->maxNumAfCb)
{
- pAfCb = &pCb->afCb[n];
- Cache_inv(pAfCb->data.sample, pCb->maxAFChanNum*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0);
- }
- Cache_wait();
+ pCb->errOvrCnt++;
- pCb->cbWriteAfInit = 1;
- }
-#endif
+ //SW_BREAKPOINT;
+ Log_info1("cbWriteAf: ERROR: overflow, numAfCb=%d", pCb->numAfCb);
- //Log_info2("cbWriteAf:pCb->numAfCb=%d, pCb->maxNumAfCb=%d", (IArg)pCb->readerActiveFlag, (IArg)pCb->maxNumAfCb); // debug
+ // Write back circular buffer configuration
+ Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
+ Cache_wait();
- // check overflow
- //while (pCb->numAfCb >= pCb->maxNumAfCb); // debug
- if (pCb->numAfCb >= pCb->maxNumAfCb)
- {
- pCb->errOvrCnt++;
+ // Leave the gate
+ GateMP_leave(gateHandle, key);
- //SW_BREAKPOINT;
- Log_info1("cbWriteAf: ERROR: overflow, numAfCb=%d", pCb->numAfCb);
+ //Log_info2("cbWriteAf:gate leave, gateHandle=0x%04x, key=%d", (IArg)gateHandle, (IArg)key); // debug
- // Write back circular buffer configuration
- Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
+ return ASP_DECOP_CB_WRITE_OVERFLOW;
+ }
- // Leave the gate
- GateMP_leave(gateHandle, key);
+ pAfCb = &pCb->afCb[pCb->afWrtIdx];
+ pPcmBuf = pAfCb->data.sample[0];
+ pMetaBuf = pAfCb->pafPrivateMetadata[0].pMdBuf;
+ if((pPcmBuf + (pAfWrt->sampleCount * pCb->maxAFChanNum )) > (pCb->pcmBufEnd))
+ {
+ pPcmBuf = pCb->pcmBuf;
+ }
- //Log_info2("cbWriteAf:gate leave, gateHandle=0x%04x, key=%d", (IArg)gateHandle, (IArg)key); // debug
+ for (i=0; i<pCb->maxAFChanNum; i++)
+ {
+ pAfCb->data.sample[i] = pPcmBuf;
+ pPcmBuf += pAfWrt->sampleCount;
+ pAfCb->data.samsiz[i] = 0;
+ }
+ Cache_inv(pAfCb->data.sample, pCb->maxAFChanNum*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0); // FL: this is write back and invalidate??
+ Cache_wait();
- return ASP_DECOP_CB_WRITE_OVERFLOW;
- }
+ //for (i=0; i<pCb->maxAFChanNum; i++){
+ //}
+ 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;
+ }
- pAfCb = &pCb->afCb[pCb->afWrtIdx];
- pPcmBuf = pAfCb->data.sample[0];
- pMetaBuf = pAfCb->pafPrivateMetadata[0].pMdBuf;
- if((pPcmBuf + (pAfWrt->sampleCount * pCb->maxAFChanNum )) > (pCb->pcmBufEnd))
- {
- pPcmBuf = pCb->pcmBuf;
- }
+ nextWrtIdx = 0;
+ if ((pCb->afWrtIdx +1) >= pCb->maxNumAfCb)
+ {
+ //Log_info0("cbWriteAf: AF Wrap around **** ");
+ // next audio frame will be audio frame 0
+ nextWrtIdx = 0;
+ }
+ else
+ {
+ // next audio frame will be current audio frame + 1
+ nextWrtIdx = pCb->afWrtIdx + 1;
+ }
- for (i=0; i<pCb->maxAFChanNum; i++)
- {
- pAfCb->data.sample[i] = pPcmBuf;
- pPcmBuf += pAfWrt->sampleCount;
- pAfCb->data.samsiz[i] = 0;
- }
- Cache_inv(pAfCb->data.sample, pCb->maxAFChanNum*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0); // FL: this is write back and invalidate??
- Cache_wait();
+ pAfCbNextAf = &pCb->afCb[nextWrtIdx]; // +1 or last AF if overflow
+ pAfCbNextAf->data.sample[0] = &pAfCb->data.sample[pCb->maxAFChanNum - 1][pAfWrt->sampleCount];// pAfCb->data.sample[15] + (pAfCb->sampleCount * sizeof(PAF_AudioData));
+
+ // 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
+ 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 < pCb->maxAFChanNum; i++)
+ {
+ if ((streamMask >> i) & 0x1)
+ {
+ for (j = 0; j < pAfWrt->sampleCount; j++)
+ {
+ pAfCb->data.sample[i][j] = pAfWrt->data.sample[i][j];
+ }
- for (i=0; i<pCb->maxAFChanNum; i++){
- }
- 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;
- }
+ pAfCb->data.samsiz[i] = pAfWrt->data.samsiz[i];
+ }
+ }
- nextWrtIdx = 0;
- if ((pCb->afWrtIdx +1) >= pCb->maxNumAfCb)
- {
- //Log_info0("cbWriteAf: AF Wrap around **** ");
- // next audio frame will be audio frame 0
- nextWrtIdx = 0;
- }else{
- // next audio frame will be current audio frame + 1
- nextWrtIdx = pCb->afWrtIdx + 1;
- }
+ #ifdef CB_RW_OP_CAP_PP // debug
+ if (pCb->cb_opCnt < CB_OP_COUNT_MAX)
+ {
+ if ((pCb->cb_samples_op != NULL) && (pCb->cb_op_owner != NULL))
+ {
+ // log sample count
+ pCb->cb_samples_op[pCb->cb_opCnt] = pAfWrt->sampleCount;
+ pCb->cb_op_owner[pCb->cb_opCnt] = CB_OP_W;
+ // log idxs
+ pCb->cb_afRdIdx[pCb->cb_opCnt] = pCb->afRdIdx;
+ pCb->cb_afWrtIdx[pCb->cb_opCnt] = pCb->afWrtIdx;
+ pCb->cb_numAfCb[pCb->cb_opCnt] = pCb->numAfCb; // numAfCb might not be pointing to this instance
+ pCb->cb_opCnt++;
+ }
+ }
+ #endif
- pAfCbNextAf = &pCb->afCb[nextWrtIdx]; // +1 or last AF if overflow
- pAfCbNextAf->data.sample[0] = &pAfCb->data.sample[pCb->maxAFChanNum - 1][pAfWrt->sampleCount];// pAfCb->data.sample[15] + (pAfCb->sampleCount * sizeof(PAF_AudioData));
-
- // 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
- 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 < pCb->maxAFChanNum; i++)
- {
- if ((streamMask >> i) & 0x1)
+ // prepare metadata buffer pointers according to the metadata and buffer sizes
+ for (i=0; i < pAfWrt->numPrivateMetadata; i++)
{
- for (j = 0; j < pAfWrt->sampleCount; j++)
+ UInt8 *nextMdBuf;
+ if(i == 0)
+ nextMdBuf = (pAfCb->pafPrivateMetadata[0].pMdBuf + pAfWrt->pafPrivateMetadata[0].size);
+ else
+ nextMdBuf = (pAfCb->pafPrivateMetadata[i-1].pMdBuf + pAfWrt->pafPrivateMetadata[i-1].size);
+ if(nextMdBuf >= pCb->metaBufEnd) // metadata buffer overflow
{
- pAfCb->data.sample[i][j] = pAfWrt->data.sample[i][j];
+ pAfCb->pafPrivateMetadata[i].pMdBuf = pCb->metaBuf;
}
+ else if(i != 0)
+ {
+ pAfCb->pafPrivateMetadata[i].pMdBuf = nextMdBuf;
+ }
+ Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, sizeof(UInt8 *), Cache_Type_ALLD, 0);
+ }
- pAfCb->data.samsiz[i] = pAfWrt->data.samsiz[i];
+ // Write metadata to circular buffer
+ for (i = 0; i < pAfWrt->numPrivateMetadata; i++) // 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);
}
- }
- #ifdef CB_RW_OP_CAP_PP // debug
- if (pCb->cb_opCnt < CB_OP_COUNT_MAX)
- {
- if ((pCb->cb_samples_op != NULL) && (pCb->cb_op_owner != NULL))
+ Cache_inv(pAfCb->pafPrivateMetadata, pAfWrt->numPrivateMetadata*sizeof(PAF_PrivateMetadata *), Cache_Type_ALLD, 0); // FL: this is write back and invalidate??
+ Cache_wait();
+ for (i=0; i<pAfCb->numPrivateMetadata; i++) // only write back numPrivateMetadata
{
- // log sample count
- pCb->cb_samples_op[pCb->cb_opCnt] = pAfWrt->sampleCount;
- pCb->cb_op_owner[pCb->cb_opCnt] = CB_OP_W;
- // log idxs
- pCb->cb_afRdIdx[pCb->cb_opCnt] = pCb->afRdIdx;
- pCb->cb_afWrtIdx[pCb->cb_opCnt] = pCb->afWrtIdx;
- pCb->cb_numAfCb[pCb->cb_opCnt] = pCb->numAfCb; // numAfCb might not be pointing to this instance
- pCb->cb_opCnt++;
+ //Log_info4("cbWriteAf: AF: %d nummd: %d offset: %d size: %d ", pCb->afWrtIdx, pAfCb->numPrivateMetadata, pAfCb->pafPrivateMetadata[i].offset, pAfCb->pafPrivateMetadata[i].size);
+ Cache_wb(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0);
+ }
+ // update audio frame write index
+ pCb->afWrtIdx++;
+ if (pCb->afWrtIdx >= pCb->maxNumAfCb)
+ {
+ pCb->afWrtIdx = 0;
}
- }
- #endif
- // prepare metadata buffer pointers according to the metadata and buffer sizes
- for (i=0; i < pAfWrt->numPrivateMetadata; i++)
- {
- UInt8 *nextMdBuf;
- if(i == 0)
- nextMdBuf = (pAfCb->pafPrivateMetadata[0].pMdBuf + pAfWrt->pafPrivateMetadata[0].size);
+ pCb->afCb[pCb->afWrtIdx].data.sample[0] = &pAfCb->data.sample[pCb->maxAFChanNum - 1][pAfWrt->sampleCount];
+ if(pAfWrt->numPrivateMetadata > 0)
+ {
+ pCb->afCb[pCb->afWrtIdx].pafPrivateMetadata[0].pMdBuf = pAfCb->pafPrivateMetadata[pAfWrt->numPrivateMetadata - 1].pMdBuf + pAfWrt->pafPrivateMetadata[pAfWrt->numPrivateMetadata - 1].size;
+ }
else
- nextMdBuf = (pAfCb->pafPrivateMetadata[i-1].pMdBuf + pAfWrt->pafPrivateMetadata[i-1].size);
- if(nextMdBuf >= pCb->metaBufEnd) // metadata buffer overflow
{
- pAfCb->pafPrivateMetadata[i].pMdBuf = pCb->metaBuf;
+ pCb->afCb[pCb->afWrtIdx].pafPrivateMetadata[0].pMdBuf = pAfCb->pafPrivateMetadata[0].pMdBuf;
+ Cache_wb(pCb->afCb , ASP_DECOP_CB_MAX_NUM_PCM_FRAMES*sizeof(PAF_AudioFrame *), Cache_Type_ALLD, 0);
+ Cache_wait();
}
- else if(i != 0)
+ Cache_inv(pCb->afCb[pCb->afWrtIdx].pafPrivateMetadata[0].pMdBuf, sizeof(UInt8 *), Cache_Type_ALLD, 0);
+ Cache_wait();
+ // update number of audio frames in circular buffer
+ pCb->numAfCb++;
+
+ // Update CB Lag index
+ //if (pCb->afLagIdx < pCb->afInitialLag)
+ //{
+ // pCb->afLagIdx += 1;
+ //}
+
+ // Update CB primed flag
+ // calculate number of delta samples before
+ if (pCb->primedFlag == 0)
{
- pAfCb->pafPrivateMetadata[i].pMdBuf = nextMdBuf;
+ pCb->primedFlag = 1;
+
+ // Calculate number of output frames to block reader.
+ // This is sample count reader waits before allowed to actually read samples from the CB.
+ pCb->deltaSamps = (pCb->targetNDSamps - pAfWrt->sampleCount + (pCb->strFrameLen-1)) / pCb->strFrameLen * pCb->strFrameLen;
+
+ // debug
+ //gSampleCountBuf[gPrimedFlagCnt] = pAfWrt->sampleCount;
+ //gCalcDeltaSampsBuf[gPrimedFlagCnt] = pCb->deltaSamps;
+ //if (gPrimedFlagCnt < 10)
+ // gPrimedFlagCnt++;
}
- Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, sizeof(UInt8 *), Cache_Type_ALLD, 0);
- }
-
- // Write metadata to circular buffer
- for (i = 0; i < pAfWrt->numPrivateMetadata; i++) // 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);
- }
- Cache_inv(pAfCb->pafPrivateMetadata, pAfWrt->numPrivateMetadata*sizeof(PAF_PrivateMetadata *), Cache_Type_ALLD, 0); // FL: this is write back and invalidate??
- Cache_wait();
- for (i=0; i<pAfCb->numPrivateMetadata; i++) // only write back numPrivateMetadata
- {
- //Log_info4("cbWriteAf: AF: %d nummd: %d offset: %d size: %d ", pCb->afWrtIdx, pAfCb->numPrivateMetadata, pAfCb->pafPrivateMetadata[i].offset, pAfCb->pafPrivateMetadata[i].size);
- Cache_wb(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0);
- }
- // update audio frame write index
- pCb->afWrtIdx++;
- if (pCb->afWrtIdx >= pCb->maxNumAfCb)
- {
- pCb->afWrtIdx = 0;
- }
+ // 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, pCb->maxAFChanNum*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
+ Cache_wb(pAfCb->pafPrivateMetadata, pAfWrt->numPrivateMetadata*sizeof(PAF_PrivateMetadata *), Cache_Type_ALLD, 0);
+ Cache_wait();
+ // write back PCM data
+ for (i = 0; i < pCb->maxAFChanNum; i++)
+ {
+ if ((streamMask >> i) & 0x1)
+ {
+ Cache_wb(pAfCb->data.sample[i], pAfWrt->sampleCount * sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
+ }
+ }
+ Cache_wait();
- pCb->afCb[pCb->afWrtIdx].data.sample[0] = &pAfCb->data.sample[pCb->maxAFChanNum - 1][pAfWrt->sampleCount];
- if(pAfWrt->numPrivateMetadata > 0)
- {
- pCb->afCb[pCb->afWrtIdx].pafPrivateMetadata[0].pMdBuf = pAfCb->pafPrivateMetadata[pAfWrt->numPrivateMetadata - 1].pMdBuf + pAfWrt->pafPrivateMetadata[pAfWrt->numPrivateMetadata - 1].size;
+ {
+ static Uint8 toggleState = 0;
+ if (toggleState == 0)
+ GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_99);
+ else
+ GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_99);
+ toggleState = ~(toggleState);
+ }
+ Log_info3("wrote %d samples into AF %d sourceSel: %d", pAfCb->sampleCount, pCb->afWrtIdx, pCb->sourceSel);
+ Log_info4("CBWMETA num=%d size=%d offset=%d chrequest=0x%04x", pAfCb->numPrivateMetadata, pAfCb->pafPrivateMetadata[0].size, pAfCb->pafPrivateMetadata[0].offset, pAfCb->channelConfigurationRequest.full);
}
else
{
- pCb->afCb[pCb->afWrtIdx].pafPrivateMetadata[0].pMdBuf = pAfCb->pafPrivateMetadata[0].pMdBuf;
- Cache_wb(pCb->afCb , ASP_DECOP_CB_MAX_NUM_PCM_FRAMES*sizeof(PAF_AudioFrame *), Cache_Type_ALLD, 0);
+ //
+ // Skip write in case of 0 sample count
+ //
+
+ // writing audio frame w/ zero samples
+ // update stat
+ pCb->wrtAfZeroSampsCnt++;
+
+ // Write back circular buffer configuration
+ Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
Cache_wait();
}
- Cache_inv(pCb->afCb[pCb->afWrtIdx].pafPrivateMetadata[0].pMdBuf, sizeof(UInt8 *), Cache_Type_ALLD, 0);
- Cache_wait();
- // update number of audio frames in circular buffer
- pCb->numAfCb++;
-
- // Update CB Lag index
- //if (pCb->afLagIdx < pCb->afInitialLag)
- //{
- // pCb->afLagIdx += 1;
- //}
+ }
+ else if (pCb->readerActiveFlag == 0)
+ {
+ //
+ // Reader inactive, don't write to circular buffer or check OVRflow.
+ //
- // Update CB primed flag
- // calculate number of delta samples before
- if (pCb->primedFlag == 0)
- {
- pCb->primedFlag = 1;
-
- // Calculate number of output frames to block reader.
- // This is sample count reader waits before allowed to actually read samples from the CB.
- pCb->deltaSamps = (pCb->targetNDSamps - pAfWrt->sampleCount + (pCb->strFrameLen-1)) / pCb->strFrameLen * pCb->strFrameLen;
-
- // debug
- //gSampleCountBuf[gPrimedFlagCnt] = pAfWrt->sampleCount;
- //gCalcDeltaSampsBuf[gPrimedFlagCnt] = pCb->deltaSamps;
- //if (gPrimedFlagCnt < 10)
- // gPrimedFlagCnt++;
- }
+ // writing AF w/ inactive reader
+ // update stat
+ pCb->wrtAfReaderInactiveCnt++;
// 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, pCb->maxAFChanNum*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
- Cache_wb(pAfCb->pafPrivateMetadata, pAfWrt->numPrivateMetadata*sizeof(PAF_PrivateMetadata *), Cache_Type_ALLD, 0);
- Cache_wait();
- // write back PCM data
- for (i = 0; i < pCb->maxAFChanNum; i++)
- {
- if ((streamMask >> i) & 0x1)
- {
- Cache_wb(pAfCb->data.sample[i], pAfWrt->sampleCount * sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
- }
- }
Cache_wait();
-
- {
- static Uint8 toggleState = 0;
- if (toggleState == 0)
- GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_99);
- else
- GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_99);
- toggleState = ~(toggleState);
- }
- Log_info3("wrote %d samples into AF %d sourceSel: %d", pAfCb->sampleCount, pCb->afWrtIdx, pCb->sourceSel);
- Log_info4("CBWMETA num=%d size=%d offset=%d chrequest=0x%04x", pAfCb->numPrivateMetadata, pAfCb->pafPrivateMetadata[0].size, pAfCb->pafPrivateMetadata[0].offset, pAfCb->channelConfigurationRequest.full);
}
// Leave the gate
return ASP_DECOP_CB_SOK;
}
+#if 0
// Get next audio frame to write in circular buffer
Int cbGetNextWriteAf(
PAF_AST_DecOpCircBufCtl *pCbCtl, // decoder output circular buffer control
return ASP_DECOP_CB_SOK;
}
+#endif
diff --git a/pasdk/test_arm/framework/aspDecOpCircBuf_slave.h b/pasdk/test_arm/framework/aspDecOpCircBuf_slave.h
index 4e4dbf1433e028f515b011e8a01623ff506b7918..766c3f5456e23a277719ca253269067c8bd6e99c 100644 (file)
PAF_AudioFrame *pAfWrt // audio frame from which to write
);
+#if 0
// Get next audio frame to write in circular buffer
Int cbGetNextWriteAf(
PAF_AST_DecOpCircBufCtl *pCbCtl, // decoder output circular buffer control
Int8 cbIdx, // decoder output circular buffer index
PAF_AudioFrame **ppAfWrt // audio frame next to be written
);
+#endif
#endif /* _ASP_DECOP_CB_SLAVE_H_ */
diff --git a/pasdk/test_dsp/framework/aspDecOpCircBuf_master.c b/pasdk/test_dsp/framework/aspDecOpCircBuf_master.c
index c00f5e3e5d044b867bb3afea33efee0ac8cc7628..38b90f146ca671b223f0aa7b807ab78d548db578 100644 (file)
pCb->readerActiveFlag = 0;
pCb->drainFlag = 0;
- // reset error counts
+ // reset stats
+ pCb->readAfWriterInactiveCnt = 0;
+ pCb->wrtAfReaderInactiveCnt = 0;
+ pCb->wrtAfZeroSampsCnt = 0;
pCb->errUndCnt = 0;
pCb->errOvrCnt = 0;
Int8 sourceSelect, // source select (PCM, DDP, etc.)
Int16 decOpFrameLen, // decoder output frame length (PCM samples)
Int16 strFrameLen, // stream frame length (PCM samples)
- Int8 resetRwFlags // whether to reset reader, writer, and empty flags
+ Int8 resetRwFlags // whether to reset reader, writer, and drain flags
)
{
IArg key;
pCb->drainFlag = 0;
}
- // reset error counts
+ // reset stats
+ pCb->readAfWriterInactiveCnt = 0;
+ pCb->wrtAfReaderInactiveCnt = 0;
+ pCb->wrtAfZeroSampsCnt = 0;
pCb->errUndCnt = 0;
pCb->errOvrCnt = 0;
//Log_info1("cbReadAf:afCb=0x%04x", (IArg)pCb->afCb); // debug
+ // Check (writerActiveFlag,drainFlag)=(1,1)
if ((pCb->writerActiveFlag == 1) && (pCb->drainFlag == 1))
{
+ //
// This shouldn't occur:
- // writer is active AND draining circular buffer
+ // writer is active AND draining circular buffer
+ //
+
//Log_info2("cbReadAf: ERROR: writerActiveFlag=%d, drainFlag=%d", pCb->writerActiveFlag, pCb->drainFlag); // FL: debug
SW_BREAKPOINT; // FL: debug
return ASP_DECOP_CB_READ_INVSTATE;
}
+ // Check (writerActiveFlag,drainFlag)=(0,0)
//if (((pCb->writerActiveFlag == 0) && (pCb->drainFlag == 0)) || (pCb->afLagIdx < pCb->afInitialLag))
if ((pCb->writerActiveFlag == 0) && (pCb->drainFlag == 0))
{
//
- // No active writer, not draining circular buffer.
+ // Writer inactive, not draining circular buffer.
// Skip UNDerflow check, mute output.
//
+
+ pCb->readAfWriterInactiveCnt++;
+
//cbReadAfMute(pAfRd, pCb->strFrameLen);
cbReadMuteWithLastAfInfo(pCb, pAfRd);
+ // Write back circular buffer configuration.
+ Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
+ Cache_wait();
+
// Leave the gate
GateMP_leave(gateHandle, key);
return ASP_DECOP_CB_SOK;
}
-
+ // (writerActiveFlag,drainFlag)= (0,0) and (1,1) checked above
// (writerActiveFlag,drainFlag)=(1,0) and (0,1) are left
- // Here we are checking (1,0) state here
+ // Checking (writerActiveFlag,drainFlag)=(1,0) state here
if (pCb->writerActiveFlag == 1)
{
// check underflow
}
}
+ // Checking (writerActiveFlag,drainFlag)=(1,0) state above and here
+ // Checking (writerActiveFlag,drainFlag)=(0,1) state here
if ((pCb->writerActiveFlag == 1) || (pCb->drainFlag == 1))
{
//
{
//
// Writer inactive, but remaining frames in circular buffer.
- // Update empty flag.
+ // Update drain flag.
//
if (pCb->numAfCb <= 0)
{
diff --git a/pasdk/test_dsp/framework/aspDecOpCircBuf_master.h b/pasdk/test_dsp/framework/aspDecOpCircBuf_master.h
index fb22448523d74151cd6612b3507ab836083eaaee..e06c5ff3d4a49f26bfeb864d2a81d3cd7adcaf15 100644 (file)
Int8 sourceSelect, // source select (PCM, DDP, etc.)
Int16 decOpFrameLen, // decoder output frame length (PCM samples)
Int16 strFrameLen, // stream frame length (PCM samples)
- Int8 resetRwFlags // whether to reset reader, writer, and empty flags
+ Int8 resetRwFlags // whether to reset reader, writer, and drain flags
);
// Start reads from circular buffer