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 (512 ) // ( 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;
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 }
94 pCbCtl->pXDecOpCb = pXDecOpCb;
96 return ASP_DECOP_CB_SOK;
98 }
100 // Initialize circular buffer
101 Int cbInit(
102 PAF_AST_DecOpCircBuf *pCb
103 )
104 {
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;
117 // set output frame length
118 pCb->strFrameLen = DEF_STR_FRAME_LEN;
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
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;
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;
162 pAfCb->data.samsiz[i] = 0;
163 }
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 */
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 }
181 // reset read/write flags
182 pCb->writerActiveFlag = 0;
183 pCb->readerActiveFlag = 0;
184 pCb->emptyFlag = 0;
186 // reset error counts
187 pCb->errUndCnt = 0;
188 pCb->errOvrCnt = 0;
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;
216 }
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
226 )
227 {
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]);
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;
257 // set output frame length
258 pCb->strFrameLen = strFrameLen;
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;
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;
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;
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;
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;
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;
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
358 {
359 SW_BREAKPOINT;
361 // Leave the gate
362 GateMP_leave(gateHandle, key);
364 return ASP_DECOP_CB_INIT_INV_SOURCE_SEL;
365 }
367 // initialize circular buffer current number of frames
368 pCb->numAfCb = pCb->afWrtIdx - pCb->afRdIdx;
370 // initialize audio frame PCM buffers
371 pPcmBuf = pCb->pcmBuf;
372 pMetaBuf = pCb->metaBuf; //QIN
373 for (n=0; n<pCb->maxNumAfCb; n++)
374 {
375 pAfCb = &pCb->afCb[n];
376 pAfCb->data.nChannels = pCb->maxAFChanNum;
377 pAfCb->data.nSamples = decOpFrameLen;
378 for (i=0; i<pCb->maxAFChanNum; i++)
379 {
380 pAfCb->data.sample[i] = pPcmBuf;
381 memset(pAfCb->data.sample[i], pCb->maxAFSampCount, 0);
382 pPcmBuf += pCb->maxAFSampCount;
384 pAfCb->data.samsiz[i] = 0;
385 }
387 // Initialize metadata buffers //QIN
388 for (i=0; i<PAF_MAX_NUM_PRIVATE_MD; i++)
389 {
390 pAfCb->pafPrivateMetadata[i].offset = 0;
391 pAfCb->pafPrivateMetadata[i].size = 0;
392 pAfCb->pafPrivateMetadata[i].pMdBuf = pMetaBuf;
393 pMetaBuf += PAF_MAX_PRIVATE_MD_SZ;
394 }
395 }
397 // reset read/write flags
398 if (resetRwFlags)
399 {
400 pCb->writerActiveFlag = 0;
401 pCb->readerActiveFlag = 0;
402 pCb->emptyFlag = 0;
403 }
405 // reset error counts
406 pCb->errUndCnt = 0;
407 pCb->errOvrCnt = 0;
409 // (***) FL: revisit
410 // Write back circular buffer configuration
411 Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
412 // Write back AF circular buffer
413 Cache_wb(pCb->afCb, pCb->maxNumAfCb*sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
414 // Write back PCM data
415 for (n=0; n<pCb->maxNumAfCb; n++)
416 {
417 pAfCb = &pCb->afCb[n];
418 Cache_wb(pAfCb->data.samsiz, pCb->maxAFChanNum*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
419 Cache_wb(pAfCb->data.sample, pCb->maxAFChanNum*sizeof(PAF_AudioData *), Cache_Type_ALLD, 0);
420 for (i=0; i<pCb->maxAFChanNum; i++)
421 {
422 Cache_wb(pAfCb->data.sample[i], pCb->maxAFSampCount*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
423 }
424 }
425 Cache_wait();
427 // Leave the gate
428 GateMP_leave(gateHandle, key);
430 return ASP_DECOP_CB_SOK;
431 }
433 // Start reads from circular buffer
434 Int cbReadStart(
435 PAF_AST_DecOpCircBufCtl *pCbCtl, // decoder output circular buffer control
436 Int8 cbIdx // decoder output circular buffer index
437 )
438 {
439 IArg key;
440 GateMP_Handle gateHandle;
441 PAF_AST_DecOpCircBuf *pCb;
443 // Get gate handle
444 gateHandle = pCbCtl->gateHandle;
445 // Enter gate
446 key = GateMP_enter(gateHandle);
448 // Get circular buffer base pointer
449 pCb = &((*pCbCtl->pXDecOpCb)[cbIdx]);
451 // Invalidate circular buffer configuration
452 Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
453 Cache_wait();
455 //Log_info1("cbReadStart:afCb=0x%04x", (IArg)pCb->afCb); // FL: debug
457 // update flags
458 pCb->readerActiveFlag = 1;
460 // (***) FL: revisit
461 // Write back circular buffer configuration
462 Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
463 Cache_wait();
465 // Leave the gate
466 GateMP_leave(gateHandle, key);
468 return ASP_DECOP_CB_SOK;
469 }
471 // Stop reads from circular buffer
472 Int cbReadStop(
473 PAF_AST_DecOpCircBufCtl *pCbCtl, // decoder output circular buffer control
474 Int8 cbIdx // decoder output circular buffer index
475 )
476 {
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]);
489 // Invalidate circular buffer configuration
490 Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
491 Cache_wait();
493 //Log_info1("cbReadStop:afCb=0x%04x", (IArg)pCb->afCb); // FL: debug
495 // update flags
496 pCb->readerActiveFlag = 0;
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;
507 }
509 // Read audio frame from circular buffer
510 Int cbReadAf(
511 PAF_AST_DecOpCircBufCtl *pCbCtl, // decoder output circular buffer control
512 Int8 cbIdx, // decoder output circular buffer index
513 PAF_AudioFrame *pAfRd // audio frame into which to read
514 )
515 {
516 IArg key;
517 GateMP_Handle gateHandle;
518 PAF_AST_DecOpCircBuf *pCb;
519 PAF_AudioFrame *pAfCb;
520 PAF_ChannelMask_HD streamMask;
521 Int8 i;
522 Int16 j;
523 Int8 numMetadata = 0;
525 // Get gate handle
526 gateHandle = pCbCtl->gateHandle;
527 // Enter gate
528 key = GateMP_enter(gateHandle);
530 // Get circular buffer base pointer
531 pCb = &((*pCbCtl->pXDecOpCb)[cbIdx]);
533 // (***) FL: revisit
534 // Invalidate circular buffer configuration.
535 Cache_inv(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
536 Cache_wait();
538 //Log_info1("cbReadAf:afCb=0x%04x", (IArg)pCb->afCb); // FL: debug
540 if ((pCb->writerActiveFlag == 1) && (pCb->emptyFlag == 1))
541 {
542 // This shouldn't occur:
543 // writer is active AND draining circular buffer
544 //Log_info2("cbReadAf: ERROR: writerActiveFlag=%d, emptyFlag=%d", pCb->writerActiveFlag, pCb->emptyFlag); // FL: debug
545 SW_BREAKPOINT; // FL: debug
547 // Leave the gate
548 GateMP_leave(gateHandle, key);
550 return ASP_DECOP_CB_READ_INVSTATE;
551 }
553 if ((pCb->writerActiveFlag == 0) && (pCb->emptyFlag == 0))
554 {
555 //
556 // No active writer, not draining circular buffer.
557 // Skip UNDerflow check, mute output.
558 //
559 //cbReadAfMute(pAfRd, pCb->strFrameLen);
560 cbReadMuteWithLastAfInfo(pCb, pAfRd);
562 // Leave the gate
563 GateMP_leave(gateHandle, key);
565 return ASP_DECOP_CB_SOK;
566 }
568 // (writerActiveFlag,emptyFlag)=(1,0) and (0,1) are left
569 // Here we are checking (1,0) state here
570 if ((pCb->writerActiveFlag == 1))
571 {
572 // check underflow
573 if (pCb->numAfCb <= 0)
574 {
575 //
576 // Increment underflow count.
577 // Mute output on underflow.
578 //
579 pCb->errUndCnt++;
580 //cbReadAfMute(pAfRd, pCb->strFrameLen);
581 cbReadMuteWithLastAfInfo(pCb, pAfRd);
582 //SW_BREAKPOINT; // FL: debug
584 // Write back circular buffer configuration.
585 Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
586 Cache_wait();
588 // Leave the gate
589 GateMP_leave(gateHandle, key);
591 return ASP_DECOP_CB_READ_UNDERFLOW;
592 }
593 }
595 if ((pCb->writerActiveFlag == 1) || (pCb->emptyFlag == 1))
596 {
597 //
598 // Writer active or draining remaining frames in circular buffer.
599 // Get next output audio frame.
600 //
602 // get pointer to current audio frame in circular buffer
603 pAfCb = &pCb->afCb[pCb->afRdIdx];
605 // (***) FL: revisit
606 // Invalidate audio frame
607 Cache_inv(pAfCb, sizeof(PAF_AudioFrame), Cache_Type_ALLD, 0);
608 Cache_inv(pAfCb->data.samsiz, pCb->maxAFChanNum*sizeof(PAF_AudioSize), Cache_Type_ALLD, 0);
609 for (i=0; i<pAfCb->numPrivateMetadata; i++) //QIN // FL: only invalidate numPrivateMetadata
610 {
611 Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0); // FL: only update metadata package size
612 }
613 Cache_wait();
615 // compute stream mask
616 streamMask = pAfRd->fxns->channelMask(pAfRd, pAfCb->channelConfigurationStream);
618 // Invalidate PCM data
619 for (i = 0; i < pCb->maxAFChanNum; i++)
620 {
621 if ((streamMask >> i) & 0x1)
622 {
623 Cache_inv(&pAfCb->data.sample[i][pCb->pcmRdIdx], pCb->strFrameLen*sizeof(PAF_AudioData), Cache_Type_ALLD, 0);
624 }
625 }
626 Cache_wait();
628 // read audio frame information updated by decoder
629 pAfRd->sampleDecode = pAfCb->sampleDecode;
630 PAF_PROCESS_COPY(pAfRd->sampleProcess, pAfCb->sampleProcess);
631 pAfRd->sampleRate = pAfCb->sampleRate;
632 pAfRd->sampleCount = pCb->strFrameLen;
633 pAfRd->channelConfigurationRequest = pAfCb->channelConfigurationRequest;
634 pAfRd->channelConfigurationStream = pAfCb->channelConfigurationStream;
636 // read metadata information updated by decoder //QIN
637 pAfRd->bsMetadata_type = pAfCb->bsMetadata_type; /* non zero if metadata is attached. */
638 pAfRd->pafBsMetadataUpdate = pAfCb->pafBsMetadataUpdate; /* indicates whether bit-stream metadata update */
639 pAfRd->numPrivateMetadata = pAfCb->numPrivateMetadata; /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
640 pAfRd->bsMetadata_offset = pAfCb->bsMetadata_offset; /* offset into audio frame for change in bsMetadata_type field */
642 // update Last Cb info as per actual stream
643 pCb->lastAf.sampleCount = pCb->strFrameLen;
644 pCb->lastAf.sampleRate = pAfCb->sampleRate;
646 // read PCM samples
647 for (i = 0; i < pCb->maxAFChanNum; i++)
648 {
649 if ((streamMask >> i) & 0x1)
650 {
651 for (j = 0; j < pCb->strFrameLen; j++)
652 {
653 pAfRd->data.sample[i][j] = pAfCb->data.sample[i][pCb->pcmRdIdx+j];
654 }
656 pAfRd->data.samsiz[i] = pAfCb->data.samsiz[i];
657 }
658 }
660 for (i = 0; i < PAF_MAX_NUM_PRIVATE_MD; i++)
661 {
662 pAfRd->pafPrivateMetadata[i].offset = 0;
663 pAfRd->pafPrivateMetadata[i].size = 0;
664 }
666 // read metadata //QIN
667 for (i = 0; i < pAfCb->numPrivateMetadata; i++) // FL: only read numPrivateMetadata
668 {
669 // FL: this is done above
670 ////Invalidate metadata data
671 //Cache_inv(&pAfCb->pafPrivateMetadata[i], sizeof(PAF_PrivateMetadata), Cache_Type_ALLD, 0);
672 //Cache_wait();
674 if ((pAfCb->pafPrivateMetadata[i].offset >= pCb->pcmRdIdx)
675 &&(pAfCb->pafPrivateMetadata[i].offset < (pCb->pcmRdIdx + pCb->strFrameLen))
676 &&(pAfCb->pafPrivateMetadata[i].size))
677 {
678 // FL: this is done above
679 ////Invalidate metadata data
680 //Cache_inv(pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size, Cache_Type_ALLD, 0);
681 //Cache_wait();
683 // the offset is adjusted for segment [pCb->pcmRdIdx, (pCb->pcmRdIdx + pCb->pafFrameLen)]
684 pAfRd->pafPrivateMetadata[numMetadata].offset = pAfCb->pafPrivateMetadata[i].offset - pCb->pcmRdIdx;
685 pAfRd->pafPrivateMetadata[numMetadata].size = pAfCb->pafPrivateMetadata[i].size;
686 memcpy(pAfRd->pafPrivateMetadata[numMetadata].pMdBuf, pAfCb->pafPrivateMetadata[i].pMdBuf, pAfCb->pafPrivateMetadata[i].size);
687 numMetadata++; //number of metadata associated with current 256 segment of audio samples
688 }
689 else //reset un-used buf
690 {
691 pAfRd->pafPrivateMetadata[i].offset = 0;
692 pAfRd->pafPrivateMetadata[i].size = 0;
693 }
695 }
696 pAfRd->numPrivateMetadata = numMetadata; //number of metadata associated with current 256 segment of audio samples
698 pCb->pcmRdIdx += pCb->strFrameLen; // update PCM read index
699 if (pCb->pcmRdIdx >= pAfCb->sampleCount)
700 {
701 // update audio frame read index
702 pCb->afRdIdx++;
703 if (pCb->afRdIdx >= pCb->maxNumAfCb)
704 {
705 pCb->afRdIdx = 0;
706 }
708 // update PCM read index
709 pCb->pcmRdIdx = 0;
711 // update number of audio frames in circular buffer
712 pCb->numAfCb--;
713 }
714 memcpy (&pCb->lastAf, pAfRd, sizeof(PAF_AudioFrame));
715 }
717 if (pCb->emptyFlag == 1)
718 {
719 //
720 // Writer inactive, but remaining frames in circular buffer.
721 // Update empty flag.
722 //
723 if (pCb->numAfCb <= 0)
724 {
725 pCb->emptyFlag = 0;
726 }
727 }
729 // (***) FL: revisit
730 // Write back circular buffer configuration.
731 // NOTE: Probably only a subset of this information needs to be updated.
732 Cache_wb(pCb, sizeof(PAF_AST_DecOpCircBuf), Cache_Type_ALLD, 0);
733 Cache_wait();
735 // Leave the gate
736 GateMP_leave(gateHandle, key);
738 return ASP_DECOP_CB_SOK;
739 }
741 // Generate mute AF on circular buffer read
742 static Void cbReadAfMute(
743 PAF_AudioFrame *pAfRd, // audio frame into which to read
744 Int16 strFrameLen // stream frame length (output transaction size)
745 )
746 {
747 PAF_ChannelMask_HD streamMask;
748 Int8 i;
750 pAfRd->sampleDecode = PAF_SOURCE_PCM;
751 PAF_PROCESS_ZERO(pAfRd->sampleProcess);
752 pAfRd->sampleRate = PAF_SAMPLERATE_48000HZ;
753 pAfRd->sampleCount = strFrameLen;
754 pAfRd->channelConfigurationRequest.full = 0;
755 pAfRd->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
756 pAfRd->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
757 pAfRd->channelConfigurationStream.full = 0;
758 pAfRd->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
759 pAfRd->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
761 // compute stream mask
762 streamMask = pAfRd->fxns->channelMask(pAfRd, pAfRd->channelConfigurationStream);
763 // Clear PCM data
764 for (i = 0; i < ASP_DECOP_CB_MAX_NUM_PCM_CH; i++)
765 {
766 if ((streamMask >> i) & 0x1)
767 {
768 memset(pAfRd->data.sample[i], 0, strFrameLen*sizeof(PAF_AudioData));
769 }
770 pAfRd->data.samsiz[i] = 0;
771 }
772 // write metadata information updated by decoder
773 pAfRd->bsMetadata_type = PAF_bsMetadata_channelData; /* non zero if metadata is attached. */
774 pAfRd->pafBsMetadataUpdate = 0; /* indicates whether bit-stream metadata update */
775 pAfRd->numPrivateMetadata = 0; /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
776 pAfRd->bsMetadata_offset = 0; /* offset into audio frame for change in bsMetadata_type field */
777 }
778 // Init last audio frame configuration info
779 static Void cbInitLastAfInfo(
780 PAF_AudioFrame *pAfRd // last audio frame stored in CB instance
781 )
782 {
783 pAfRd->sampleDecode = PAF_SOURCE_PCM;
784 PAF_PROCESS_ZERO(pAfRd->sampleProcess);
785 pAfRd->sampleRate = PAF_SAMPLERATE_48000HZ;
786 pAfRd->sampleCount = DEF_DEC_OP_FRAME_LEN;
787 pAfRd->channelConfigurationRequest.full = 0;
788 pAfRd->channelConfigurationRequest.part.sat = PAF_CC_SAT_SURROUND4;
789 pAfRd->channelConfigurationRequest.part.sub = PAF_CC_SUB_ONE;
790 pAfRd->channelConfigurationStream.full = 0;
791 pAfRd->channelConfigurationStream.part.sat = PAF_CC_SAT_SURROUND4;
792 pAfRd->channelConfigurationStream.part.sub = PAF_CC_SUB_ONE;
794 pAfRd->bsMetadata_type = PAF_bsMetadata_none; /* non zero if metadata is attached. */
795 pAfRd->pafBsMetadataUpdate = 0; /* indicates whether bit-stream metadata update */
796 pAfRd->numPrivateMetadata = 0; /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
797 pAfRd->bsMetadata_offset = 0; /* offset into audio frame for change in bsMetadata_type field */
798 }
800 // Generate mute AF on circular buffer read using the last AF configuration info
801 static Void cbReadMuteWithLastAfInfo (
802 PAF_AST_DecOpCircBuf *pCb, // decoder output circular buffer control
803 PAF_AudioFrame *pAfRd // audio frame into which to read
804 )
805 {
806 PAF_ChannelMask_HD streamMask;
807 Int8 i;
809 pAfRd->sampleDecode = pCb->lastAf.sampleDecode;
810 PAF_PROCESS_ZERO(pAfRd->sampleProcess);
811 pAfRd->sampleRate = pCb->lastAf.sampleRate;
812 pAfRd->sampleCount = pCb->strFrameLen;
813 pAfRd->channelConfigurationRequest.full = pCb->lastAf.channelConfigurationRequest.full;
814 pAfRd->channelConfigurationRequest.part.sat = pCb->lastAf.channelConfigurationRequest.part.sat;
815 pAfRd->channelConfigurationRequest.part.sub = pCb->lastAf.channelConfigurationRequest.part.sub;
816 pAfRd->channelConfigurationStream.full = pCb->lastAf.channelConfigurationStream.full;
817 pAfRd->channelConfigurationStream.part.sat = pCb->lastAf.channelConfigurationStream.part.sat;
818 pAfRd->channelConfigurationStream.part.sub = pCb->lastAf.channelConfigurationStream.part.sub;
820 // compute stream mask
821 streamMask = pAfRd->fxns->channelMask(pAfRd, pAfRd->channelConfigurationStream);
822 // Clear PCM data
823 for (i = 0; i < ASP_DECOP_CB_MAX_NUM_PCM_CH; i++)
824 {
825 if ((streamMask >> i) & 0x1)
826 {
827 memset(pAfRd->data.sample[i], 0, pAfRd->sampleCount*sizeof(PAF_AudioData));
828 }
829 pAfRd->data.samsiz[i] = 0;
830 }
831 pAfRd->bsMetadata_type = PAF_bsMetadata_none; /* non zero if metadata is attached. */
832 pAfRd->pafBsMetadataUpdate = 0; /* indicates whether bit-stream metadata update */
833 pAfRd->numPrivateMetadata = 0; /* number of valid private metadata (0 or 1 if metadata filtering enabled) */
834 pAfRd->bsMetadata_offset = 0; /* offset into audio frame for change in bsMetadata_type field */
835 }