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