PASDK-71:Add PFP component to ARM & DSP.
[processor-sdk/performance-audio-sr.git] / pasdk / test_arm / framework / audioStreamDecodeProc.c
2 /*
3 Copyright (c) 2017, 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 /*
37  *  ======== audioStreamDecodeProc.c ========
38  */
40 #include <xdc/cfg/global.h>
41 #include <xdc/runtime/Error.h>
42 #include <xdc/runtime/Log.h>
43 #include <xdc/runtime/Memory.h>
44 #include <ti/sysbios/BIOS.h>
45 #include <ti/sysbios/hal/Cache.h>
46 #include <ti/sysbios/knl/Task.h>
47 #include <ti/ipc/Ipc.h>
48 #include <ti/ipc/MessageQ.h>
49 #include <ti/ipc/MultiProc.h>
51 #include <acp_mds.h>
52 #include <pcm.h>
53 #include "audioStreamProc_params.h"
54 #include "audioStreamProc_patchs.h"
55 #include "audioStreamProc_config.h"
57 #include "common.h"
58 #include "aspMsg_common.h"
59 #include "aspMsg_slave.h"
60 #include "aspDecOpCircBuf_slave.h"
61 #include "audioStreamProc_common.h"
62 #include "audioStreamDecodeProc.h"
63 #include "statusOp_common.h"
65 #include "pfp/pfp.h"
66 #include "pfp_app.h"        /* contains all PFP ID's */
68 // FL: debug
69 #include "dbgCapAf.h"
70 #include "dbgDib.h"
71 #include "evmc66x_gpio_dbg.h"
73 //
74 // Decoder Definitions
75 //
76 #define decLinkInit pQ->i_decLinkInit
78 #define __TASK_NAME__  "TaskAsdp"
80 extern struct {
81     Int size;
82     IALG_Status *pStatus[512];
83 } IACP_STD_BETA_TABLE;
85 extern const char AFChanPtrMap[PAF_MAXNUMCHAN+1][PAF_MAXNUMCHAN];
86 extern PAF_ChannelConfigurationMaskTable PAF_ASP_stdCCMT;
88 LINNO_DEFN(TaskAsdp); /* Line number macros */
89 ERRNO_DEFN(TaskAsdp); /* Error number macros */
91 // ASDT configuration
92 PAF_ASDT_Config gPAF_ASDT_config 
93 __attribute__ ((section(".globalSectionPafAsdtConfig"))) = {
94     NULL,               // acp
95     {NULL, NULL},       // decOpCircBufCtl
96     &gPAF_AST_config    // ASIT/ASOT/ASDT shared configuration
97 };
99 PAF_AudioFrame *gpDecAudioFrame=NULL;
100 PAF_AudioData  *gDecAudioFrameChannelPointers[PAF_MAXNUMCHAN_AF];
101 PAF_AudioSize  gDecAudioFrameChannelSizes[PAF_MAXNUMCHAN_AF];
102 PAF_AudioData  *gDecOrigAudioFrameChannelPointers[PAF_MAXNUMCHAN_AF];
104 // Overflow threshold before circular buffer reset and return error to Top-Level FSM
105 #define DEC_OP_CB_WRTAF_OVR_THR  ( 20 ) // FL: arbitrary setting
106 UInt32 gCbWrtAfErrCnt           =0; // decoder output circular buffer write error count, not including overflows
107 UInt32 gDecOpCbWrtAfOvr         =0; // decoder output circular buffer overflow count
108 UInt32 gMaxDecOpCbWrtAfOvr      =0; // max (consecutive) decoder output circular buffer overflow count
110 // Global debug counters */
111 UInt32 gSlaveStartErrCnt        =0;
112 UInt32 gSlaveStartCnt           =0;
113 UInt32 gSlaveSourceSelectCnt    =0;
114 UInt32 gSlaveExitCnt            =0;
115 UInt32 gSlaveDecExitCnt         =0;
116 UInt32 gSlaveDecControlCnt      =0;
117 UInt32 gSlaveDecActivateCnt     =0;
118 UInt32 gSlaveDecResetCnt        =0;
119 UInt32 gSlaveDecInfoCnt         =0;
120 UInt32 gSlaveDecDecodeCnt       =0;
121 UInt32 gSlaveDecDeactivateCnt   =0;
124 /*
125  *  ======== taskAsdpFxn ========
126  *  Audio Stream Decode Processing task function
127  */
128 Void taskAsdpFxn(
129 //    Int betaPrimeValue, // FL: revisit
130     const PAF_ASDT_Params *pP,
131     const PAF_ASDT_Patchs *pQ
134     PAF_ASDT_Config *pC;            /* Local configuration pointer */
135     PAF_AST_Config *pAstCfg;        /* Common (shared) configuration pointer */
136     Int as;                         /* Audio Stream Number (1, 2, etc.) */
137     Int z;                          /* input/encode/stream/decode/output counter */
138     Int i;                          /* phase */
139     Int zMD, zMS;
140     Bool done;
141     Bool decDone;
142     ALG_Handle alg[DECODEN_MAX];
143     ASP_Slave_Cmd slaveCmd;
144     Int sourceSelect;
145     DEC_Handle dec;
146     IALG_Cmd decCtrlCmd;            // decoder control command
147     Int decCtrlRet;                 // decoder control return
148     Int errno;                      /* error number */
149     Int size;
150     Int argIdx;
151     // Decoder output circular buffer
152     PAF_AST_DecOpCircBufCtl *pCbCtl;    /* Decoder output circular buffer control */
153     //PAF_AST_DecOpCircBuf *pCb;
154     PAF_AudioFrame *pAfWrt;
155     Int cbErrno;    
156     // Messaging
157     PAF_InpBufConfig *pIpBufConfig;
158     ASP_Msg *pAspMsg;
159     MessageQ_QueueId queId;
160     Int status;
161     Int zI;
162     Int bufEnd, wrapSize, currentBufSize, chunkSize;
163     Int8 temp8;
164     Task_Handle asdtHandle; // For PFP
166     Log_info0("Enter taskAsdpFxn()");
167     
168     asdtHandle = Task_self(); // get task handle for PFP
169     
170     //
171     // Audio Framework Parameters & Patch (*pP, *pQ):
172     //
173     if (!pP) 
174     {
175         TRACE_TERSE0("TaskAsdp: No Parameters defined. Exiting.");
176         LINNO_RPRT(TaskAsdp, -1);
177         return;
178     }
180     if (!pQ) 
181     {
182         TRACE_TERSE0("TaskAsdp: No Patchs defined. Exiting.");
183         LINNO_RPRT(TaskAsdp, -1);
184         return;
185     }    
187     //
188     // Audio Framework Configuration (*pC):
189     //
190     pC = &gPAF_ASDT_config;
191     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration 
192     pCbCtl = &pC->decOpCircBufCtl; // get pointer to circular buffer control
194     // wait for initialization message from master
195     do {
196         status = MessageQ_get(hAspMsgSlave->slaveQue, (MessageQ_Msg *)&pAspMsg, MessageQ_FOREVER);
197         //TRACE_TERSE1("Rx ASP message: status=%d", status);
198     //} while ((status != MessageQ_S_SUCCESS || (pAspMsg->cmd != ASP_SLAVE_START));
199     } while (status != MessageQ_S_SUCCESS);
200     if ((pAspMsg->procId != hAspMsgSlave->masterProcId) ||
201         (pAspMsg->cmd != ASP_SLAVE_START))
202     {
203         TRACE_TERSE3("ERROR: Rx ASP message: procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
204         SW_BREAKPOINT;
205     }
206     hAspMsgSlave->masterMessageId = pAspMsg->messageId; 
207     gSlaveStartCnt++;
208     TRACE_MSG3("Rx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
210     // invalidate AST shared configuration
211     Cache_inv(pAstCfg, sizeof(PAF_AST_Config), Cache_Type_ALLD, 0);
212     // FL: no need to share this pointer, can be local
213     //Cache_inv(&pC, sizeof(PAF_AST_Config *), Cache_Type_ALLD, 0);
214     Cache_wait();
215     
216     // (***) FL: revisit
217     // invalidate Dec configuration for all Decoder zones
218     Cache_inv(&pAstCfg->xDec[0], DECODEN*sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
219     Cache_wait();
221     // (***) FL: revisit
222     // invalidate Beta Table status pointers
223     Cache_inv((Ptr)(&IACP_STD_BETA_TABLE.pStatus[0]), 512*sizeof(IALG_Status *), Cache_Type_ALLD, 0); // invalidate entire beta table
224     Cache_wait();
226     /* Obtain Audio Stream Number (1, 2, etc.) */
227     as = pAstCfg->as;
228     TRACE_TERSE1("TaskAsdp: Started with AS%d.", as);
229     
230     //
231     // Initialize message log trace and line number reporting
232     //
233     for (z=STREAM1; z < STREAMN; z++)
234     {
235         TRACE_TERSE1("TaskAsdp: AS%d: initiated", as+z);
236     }
237     LINNO_RPRT(TaskAsdp, -1);
239     // Get decoder and stream index associated with the master input
240     zMD = pAstCfg->masterDec;
241     zMS = pAstCfg->masterStr;
243     // 
244     // Initialize per parameterized phases.
245     //   - Malloc: Memory Allocation
246     //   - Config: Configuration Initialization
247     //   - AcpAlg: ACP Algorithm Initialization and Local Attachment
248     //   - Common: Common Algorithm Initialization
249     //   - AlgKey: Dec/Enc chain to Array Initialization
250     //   - Unused: (available)
251     //   - Unused: (available)
252     //   - Unused: (available)
253     //
254     LINNO_RPRT(TaskAsdp, -2);
255     for (i=0; i < lengthof(pP->fxns->initPhase); i++)
256     {
257         Int linno;
258         if (pP->fxns->initPhase[i])
259         {
260             if ((linno = pP->fxns->initPhase[i](pP, pQ, pC)))
261             {
262                 LINNO_RPRT(TaskAsdp, linno);
263                 return;
264             }
265         }
266         else 
267         {
268             TRACE_TERSE1("TaskAsdp: AS%d: initialization phase - null", as+zMS);
269         }
270         TRACE_TERSE2("TaskAsdp: AS%d: initialization phase - %d completed", as+zMS, i);
271         LINNO_RPRT(TaskAsdp, -i-3);
272     }
273     
274     //
275     // End of Initialization -- final memory usage report.
276     //
277     if (pP->fxns->memStatusPrint)
278     {
279         pP->fxns->memStatusPrint(HEAP_INTERNAL, HEAP_INTERNAL1, HEAP_EXTERNAL, HEAP_INTERNAL1_SHM);
280     }
281     
282 #ifdef NON_CACHE_STATUS
283     //
284     // init Status structure Gate
285     //
286     if (statusOp_Init(GATEMP_INDEX_DEC) == STATUSOP_INIT_FAIL)
287     {
288         TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_DEC);
289     }
290     if (statusOp_Init(GATEMP_INDEX_DDP) == STATUSOP_INIT_FAIL)
291     {
292         TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_DDP);
293     }
294     if (statusOp_Init(GATEMP_INDEX_PCM) == STATUSOP_INIT_FAIL)
295     {
296         TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_PCM);
297     }
298     if (statusOp_Init(GATEMP_INDEX_THD) == STATUSOP_INIT_FAIL)
299     {
300         TRACE_TERSE1("TaskAsdp: Gate Index %d:initialization status GateMP Fail.", GATEMP_INDEX_THD);
301     }
302 #endif
304     // (***) FL: revisit
305     // write back Status structure addresses for Beta Units initialized on Slave
306     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
307     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
308     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM2]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
309     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
310     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP2]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
311     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_THD]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
312     Cache_wb((Ptr)(&IACP_STD_BETA_TABLE.pStatus[STD_BETA_THD2]), sizeof(IALG_Status *), Cache_Type_ALLD, 0);
313     Cache_wait();
314     
315     // (***) FL: revisit
316     // write back Status structures for Beta Units initialized on Slave
317    /* size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
318     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
319     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
320     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
321     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM2]->size;
322     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM2]), size, Cache_Type_ALLD, 0);
323     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]->size;
324     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
325     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP2]->size;
326     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP2]), size, Cache_Type_ALLD, 0);
327     Cache_wait();
329     // (***) FL: revisit
330     // write back Dec configuration
331     Cache_wbInv(&pAstCfg->xDec[0], DECODEN*sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
332     Cache_wait();*/
333     
334     // Send initialization complete message to master
335     queId = MessageQ_getReplyQueue(pAspMsg);
336     pAspMsg->procId = hAspMsgSlave->slaveProcId;
337     pAspMsg->cmd = ASP_MASTER_START_DONE;
338     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
339     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
340     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
341     if (status != MessageQ_S_SUCCESS)
342     {
343         SW_BREAKPOINT;
344     }
346     done = FALSE;
347     while (done==FALSE)
348     {
349         // wait for source select message from master
350         do {
351             status = MessageQ_get(hAspMsgSlave->slaveQue, (MessageQ_Msg *)&pAspMsg, MessageQ_FOREVER);
352         } while ((status < 0) || (pAspMsg->cmd != ASP_SLAVE_DEC_SOURCE_SELECT));
353         if ((pAspMsg->procId != hAspMsgSlave->masterProcId) ||
354             (pAspMsg->cmd != ASP_SLAVE_DEC_SOURCE_SELECT))
355         {
356             TRACE_TERSE3("ERROR: Rx ASP message: procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
357             SW_BREAKPOINT;
358         }            
359         hAspMsgSlave->masterMessageId = pAspMsg->messageId; 
360         sourceSelect = *(Int32 *)&pAspMsg->buf[0];
361         TRACE_MSG3("Rx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
362         TRACE_MSG1("sourceSelect=%d.", sourceSelect);
363         // send source select complete message to master
364         queId = MessageQ_getReplyQueue(pAspMsg);
365         pAspMsg->procId = hAspMsgSlave->slaveProcId;
366         pAspMsg->cmd = ASP_MASTER_DEC_SOURCE_SELECT_DONE;
367         pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
368         gSlaveSourceSelectCnt++;
369         TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
370         MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
371         
372         for (z=DECODE1; z < DECODEN; z++)
373         {
374             alg[z] = pAstCfg->xDec[z].decAlg[PAF_SOURCE_PCM];
375         }
376         alg[zMD] = pAstCfg->xDec[zMD].decAlg[sourceSelect];
378         // FL: debug, reset IB capture buffer
379         //capIbReset();
380         //Log_info0("capIbReset()");
381         // FL: debug, reset audio frame capture buffer
382         //capAfReset();
383         
384         decDone = FALSE;
385         while (decDone==FALSE)
386         {
387             // wait for received message from master
388             do {
389                 status = MessageQ_get(hAspMsgSlave->slaveQue, (MessageQ_Msg *)&pAspMsg, MessageQ_FOREVER);
390             } while (status < 0);
391             if (pAspMsg->procId != hAspMsgSlave->masterProcId)
392             {
393                 TRACE_TERSE3("ERROR: Rx ASP message: procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
394                 SW_BREAKPOINT;
395             }
396             hAspMsgSlave->masterMessageId = pAspMsg->messageId; 
397             slaveCmd = pAspMsg->cmd;
398             TRACE_MSG3("Rx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
400             switch (slaveCmd)
401             {
402                 case ASP_SLAVE_NULL:
403                 case ASP_SLAVE_START:
404                     gSlaveStartErrCnt++;
405                     TRACE_TERSE1("ERROR: unexpected slaveCmd=%d", slaveCmd);
406                     
407                     break;
408                     
409                 case ASP_SLAVE_EXIT:
410                     gSlaveExitCnt++;
411                     TRACE_TERSE1("slaveCmd=%d", slaveCmd);
412                     
413                     decDone = TRUE;
414                     done = TRUE;
415                     break;
416                     
417                 case ASP_SLAVE_DEC_EXIT:
418                     gSlaveDecExitCnt++;
419                     TRACE_TERSE1("slaveCmd=%d", slaveCmd);
420                     
421                     // send dec exit complete message to master
422                     queId = MessageQ_getReplyQueue(pAspMsg);
423                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
424                     pAspMsg->cmd = ASP_MASTER_DEC_EXIT_DONE;
425                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
426                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
427                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
428                     if (status != MessageQ_S_SUCCESS)
429                     {
430                         SW_BREAKPOINT;
431                     }
432                     
433                     decDone=TRUE;
434                     break;
435                     
436                 case ASP_SLAVE_DEC_CONTROL:
437                     gSlaveDecControlCnt++;
438                     // simulate dec control load
439                     //simLoad(DEC_CONTROL_LOAD);
440                     
441                     argIdx = 0; // get decIdx
442                     z = *(Int32 *)&pAspMsg->buf[argIdx];
443                     argIdx += sizeof(Int32);
444                     decCtrlCmd = *(IALG_Cmd *)&pAspMsg->buf[argIdx]; // get decCtrlCmd
445                     TRACE_MSG3("slaveCmd=%d, decIdx=%d, decCtrlCmd=%d", slaveCmd, z, decCtrlCmd);
446                     
447                     decCtrlRet = alg[z]->fxns->algControl(alg[z], decCtrlCmd, NULL);
449                     // send dec control complete message to master
450                     queId = MessageQ_getReplyQueue(pAspMsg);
451                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
452                     pAspMsg->cmd = ASP_MASTER_DEC_CONTROL_DONE;
453                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
454                     argIdx = 0; // set decCtrlRet
455                     *(Int32 *)&pAspMsg->buf[argIdx] = decCtrlRet;
456                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
457                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
458                     if (status != MessageQ_S_SUCCESS)
459                     {
460                         SW_BREAKPOINT;
461                     }
463                     break;
464                     
465                 case ASP_SLAVE_DEC_ACTIVATE:
466                     gSlaveDecActivateCnt++;
467                     // simulate dec activate load
468                     //simLoad(DEC_ACTIVATE_LOAD);
469                     
470                     // (***) FL: revisit
471                     // invalidate Status structures for shared Beta Units
472                     //size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
473                     //Cache_inv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
474                     /*size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
475                     Cache_inv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
476                     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]->size;
477                     Cache_inv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
478                     Cache_wait();*/
479                     
480                     argIdx = 0; // get decIdx
481                     z = *(Int32 *)&pAspMsg->buf[argIdx];
482                     TRACE_MSG2("slaveCmd=%d, decIdx=%d", slaveCmd, z);
483                     
484                     // invalidate Dec configuration
485                     Cache_inv(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
486                     Cache_wait();
487                     
488                     if (alg[z]->fxns->algActivate)
489                     {
490                         alg[z]->fxns->algActivate(alg[z]);
491                     }
493                     // Start writes to circular buffer
494                     //pCb = &pAstCfg->xDecOpCb[z];
495                     cbErrno = cbWriteStart(pCbCtl, z);
496                     if (cbErrno < 0)
497                     {
498                         SW_BREAKPOINT;
499                     }
500                     gCbWrtAfErrCnt=0;       // reset write circular buffer error count
501                     gDecOpCbWrtAfOvr=0;     // reset decoder output circular buffer overflow count
502                     gMaxDecOpCbWrtAfOvr=0;  // reset max decoder output circular buffer overflow count
503                     // FL: debug, log circular buffer control variables
504                     cbLog(pCbCtl, z, 1, "cbWriteStart");
505                     // Reset audio frame
506                     resetAf(pP, z, sourceSelect);
507                     
508                     // send dec activate complete message to master
509                     queId = MessageQ_getReplyQueue(pAspMsg);
510                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
511                     pAspMsg->cmd = ASP_MASTER_DEC_ACTIVATE_DONE;
512                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
513                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
514                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
515                     if (status != MessageQ_S_SUCCESS)
516                     {
517                         SW_BREAKPOINT;
518                     }
519                    
520                     break;
521                     
522                 case ASP_SLAVE_DEC_RESET:
523                     gSlaveDecResetCnt++;
524                     // simulate dec reset load
525                     //simLoad(DEC_RESET_LOAD);
526                     
527                     argIdx = 0; // get decIdx
528                     z = *(Int32 *)&pAspMsg->buf[argIdx];
529                     TRACE_TERSE2("slaveCmd=%d,decIdx=%d", slaveCmd, z);
530                     
531                     dec = (DEC_Handle)alg[z];
532                     errno = 0;
533                     if (dec->fxns->reset)
534                     {
535                         errno = dec->fxns->reset(dec, NULL, &pAstCfg->xDec[z].decodeControl, &pAstCfg->xDec[z].decodeStatus);
536                     }
538                     // write back Dec configuration
539                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
540                     Cache_wait();            
542                     // (***) FL: revisit
543                     // write back Status structures for shared Beta Units
544                     //size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
545                     //Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
546                    /* size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
547                     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
548                     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]->size;
549                     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
550                     Cache_wait();*/
551                     
552                     // send dec reset complete message to master
553                     queId = MessageQ_getReplyQueue(pAspMsg);
554                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
555                     pAspMsg->cmd = ASP_MASTER_DEC_RESET_DONE;
556                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
557                     argIdx = 0; // set decErrno
558                     *(Int32 *)&pAspMsg->buf[argIdx] = errno;
559                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
560                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
561                     if (status != MessageQ_S_SUCCESS)
562                     {
563                         SW_BREAKPOINT;
564                     }
566                     break;
567                     
568                 case ASP_SLAVE_DEC_INFO:
569                     gSlaveDecInfoCnt++;
570                     // simulate dec info load
571                     //simLoad(DEC_INFO_LOAD);
572                     
573                     argIdx = 0; // get decIdx
574                     z = *(Int32 *)&pAspMsg->buf[argIdx];
575                     TRACE_TERSE2("slaveCmd=%d,decIdx=%d", slaveCmd, z);
576                     // Get input associated w/ decoder
577                     zI = pP->inputsFromDecodes[z];
579                     // (***) FL: revisit
580                     // invalidate Inp configuration
581                     Cache_inv(&pAstCfg->xInp[zI], sizeof(PAF_AST_InpBuf), Cache_Type_ALLD, 0);
582                     Cache_wait();
583                     // invalidate input data
584                     pIpBufConfig = &pAstCfg->xInp[zI].inpBufConfig;
585                     size = pIpBufConfig->frameLength * pIpBufConfig->sizeofElement;
586                     if (sourceSelect == PAF_SOURCE_PCM)
587                     {
588                         size *= pIpBufConfig->stride;
589                     }
591                     bufEnd = (Int) pIpBufConfig->base.pVoid + pIpBufConfig->sizeofBuffer;
592                     currentBufSize = (bufEnd - (Int)pIpBufConfig->pntr.pSmInt);
593                     if (currentBufSize >= size)
594                     {
595                         chunkSize = size;
596                     }
597                     else
598                     {
599                         chunkSize = currentBufSize;
600                     }
601                     wrapSize = size - chunkSize;
602                     // invalidate input data
603                     Cache_inv((Ptr)pIpBufConfig->pntr.pSmInt, chunkSize, Cache_Type_ALLD, 0);
604                     // invalidate Dec configuration
605                     TRACE_MSG2("IBUF : pIpBufConfig->pntr.pSmInt: 0x%x and chunkSize: %d", (IArg)pIpBufConfig->pntr.pSmInt, chunkSize);
606                     Cache_inv(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
607                     // status for selected decoder should be invalidated
608                     Cache_wait();
610                     /* Circular buffer wrap condition*/
611                     //if(((Int) pIpBufConfig->head.pVoid + size)  > bufEnd)
612                     if(wrapSize > 0)
613                     {
614                         // invalidate input data
615                         Cache_inv((Ptr)pIpBufConfig->base.pSmInt, wrapSize, Cache_Type_ALLD, 0);
616                         TRACE_MSG2("IBUF : pIpBufConfig->base.pSmInt: 0x%x and wrapSize: %d", (IArg)pIpBufConfig->base.pSmInt, wrapSize);
617                         // status for selected decoder should be invalidated
618                         Cache_wait();
619                     }
620                     /* Circular buffer wrap condition */
622                     dec = (DEC_Handle)alg[z];
623                     errno = 0;
624                     if (dec->fxns->info)
625                     {
626                         pfpBegin(PFP_ID_TASK0_1, asdtHandle);
627                         errno = dec->fxns->info(dec, NULL, &pAstCfg->xDec[z].decodeControl, &pAstCfg->xDec[z].decodeStatus);
628                         pfpEnd(PFP_ID_TASK0_1, PFP_FINISH_MEAS);
629                     }
630                     
631                     // write back Dec configuration
632                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
633                     Cache_wait();            
634                     
635 #ifdef NON_CACHE_STATUS
636                     statusOp_read(&(temp8),
637                                   &(pAstCfg->xDec[z].decodeStatus.mode),
638                                   sizeof(Int8),
639                                   GATEMP_INDEX_DEC);
640                     // Re-initialize audio frame if decoder is disabled or
641                     // doesn't have a valid input
642                     if (!temp8 || !pAstCfg->xInp[zI].hRxSio)
643                     {
644                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
645                     }
646 #else
647                     // Re-initialize audio frame if decoder is disabled or
648                     // doesn't have a valid input
649                     if (!pAstCfg->xDec[z].decodeStatus.mode || !pAstCfg->xInp[zI].hRxSio)
650                     {
651                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
652                     }
653 #endif
655                     // send dec info complete message to master
656                     queId = MessageQ_getReplyQueue(pAspMsg);
657                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
658                     pAspMsg->cmd = ASP_MASTER_DEC_INFO_DONE;
659                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
660                     argIdx = 0; // set decErrno
661                     *(Int32 *)&pAspMsg->buf[argIdx] = errno;
662                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
663                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
664                     if (status != MessageQ_S_SUCCESS)
665                     {
666                         SW_BREAKPOINT;
667                     }
668                     
669                     break;
670                     
671                 case ASP_SLAVE_DEC_DECODE:
672                     gSlaveDecDecodeCnt++;
673                     // simulate dec info load
674                     //simLoad(DEC_DECODE_LOAD);
675                     
676                     argIdx = 0; // get decIdx
677                     z = *(Int32 *)&pAspMsg->buf[argIdx];
678                     TRACE_TERSE2("slaveCmd=%d, decIdx=%d", slaveCmd, z);
679                     // Get input associated w/ decoder
680                     zI = pP->inputsFromDecodes[z];
681                     
682                     // Reset AF samsiz
683                     resetAfSamsiz(z);
684                     
685                     // invalidate Dec configuration
686                     Cache_inv(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
687                     Cache_wait();
688                     //TRACE_TERSE0("Dec:cache wb done");
689             
690                     dec = (DEC_Handle)alg[z];
691                     //TRACE_TERSE1("Dec:dec handle=0x%04x", (IArg)dec);
693                     errno = 0;
694                     cbErrno = 0;
695                     if (dec->fxns->decode)
696                     {
697                         // FL: debug, capture input buffer
698                         //capIb(pAstCfg->xInp[z].pInpBuf);
699                     
700                         pfpBegin(PFP_ID_TASK0_2, asdtHandle);
701                         errno = dec->fxns->decode(dec, NULL, &pAstCfg->xDec[z].decodeInStruct, &pAstCfg->xDec[z].decodeOutStruct);
702                         pfpEnd(PFP_ID_TASK0_2, PFP_FINISH_MEAS);
703                         if (errno < 0)
704                         {
705                             //SW_BREAKPOINT;
706                         }
707                         TRACE_TERSE0("Dec:decode done");
708                         
709                         // copy decoder output to decoder output circular buffers
710                         //pCb = &pAstCfg->xDecOpCb[z];
711                         //TRACE_TERSE1("Dec:pCb=0x%04x", (IArg)pCb);
712                         
713                         pAfWrt = pAstCfg->xDec[z].decodeOutStruct.pAudioFrame;
714                         TRACE_TERSE1("Dec:pAfWrt=0x%04x", (IArg)pAfWrt);
715                         //TRACE_TERSE1("nSamples=%d",pAfWrt->data.nSamples);
716                         
717                         // FL: debug, capture audio frame
718                         //if (capAfWrite(pAfWrt, PAF_CNTR) != CAP_AF_SOK)
719                         //{
720                         //    Log_info0("capAfWrite() error");
721                         //}                        
723                         GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_107);
724                         cbErrno = cbWriteAf(pCbCtl, z, pAfWrt);
725                         if ((cbErrno < 0) && (cbErrno != ASP_DECOP_CB_WRITE_OVERFLOW))
726                         {
727                             gCbWrtAfErrCnt++;
728                             //SW_BREAKPOINT; // FL: debug
729                         }
730                         
731                         // Handle overflows
732                         if (cbErrno == ASP_DECOP_CB_WRITE_OVERFLOW)
733                         {
734                             gDecOpCbWrtAfOvr++; // increment circular buffer overflow count
735                             if (gDecOpCbWrtAfOvr >= DEC_OP_CB_WRTAF_OVR_THR)
736                             {
737                                 gMaxDecOpCbWrtAfOvr = DEC_OP_CB_WRTAF_OVR_THR; // update max overflow count
738                                 gDecOpCbWrtAfOvr = 0; // reset overflow count
739                                 
740                                 // Reset circular buffer
741                                 cbReset(pCbCtl, z);
742                             }
743                         }
744                         else if ((cbErrno == ASP_DECOP_CB_SOK) && (gDecOpCbWrtAfOvr > 0))
745                         {
746                             // No overflow detected.
747                             // update max overflow count,
748                             // reset overflow count
749                             
750                             if (gDecOpCbWrtAfOvr > gMaxDecOpCbWrtAfOvr)
751                             {
752                                 gMaxDecOpCbWrtAfOvr = gDecOpCbWrtAfOvr;
753                             }
754                             gDecOpCbWrtAfOvr = 0; // reset circular buffer overflow count
755                             
756                             cbErrno = 0; // don't return error condition
757                         }
758                         GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_107);
759                         TRACE_TERSE0("Dec:cbWriteAf() complete");
760                         
761 #if 0 // (***) FL: shows timing of CB write
762                         // (***) debug // B9
763                         {
764                             static Uint8 toggleState = 0;
765                             if (toggleState == 0)
766                                 GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_107);
767                             else
768                                 GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_107);
769                             toggleState = ~(toggleState);
770                         }
771 #endif        
772                         
773                         // FL: debug, log circular buffer control variables
774                         cbLog(pCbCtl, z, 1, "cbWriteAf");
775                     }
776                     
777                     // write back Dec configuration
778                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
779                     Cache_wait();
780                     
781 #ifdef NON_CACHE_STATUS
782                     statusOp_read(&(temp8),
783                                   &(pAstCfg->xDec[z].decodeStatus.mode),
784                                   sizeof(Int8),
785                                   GATEMP_INDEX_DEC);
786                     // Re-initialize audio frame if decoder is disabled or 
787                     // doesn't have a valid input 
788                     if (!temp8 || !pAstCfg->xInp[zI].hRxSio)
789                     {
790                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
791                     }
792 #else
793                     // Re-initialize audio frame if decoder is disabled or
794                     // doesn't have a valid input
795                     if (!pAstCfg->xDec[z].decodeStatus.mode || !pAstCfg->xInp[zI].hRxSio)
796                     {
797                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
798                     }
799 #endif
800                     // send dec info complete message to master
801                     queId = MessageQ_getReplyQueue(pAspMsg);
802                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
803                     pAspMsg->cmd = ASP_MASTER_DEC_DECODE_DONE;
804                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
805                     argIdx = 0; // set decErrno
806                     *(Int32 *)&pAspMsg->buf[argIdx] = errno;
807                     argIdx += sizeof(Int32); // set cbErrno
808                     *(Int32 *)&pAspMsg->buf[argIdx] = cbErrno;                    
809                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
810                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
811                     if (status != MessageQ_S_SUCCESS)
812                     {
813                         SW_BREAKPOINT;
814                     }
815                     
816                     break;
817                     
818                 case ASP_SLAVE_DEC_DEACTIVATE:
819                     gSlaveDecDeactivateCnt++;
820                     // simulate dec info load
821                     //simLoad(DEC_DEACTIVATE_LOAD);
822                     
823                     argIdx = 0; // get decIdx
824                     z = *(Int32 *)&pAspMsg->buf[argIdx];
825                     TRACE_TERSE2("slaveCmd=%d, decIdx=%d", slaveCmd, z);
826                     
827                     if (alg[z]->fxns->algDeactivate)
828                     {
829                         alg[z]->fxns->algDeactivate(alg[z]);
830                     }
831                     
832                     // Stop writes to circular buffer
833                     //pCb = &pAstCfg->xDecOpCb[z];
834                     cbErrno = cbWriteStop(pCbCtl, z);
835                     if (cbErrno < 0)
836                     {
837                         SW_BREAKPOINT;
838                     }
839                     // FL: debug, log circular buffer control variables
840                     cbLog(pCbCtl, z, 1, "cbWriteStop");
841                     
842                     // send dec deactivate complete message to master
843                     queId = MessageQ_getReplyQueue(pAspMsg);
844                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
845                     pAspMsg->cmd = ASP_MASTER_DEC_DEACTIVATE_DONE;
846                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
847                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
848                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
849                     if (status != MessageQ_S_SUCCESS)
850                     {
851                         SW_BREAKPOINT;
852                     }
853                     
854                     break;
855                     
856                 default:
857                     TRACE_TERSE1("ERROR: invalid slaveCmd=%d", slaveCmd);
858                     break;
859             }
860         }
861     }
862     
863     Log_info0("exit taskAsdpFxn()");   
867 // -----------------------------------------------------------------------------
868 // AST Initialization Function - Memory Allocation
869 //
870 //   Name:      PAF_AST_initPhaseMalloc
871 //   Purpose:   Audio Stream Task Function for initialization of data pointers
872 //              by allocation of memory.
873 //   From:      audioStream1Task or equivalent
874 //   Uses:      See code.
875 //   States:    x
876 //   Return:    0 on success.
877 //              Source code line number on MEM_calloc failure.
878 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
879 //              * State information as per parent.
880 //              * Memory allocation errors.
881 //
882 Int
883 PAF_ASDT_initPhaseMalloc(
884     const PAF_ASDT_Params *pP, 
885     const PAF_ASDT_Patchs *pQ, 
886     PAF_ASDT_Config *pC
889     PAF_AST_Config *pAstCfg;
890     Int as;                     /* Audio Stream Number (1, 2, etc.) */
891     Int zMS;
892     Error_Block eb;
894     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
895     as = pAstCfg->as;
896     zMS = pAstCfg->masterStr;
897     
898     TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: initialization phase - memory allocation", as+zMS);
900     // Initialize error block
901     Error_init(&eb); 
903 //    if (!(gpDecAudioFrame = (PAF_AudioFrame *)Memory_calloc((IHeap_Handle)HEAP_INTERNAL1,
904     if (!(gpDecAudioFrame = (PAF_AudioFrame *)Memory_calloc((IHeap_Handle)HEAP_EXTERNAL, //Qin - moved to external memory
905         DECODEN * sizeof (PAF_AudioFrame), 4, &eb)))
906     {
907         TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: Memory_calloc failed", as+zMS);
908         SW_BREAKPOINT;
909         return __LINE__;
910     }
911     TRACE_TERSE3("PAF_ASDT_initPhaseMalloc. (gpAudioFrameSlave) %d bytes from space %d at 0x%x.",
912             DECODEN * sizeof (PAF_AudioFrame),
913             HEAP_ID_INTERNAL1, (IArg)gpDecAudioFrame);
915     TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: initialization phase - memory allocation complete.", as+zMS);
916     TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: initialization phase - memory allocation complete.", as+zMS);
917     return 0;
918 } //PAF_ASDT_initPhaseMalloc
920 // -----------------------------------------------------------------------------
921 // AST Initialization Function - Memory Initialization from Configuration
922 //
923 //   Name:      PAF_AST_initPhaseConfig
924 //   Purpose:   Audio Stream Task Function for initialization of data values
925 //              from parameters.
926 //   From:      audioStream1Task or equivalent
927 //   Uses:      See code.
928 //   States:    x
929 //   Return:    0 on success.
930 //              Other as per initFrame0 and initFrame1.
931 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
932 //              * State information as per parent.
933 //
935 Int
936 PAF_ASDT_initPhaseConfig(
937     const PAF_ASDT_Params *pP, 
938     const PAF_ASDT_Patchs *pQ, 
939     PAF_ASDT_Config *pC
942     PAF_AST_Config *pAstCfg;
943     Int as;                    /* Audio Stream Number (1, 2, etc.) */
944     Int zMS;
945     Int z;
947     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
948     as = pAstCfg->as;
949     zMS = pAstCfg->masterStr;
950     
951     TRACE_TERSE1("PAF_ASDT_initPhaseConfig: AS%d: initialization phase - configuration", as+zMS);
953     // overwrite pointer to audio frame in framework decode control
954     for (z=DECODE1; z < DECODEN; z++) 
955     {
956         //Int zS = pP->streamsFromDecodes[z]; // FL: formerly on master
957         //pC->xDec[z].decodeControl.pAudioFrame = pC->xStr[zS].pAudioFrame; FL: formerly on master
958         //pC->xDec[z].decodeInStruct.pAudioFrame = pC->xStr[zS].pAudioFrame; FL: formerly on master
959         pAstCfg->xDec[z].decodeControl.pAudioFrame = &gpDecAudioFrame[z];
960         pAstCfg->xDec[z].decodeInStruct.pAudioFrame = &gpDecAudioFrame[z];
961         pAstCfg->xDec[z].decodeStatus = *pP->z_pDecodeStatus[z];
962         pP->fxns->initFrame0(pP, pQ, pC, z);
963     }
965     return 0;
966 }  //PAF_ASDT_initPhaseConfig
968 // -----------------------------------------------------------------------------
969 // AST Initialization Function - ACP Algorithm Instantiation
970 //
971 //   Name:      PAF_AST_initPhaseAcpAlg
972 //   Purpose:   Audio Stream Task Function for initialization of ACP by
973 //              instantiation of the algorithm.
974 //   From:      audioStream1Task or equivalent
975 //   Uses:      See code.
976 //   States:    x
977 //   Return:    0 on success.
978 //              Source code line number on ACP Algorithm creation failure.
979 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
980 //              * State information as per parent.
981 //              * Memory allocation errors.
982 //
983 Int
984 PAF_ASDT_initPhaseAcpAlg(
985     const PAF_ASDT_Params *pP, 
986     const PAF_ASDT_Patchs *pQ, 
987     PAF_ASDT_Config *pC
990     PAF_AST_Config *pAstCfg;
991     Int as;                    /* Audio Stream Number (1, 2, etc.) */
992     Int z;                     /* input/encode/stream/decode/output counter */
993     Int betaPrimeOffset;
994     ACP_Handle acp;
995     Int zMS;
996     Int zS; //, zX;
998     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
999     as = pAstCfg->as;
1000     zMS = pAstCfg->masterStr;    
1002     TRACE_TERSE1("PAF_ASDT_initPhaseAcpAlg: AS%d: initialization phase - ACP Algorithm", as+zMS);
1004     ACP_MDS_init();
1006     if (!(acp = (ACP_Handle)ACP_MDS_create(NULL))) 
1007     {
1008         TRACE_TERSE1("PAF_ASDT_initPhaseAcpAlg: AS%d: ACP algorithm instance creation  failed", as+zMS);
1009         return __LINE__;
1010     }
1011     pC->acp = acp;
1013     ((ALG_Handle)acp)->fxns->algControl((ALG_Handle)acp,
1014         ACP_GETBETAPRIMEOFFSET, (IALG_Status *)&betaPrimeOffset);
1016     for (z=DECODE1; z < DECODEN; z++) 
1017     {
1018         zS = pP->streamsFromDecodes[z];
1019         acp->fxns->attach(acp, ACP_SERIES_STD,
1020             STD_BETA_DECODE + betaPrimeOffset * (as-1+zS),
1021             (IALG_Status *)&pAstCfg->xDec[z].decodeStatus);
1022         /* Ignore errors, not reported. */
1023     }
1025     TRACE_TERSE1("PAF_ASDT_initPhaseAcpAlg: AS%d: initialization phase - ACP Algorithm complete.", as+zMS);
1027     return 0;
1028 } //PAF_AST_initPhaseAcpAlg
1030 // -----------------------------------------------------------------------------
1031 // AST Initialization Function - Common Memory and Algorithms
1032 //
1033 //   Name:      PAF_AST_initPhaseCommon
1034 //   Purpose:   Audio Stream Task Function for initialization of data pointers
1035 //              by allocation for common memory and by instantiation for
1036 //              algorithms.
1037 //   From:      audioStream1Task or equivalent
1038 //   Uses:      See code.
1039 //   States:    x
1040 //   Return:    0 on success.
1041 //              Source code line number on PAF_ALG_alloc failure.
1042 //              Source code line number on PAF_ALG_mallocMemory failure.
1043 //              Source code line number on Decode Chain initialization failure.
1044 //              Source code line number on ASP Chain initialization failure.
1045 //              Source code line number on Encode Chain initialization failure.
1046 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
1047 //              * State information as per parent.
1048 //              * Memory allocation errors.
1049 //
1051 #include <pafsio_ialg.h>
1053 Int
1054 PAF_ASDT_initPhaseCommon(
1055     const PAF_ASDT_Params *pP, 
1056     const PAF_ASDT_Patchs *pQ, 
1057     PAF_ASDT_Config *pC
1060     PAF_AST_Config *pAstCfg;
1061     Int as;                         /* Audio Stream Number (1, 2, etc.) */
1062     Int z;                          /* stream counter */
1063     //Int g;                        /* gear */
1064     ACP_Handle acp;
1065     PAF_IALG_Config pafAlgConfig;
1066     IALG_MemRec common[3][PAF_IALG_COMMON_MEMN+1];
1067    
1068     acp = pC->acp; // get acp handle
1069     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
1070     as = pAstCfg->as;
1071     
1072     TRACE_TERSE0("PAF_ASDT_initPhaseCommon: initialization phase - Common Memory");
1074     //
1075     // Determine memory needs and instantiate algorithms across audio streams
1076     //
1078     TRACE_TERSE0("PAF_ASDT_initPhaseCommon: calling PAF_ALG_setup.");
1079     PAF_ALG_setup(&pafAlgConfig, 
1080         HEAP_ID_INTERNAL,               HEAP_INTERNAL, 
1081         HEAP_ID_INTERNAL1,              HEAP_INTERNAL1, 
1082         HEAP_ID_EXTERNAL,               HEAP_EXTERNAL, 
1083         HEAP_ID_INTERNAL1_SHM,          HEAP_INTERNAL1_SHM, 
1084         HEAP_ID_EXTERNAL_SHM,           HEAP_EXTERNAL_SHM, 
1085         HEAP_ID_EXTERNAL_NONCACHED_SHM, HEAP_EXTERNAL_NONCACHED_SHM,
1086         HEAP_CLEAR);
1088     if (pP->fxns->headerPrint)
1089         pP->fxns->headerPrint();
1091     for (z=STREAM1; z < STREAMN; z++) 
1092     {
1093         //Int zD, zE, zX;
1094         Int zD, zX;
1096         TRACE_TERSE1("PAF_ASDT_initPhaseCommon: AS%d: initialization phase - Common Algorithms", as+z);
1098         //
1099         // Determine common memory needs of Decode Algorithms
1100         //
1101         PAF_ALG_init (common[z], lengthof (common[z]), COMMONSPACE);
1103         zD = -1;
1104         for (zX = DECODE1; zX < DECODEN; zX++) 
1105         {
1106             if (pP->streamsFromDecodes[zX] == z) 
1107             {
1108                 zD = zX;
1109                 break;
1110             }
1111         }
1113         if (zD >= 0) 
1114         {
1115             TRACE_TERSE1("PAF_ASDT_initPhaseCommon: calling PAF_ALG_ALLOC for decoder common[%d].", z);
1116             if (PAF_ALG_ALLOC (decLinkInit[zD-DECODE1], common[z])) 
1117             {
1118                 TRACE_TERSE3("AS%d: %s.%d: PAF_ALG_alloc failed", as+z, (IArg)__FUNCTION__, __LINE__);
1119                 TRACE_TERSE2("Failed to alloc %d bytes from space %d", common[z]->size, common[z]->space);
1121                 SW_BREAKPOINT;
1122                 return __LINE__;
1123             }
1124             TRACE_TERSE3("alloced %d bytes from space %d at 0x%x", common[z]->size, common[z]->space, (IArg)common[z]->base);
1125             if(pP->fxns->allocPrint)
1126                 pP->fxns->allocPrint ((const PAF_ALG_AllocInit *)(decLinkInit[z-DECODE1]),sizeof (*(decLinkInit[z-DECODE1])), &pafAlgConfig);
1127         }
1129 #if 0 // FL: master
1130         TRACE_TERSE3("%s.%d: calling PAF_ALG_ALLOC for stream common[%d].", (IArg)__FUNCTION__, __LINE__, z);
1131         TRACE_TERSE3("%s.%d: calling PAF_ALG_ALLOC for stream common[%d].", (IArg)__FUNCTION__, __LINE__, z);
1132         if (PAF_ALG_ALLOC (aspLinkInit[z-STREAM1][0], common[z])) 
1133         {
1134             TRACE_TERSE3("AS%d: %s.%d: PAF_ALG_alloc failed", as+z, (IArg)__FUNCTION__, __LINE__);
1135             TRACE_TERSE2("Failed to alloc %d bytes from space %d ", common[z]->size, common[z]->space);
1136             SW_BREAKPOINT;
1137             return __LINE__;
1138         }
1139         TRACE_TERSE3("alloced %d bytes from space %d at 0x%x", common[z]->size, common[z]->space, (IArg)common[z]->base);
1140         if(pP->fxns->allocPrint)
1141             pP->fxns->allocPrint((const PAF_ALG_AllocInit *)(aspLinkInit[z-STREAM1][0]), sizeof (*(aspLinkInit[z-STREAM1][0])), &pafAlgConfig);
1142 #endif
1143         
1144     }
1145     {
1146         // Changes made to share scratch between zones
1147         // Assume maximum 3 zones and scratch common memory is at offset 0;
1148         int max=0;
1149         for (z=STREAM1; z < STREAMN; z++)
1150         {
1151             if (max<common[z][0].size)
1152                 max=common[z][0].size;
1153         }
1154         common[STREAM1][0].size=max;
1155         for (z=STREAM1+1; z < STREAMN; z++)
1156             common[z][0].size=0;
1157     }
1158     
1159     //
1160     // Provide common memory needs of Decode Algorithms
1161     //
1162     for (z=STREAM1; z < STREAMN; z++) 
1163     {
1164         //Int zD, zE, zX;
1165         Int zD, zX;
1167         zD = -1;        
1168         for (zX = DECODE1; zX < DECODEN; zX++) 
1169         {
1170            if (pP->streamsFromDecodes[zX] == z) 
1171            {
1172                zD = zX;
1173                break;
1174            }
1175         }
1177         TRACE_TERSE0("PAF_ASDT_initPhaseCommon: calling PAF_ALG_mallocMemory for common space.");
1178         if (PAF_ALG_mallocMemory (common[z], &pafAlgConfig)) 
1179         {
1180             TRACE_TERSE3("AS%d: %s.%d: PAF_ALG_mallocMemory failed", as+z, (IArg)__FUNCTION__, __LINE__);
1181             TRACE_TERSE3("AS%d: z: %d.  Size 0x%x", as+z, z, common[z][0].size);
1182             SW_BREAKPOINT;
1183             return __LINE__;
1184         }
1185         TRACE_TERSE3("alloced %d bytes from space %d at 0x%x", common[z]->size, common[z]->space, (IArg)common[z]->base);
1186         // share zone0 scratch with all zones 
1187         common[z][0].base=common[0][0].base;
1188         if (pP->fxns->commonPrint)
1189                 pP->fxns->commonPrint (common[z], &pafAlgConfig);
1191         //
1192         // Instantiate Decode Algorithms
1193         //
1194         if (zD >= 0) 
1195         {
1196             PAF_ASP_Chain *chain;
1197             TRACE_TERSE0("PAF_ASDT_initPhaseCommon: calling PAF_ASP_chainInit for decode.");
1198             chain =
1199                 PAF_ASP_chainInit (&pAstCfg->xDec[zD].decChainData, pP->pChainFxns,
1200                                    HEAP_INTERNAL, as+z, acp, &trace,
1201                                    decLinkInit[zD-DECODE1], NULL, common[z], &pafAlgConfig);
1202             if (!chain) 
1203             {
1204                 TRACE_TERSE1("PAF_ASDT_initPhaseCommon: AS%d: Decode chain initialization failed", as+z);
1205                 return __LINE__;
1206             }
1207         }
1209 #if 0 // FL: master
1210         pC->xStr[z].aspChain[0] = NULL;
1211         for (g=0; g < GEARS; g++) 
1212         {
1213             PAF_ASP_Chain *chain;
1214             TRACE_TERSE2("%s.%d: calling PAF_ASP_chainInit for ASPs.", (IArg)__FUNCTION__, __LINE__);
1215             chain =
1216                 PAF_ASP_chainInit (&pC->xStr[z].aspChainData[g], pP->pChainFxns,
1217                                    HEAP_INTERNAL, as+z, acp, &trace,
1218                                    aspLinkInit[z-STREAM1][g], pC->xStr[z].aspChain[0], common[z], &pafAlgConfig);
1219             if (! chain) 
1220             {
1221                 TRACE_TERSE2("AS%d: ASP chain %d initialization failed", as+z, g);
1222                 return __LINE__;
1223             }
1224             else
1225                 pC->xStr[z].aspChain[g] = chain;
1226         }
1227 #endif
1229     }
1230     TRACE_TERSE1("PAF_ASDT_initPhaseCommon: AS%d: Returning complete.", as+z);
1232     return 0;
1233 } //PAF_ASDT_initPhaseCommon
1235 // -----------------------------------------------------------------------------
1236 // AST Initialization Function - Algorithm Keys
1237 //
1238 //   Name:      PAF_AST_initPhaseAlgKey
1239 //   Purpose:   Audio Stream Task Function for initialization of data values
1240 //              from parameters for Algorithm Keys.
1241 //   From:      audioStream1Task or equivalent
1242 //   Uses:      See code.
1243 //   States:    x
1244 //   Return:    0.
1245 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
1246 //              * State information as per parent.
1247 //
1248 // .............................................................................
1249 Int
1250 PAF_ASDT_initPhaseAlgKey(
1251     const PAF_ASDT_Params *pP, 
1252     const PAF_ASDT_Patchs *pQ, 
1253     PAF_ASDT_Config *pC
1256     PAF_AST_Config *pAstCfg;
1257     Int as;                     /* Audio Stream Number (1, 2, etc.) */
1258     Int z;                      /* decode/encode counter */
1259     Int s;                      /* key number */
1260     PAF_ASP_Link *that;
1262     (void)as;  // clear warning.
1264     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
1265     as = pAstCfg->as;
1266     
1267     TRACE_VERBOSE1("PAF_ASDT_initPhaseAlgKey: AS%d: initialization phase - Algorithm Keys", as);
1269     for (z=DECODE1; z < DECODEN; z++) 
1270     {
1271         for (s=0; s < pP->pDecAlgKey->length; s++) 
1272         {
1273             if ((pP->pDecAlgKey->code[s].full != 0)
1274                 && (that = PAF_ASP_chainFind (&pAstCfg->xDec[z].decChainData, pP->pDecAlgKey->code[s])))
1275             {
1276                 pAstCfg->xDec[z].decAlg[s] = (ALG_Handle )that->alg;
1277                     /* Cast in interface, for now --Kurt */
1278             }
1279             else
1280                 pAstCfg->xDec[z].decAlg[s] = NULL;
1281         }
1282     }
1284     return 0;
1285 } //PAF_AST_initPhaseAlgKey
1287 //   Purpose:   Audio Stream Decode Task Function for initialization of the Audio
1288 //              Frame(s) by memory allocation and loading of data pointers
1289 //              and values.
1290 Int
1291 PAF_ASDT_initFrame0(
1292     const PAF_ASDT_Params *pP, 
1293     const PAF_ASDT_Patchs *pQ, 
1294     PAF_ASDT_Config *pC, 
1295     Int z
1298     PAF_AST_Config *pAstCfg;
1299     Int as;                    /* Audio Stream Number (1, 2, etc.) */
1300     Int aLen;
1301     Int aSize = sizeof(PAF_AudioData);
1302     Int aAlign = aSize < sizeof (int) ? sizeof (int) : aSize;
1303     Int maxFrameLength = pP->maxFramelength;
1304     PAF_AudioData *aBuf=NULL;
1305     XDAS_UInt8 *metadataBuf;
1306     Error_Block    eb;
1307     PAF_AudioFrame *pAudioFrame;
1308     Int i;
1310     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
1311     as = pAstCfg->as;
1313     pAudioFrame = &gpDecAudioFrame[z];
1314     if (pAudioFrame == NULL)
1315     {
1316         SW_BREAKPOINT;
1317     }
1318     
1319     // Initialize error block
1320     Error_init(&eb); 
1321     
1322     //maxFrameLength += PA_MODULO - maxFrameLength % PA_MODULO; // compute maximum framelength (needed for ARC support)
1323     //aLen = numchan[z] * maxFrameLength;
1324     aLen = numchan[z] * maxFrameLength + (maxFrameLength - FRAMELENGTH); /* Qin - need additional memory for starting offset
1325                                                                                       See line 1301 */
1327     //
1328     // Initialize audio frame elements directly
1329     //
1330     pAudioFrame->fxns = pP->pAudioFrameFunctions;
1331     pAudioFrame->data.nChannels = PAF_MAXNUMCHAN;
1332     pAudioFrame->data.nSamples = FRAMELENGTH;
1333     pAudioFrame->data.sample = gDecAudioFrameChannelPointers;
1334     pAudioFrame->data.samsiz = gDecAudioFrameChannelSizes;
1335     pAudioFrame->pChannelConfigurationMaskTable = &PAF_ASP_stdCCMT;
1337     //
1338     // Allocate memory for and initialize pointers to audio data buffers
1339     //
1340     //   The NUMCHANMASK is used to identify the channels for which data
1341     //   buffers can be allocated. Using this mask and switch statement
1342     //   rather than some other construct allows efficient code generation,
1343     //   providing just the code necessary (with significant savings).
1344     //
1345     if (pP->fxns->bufMemPrint)
1346     {
1347         pP->fxns->bufMemPrint(z, aLen*aSize, HEAP_ID_FRMBUF, 2);
1348     }
1350     TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc for audio buffers", as+z);
1351     
1352     if (aLen != 0)
1353     {
1354         if (!(aBuf = (PAF_AudioData *)Memory_calloc((IHeap_Handle)HEAP_FRMBUF, aLen*aSize, aAlign, &eb)))
1355         {
1356             TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc failed", as+z);
1357             TRACE_TERSE2("  maxFrameLength: %d.  aLen*aSize: %d", maxFrameLength, aLen*aSize);
1358             SW_BREAKPOINT;
1359             return __LINE__;
1360         }
1361     }
1363     TRACE_TERSE3("  maxFrameLength: %d.  aLen*aSize: %d.  aBuf: 0x%x", maxFrameLength, aLen*aSize, (IArg)aBuf);
1365     TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc for metadata buffers", as+z);
1366     if (!(metadataBuf = (XDAS_UInt8 *)Memory_calloc((IHeap_Handle)HEAP_MDBUF, pP->pMetadataBufStatus->bufSize*pP->pMetadataBufStatus->NumBuf, pP->pMetadataBufStatus->alignment, &eb)))
1367     {
1368         TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc failed", as+z);
1369         TRACE_TERSE1("  bufSize*NumBuf: %d", pP->pMetadataBufStatus->bufSize*pP->pMetadataBufStatus->NumBuf);
1370         SW_BREAKPOINT;
1371         return __LINE__;
1372     }
1374     for (i=0; i < PAF_MAXNUMCHAN_AF; i++)
1375     {
1376         gDecAudioFrameChannelPointers[i] = NULL;
1377     }
1379     if ((numchan[z] > PAF_MAXNUMCHAN) || (numchan[z] < 1)) 
1380     {
1381         TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: unsupported option", as+z);
1382         return __LINE__;
1383     }
1384     else 
1385     {
1386         Int j = 0;
1387         TRACE_TERSE1("PAF_ASDT_initFrame0: AFChanPtrMap[%d][i]", numchan[z]);
1388         for (i=0; i<numchan[z]; i++)
1389         {
1390             Int8 chan = AFChanPtrMap[numchan[z]][i];
1391             if (chan != -1)
1392             {
1393                 gDecAudioFrameChannelPointers[chan] = aBuf + maxFrameLength*(j+1) - FRAMELENGTH;
1394                 j++;
1395                 TRACE_TERSE3("PAF_ASDT_initFrame0: chan = %d = AFChanPtrMap[%d][%d].", chan, numchan[z], i);
1396                 TRACE_TERSE2("PAF_ASDT_initFrame0: audioFrameChannelPointers[%d]: 0x%x", chan, (IArg)gDecAudioFrameChannelPointers[chan]);
1397             }
1398         }
1399     }
1401     // Initialize original audio frame channel pointers
1402     for (i=PAF_LEFT; i < PAF_MAXNUMCHAN_AF; i++) 
1403     {
1404         if (gDecAudioFrameChannelPointers[i])
1405         {
1406             gDecOrigAudioFrameChannelPointers[i] = gDecAudioFrameChannelPointers[i];
1407         }
1408     }
1410     //
1411     // Initialize meta data elements
1412     //
1413     pAudioFrame->pafBsMetadataUpdate = XDAS_FALSE;
1414     pAudioFrame->numPrivateMetadata = 0;
1415     pAudioFrame->bsMetadata_offset = 0;
1416     pAudioFrame->bsMetadata_type = PAF_bsMetadata_channelData;
1417     pAudioFrame->privateMetadataBufSize = pP->pMetadataBufStatus->bufSize;
1418     for (i=0; i<pP->pMetadataBufStatus->NumBuf; i++)
1419     {
1420         pAudioFrame->pafPrivateMetadata[i].offset = 0;
1421         pAudioFrame->pafPrivateMetadata[i].size = 0;
1422         pAudioFrame->pafPrivateMetadata[i].pMdBuf = metadataBuf + pP->pMetadataBufStatus->bufSize*i;
1423     }
1425     return 0;
1426 } //PAF_ASDT_initFrame0
1428 // -----------------------------------------------------------------------------
1429 // ASOT Initialization Function Helper - Reinitialization of Audio Frame
1430 // AST Decoding Function              - Reinitialization of Audio Frame
1431 //
1432 //   Name:      PAF_ASOT_initFrame1
1433 //   Purpose:   Audio Stream Task Function for initialization or reinitiali-
1434 //              zation of the Audio Frame(s) by loading of data values of a
1435 //              time-varying nature.
1436 //   From:      audioStream1Task or equivalent
1437 //              AST Parameter Function -> decodeInfo
1438 //              AST Parameter Function -> decodeDecode
1439 //   Uses:      See code.
1440 //   States:    x
1441 //   Return:    0.
1442 //   Trace:     None.
1443 //
1444 Int
1445 PAF_ASDT_initFrame1(
1446     const PAF_ASDT_Params *pP, 
1447     const PAF_ASDT_Patchs *pQ, 
1448     PAF_ASDT_Config *pC, 
1449     Int z, 
1450     Int apply
1453     PAF_AudioFrame *pAudioFrame;
1455     //
1456     // Reinitialize audio frame elements:
1457     //
1458     //   Channel Configurations during sys init                 = Unknown
1459     //      "          "        during info or decode           = None
1460     //
1461     //   Sample Rate / Count    during sys init, info or decode = Unknown / 0
1462     //
1464     pAudioFrame = &gpDecAudioFrame[z];
1466     if (apply < 0) 
1467     {
1468         pAudioFrame->channelConfigurationRequest.legacy = PAF_CC_UNKNOWN;
1469         pAudioFrame->channelConfigurationStream.legacy = PAF_CC_UNKNOWN;
1470     }
1471     else 
1472     {
1473         pAudioFrame->channelConfigurationRequest.legacy = PAF_CC_NONE;
1474         pAudioFrame->channelConfigurationStream.legacy = PAF_CC_NONE;
1475     }
1477     if (apply < 1) 
1478     {
1479         pAudioFrame->sampleRate = PAF_SAMPLERATE_UNKNOWN;
1480         pAudioFrame->sampleCount = 0;
1481     }
1483     return 0;
1484 } //PAF_ASDT_initFrame1
1486 // Reset AF, invoked during decode ACTIVATE (during state=INIT on Master)
1487 Int resetAf(
1488     const PAF_ASDT_Params *pP, 
1489     Int z, 
1490     Int sourceSelect
1493     PAF_AudioFrame *pAudioFrame;
1494     Int ch;
1495     Int i;
1497     // Get audio frame
1498     pAudioFrame = &gpDecAudioFrame[z];
1499     if (pAudioFrame == NULL)
1500     {
1501         SW_BREAKPOINT;
1502     }
1504     // Reinitialize audio frame elements
1505     pAudioFrame->channelConfigurationRequest.legacy = PAF_CC_NONE;
1506     pAudioFrame->channelConfigurationStream.legacy = PAF_CC_NONE;
1507     pAudioFrame->sampleRate = PAF_SAMPLERATE_UNKNOWN;
1508     pAudioFrame->sampleCount = 0;
1509     pAudioFrame->data.nChannels = PAF_MAXNUMCHAN;
1510     
1511     switch (sourceSelect)
1512     {
1513         case PAF_SOURCE_PCM:
1514             pAudioFrame->data.nSamples = FRAMELENGTH;
1515             break;
1516         case PAF_SOURCE_AC3:
1517         case PAF_SOURCE_DDP:
1518             pAudioFrame->data.nSamples = 1536;
1519             break;
1520         case PAF_SOURCE_THD:
1521             pAudioFrame->data.nSamples = 5120; //QIN FIX ME
1522             break;
1523         default:  
1524             pAudioFrame->data.nSamples = FRAMELENGTH;
1525             break;
1526     }
1528     // Reset audio frame channel pointers
1529     for (ch=PAF_LEFT; ch < PAF_MAXNUMCHAN_AF; ch++) 
1530     {
1531         if (gDecAudioFrameChannelPointers[ch])
1532         {
1533             gDecAudioFrameChannelPointers[ch] = gDecOrigAudioFrameChannelPointers[ch];
1534         }
1535     }
1536     
1537     // Reset audio frame meta data elements
1538     pAudioFrame->pafBsMetadataUpdate = XDAS_FALSE;
1539     pAudioFrame->numPrivateMetadata = 0;
1540     pAudioFrame->bsMetadata_offset = 0;
1541     pAudioFrame->bsMetadata_type = PAF_bsMetadata_channelData;
1542     for (i=0; i<pP->pMetadataBufStatus->NumBuf; i++)
1543     {
1544         pAudioFrame->pafPrivateMetadata[i].offset = 0;
1545         pAudioFrame->pafPrivateMetadata[i].size = 0;
1546     }
1547     
1548     return 0;
1551 // Reset AF samsiz, invoked during DECODE
1552 Int resetAfSamsiz(
1553     Int z
1556     PAF_AudioFrame *pAudioFrame;
1557     Int ch;
1558     
1559     // Get audio frame
1560     pAudioFrame = &gpDecAudioFrame[z];
1561     if (pAudioFrame == NULL)
1562     {
1563         SW_BREAKPOINT;
1564     }
1565     
1566     // Clear samsiz for all channels - MID 208.
1567     for (ch=0; ch < PAF_MAXNUMCHAN_AF; ch++) 
1568     {
1569         pAudioFrame->data.samsiz[ch] = 0;
1570     }
1572     return 0;