PASDK183: Updates for DTS legacy stream decode.
[processor-sdk/performance-audio-sr.git] / pasdk / test_dsp / framework / aspDecOpCircBuf_master.c
2 /*
3 Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/
4 All rights reserved.
6 * Redistribution and use in source and binary forms, with or without 
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the
16 * distribution.
17 *
18 * Neither the name of Texas Instruments Incorporated nor the names of
19 * its contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 */
36 #include <string.h> // for memset()
37 #include <xdc/std.h>
38 #include <xdc/runtime/Log.h>
39 #include <ti/sysbios/hal/Cache.h>
40 #include <ti/uia/events/UIAEvt.h>
41 #include <ti/ipc/GateMP.h>
43 #include "common.h"
44 #include "paftyp.h"
45 #include "pafdec.h"
46 #include "aspDecOpCircBuf_master.h"
48 #define DEF_SOURCE_SEL          ( PAF_SOURCE_PCM ) // default source select
49 #define DEF_DEC_OP_FRAME_LEN    ( 256 )     // default decoder output frame length
50 #define DEF_STR_FRAME_LEN       ( 256 )     // default stream frame length
52 // Generate mute AF on circular buffer read
53 static Void cbReadAfMute(
54     PAF_AudioFrame *pAfRd,      // audio frame into which to read
55     Int16 strFrameLen           // stream frame length (output transaction size)
56 );
58 // Init last audio frame configuration info 
59 static Void cbInitLastAfInfo(
60     PAF_AudioFrame *pAfRd      // last audio frame stored in CB instance
61 );
63 // Generate mute AF on circular buffer read using the last AF configuration info 
64 static Void cbReadMuteWithLastAfInfo (
65     PAF_AST_DecOpCircBuf *pCb,    // decoder output circular buffer control
66     PAF_AudioFrame *pAfRd         // audio frame into which to read
67 );
69 // Initialize circular buffer control
70 Int cbCtlInit(
71     PAF_AST_DecOpCircBufCtl *pCbCtl,    // decoder output circular buffer control
72     PAF_AST_DecOpCircBuf **pXDecOpCb    // address of decoder output circular buffer base pointer
73 )
74 {
75     GateMP_Params gateParams;
76     GateMP_Handle gateHandle;
77     
78     GateMP_Params_init(&gateParams);
79     gateParams.localProtect = GateMP_LocalProtect_THREAD;
80     gateParams.remoteProtect = GateMP_RemoteProtect_SYSTEM;
81     gateParams.name = ASP_DECODE_CB_GATE_NAME;
82     gateParams.regionId = ASP_DECODE_CB_GATE_REGION_ID;
83     gateHandle = GateMP_create(&gateParams);
84     if (gateHandle != NULL)
85     {
86         pCbCtl->gateHandle = gateHandle;
87     }
88     else
89     {
90         pCbCtl->gateHandle = NULL;
91         return ASP_DECOP_CB_CTL_INIT_INV_GATE;
92     }
93     
94     pCbCtl->pXDecOpCb = pXDecOpCb;
95     
96     return ASP_DECOP_CB_SOK;
97     
98 }
100 // Initialize circular buffer
101 Int cbInit(
102     PAF_AST_DecOpCircBuf *pCb
105     PAF_AudioFrame *pAfCb;
106     PAF_AudioData *pPcmBuf;
107     UInt8 *pMetaBuf;
108     Int8 n;
109     Int8 i;
111     // set source select
112     pCb->sourceSel = DEF_SOURCE_SEL;
114     // set input frame length
115     pCb->decOpFrameLen = DEF_DEC_OP_FRAME_LEN;
116     
117     // set output frame length
118     pCb->strFrameLen = DEF_STR_FRAME_LEN;
119     
120     // initialize circular buffer maximum number of audio frames
121     pCb->maxNumAfCb = ASP_DECOP_CB_MAX_NUM_AF_THD;//ASP_DECOP_CB_MAX_NUM_AF_PCM;
122     pCb->afWrtIdx = ASP_DECOP_CB_INIT_LAG_PCM;
123     pCb->afRdIdx = 0;
124     pCb->pcmRdIdx = 0; // 2*256 in behind
125     
126     // set default value to PCM configuration
127     pCb->maxAFChanNum   = ASP_DECOP_CB_MAX_NUM_PCM_CH;
128     pCb->maxAFSampCount = DEF_DEC_OP_FRAME_LEN;
129     // initialize audio frames
130     for (n=0; n<pCb->maxNumAfCb; n++)
131     {
132         pAfCb = &pCb->afCb[n];
133         pAfCb->sampleDecode = PAF_SOURCE_PCM;
134         PAF_PROCESS_ZERO(pAfCb->sampleProcess);
135         pAfCb->sampleRate = PAF_SAMPLERATE_48000HZ;
136         pAfCb->sampleCount = DEF_DEC_OP_FRAME_LEN;
137         pAfCb->channelConfigurationRequest.full = 0;
138         pAfCb->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
139         pAfCb->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
140         pAfCb->channelConfigurationStream.full = 0;
141         pAfCb->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
142         pAfCb->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
143     }
145     // initialize circular buffer current number of frames
146     pCb->numAfCb = pCb->afWrtIdx - pCb->afRdIdx;
147     
148     // initialize audio frame PCM buffers
149     pPcmBuf = pCb->pcmBuf;
150     pMetaBuf = pCb->metaBuf; //QIN
151     for (n=0; n<pCb->maxNumAfCb; n++)
152     {
153         pAfCb = &pCb->afCb[n];
154         pAfCb->data.nChannels = ASP_DECOP_CB_MAX_NUM_PCM_CH;
155         pAfCb->data.nSamples = DEF_DEC_OP_FRAME_LEN;
156         for (i=0; i<ASP_DECOP_CB_MAX_NUM_PCM_CH; i++)
157         {
158             pAfCb->data.sample[i] = pPcmBuf;
159             memset(pAfCb->data.sample[i], DEF_DEC_OP_FRAME_LEN, 0);
160             pPcmBuf += DEF_DEC_OP_FRAME_LEN;
161             
162             pAfCb->data.samsiz[i] = 0;
163         }
164         
165         // write metadata information updated by decoder
166         pAfCb->bsMetadata_type     = PAF_bsMetadata_channelData;    /* non zero if metadata is attached. */
167         pAfCb->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
168         pAfCb->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
169         pAfCb->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
170         
171         // Initialize metadata buffers //QIN
172         for (i=0; i<PAF_MAX_NUM_PRIVATE_MD; i++)
173         {
174             pAfCb->pafPrivateMetadata[i].offset = 0; 
175             pAfCb->pafPrivateMetadata[i].size   = 0; 
176             pAfCb->pafPrivateMetadata[i].pMdBuf = pMetaBuf;
177             pMetaBuf += PAF_MAX_PRIVATE_MD_SZ;
178         }
179     }
180     
181     // reset read/write flags
182     pCb->writerActiveFlag = 0;
183     pCb->readerActiveFlag = 0;
184     pCb->emptyFlag = 0;
185     
186     // reset error counts
187     pCb->errUndCnt = 0;
188     pCb->errOvrCnt = 0;
189     
190     cbInitLastAfInfo(&pCb->lastAf);
192     // (***) FL: revisit
193     // Write back circular buffer configuration
194     Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
195     // Write back AF circular buffer
196     Cache_wb(pCb->afCb, pCb->maxNumAfCb*sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
197     // Write back PCM data
198     for (n=0; n<pCb->maxNumAfCb; n++)
199     {
200         pAfCb = &pCb->afCb[n];
201         Cache_wb(pAfCb->data.samsiz, ASP_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
202         Cache_wb(pAfCb->data.sample, ASP_DECOP_CB_MAX_NUM_PCM_CH*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0);
203         for (i=0; i<ASP_DECOP_CB_MAX_NUM_PCM_CH; i++)
204         {
205             Cache_wb(pAfCb->data.sample[i], DEF_DEC_OP_FRAME_LEN*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
206         }
207         // FL: unnecessary since part of AF
208         //for (i=0; i<PAF_MAX_NUM_PRIVATE_MD; i++)     // Write back metadata //QIN
209         //{
210         //    Cache_wb(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0);
211         //}
212     }
213     Cache_wait();
215     return ASP_DECOP_CB_SOK;
218 // Initialize circular buffer based on selected source
219 Int cbInitSourceSel(
220     PAF_AST_DecOpCircBufCtl *pCbCtl,    // decoder output circular buffer control
221     Int8 cbIdx,                         // decoder output circular buffer index
222     Int8 sourceSelect,                  // source select (PCM, DDP, etc.)
223     Int16 decOpFrameLen,                // decoder output frame length (PCM samples)
224     Int16 strFrameLen,                  // stream frame length (PCM samples)
225     Int8 resetRwFlags                   // whether to reset reader, writer, and empty flags
228     IArg key;
229     GateMP_Handle gateHandle;
230     PAF_AST_DecOpCircBuf *pCb;
231     PAF_AudioFrame *pAfCb;
232     PAF_AudioData *pPcmBuf;
233     UInt8 *pMetaBuf; //QIN
234     Int8 n;
235     Int8 i;
237     // Get gate handle
238     gateHandle = pCbCtl->gateHandle;
239     // Enter gate
240     key = GateMP_enter(gateHandle);
242     // Get circular buffer base pointer
243     pCb = &((*pCbCtl->pXDecOpCb)[cbIdx]);
244     
245     // Invalidate circular buffer configuration
246     Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
247     Cache_wait();
249     //Log_info1("cbInitSourceSel:afCb=0x%04x", (IArg)pCb->afCb); // FL: debug
251     // set source select
252     pCb->sourceSel = sourceSelect;
254     // set input frame length
255     pCb->decOpFrameLen = decOpFrameLen;
256     
257     // set output frame length
258     pCb->strFrameLen = strFrameLen;
259     
260     // initialize circular buffer maximum number of audio frames
261     if (sourceSelect == PAF_SOURCE_PCM)
262     {
263         pCb->maxNumAfCb = ASP_DECOP_CB_MAX_NUM_AF_PCM;
264         // 2*256 in behind
265         pCb->afWrtIdx = ASP_DECOP_CB_INIT_WRTIDX_PCM;
266         pCb->afRdIdx = ASP_DECOP_CB_INIT_RDIDX_PCM;
267         pCb->pcmRdIdx = 0;
268         pCb->maxAFChanNum = ASP_DECOP_CB_MAX_NUM_PCM_CH;
269         pCb->maxAFSampCount = DEF_DEC_OP_FRAME_LEN;
270         
271         // initialize audio frames
272         for (n=0; n<pCb->maxNumAfCb; n++)
273         {
274             pAfCb = &pCb->afCb[n];
275             pAfCb->sampleDecode = sourceSelect;
276             PAF_PROCESS_ZERO(pAfCb->sampleProcess);
277             pAfCb->sampleRate = PAF_SAMPLERATE_48000HZ;
278             pAfCb->sampleCount = decOpFrameLen;
279             pAfCb->channelConfigurationRequest.full = 0;
280             pAfCb->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
281             pAfCb->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
282             pAfCb->channelConfigurationStream.full = 0;
283             pAfCb->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
284             pAfCb->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
285             
286             // write metadata information updated by decoder
287             pAfCb->bsMetadata_type     = PAF_bsMetadata_channelData;    /* non zero if metadata is attached. */
288             pAfCb->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
289             pAfCb->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
290             pAfCb->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
291         }
292     }
293     else if ((sourceSelect == PAF_SOURCE_DDP) || (sourceSelect == PAF_SOURCE_AC3))
294     {
295         pCb->maxNumAfCb = ASP_DECOP_CB_MAX_NUM_AF_DDP;
296         // 4*256 in behind
297         pCb->afWrtIdx = ASP_DECOP_CB_INIT_WRTIDX_DDP;
298         pCb->afRdIdx = ASP_DECOP_CB_INIT_RDIDX_DDP;
299         pCb->pcmRdIdx = decOpFrameLen - ASP_DECOP_CB_INIT_LAG_DDP*strFrameLen; // 4*256 behind
300         pCb->maxAFChanNum = ASP_DECOP_CB_MAX_NUM_PCM_CH_DDP;
301         pCb->maxAFSampCount = ASP_DECOP_CB_MAX_PCM_FRAME_LEN_48kDDP;
302         
303         // initialize audio frames
304         for (n=0; n<pCb->maxNumAfCb; n++)
305         {
306             pAfCb = &pCb->afCb[n];
307             pAfCb->sampleDecode = sourceSelect;
308             PAF_PROCESS_ZERO(pAfCb->sampleProcess);
309             pAfCb->sampleRate = PAF_SAMPLERATE_48000HZ;
310             pAfCb->sampleCount = decOpFrameLen;
311             pAfCb->channelConfigurationRequest.full = 0;
312             pAfCb->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
313             pAfCb->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
314             pAfCb->channelConfigurationStream.full = 0;
315             pAfCb->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
316             pAfCb->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
317             
318             // write metadata information updated by decoder
319             pAfCb->bsMetadata_type     = PAF_bsMetadata_channelData;    /* non zero if metadata is attached. */
320             pAfCb->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
321             pAfCb->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
322             pAfCb->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
323         }
324     }
325     else if (sourceSelect == PAF_SOURCE_THD)
326     {
327         pCb->maxNumAfCb = ASP_DECOP_CB_MAX_NUM_AF_THD;
328         // 0 in behind
329         pCb->afWrtIdx = ASP_DECOP_CB_INIT_WRTIDX_THD;
330         pCb->afRdIdx = ASP_DECOP_CB_INIT_RDIDX_THD;
331         pCb->pcmRdIdx = 0;
332         pCb->maxAFChanNum = ASP_DECOP_CB_MAX_NUM_PCM_CH_MAT;
333         pCb->maxAFSampCount = ASP_DECOP_CB_MAX_PCM_FRAME_LEN_48kMAT;
334         
335         // initialize audio frames
336         for (n=0; n<pCb->maxNumAfCb; n++)
337         {
338             pAfCb = &pCb->afCb[n];
339             pAfCb->sampleDecode = sourceSelect;
340             PAF_PROCESS_ZERO(pAfCb->sampleProcess);
341             pAfCb->sampleRate = PAF_SAMPLERATE_48000HZ;
342             pAfCb->sampleCount = decOpFrameLen;
343             pAfCb->channelConfigurationRequest.full = 0;
344             pAfCb->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
345             pAfCb->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
346             pAfCb->channelConfigurationStream.full = 0;
347             pAfCb->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
348             pAfCb->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
349             
350             // write metadata information updated by decoder
351             pAfCb->bsMetadata_type     = PAF_bsMetadata_channelData;    /* non zero if metadata is attached. */
352             pAfCb->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
353             pAfCb->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
354             pAfCb->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
355         }
356     }
357     else if ((sourceSelect == PAF_SOURCE_DTS)   ||
358              (sourceSelect == PAF_SOURCE_DTSHD) ||
359              (sourceSelect == PAF_SOURCE_DTS12) ||
360              (sourceSelect == PAF_SOURCE_DTS13) ||
361              (sourceSelect == PAF_SOURCE_DTS14) ||
362              (sourceSelect == PAF_SOURCE_DTS16) ||
363              (sourceSelect == PAF_SOURCE_DTSALL)
364             )
365     {
366         pCb->maxNumAfCb = ASP_DECOP_CB_MAX_NUM_AF_DTS;
367         pCb->afWrtIdx = ASP_DECOP_CB_INIT_WRTIDX_DTS;
368         pCb->afRdIdx = ASP_DECOP_CB_INIT_RDIDX_DTS;
369         pCb->pcmRdIdx = decOpFrameLen - ASP_DECOP_CB_INIT_LAG_DTS*strFrameLen;
370         pCb->maxAFChanNum = ASP_DECOP_CB_MAX_NUM_PCM_CH;
371         pCb->maxAFSampCount = ASP_DECOP_CB_MAX_PCM_FRAME_LEN_48kDTS;
373         // initialize audio frames
374         for (n=0; n<pCb->maxNumAfCb; n++)
375         {
376             pAfCb = &pCb->afCb[n];
377             pAfCb->sampleDecode = sourceSelect;
378             PAF_PROCESS_ZERO(pAfCb->sampleProcess);
379             pAfCb->sampleRate = PAF_SAMPLERATE_48000HZ;
380             pAfCb->sampleCount = decOpFrameLen;
381             pAfCb->channelConfigurationRequest.full = 0;
382             pAfCb->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
383             pAfCb->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
384             pAfCb->channelConfigurationStream.full = 0;
385             pAfCb->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
386             pAfCb->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
388             // write metadata information updated by decoder
389             pAfCb->bsMetadata_type     = PAF_bsMetadata_channelData;    /* non zero if metadata is attached. */
390             pAfCb->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
391             pAfCb->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
392             pAfCb->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
393         }
394     }
395     else
396     {
397         SW_BREAKPOINT;
398         
399         // Leave the gate
400         GateMP_leave(gateHandle, key);
402         return ASP_DECOP_CB_INIT_INV_SOURCE_SEL;
403     }
405     // initialize circular buffer current number of frames
406     pCb->numAfCb = pCb->afWrtIdx - pCb->afRdIdx;
407     
408     // initialize audio frame PCM buffers
409     pPcmBuf = pCb->pcmBuf;
410     pMetaBuf = pCb->metaBuf; //QIN
411     for (n=0; n<pCb->maxNumAfCb; n++)
412     {
413         pAfCb = &pCb->afCb[n];
414         pAfCb->data.nChannels = pCb->maxAFChanNum;
415         pAfCb->data.nSamples = decOpFrameLen;
416         for (i=0; i<pCb->maxAFChanNum; i++)
417         {
418             pAfCb->data.sample[i] = pPcmBuf;
419             memset(pAfCb->data.sample[i], pCb->maxAFSampCount, 0);
420             pPcmBuf += pCb->maxAFSampCount;
421             
422             pAfCb->data.samsiz[i] = 0;
423         }
424         
425         // Initialize metadata buffers //QIN
426         for (i=0; i<PAF_MAX_NUM_PRIVATE_MD; i++)
427         {
428             pAfCb->pafPrivateMetadata[i].offset = 0; 
429             pAfCb->pafPrivateMetadata[i].size   = 0; 
430             pAfCb->pafPrivateMetadata[i].pMdBuf = pMetaBuf;
431             pMetaBuf += PAF_MAX_PRIVATE_MD_SZ;
432         }
433     }
434     
435     // reset read/write flags
436     if (resetRwFlags)
437     {
438         pCb->writerActiveFlag = 0;
439         pCb->readerActiveFlag = 0;
440         pCb->emptyFlag = 0;
441     }
442     
443     // reset error counts
444     pCb->errUndCnt = 0;
445     pCb->errOvrCnt = 0;
446     
447     // (***) FL: revisit
448     // Write back circular buffer configuration
449     Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
450     // Write back AF circular buffer
451     Cache_wb(pCb->afCb, pCb->maxNumAfCb*sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
452     // Write back PCM data
453     for (n=0; n<pCb->maxNumAfCb; n++)
454     {
455         pAfCb = &pCb->afCb[n];
456         Cache_wb(pAfCb->data.samsiz, pCb->maxAFChanNum*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
457         Cache_wb(pAfCb->data.sample, pCb->maxAFChanNum*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0);
458         for (i=0; i<pCb->maxAFChanNum; i++)
459         {
460             Cache_wb(pAfCb->data.sample[i], pCb->maxAFSampCount*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
461         }
462     }
463     Cache_wait();
465     // Leave the gate
466     GateMP_leave(gateHandle, key);
467     
468     return ASP_DECOP_CB_SOK;
471 // Start reads from circular buffer
472 Int cbReadStart(
473     PAF_AST_DecOpCircBufCtl *pCbCtl,    // decoder output circular buffer control
474     Int8 cbIdx                          // decoder output circular buffer index
477     IArg key;
478     GateMP_Handle gateHandle;
479     PAF_AST_DecOpCircBuf *pCb;
481     // Get gate handle
482     gateHandle = pCbCtl->gateHandle;
483     // Enter gate
484     key = GateMP_enter(gateHandle);
486     // Get circular buffer base pointer
487     pCb = &((*pCbCtl->pXDecOpCb)[cbIdx]);
488     
489     // Invalidate circular buffer configuration
490     Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
491     Cache_wait();
492     
493     //Log_info1("cbReadStart:afCb=0x%04x", (IArg)pCb->afCb); // FL: debug
495     // update flags
496     pCb->readerActiveFlag = 1;
497     
498     // (***) FL: revisit
499     // Write back circular buffer configuration
500     Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
501     Cache_wait();
503     // Leave the gate
504     GateMP_leave(gateHandle, key);
506     return ASP_DECOP_CB_SOK;
509 // Stop reads from circular buffer
510 Int cbReadStop(
511     PAF_AST_DecOpCircBufCtl *pCbCtl,    // decoder output circular buffer control
512     Int8 cbIdx                          // decoder output circular buffer index
515     IArg key;
516     GateMP_Handle gateHandle;
517     PAF_AST_DecOpCircBuf *pCb;
519     // Get gate handle
520     gateHandle = pCbCtl->gateHandle;
521     // Enter gate
522     key = GateMP_enter(gateHandle);
524     // Get circular buffer base pointer
525     pCb = &((*pCbCtl->pXDecOpCb)[cbIdx]);
527     // Invalidate circular buffer configuration
528     Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
529     Cache_wait();
530     
531     //Log_info1("cbReadStop:afCb=0x%04x", (IArg)pCb->afCb); // FL: debug
533     // update flags
534     pCb->readerActiveFlag = 0;
535     
536     // (***) FL: revisit
537     // Write back circular buffer configuration
538     Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
539     Cache_wait();
541     // Leave the gate
542     GateMP_leave(gateHandle, key);
544     return ASP_DECOP_CB_SOK;
547 // Read audio frame from circular buffer
548 Int cbReadAf(
549     PAF_AST_DecOpCircBufCtl *pCbCtl,    // decoder output circular buffer control
550     Int8 cbIdx,                         // decoder output circular buffer index
551     PAF_AudioFrame *pAfRd               // audio frame into which to read
554     IArg key;
555     GateMP_Handle gateHandle;
556     PAF_AST_DecOpCircBuf *pCb;
557     PAF_AudioFrame *pAfCb;
558     PAF_ChannelMask_HD streamMask;
559     Int8 i;
560     Int16 j;
561     Int8 numMetadata = 0;
563     // Get gate handle
564     gateHandle = pCbCtl->gateHandle;
565     // Enter gate
566     key = GateMP_enter(gateHandle);
568     // Get circular buffer base pointer
569     pCb = &((*pCbCtl->pXDecOpCb)[cbIdx]);
571     // (***) FL: revisit
572     // Invalidate circular buffer configuration.
573     Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
574     Cache_wait();
576     //Log_info1("cbReadAf:afCb=0x%04x", (IArg)pCb->afCb); // FL: debug
578     if ((pCb->writerActiveFlag == 1) && (pCb->emptyFlag == 1))
579     {
580         // This shouldn't occur:
581         //  writer is active AND draining circular buffer
582         //Log_info2("cbReadAf: ERROR: writerActiveFlag=%d, emptyFlag=%d", pCb->writerActiveFlag, pCb->emptyFlag); // FL: debug
583         SW_BREAKPOINT; // FL: debug
584         
585         // Leave the gate
586         GateMP_leave(gateHandle, key);
587         
588         return ASP_DECOP_CB_READ_INVSTATE;
589     }
591     if ((pCb->writerActiveFlag == 0) && (pCb->emptyFlag == 0))
592     {
593         //
594         // No active writer, not draining circular buffer.
595         // Skip UNDerflow check, mute output.
596         //
597         //cbReadAfMute(pAfRd, pCb->strFrameLen);
598         cbReadMuteWithLastAfInfo(pCb, pAfRd);
599         
600         // Leave the gate
601         GateMP_leave(gateHandle, key);
603         return ASP_DECOP_CB_SOK;
604     }
605     
606     // (writerActiveFlag,emptyFlag)=(1,0) and (0,1) are left
607     // Here we are checking (1,0) state here
608     if ((pCb->writerActiveFlag == 1))
609     {
610         // check underflow
611         if (pCb->numAfCb <= 0)
612         {
613             // 
614             // Increment underflow count.
615             // Mute output on underflow.
616             //
617             pCb->errUndCnt++;
618             //cbReadAfMute(pAfRd, pCb->strFrameLen);
619             cbReadMuteWithLastAfInfo(pCb, pAfRd);
620             //SW_BREAKPOINT; // FL: debug
621             
622             // Write back circular buffer configuration.
623             Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
624             Cache_wait();    
625             
626             // Leave the gate
627             GateMP_leave(gateHandle, key);
628             
629             return ASP_DECOP_CB_READ_UNDERFLOW;
630         }
631     }
632     
633     if ((pCb->writerActiveFlag == 1) || (pCb->emptyFlag == 1))
634     {
635         //
636         // Writer active or draining remaining frames in circular buffer.
637         // Get next output audio frame.
638         //
639         
640         // get pointer to current audio frame in circular buffer
641         pAfCb = &pCb->afCb[pCb->afRdIdx];
643         // (***) FL: revisit
644         // Invalidate audio frame
645         Cache_inv(pAfCb, sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
646         Cache_inv(pAfCb->data.samsiz, pCb->maxAFChanNum*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
647         for (i=0; i<pAfCb->numPrivateMetadata; i++) //QIN // FL: only invalidate numPrivateMetadata
648         {
649             Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0); // FL: only update metadata package size
650         }
651         Cache_wait();
653         // compute stream mask
654         streamMask = pAfRd->fxns->channelMask(pAfRd, pAfCb->channelConfigurationStream);
656         // Invalidate PCM data
657         for (i = 0; i < pCb->maxAFChanNum; i++)
658         {
659             if ((streamMask >> i) & 0x1)
660             {
661                 Cache_inv(&pAfCb->data.sample[i][pCb->pcmRdIdx], pCb->strFrameLen*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
662             }
663         }
664         Cache_wait();        
665         
666         // read audio frame information updated by decoder
667         pAfRd->sampleDecode = pAfCb->sampleDecode;
668         PAF_PROCESS_COPY(pAfRd->sampleProcess, pAfCb->sampleProcess);
669         pAfRd->sampleRate = pAfCb->sampleRate;
670         pAfRd->sampleCount = pCb->strFrameLen;
671         pAfRd->channelConfigurationRequest = pAfCb->channelConfigurationRequest;
672         pAfRd->channelConfigurationStream = pAfCb->channelConfigurationStream;
673         
674         // read metadata information updated by decoder //QIN
675         pAfRd->bsMetadata_type     = pAfCb->bsMetadata_type;        /* non zero if metadata is attached. */
676         pAfRd->pafBsMetadataUpdate = pAfCb->pafBsMetadataUpdate;    /* indicates whether bit-stream metadata update */
677         pAfRd->numPrivateMetadata  = pAfCb->numPrivateMetadata;     /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
678         pAfRd->bsMetadata_offset   = pAfCb->bsMetadata_offset;      /* offset into audio frame for change in bsMetadata_type field */
679         
680         // read PCM samples
681         for (i = 0; i < pCb->maxAFChanNum; i++)
682         {
683             if ((streamMask >> i) & 0x1)
684             {
685                 for (j = 0; j < pCb->strFrameLen; j++)
686                 {
687                     pAfRd->data.sample[i][j] = pAfCb->data.sample[i][pCb->pcmRdIdx+j];
688                 }
690                 pAfRd->data.samsiz[i] = pAfCb->data.samsiz[i];
691             }
692         }
693         
694         for (i = 0; i < PAF_MAX_NUM_PRIVATE_MD; i++)
695         {
696             pAfRd->pafPrivateMetadata[i].offset = 0;
697             pAfRd->pafPrivateMetadata[i].size   = 0;
698         }
699         
700         // read metadata //QIN
701         for (i = 0; i < pAfCb->numPrivateMetadata; i++) // FL: only read numPrivateMetadata
702         {
703             // FL: this is done above
704             ////Invalidate metadata data
705             //Cache_inv(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0);
706             //Cache_wait();        
707             
708             if ((pAfCb->pafPrivateMetadata[i].offset >= pCb->pcmRdIdx) 
709                  &&(pAfCb->pafPrivateMetadata[i].offset < (pCb->pcmRdIdx + pCb->strFrameLen))
710                  &&(pAfCb->pafPrivateMetadata[i].size))
711             {
712                 // FL: this is done above
713                 ////Invalidate metadata data
714                 //Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0);
715                 //Cache_wait();        
716         
717                 // the offset is adjusted for segment [pCb->pcmRdIdx, (pCb->pcmRdIdx + pCb->pafFrameLen)]
718                 pAfRd->pafPrivateMetadata[numMetadata].offset = pAfCb->pafPrivateMetadata[i].offset - pCb->pcmRdIdx;
719                 pAfRd->pafPrivateMetadata[numMetadata].size   = pAfCb->pafPrivateMetadata[i].size;
720                 memcpy(pAfRd->pafPrivateMetadata[numMetadata].pMdBuf, pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size);
721                 numMetadata++; //number of metadata associated with current 256 segment of audio samples
722             }
723             else //reset un-used buf
724             {
725                 pAfRd->pafPrivateMetadata[i].offset = 0;
726                 pAfRd->pafPrivateMetadata[i].size   = 0;
727             }
729         }
730         pAfRd->numPrivateMetadata = numMetadata; //number of metadata associated with current 256 segment of audio samples
731         
732         pCb->pcmRdIdx += pCb->strFrameLen; // update PCM read index
733         if (pCb->pcmRdIdx >= pAfCb->sampleCount) 
734         {
735             // update audio frame read index
736             pCb->afRdIdx++;
737             if (pCb->afRdIdx >= pCb->maxNumAfCb)
738             {
739                 pCb->afRdIdx = 0;
740             }
741             
742             // update PCM read index
743             pCb->pcmRdIdx = 0;
744             
745             // update number of audio frames in circular buffer
746             pCb->numAfCb--;
747         }
748         memcpy (&pCb->lastAf, pAfRd, sizeof(PAF_AudioFrame));
749     }
750     
751     if (pCb->emptyFlag == 1)
752     {
753         //
754         // Writer inactive, but remaining frames in circular buffer.
755         // Update empty flag.
756         //
757         if (pCb->numAfCb <= 0)
758         {
759             pCb->emptyFlag = 0;
760         }
761     }
762     
763     // (***) FL: revisit
764     // Write back circular buffer configuration.
765     // NOTE: Probably only a subset of this information needs to be updated.
766     Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
767     Cache_wait();    
768         
769     // Leave the gate
770     GateMP_leave(gateHandle, key);
772     return ASP_DECOP_CB_SOK;
775 // Generate mute AF on circular buffer read
776 static Void cbReadAfMute(
777     PAF_AudioFrame *pAfRd,      // audio frame into which to read
778     Int16 strFrameLen           // stream frame length (output transaction size)
781     PAF_ChannelMask_HD streamMask;
782     Int8 i;
783     
784     pAfRd->sampleDecode = PAF_SOURCE_PCM;
785     PAF_PROCESS_ZERO(pAfRd->sampleProcess);
786     pAfRd->sampleRate = PAF_SAMPLERATE_48000HZ;
787     pAfRd->sampleCount = strFrameLen;
788     pAfRd->channelConfigurationRequest.full = 0;
789     pAfRd->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
790     pAfRd->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
791     pAfRd->channelConfigurationStream.full = 0;
792     pAfRd->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
793     pAfRd->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
794     
795     // compute stream mask
796     streamMask = pAfRd->fxns->channelMask(pAfRd, pAfRd->channelConfigurationStream);
797     // Clear PCM data
798     for (i = 0; i < ASP_DECOP_CB_MAX_NUM_PCM_CH; i++)
799     {
800         if ((streamMask >> i) & 0x1)
801         {
802             memset(pAfRd->data.sample[i], 0, strFrameLen*sizeof(PAF_AudioData));
803         }
804         pAfRd->data.samsiz[i] = 0;
805     }
806     // write metadata information updated by decoder
807     pAfRd->bsMetadata_type     = PAF_bsMetadata_channelData;    /* non zero if metadata is attached. */
808     pAfRd->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
809     pAfRd->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
810     pAfRd->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
812 // Init last audio frame configuration info 
813 static Void cbInitLastAfInfo(
814     PAF_AudioFrame *pAfRd      // last audio frame stored in CB instance
817     pAfRd->sampleDecode = PAF_SOURCE_PCM;
818     PAF_PROCESS_ZERO(pAfRd->sampleProcess);
819     pAfRd->sampleRate = PAF_SAMPLERATE_48000HZ;
820     pAfRd->sampleCount = DEF_DEC_OP_FRAME_LEN;
821     pAfRd->channelConfigurationRequest.full = 0;
822     pAfRd->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
823     pAfRd->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
824     pAfRd->channelConfigurationStream.full = 0;
825     pAfRd->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
826     pAfRd->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
828     pAfRd->bsMetadata_type     = PAF_bsMetadata_none;           /* non zero if metadata is attached. */
829     pAfRd->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
830     pAfRd->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
831     pAfRd->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */
834 // Generate mute AF on circular buffer read using the last AF configuration info 
835 static Void cbReadMuteWithLastAfInfo (
836     PAF_AST_DecOpCircBuf *pCb,    // decoder output circular buffer control
837     PAF_AudioFrame *pAfRd         // audio frame into which to read
840     PAF_ChannelMask_HD streamMask;
841     Int8 i;
843     pAfRd->sampleDecode = pCb->lastAf.sampleDecode;
844     PAF_PROCESS_ZERO(pAfRd->sampleProcess);
845     pAfRd->sampleRate  = pCb->lastAf.sampleRate;
846     pAfRd->sampleCount = pCb->strFrameLen;
847     pAfRd->channelConfigurationRequest.full     = pCb->lastAf.channelConfigurationRequest.full;
848     pAfRd->channelConfigurationRequest.part.sat = pCb->lastAf.channelConfigurationRequest.part.sat;
849     pAfRd->channelConfigurationRequest.part.sub = pCb->lastAf.channelConfigurationRequest.part.sub;
850     pAfRd->channelConfigurationStream.full      = pCb->lastAf.channelConfigurationStream.full;
851     pAfRd->channelConfigurationStream.part.sat  = pCb->lastAf.channelConfigurationStream.part.sat;
852     pAfRd->channelConfigurationStream.part.sub  = pCb->lastAf.channelConfigurationStream.part.sub;
853     
854     // compute stream mask
855     streamMask = pAfRd->fxns->channelMask(pAfRd, pAfRd->channelConfigurationStream);
856     // Clear PCM data
857     for (i = 0; i < ASP_DECOP_CB_MAX_NUM_PCM_CH; i++)
858     {
859         if ((streamMask >> i) & 0x1)
860         {
861             memset(pAfRd->data.sample[i], 0, pAfRd->sampleCount*sizeof(PAF_AudioData));
862         }
863         pAfRd->data.samsiz[i] = 0;
864     }
865     pAfRd->bsMetadata_type     = PAF_bsMetadata_none;           /* non zero if metadata is attached. */
866     pAfRd->pafBsMetadataUpdate = 0;                             /* indicates whether bit-stream metadata update */
867     pAfRd->numPrivateMetadata  = 0;                             /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
868     pAfRd->bsMetadata_offset   = 0;                             /* offset into audio frame for change in bsMetadata_type field */