Circular buffer read cleanup from Build #38 (work on PASDK-53).
[processor-sdk/performance-audio-sr.git] / pasdk / test_arm / framework / audioStreamDecodeProc.c
2 /*
3 Copyright (c) 2016, Texas Instruments Incorporated - http://www.ti.com/
4 All rights reserved.
6 * Redistribution and use in source and binary forms, with or without 
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the
16 * distribution.
17 *
18 * Neither the name of Texas Instruments Incorporated nor the names of
19 * its contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 */
36 /*
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"
64 #include "statusOp_common.h"
67 // FL: debug
68 //#include "fwkSim.h"
69 #include "dbgCapAf.h"
70 #include "dbgDib.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 // Underflow threshold before returning error to Top-Level FSM
105 #define DEC_OP_CB_WRTAF_OVR_THR  ( 20 ) // FL: arbitrary setting
106 UInt32 gDecOpCbWrtAfOvr  =0; // decoder output circular buffer overflow count
108 // Global debug counters */
109 UInt32 gSlaveStartErrCnt        =0;
110 UInt32 gSlaveStartCnt           =0;
111 UInt32 gSlaveSourceSelectCnt    =0;
112 UInt32 gSlaveExitCnt            =0;
113 UInt32 gSlaveDecExitCnt         =0;
114 UInt32 gSlaveDecControlCnt      =0;
115 UInt32 gSlaveDecActivateCnt     =0;
116 UInt32 gSlaveDecResetCnt        =0;
117 UInt32 gSlaveDecInfoCnt         =0;
118 UInt32 gSlaveDecDecodeCnt       =0;
119 UInt32 gSlaveDecDeactivateCnt   =0;
122 // FL: (***) debug
123 #include "evmc66x_gpio_dbg.h"
126 /*
127  *  ======== taskAsdpFxn ========
128  *  Audio Stream Decode Processing task function
129  */
130 Void taskAsdpFxn(
131 //    Int betaPrimeValue, // FL: revisit
132     const PAF_ASDT_Params *pP,
133     const PAF_ASDT_Patchs *pQ
136     PAF_ASDT_Config *pC;            /* Local configuration pointer */
137     PAF_AST_Config *pAstCfg;        /* Common (shared) configuration pointer */
138     Int as;                         /* Audio Stream Number (1, 2, etc.) */
139     Int z;                          /* input/encode/stream/decode/output counter */
140     Int i;                          /* phase */
141     Int zMD, zMS;
142     Bool done;
143     Bool decDone;
144     ALG_Handle alg[DECODEN_MAX];
145     ASP_Slave_Cmd slaveCmd;
146     Int sourceSelect;
147     DEC_Handle dec;
148     IALG_Cmd decCtrlCmd;            // decoder control command
149     Int decCtrlRet;                 // decoder control return
150     Int errno;                      /* error number */
151     Int size;
152     Int argIdx;
153     // Decoder output circular buffer
154     PAF_AST_DecOpCircBufCtl *pCbCtl;    /* Decoder output circular buffer control */
155     //PAF_AST_DecOpCircBuf *pCb;
156     PAF_AudioFrame *pAfWrt;
157     Int cbErrno;    
158     // Messaging
159     PAF_InpBufConfig *pIpBufConfig;
160     ASP_Msg *pAspMsg;
161     MessageQ_QueueId queId;
162     Int status;
163     Int zI;
164     Int bufEnd, wrapSize, currentBufSize, chunkSize;
165     Int8 temp8;
167     
168     Log_info0("Enter taskAsdpFxn()");
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                     // FL: debug, log circular buffer control variables
501                     cbLog(pCbCtl, z, 1, "cbWriteStart");
502                     // Reset audio frame
503                     resetAf(pP, z, sourceSelect);
504                     
505                     // send dec activate complete message to master
506                     queId = MessageQ_getReplyQueue(pAspMsg);
507                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
508                     pAspMsg->cmd = ASP_MASTER_DEC_ACTIVATE_DONE;
509                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
510                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
511                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
512                     if (status != MessageQ_S_SUCCESS)
513                     {
514                         SW_BREAKPOINT;
515                     }
516                    
517                     break;
518                     
519                 case ASP_SLAVE_DEC_RESET:
520                     gSlaveDecResetCnt++;
521                     // simulate dec reset load
522                     //simLoad(DEC_RESET_LOAD);
523                     
524                     argIdx = 0; // get decIdx
525                     z = *(Int32 *)&pAspMsg->buf[argIdx];
526                     TRACE_TERSE2("slaveCmd=%d,decIdx=%d", slaveCmd, z);
527                     
528                     dec = (DEC_Handle)alg[z];
529                     errno = 0;
530                     if (dec->fxns->reset)
531                     {
532                         errno = dec->fxns->reset(dec, NULL, &pAstCfg->xDec[z].decodeControl, &pAstCfg->xDec[z].decodeStatus);
533                     }
535                     // write back Dec configuration
536                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
537                     Cache_wait();            
539                     // (***) FL: revisit
540                     // write back Status structures for shared Beta Units
541                     //size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]->size;
542                     //Cache_wb((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DECODE]), size, Cache_Type_ALLD, 0);
543                    /* size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]->size;
544                     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_PCM]), size, Cache_Type_ALLD, 0);
545                     size = IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]->size;
546                     Cache_wbInv((Ptr)(IACP_STD_BETA_TABLE.pStatus[STD_BETA_DDP]), size, Cache_Type_ALLD, 0);
547                     Cache_wait();*/
548                     
549                     // send dec reset complete message to master
550                     queId = MessageQ_getReplyQueue(pAspMsg);
551                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
552                     pAspMsg->cmd = ASP_MASTER_DEC_RESET_DONE;
553                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
554                     argIdx = 0; // set decErrno
555                     *(Int32 *)&pAspMsg->buf[argIdx] = errno;
556                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
557                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
558                     if (status != MessageQ_S_SUCCESS)
559                     {
560                         SW_BREAKPOINT;
561                     }
563                     break;
564                     
565                 case ASP_SLAVE_DEC_INFO:
566                     gSlaveDecInfoCnt++;
567                     // simulate dec info load
568                     //simLoad(DEC_INFO_LOAD);
569                     
570                     argIdx = 0; // get decIdx
571                     z = *(Int32 *)&pAspMsg->buf[argIdx];
572                     TRACE_TERSE2("slaveCmd=%d,decIdx=%d", slaveCmd, z);
573                     // Get input associated w/ decoder
574                     zI = pP->inputsFromDecodes[z];
576                     // (***) FL: revisit
577                     // invalidate Inp configuration
578                     Cache_inv(&pAstCfg->xInp[zI], sizeof(PAF_AST_InpBuf), Cache_Type_ALLD, 0);
579                     Cache_wait();
580                     // invalidate input data
581                     pIpBufConfig = &pAstCfg->xInp[zI].inpBufConfig;
582                     size = pIpBufConfig->frameLength * pIpBufConfig->sizeofElement;
583                     if (sourceSelect == PAF_SOURCE_PCM)
584                     {
585                         size *= pIpBufConfig->stride;
586                     }
588                     bufEnd = (Int) pIpBufConfig->base.pVoid + pIpBufConfig->sizeofBuffer;
589                     currentBufSize = (bufEnd - (Int)pIpBufConfig->pntr.pSmInt);
590                     if (currentBufSize >= size)
591                     {
592                         chunkSize = size;
593                     }
594                     else
595                     {
596                         chunkSize = currentBufSize;
597                     }
598                     wrapSize = size - chunkSize;
599                     // invalidate input data
600                     Cache_inv((Ptr)pIpBufConfig->pntr.pSmInt, chunkSize, Cache_Type_ALLD, 0);
601                     // invalidate Dec configuration
602                     TRACE_MSG2("IBUF : pIpBufConfig->pntr.pSmInt: 0x%x and chunkSize: %d", (IArg)pIpBufConfig->pntr.pSmInt, chunkSize);
603                     Cache_inv(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
604                     // status for selected decoder should be invalidated
605                     Cache_wait();
607                     /* Circular buffer wrap condition*/
608                     //if(((Int) pIpBufConfig->head.pVoid + size)  > bufEnd)
609                     if(wrapSize > 0)
610                     {
611                         // invalidate input data
612                         Cache_inv((Ptr)pIpBufConfig->base.pSmInt, wrapSize, Cache_Type_ALLD, 0);
613                         TRACE_MSG2("IBUF : pIpBufConfig->base.pSmInt: 0x%x and wrapSize: %d", (IArg)pIpBufConfig->base.pSmInt, wrapSize);
614                         // status for selected decoder should be invalidated
615                         Cache_wait();
616                     }
617                     /* Circular buffer wrap condition */
619                     dec = (DEC_Handle)alg[z];
620                     errno = 0;
621                     if (dec->fxns->info)
622                     {
623                         errno = dec->fxns->info(dec, NULL, &pAstCfg->xDec[z].decodeControl, &pAstCfg->xDec[z].decodeStatus);
624                     }
625                     
626                     // write back Dec configuration
627                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
628                     Cache_wait();            
629                     
630 #ifdef NON_CACHE_STATUS
631                     statusOp_read(&(temp8),
632                                   &(pAstCfg->xDec[z].decodeStatus.mode),
633                                   sizeof(Int8),
634                                   GATEMP_INDEX_DEC);
635                     // Re-initialize audio frame if decoder is disabled or
636                     // doesn't have a valid input
637                     if (!temp8 || !pAstCfg->xInp[zI].hRxSio)
638                     {
639                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
640                     }
641 #else
642                     // Re-initialize audio frame if decoder is disabled or
643                     // doesn't have a valid input
644                     if (!pAstCfg->xDec[z].decodeStatus.mode || !pAstCfg->xInp[zI].hRxSio)
645                     {
646                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
647                     }
648 #endif
650                     // send dec info complete message to master
651                     queId = MessageQ_getReplyQueue(pAspMsg);
652                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
653                     pAspMsg->cmd = ASP_MASTER_DEC_INFO_DONE;
654                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
655                     argIdx = 0; // set decErrno
656                     *(Int32 *)&pAspMsg->buf[argIdx] = errno;
657                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
658                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
659                     if (status != MessageQ_S_SUCCESS)
660                     {
661                         SW_BREAKPOINT;
662                     }
663                     
664                     break;
665                     
666                 case ASP_SLAVE_DEC_DECODE:
667                     gSlaveDecDecodeCnt++;
668                     // simulate dec info load
669                     //simLoad(DEC_DECODE_LOAD);
670                     
671                     argIdx = 0; // get decIdx
672                     z = *(Int32 *)&pAspMsg->buf[argIdx];
673                     TRACE_TERSE2("slaveCmd=%d, decIdx=%d", slaveCmd, z);
674                     // Get input associated w/ decoder
675                     zI = pP->inputsFromDecodes[z];
676                     
677                     // Reset AF samsiz
678                     resetAfSamsiz(z);
679                     
680                     // invalidate Dec configuration
681                     Cache_inv(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
682                     Cache_wait();
683                     //TRACE_TERSE0("Dec:cache wb done");
684             
685                     dec = (DEC_Handle)alg[z];
686                     //TRACE_TERSE1("Dec:dec handle=0x%04x", (IArg)dec);
688                     errno = 0;
689                     cbErrno = 0;
690                     if (dec->fxns->decode)
691                     {
692                         // FL: debug, capture input buffer
693                         //capIb(pAstCfg->xInp[z].pInpBuf);
694                     
695                         errno = dec->fxns->decode(dec, NULL, &pAstCfg->xDec[z].decodeInStruct, &pAstCfg->xDec[z].decodeOutStruct);
696                         if (errno < 0)
697                         {
698                             //SW_BREAKPOINT;
699                         }
700                         TRACE_TERSE0("Dec:decode done");
701                         
702                         // copy decoder output to decoder output circular buffers
703                         //pCb = &pAstCfg->xDecOpCb[z];
704                         //TRACE_TERSE1("Dec:pCb=0x%04x", (IArg)pCb);
705                         
706                         pAfWrt = pAstCfg->xDec[z].decodeOutStruct.pAudioFrame;
707                         TRACE_TERSE1("Dec:pAfWrt=0x%04x", (IArg)pAfWrt);
708                         //TRACE_TERSE1("nSamples=%d",pAfWrt->data.nSamples);
709                         
710                         // FL: debug, capture audio frame
711                         //if (capAfWrite(pAfWrt, PAF_CNTR) != CAP_AF_SOK)
712                         //{
713                         //    Log_info0("capAfWrite() error");
714                         //}                        
716                         GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_107);
717                         cbErrno = cbWriteAf(pCbCtl, z, pAfWrt);
718                         if (cbErrno < 0)
719                         {
720                             //SW_BREAKPOINT; // FL: debug
721                             
722                             if (cbErrno == ASP_DECOP_CB_WRITE_OVERFLOW)
723                             {
724                                 // Reset circular buffer
725                                 cbReset(pCbCtl, z);
726                                 // Update overflow count, return if above threshold
727                                 gDecOpCbWrtAfOvr++;
728                                 if (gDecOpCbWrtAfOvr < DEC_OP_CB_WRTAF_OVR_THR)
729                                 {
730                                     cbErrno = 0;
731                                 }
732                                 else 
733                                 {
734                                     gDecOpCbWrtAfOvr = 0;
735                                 }
736                             }
737                         }
738                         GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_107);
739                         TRACE_TERSE0("Dec:cbWriteAf() complete");
740                         
741 #if 1 // (***) FL: shows timing of CB write
742                         /// (***) debug // B9
743                         //{
744                         //    static Uint8 toggleState = 0;
745                         //    if (toggleState == 0)
746                         //        GPIOSetOutput(GPIO_PORT_0, GPIO_PIN_107);
747                         //    else
748                         //        GPIOClearOutput(GPIO_PORT_0, GPIO_PIN_107);
749                         //    toggleState = ~(toggleState);
750                         //}
751 #endif        
752                         
753                         // FL: debug, log circular buffer control variables
754                         cbLog(pCbCtl, z, 1, "cbWriteAf");
755                     }
756                     
757                     // write back Dec configuration
758                     Cache_wb(&pAstCfg->xDec[z], sizeof(PAF_AST_Decode), Cache_Type_ALLD, 0);
759                     Cache_wait();
760                     
761 #ifdef NON_CACHE_STATUS
762                     statusOp_read(&(temp8),
763                                   &(pAstCfg->xDec[z].decodeStatus.mode),
764                                   sizeof(Int8),
765                                   GATEMP_INDEX_DEC);
766                     // Re-initialize audio frame if decoder is disabled or 
767                     // doesn't have a valid input 
768                     if (!temp8 || !pAstCfg->xInp[zI].hRxSio)
769                     {
770                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
771                     }
772 #else
773                     // Re-initialize audio frame if decoder is disabled or
774                     // doesn't have a valid input
775                     if (!pAstCfg->xDec[z].decodeStatus.mode || !pAstCfg->xInp[zI].hRxSio)
776                     {
777                         pP->fxns->initFrame1(pP, pQ, pC, z, 0);
778                     }
779 #endif
780                     // send dec info complete message to master
781                     queId = MessageQ_getReplyQueue(pAspMsg);
782                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
783                     pAspMsg->cmd = ASP_MASTER_DEC_DECODE_DONE;
784                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
785                     argIdx = 0; // set decErrno
786                     *(Int32 *)&pAspMsg->buf[argIdx] = errno;
787                     argIdx += sizeof(Int32); // set cbErrno
788                     *(Int32 *)&pAspMsg->buf[argIdx] = cbErrno;                    
789                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
790                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
791                     if (status != MessageQ_S_SUCCESS)
792                     {
793                         SW_BREAKPOINT;
794                     }
795                     
796                     break;
797                     
798                 case ASP_SLAVE_DEC_DEACTIVATE:
799                     gSlaveDecDeactivateCnt++;
800                     // simulate dec info load
801                     //simLoad(DEC_DEACTIVATE_LOAD);
802                     
803                     argIdx = 0; // get decIdx
804                     z = *(Int32 *)&pAspMsg->buf[argIdx];
805                     TRACE_TERSE2("slaveCmd=%d, decIdx=%d", slaveCmd, z);
806                     
807                     if (alg[z]->fxns->algDeactivate)
808                     {
809                         alg[z]->fxns->algDeactivate(alg[z]);
810                     }
811                     
812                     // Stop writes to circular buffer
813                     //pCb = &pAstCfg->xDecOpCb[z];
814                     cbErrno = cbWriteStop(pCbCtl, z);
815                     if (cbErrno < 0)
816                     {
817                         SW_BREAKPOINT;
818                     }
819                     // FL: debug, log circular buffer control variables
820                     cbLog(pCbCtl, z, 1, "cbWriteStop");
821                     
822                     // send dec deactivate complete message to master
823                     queId = MessageQ_getReplyQueue(pAspMsg);
824                     pAspMsg->procId = hAspMsgSlave->slaveProcId;
825                     pAspMsg->cmd = ASP_MASTER_DEC_DEACTIVATE_DONE;
826                     pAspMsg->messageId = hAspMsgSlave->masterMessageId | ((UInt32)1<<31);
827                     TRACE_MSG3("Tx ASP message, procId=%d, cmd=%d, messageId=0x%04x", pAspMsg->procId, pAspMsg->cmd, pAspMsg->messageId);
828                     status = MessageQ_put(queId, (MessageQ_Msg)pAspMsg); /* send message back */
829                     if (status != MessageQ_S_SUCCESS)
830                     {
831                         SW_BREAKPOINT;
832                     }
833                     
834                     break;
835                     
836                 default:
837                     TRACE_TERSE1("ERROR: invalid slaveCmd=%d", slaveCmd);
838                     break;
839             }
840         }
841     }
842     
843     Log_info0("exit taskAsdpFxn()");   
847 // -----------------------------------------------------------------------------
848 // AST Initialization Function - Memory Allocation
849 //
850 //   Name:      PAF_AST_initPhaseMalloc
851 //   Purpose:   Audio Stream Task Function for initialization of data pointers
852 //              by allocation of memory.
853 //   From:      audioStream1Task or equivalent
854 //   Uses:      See code.
855 //   States:    x
856 //   Return:    0 on success.
857 //              Source code line number on MEM_calloc failure.
858 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
859 //              * State information as per parent.
860 //              * Memory allocation errors.
861 //
862 Int
863 PAF_ASDT_initPhaseMalloc(
864     const PAF_ASDT_Params *pP, 
865     const PAF_ASDT_Patchs *pQ, 
866     PAF_ASDT_Config *pC
869     PAF_AST_Config *pAstCfg;
870     Int as;                     /* Audio Stream Number (1, 2, etc.) */
871     Int zMS;
872     Error_Block eb;
874     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
875     as = pAstCfg->as;
876     zMS = pAstCfg->masterStr;
877     
878     TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: initialization phase - memory allocation", as+zMS);
880     // Initialize error block
881     Error_init(&eb); 
883 //    if (!(gpDecAudioFrame = (PAF_AudioFrame *)Memory_calloc((IHeap_Handle)HEAP_INTERNAL1,
884     if (!(gpDecAudioFrame = (PAF_AudioFrame *)Memory_calloc((IHeap_Handle)HEAP_EXTERNAL, //Qin - moved to external memory
885         DECODEN * sizeof (PAF_AudioFrame), 4, &eb)))
886     {
887         TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: Memory_calloc failed", as+zMS);
888         SW_BREAKPOINT;
889         return __LINE__;
890     }
891     TRACE_TERSE3("PAF_ASDT_initPhaseMalloc. (gpAudioFrameSlave) %d bytes from space %d at 0x%x.",
892             DECODEN * sizeof (PAF_AudioFrame),
893             HEAP_ID_INTERNAL1, (IArg)gpDecAudioFrame);
895     TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: initialization phase - memory allocation complete.", as+zMS);
896     TRACE_TERSE1("PAF_ASDT_initPhaseMalloc: AS%d: initialization phase - memory allocation complete.", as+zMS);
897     return 0;
898 } //PAF_ASDT_initPhaseMalloc
900 // -----------------------------------------------------------------------------
901 // AST Initialization Function - Memory Initialization from Configuration
902 //
903 //   Name:      PAF_AST_initPhaseConfig
904 //   Purpose:   Audio Stream Task Function for initialization of data values
905 //              from parameters.
906 //   From:      audioStream1Task or equivalent
907 //   Uses:      See code.
908 //   States:    x
909 //   Return:    0 on success.
910 //              Other as per initFrame0 and initFrame1.
911 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
912 //              * State information as per parent.
913 //
915 Int
916 PAF_ASDT_initPhaseConfig(
917     const PAF_ASDT_Params *pP, 
918     const PAF_ASDT_Patchs *pQ, 
919     PAF_ASDT_Config *pC
922     PAF_AST_Config *pAstCfg;
923     Int as;                    /* Audio Stream Number (1, 2, etc.) */
924     Int zMS;
925     Int z;
927     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
928     as = pAstCfg->as;
929     zMS = pAstCfg->masterStr;
930     
931     TRACE_TERSE1("PAF_ASDT_initPhaseConfig: AS%d: initialization phase - configuration", as+zMS);
933     // overwrite pointer to audio frame in framework decode control
934     for (z=DECODE1; z < DECODEN; z++) 
935     {
936         //Int zS = pP->streamsFromDecodes[z]; // FL: formerly on master
937         //pC->xDec[z].decodeControl.pAudioFrame = pC->xStr[zS].pAudioFrame; FL: formerly on master
938         //pC->xDec[z].decodeInStruct.pAudioFrame = pC->xStr[zS].pAudioFrame; FL: formerly on master
939         pAstCfg->xDec[z].decodeControl.pAudioFrame = &gpDecAudioFrame[z];
940         pAstCfg->xDec[z].decodeInStruct.pAudioFrame = &gpDecAudioFrame[z];
941         pAstCfg->xDec[z].decodeStatus = *pP->z_pDecodeStatus[z];
942         pP->fxns->initFrame0(pP, pQ, pC, z);
943     }
945     return 0;
946 }  //PAF_ASDT_initPhaseConfig
948 // -----------------------------------------------------------------------------
949 // AST Initialization Function - ACP Algorithm Instantiation
950 //
951 //   Name:      PAF_AST_initPhaseAcpAlg
952 //   Purpose:   Audio Stream Task Function for initialization of ACP by
953 //              instantiation of the algorithm.
954 //   From:      audioStream1Task or equivalent
955 //   Uses:      See code.
956 //   States:    x
957 //   Return:    0 on success.
958 //              Source code line number on ACP Algorithm creation failure.
959 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
960 //              * State information as per parent.
961 //              * Memory allocation errors.
962 //
963 Int
964 PAF_ASDT_initPhaseAcpAlg(
965     const PAF_ASDT_Params *pP, 
966     const PAF_ASDT_Patchs *pQ, 
967     PAF_ASDT_Config *pC
970     PAF_AST_Config *pAstCfg;
971     Int as;                    /* Audio Stream Number (1, 2, etc.) */
972     Int z;                     /* input/encode/stream/decode/output counter */
973     Int betaPrimeOffset;
974     ACP_Handle acp;
975     Int zMS;
976     Int zS; //, zX;
978     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
979     as = pAstCfg->as;
980     zMS = pAstCfg->masterStr;    
982     TRACE_TERSE1("PAF_ASDT_initPhaseAcpAlg: AS%d: initialization phase - ACP Algorithm", as+zMS);
984     ACP_MDS_init();
986     if (!(acp = (ACP_Handle)ACP_MDS_create(NULL))) 
987     {
988         TRACE_TERSE1("PAF_ASDT_initPhaseAcpAlg: AS%d: ACP algorithm instance creation  failed", as+zMS);
989         return __LINE__;
990     }
991     pC->acp = acp;
993     ((ALG_Handle)acp)->fxns->algControl((ALG_Handle)acp,
994         ACP_GETBETAPRIMEOFFSET, (IALG_Status *)&betaPrimeOffset);
996     for (z=DECODE1; z < DECODEN; z++) 
997     {
998         zS = pP->streamsFromDecodes[z];
999         acp->fxns->attach(acp, ACP_SERIES_STD,
1000             STD_BETA_DECODE + betaPrimeOffset * (as-1+zS),
1001             (IALG_Status *)&pAstCfg->xDec[z].decodeStatus);
1002         /* Ignore errors, not reported. */
1003     }
1005     TRACE_TERSE1("PAF_ASDT_initPhaseAcpAlg: AS%d: initialization phase - ACP Algorithm complete.", as+zMS);
1007     return 0;
1008 } //PAF_AST_initPhaseAcpAlg
1010 // -----------------------------------------------------------------------------
1011 // AST Initialization Function - Common Memory and Algorithms
1012 //
1013 //   Name:      PAF_AST_initPhaseCommon
1014 //   Purpose:   Audio Stream Task Function for initialization of data pointers
1015 //              by allocation for common memory and by instantiation for
1016 //              algorithms.
1017 //   From:      audioStream1Task or equivalent
1018 //   Uses:      See code.
1019 //   States:    x
1020 //   Return:    0 on success.
1021 //              Source code line number on PAF_ALG_alloc failure.
1022 //              Source code line number on PAF_ALG_mallocMemory failure.
1023 //              Source code line number on Decode Chain initialization failure.
1024 //              Source code line number on ASP Chain initialization failure.
1025 //              Source code line number on Encode Chain initialization failure.
1026 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
1027 //              * State information as per parent.
1028 //              * Memory allocation errors.
1029 //
1031 #include <pafsio_ialg.h>
1033 Int
1034 PAF_ASDT_initPhaseCommon(
1035     const PAF_ASDT_Params *pP, 
1036     const PAF_ASDT_Patchs *pQ, 
1037     PAF_ASDT_Config *pC
1040     PAF_AST_Config *pAstCfg;
1041     Int as;                         /* Audio Stream Number (1, 2, etc.) */
1042     Int z;                          /* stream counter */
1043     //Int g;                        /* gear */
1044     ACP_Handle acp;
1045     PAF_IALG_Config pafAlgConfig;
1046     IALG_MemRec common[3][PAF_IALG_COMMON_MEMN+1];
1047    
1048     acp = pC->acp; // get acp handle
1049     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
1050     as = pAstCfg->as;
1051     
1052     TRACE_TERSE0("PAF_ASDT_initPhaseCommon: initialization phase - Common Memory");
1054     //
1055     // Determine memory needs and instantiate algorithms across audio streams
1056     //
1058     TRACE_TERSE0("PAF_ASDT_initPhaseCommon: calling PAF_ALG_setup.");
1059     PAF_ALG_setup(&pafAlgConfig, 
1060         HEAP_ID_INTERNAL,               HEAP_INTERNAL, 
1061         HEAP_ID_INTERNAL1,              HEAP_INTERNAL1, 
1062         HEAP_ID_EXTERNAL,               HEAP_EXTERNAL, 
1063         HEAP_ID_INTERNAL1_SHM,          HEAP_INTERNAL1_SHM, 
1064         HEAP_ID_EXTERNAL_SHM,           HEAP_EXTERNAL_SHM, 
1065         HEAP_ID_EXTERNAL_NONCACHED_SHM, HEAP_EXTERNAL_NONCACHED_SHM,
1066         HEAP_CLEAR);
1068     if (pP->fxns->headerPrint)
1069         pP->fxns->headerPrint();
1071     for (z=STREAM1; z < STREAMN; z++) 
1072     {
1073         //Int zD, zE, zX;
1074         Int zD, zX;
1076         TRACE_TERSE1("PAF_ASDT_initPhaseCommon: AS%d: initialization phase - Common Algorithms", as+z);
1078         //
1079         // Determine common memory needs of Decode Algorithms
1080         //
1081         PAF_ALG_init (common[z], lengthof (common[z]), COMMONSPACE);
1083         zD = -1;
1084         for (zX = DECODE1; zX < DECODEN; zX++) 
1085         {
1086             if (pP->streamsFromDecodes[zX] == z) 
1087             {
1088                 zD = zX;
1089                 break;
1090             }
1091         }
1093         if (zD >= 0) 
1094         {
1095             TRACE_TERSE1("PAF_ASDT_initPhaseCommon: calling PAF_ALG_ALLOC for decoder common[%d].", z);
1096             if (PAF_ALG_ALLOC (decLinkInit[zD-DECODE1], common[z])) 
1097             {
1098                 TRACE_TERSE3("AS%d: %s.%d: PAF_ALG_alloc failed", as+z, (IArg)__FUNCTION__, __LINE__);
1099                 TRACE_TERSE2("Failed to alloc %d bytes from space %d", common[z]->size, common[z]->space);
1101                 SW_BREAKPOINT;
1102                 return __LINE__;
1103             }
1104             TRACE_TERSE3("alloced %d bytes from space %d at 0x%x", common[z]->size, common[z]->space, (IArg)common[z]->base);
1105             if(pP->fxns->allocPrint)
1106                 pP->fxns->allocPrint ((const PAF_ALG_AllocInit *)(decLinkInit[z-DECODE1]),sizeof (*(decLinkInit[z-DECODE1])), &pafAlgConfig);
1107         }
1109 #if 0 // FL: master
1110         TRACE_TERSE3("%s.%d: calling PAF_ALG_ALLOC for stream common[%d].", (IArg)__FUNCTION__, __LINE__, z);
1111         TRACE_TERSE3("%s.%d: calling PAF_ALG_ALLOC for stream common[%d].", (IArg)__FUNCTION__, __LINE__, z);
1112         if (PAF_ALG_ALLOC (aspLinkInit[z-STREAM1][0], common[z])) 
1113         {
1114             TRACE_TERSE3("AS%d: %s.%d: PAF_ALG_alloc failed", as+z, (IArg)__FUNCTION__, __LINE__);
1115             TRACE_TERSE2("Failed to alloc %d bytes from space %d ", common[z]->size, common[z]->space);
1116             SW_BREAKPOINT;
1117             return __LINE__;
1118         }
1119         TRACE_TERSE3("alloced %d bytes from space %d at 0x%x", common[z]->size, common[z]->space, (IArg)common[z]->base);
1120         if(pP->fxns->allocPrint)
1121             pP->fxns->allocPrint((const PAF_ALG_AllocInit *)(aspLinkInit[z-STREAM1][0]), sizeof (*(aspLinkInit[z-STREAM1][0])), &pafAlgConfig);
1122 #endif
1123         
1124     }
1125     {
1126         // Changes made to share scratch between zones
1127         // Assume maximum 3 zones and scratch common memory is at offset 0;
1128         int max=0;
1129         for (z=STREAM1; z < STREAMN; z++)
1130         {
1131             if (max<common[z][0].size)
1132                 max=common[z][0].size;
1133         }
1134         common[STREAM1][0].size=max;
1135         for (z=STREAM1+1; z < STREAMN; z++)
1136             common[z][0].size=0;
1137     }
1138     
1139     //
1140     // Provide common memory needs of Decode Algorithms
1141     //
1142     for (z=STREAM1; z < STREAMN; z++) 
1143     {
1144         //Int zD, zE, zX;
1145         Int zD, zX;
1147         zD = -1;        
1148         for (zX = DECODE1; zX < DECODEN; zX++) 
1149         {
1150            if (pP->streamsFromDecodes[zX] == z) 
1151            {
1152                zD = zX;
1153                break;
1154            }
1155         }
1157         TRACE_TERSE0("PAF_ASDT_initPhaseCommon: calling PAF_ALG_mallocMemory for common space.");
1158         if (PAF_ALG_mallocMemory (common[z], &pafAlgConfig)) 
1159         {
1160             TRACE_TERSE3("AS%d: %s.%d: PAF_ALG_mallocMemory failed", as+z, (IArg)__FUNCTION__, __LINE__);
1161             TRACE_TERSE3("AS%d: z: %d.  Size 0x%x", as+z, z, common[z][0].size);
1162             SW_BREAKPOINT;
1163             return __LINE__;
1164         }
1165         TRACE_TERSE3("alloced %d bytes from space %d at 0x%x", common[z]->size, common[z]->space, (IArg)common[z]->base);
1166         // share zone0 scratch with all zones 
1167         common[z][0].base=common[0][0].base;
1168         if (pP->fxns->commonPrint)
1169                 pP->fxns->commonPrint (common[z], &pafAlgConfig);
1171         //
1172         // Instantiate Decode Algorithms
1173         //
1174         if (zD >= 0) 
1175         {
1176             PAF_ASP_Chain *chain;
1177             TRACE_TERSE0("PAF_ASDT_initPhaseCommon: calling PAF_ASP_chainInit for decode.");
1178             chain =
1179                 PAF_ASP_chainInit (&pAstCfg->xDec[zD].decChainData, pP->pChainFxns,
1180                                    HEAP_INTERNAL, as+z, acp, &trace,
1181                                    decLinkInit[zD-DECODE1], NULL, common[z], &pafAlgConfig);
1182             if (!chain) 
1183             {
1184                 TRACE_TERSE1("PAF_ASDT_initPhaseCommon: AS%d: Decode chain initialization failed", as+z);
1185                 return __LINE__;
1186             }
1187         }
1189 #if 0 // FL: master
1190         pC->xStr[z].aspChain[0] = NULL;
1191         for (g=0; g < GEARS; g++) 
1192         {
1193             PAF_ASP_Chain *chain;
1194             TRACE_TERSE2("%s.%d: calling PAF_ASP_chainInit for ASPs.", (IArg)__FUNCTION__, __LINE__);
1195             chain =
1196                 PAF_ASP_chainInit (&pC->xStr[z].aspChainData[g], pP->pChainFxns,
1197                                    HEAP_INTERNAL, as+z, acp, &trace,
1198                                    aspLinkInit[z-STREAM1][g], pC->xStr[z].aspChain[0], common[z], &pafAlgConfig);
1199             if (! chain) 
1200             {
1201                 TRACE_TERSE2("AS%d: ASP chain %d initialization failed", as+z, g);
1202                 return __LINE__;
1203             }
1204             else
1205                 pC->xStr[z].aspChain[g] = chain;
1206         }
1207 #endif
1209     }
1210     TRACE_TERSE1("PAF_ASDT_initPhaseCommon: AS%d: Returning complete.", as+z);
1212     return 0;
1213 } //PAF_ASDT_initPhaseCommon
1215 // -----------------------------------------------------------------------------
1216 // AST Initialization Function - Algorithm Keys
1217 //
1218 //   Name:      PAF_AST_initPhaseAlgKey
1219 //   Purpose:   Audio Stream Task Function for initialization of data values
1220 //              from parameters for Algorithm Keys.
1221 //   From:      audioStream1Task or equivalent
1222 //   Uses:      See code.
1223 //   States:    x
1224 //   Return:    0.
1225 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
1226 //              * State information as per parent.
1227 //
1228 // .............................................................................
1229 Int
1230 PAF_ASDT_initPhaseAlgKey(
1231     const PAF_ASDT_Params *pP, 
1232     const PAF_ASDT_Patchs *pQ, 
1233     PAF_ASDT_Config *pC
1236     PAF_AST_Config *pAstCfg;
1237     Int as;                     /* Audio Stream Number (1, 2, etc.) */
1238     Int z;                      /* decode/encode counter */
1239     Int s;                      /* key number */
1240     PAF_ASP_Link *that;
1242     (void)as;  // clear warning.
1244     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
1245     as = pAstCfg->as;
1246     
1247     TRACE_VERBOSE1("PAF_ASDT_initPhaseAlgKey: AS%d: initialization phase - Algorithm Keys", as);
1249     for (z=DECODE1; z < DECODEN; z++) 
1250     {
1251         for (s=0; s < pP->pDecAlgKey->length; s++) 
1252         {
1253             if ((pP->pDecAlgKey->code[s].full != 0)
1254                 && (that = PAF_ASP_chainFind (&pAstCfg->xDec[z].decChainData, pP->pDecAlgKey->code[s])))
1255             {
1256                 pAstCfg->xDec[z].decAlg[s] = (ALG_Handle )that->alg;
1257                     /* Cast in interface, for now --Kurt */
1258             }
1259             else
1260                 pAstCfg->xDec[z].decAlg[s] = NULL;
1261         }
1262     }
1264     return 0;
1265 } //PAF_AST_initPhaseAlgKey
1267 //   Purpose:   Audio Stream Decode Task Function for initialization of the Audio
1268 //              Frame(s) by memory allocation and loading of data pointers
1269 //              and values.
1270 Int
1271 PAF_ASDT_initFrame0(
1272     const PAF_ASDT_Params *pP, 
1273     const PAF_ASDT_Patchs *pQ, 
1274     PAF_ASDT_Config *pC, 
1275     Int z
1278     PAF_AST_Config *pAstCfg;
1279     Int as;                    /* Audio Stream Number (1, 2, etc.) */
1280     Int aLen;
1281     Int aSize = sizeof(PAF_AudioData);
1282     Int aAlign = aSize < sizeof (int) ? sizeof (int) : aSize;
1283     Int maxFrameLength = pP->maxFramelength;
1284     PAF_AudioData *aBuf=NULL;
1285     XDAS_UInt8 *metadataBuf;
1286     Error_Block    eb;
1287     PAF_AudioFrame *pAudioFrame;
1288     Int i;
1290     pAstCfg = pC->pAstCfg; // get pointer to common (shared) configuration
1291     as = pAstCfg->as;
1293     pAudioFrame = &gpDecAudioFrame[z];
1294     if (pAudioFrame == NULL)
1295     {
1296         SW_BREAKPOINT;
1297     }
1298     
1299     // Initialize error block
1300     Error_init(&eb); 
1301     
1302     //maxFrameLength += PA_MODULO - maxFrameLength % PA_MODULO; // compute maximum framelength (needed for ARC support)
1303     //aLen = numchan[z] * maxFrameLength;
1304     aLen = numchan[z] * maxFrameLength + (maxFrameLength - FRAMELENGTH); /* Qin - need additional memory for starting offset
1305                                                                                       See line 1301 */
1307     //
1308     // Initialize audio frame elements directly
1309     //
1310     pAudioFrame->fxns = pP->pAudioFrameFunctions;
1311     pAudioFrame->data.nChannels = PAF_MAXNUMCHAN;
1312     pAudioFrame->data.nSamples = FRAMELENGTH;
1313     pAudioFrame->data.sample = gDecAudioFrameChannelPointers;
1314     pAudioFrame->data.samsiz = gDecAudioFrameChannelSizes;
1315     pAudioFrame->pChannelConfigurationMaskTable = &PAF_ASP_stdCCMT;
1317     //
1318     // Allocate memory for and initialize pointers to audio data buffers
1319     //
1320     //   The NUMCHANMASK is used to identify the channels for which data
1321     //   buffers can be allocated. Using this mask and switch statement
1322     //   rather than some other construct allows efficient code generation,
1323     //   providing just the code necessary (with significant savings).
1324     //
1325     if (pP->fxns->bufMemPrint)
1326     {
1327         pP->fxns->bufMemPrint(z, aLen*aSize, HEAP_ID_FRMBUF, 2);
1328     }
1330     TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc for audio buffers", as+z);
1331     
1332     if (aLen != 0)
1333     {
1334         if (!(aBuf = (PAF_AudioData *)Memory_calloc((IHeap_Handle)HEAP_FRMBUF, aLen*aSize, aAlign, &eb)))
1335         {
1336             TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc failed", as+z);
1337             TRACE_TERSE2("  maxFrameLength: %d.  aLen*aSize: %d", maxFrameLength, aLen*aSize);
1338             SW_BREAKPOINT;
1339             return __LINE__;
1340         }
1341     }
1343     TRACE_TERSE3("  maxFrameLength: %d.  aLen*aSize: %d.  aBuf: 0x%x", maxFrameLength, aLen*aSize, (IArg)aBuf);
1345     TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc for metadata buffers", as+z);
1346     if (!(metadataBuf = (XDAS_UInt8 *)Memory_calloc((IHeap_Handle)HEAP_MDBUF, pP->pMetadataBufStatus->bufSize*pP->pMetadataBufStatus->NumBuf, pP->pMetadataBufStatus->alignment, &eb)))
1347     {
1348         TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: Memory_calloc failed", as+z);
1349         TRACE_TERSE1("  bufSize*NumBuf: %d", pP->pMetadataBufStatus->bufSize*pP->pMetadataBufStatus->NumBuf);
1350         SW_BREAKPOINT;
1351         return __LINE__;
1352     }
1354     for (i=0; i < PAF_MAXNUMCHAN_AF; i++)
1355     {
1356         gDecAudioFrameChannelPointers[i] = NULL;
1357     }
1359     if ((numchan[z] > PAF_MAXNUMCHAN) || (numchan[z] < 1)) 
1360     {
1361         TRACE_TERSE1("PAF_ASDT_initFrame0: AS%d: unsupported option", as+z);
1362         return __LINE__;
1363     }
1364     else 
1365     {
1366         Int j = 0;
1367         TRACE_TERSE1("PAF_ASDT_initFrame0: AFChanPtrMap[%d][i]", numchan[z]);
1368         for (i=0; i<numchan[z]; i++)
1369         {
1370             Int8 chan = AFChanPtrMap[numchan[z]][i];
1371             if (chan != -1)
1372             {
1373                 gDecAudioFrameChannelPointers[chan] = aBuf + maxFrameLength*(j+1) - FRAMELENGTH;
1374                 j++;
1375                 TRACE_TERSE3("PAF_ASDT_initFrame0: chan = %d = AFChanPtrMap[%d][%d].", chan, numchan[z], i);
1376                 TRACE_TERSE2("PAF_ASDT_initFrame0: audioFrameChannelPointers[%d]: 0x%x", chan, (IArg)gDecAudioFrameChannelPointers[chan]);
1377             }
1378         }
1379     }
1381     // Initialize original audio frame channel pointers
1382     for (i=PAF_LEFT; i < PAF_MAXNUMCHAN_AF; i++) 
1383     {
1384         if (gDecAudioFrameChannelPointers[i])
1385         {
1386             gDecOrigAudioFrameChannelPointers[i] = gDecAudioFrameChannelPointers[i];
1387         }
1388     }
1390     //
1391     // Initialize meta data elements
1392     //
1393     pAudioFrame->pafBsMetadataUpdate = XDAS_FALSE;
1394     pAudioFrame->numPrivateMetadata = 0;
1395     pAudioFrame->bsMetadata_offset = 0;
1396     pAudioFrame->bsMetadata_type = PAF_bsMetadata_channelData;
1397     pAudioFrame->privateMetadataBufSize = pP->pMetadataBufStatus->bufSize;
1398     for (i=0; i<pP->pMetadataBufStatus->NumBuf; i++)
1399     {
1400         pAudioFrame->pafPrivateMetadata[i].offset = 0;
1401         pAudioFrame->pafPrivateMetadata[i].size = 0;
1402         pAudioFrame->pafPrivateMetadata[i].pMdBuf = metadataBuf + pP->pMetadataBufStatus->bufSize*i;
1403     }
1405     return 0;
1406 } //PAF_ASDT_initFrame0
1408 // -----------------------------------------------------------------------------
1409 // ASOT Initialization Function Helper - Reinitialization of Audio Frame
1410 // AST Decoding Function              - Reinitialization of Audio Frame
1411 //
1412 //   Name:      PAF_ASOT_initFrame1
1413 //   Purpose:   Audio Stream Task Function for initialization or reinitiali-
1414 //              zation of the Audio Frame(s) by loading of data values of a
1415 //              time-varying nature.
1416 //   From:      audioStream1Task or equivalent
1417 //              AST Parameter Function -> decodeInfo
1418 //              AST Parameter Function -> decodeDecode
1419 //   Uses:      See code.
1420 //   States:    x
1421 //   Return:    0.
1422 //   Trace:     None.
1423 //
1424 Int
1425 PAF_ASDT_initFrame1(
1426     const PAF_ASDT_Params *pP, 
1427     const PAF_ASDT_Patchs *pQ, 
1428     PAF_ASDT_Config *pC, 
1429     Int z, 
1430     Int apply
1433     PAF_AudioFrame *pAudioFrame;
1435     //
1436     // Reinitialize audio frame elements:
1437     //
1438     //   Channel Configurations during sys init                 = Unknown
1439     //      "          "        during info or decode           = None
1440     //
1441     //   Sample Rate / Count    during sys init, info or decode = Unknown / 0
1442     //
1444     pAudioFrame = &gpDecAudioFrame[z];
1446     if (apply < 0) 
1447     {
1448         pAudioFrame->channelConfigurationRequest.legacy = PAF_CC_UNKNOWN;
1449         pAudioFrame->channelConfigurationStream.legacy = PAF_CC_UNKNOWN;
1450     }
1451     else 
1452     {
1453         pAudioFrame->channelConfigurationRequest.legacy = PAF_CC_NONE;
1454         pAudioFrame->channelConfigurationStream.legacy = PAF_CC_NONE;
1455     }
1457     if (apply < 1) 
1458     {
1459         pAudioFrame->sampleRate = PAF_SAMPLERATE_UNKNOWN;
1460         pAudioFrame->sampleCount = 0;
1461     }
1463     return 0;
1464 } //PAF_ASDT_initFrame1
1466 // Reset AF, invoked during decode ACTIVATE (during state=INIT on Master)
1467 Int resetAf(
1468     const PAF_ASDT_Params *pP, 
1469     Int z, 
1470     Int sourceSelect
1473     PAF_AudioFrame *pAudioFrame;
1474     Int ch;
1475     Int i;
1477     // Get audio frame
1478     pAudioFrame = &gpDecAudioFrame[z];
1479     if (pAudioFrame == NULL)
1480     {
1481         SW_BREAKPOINT;
1482     }
1484     // Reinitialize audio frame elements
1485     pAudioFrame->channelConfigurationRequest.legacy = PAF_CC_NONE;
1486     pAudioFrame->channelConfigurationStream.legacy = PAF_CC_NONE;
1487     pAudioFrame->sampleRate = PAF_SAMPLERATE_UNKNOWN;
1488     pAudioFrame->sampleCount = 0;
1489     pAudioFrame->data.nChannels = PAF_MAXNUMCHAN;
1490     
1491     switch (sourceSelect)
1492     {
1493         case PAF_SOURCE_PCM:
1494             pAudioFrame->data.nSamples = FRAMELENGTH;
1495             break;
1496         case PAF_SOURCE_AC3:
1497         case PAF_SOURCE_DDP:
1498             pAudioFrame->data.nSamples = 1536;
1499             break;
1500         case PAF_SOURCE_THD:
1501             pAudioFrame->data.nSamples = 5120; //QIN FIX ME
1502             break;
1503         default:  
1504             pAudioFrame->data.nSamples = FRAMELENGTH;
1505             break;
1506     }
1508     // Reset audio frame channel pointers
1509     for (ch=PAF_LEFT; ch < PAF_MAXNUMCHAN_AF; ch++) 
1510     {
1511         if (gDecAudioFrameChannelPointers[ch])
1512         {
1513             gDecAudioFrameChannelPointers[ch] = gDecOrigAudioFrameChannelPointers[ch];
1514         }
1515     }
1516     
1517     // Reset audio frame meta data elements
1518     pAudioFrame->pafBsMetadataUpdate = XDAS_FALSE;
1519     pAudioFrame->numPrivateMetadata = 0;
1520     pAudioFrame->bsMetadata_offset = 0;
1521     pAudioFrame->bsMetadata_type = PAF_bsMetadata_channelData;
1522     for (i=0; i<pP->pMetadataBufStatus->NumBuf; i++)
1523     {
1524         pAudioFrame->pafPrivateMetadata[i].offset = 0;
1525         pAudioFrame->pafPrivateMetadata[i].size = 0;
1526     }
1527     
1528     return 0;
1531 // Reset AF samsiz, invoked during DECODE
1532 Int resetAfSamsiz(
1533     Int z
1536     PAF_AudioFrame *pAudioFrame;
1537     Int ch;
1538     
1539     // Get audio frame
1540     pAudioFrame = &gpDecAudioFrame[z];
1541     if (pAudioFrame == NULL)
1542     {
1543         SW_BREAKPOINT;
1544     }
1545     
1546     // Clear samsiz for all channels - MID 208.
1547     for (ch=0; ch < PAF_MAXNUMCHAN_AF; ch++) 
1548     {
1549         pAudioFrame->data.samsiz[ch] = 0;
1550     }
1552     return 0;