b25a449a12bcd475bd4f162dc7ab27b0df71acd3
[processor-sdk/performance-audio-sr.git] / pasdk / common / asp0.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 //
38 // Performance Audio Framework Series 3 -- Audio Stream Processing Definitions
39 //
40 //
41 //
43 #include "fwkPort.h"
45 #include <xdc/std.h>
47 //#include <mem.h>
48 #include <xdc/runtime/Log.h>
49 #include <xdc/runtime/Memory.h>
50 #include <xdc/runtime/Error.h>
51 #include <xdc/runtime/IHeap.h>
52 #include <ti/sysbios/heaps/HeapMem.h>
55 #define PROFILER
57 #ifdef PROFILER
58 #include <ti/sysbios/knl/Task.h>
59 #include "ti/sysbios/knl/Clock.h"
60 #include "xdc/runtime/Timestamp.h"
61 #include "ti/sysbios/utils/Load.h"
63 #ifndef MAX_NUM
64 #define MAX_NUM 28515
65 #endif
66 UInt32 profile_array_dsp_cycles[MAX_NUM];
67 UInt32 profile_array_dsp_cpuload[MAX_NUM];
68 UInt32 profile_index = 0;
69 UInt32 start_profiling = 0;
70 #endif
72 //
73 #include "asp0.h"
74 //#include <paf_alg.h>
75 //#include <pafhjt.h>
77 #include <acp.h>
79 #include "logp.h"
81 //
82 // Audio Stream Processing Chain Function - Initialization
83 //
84 //   Name:      PAF_ASP_chainInit_
85 //   Purpose:   Initialize an ASP Chain by linking all elements of an
86 //              initialization array onto it. If this is the first audio
87 //              stream, perform base initialization of the ASP Chain, but 
88 //              otherwise do not.
89 //   From:      AST Parameter Chain Function -> chainInit
90 //   Uses:      AST Parameter Chain Function -> chainLink
91 //   States:    None.
92 //   Return:    ASP Chain.
93 //   Trace:     None.
94 //
96 PAF_ASP_Chain *
97 PAF_ASP_chainInit_ (
98     PAF_ASP_Chain *this,
99     const struct PAF_ASP_ChainFxns *fxns,
100     HeapMem_Handle heap, //int heap,
101     Uns stream,
102     ACP_Handle acp,
103     LOG_Obj *log,
104     const PAF_ASP_LinkInit *pInit,
105     PAF_ASP_Chain *from,
106     IALG_MemRec *common,
107     PAF_IALG_Config *pafConfig)
109     if (stream) {
110         this->fxns = fxns;
111         this->head = NULL;
112         this->stream = stream;
113         this->acp = acp;
114         this->log = log;
115     }
117     for ( ; pInit && pInit->thisCode.full; pInit++)
118         if (! this->fxns->chainLink (this, heap, pInit, from, common, pafConfig))
119             return NULL;
121     return this;
124 //
125 // Audio Stream Processing Chain Function - Link
126 //
127 //   Name:      PAF_ASP_chainLink_
128 //   Purpose:   Link an element onto an ASP Chain:
129 //              (1) Allocate memory for the link, and
130 //              (2) For the first gear, create the data for the link, but
131 //              (3) For other than the first gear, simply link the data already
132 //                  created in the previous gear.
133 //   From:      AST Parameter Chain Function -> chainInit
134 //   Uses:      See code.
135 //   States:    None.
136 //   Return:    Success: ASP Chain.
137 //              Failure: Null.
138 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
139 //              * Memory allocation errors.
140 //              * Data creation errors.
141 //              * Data linking errors.
142 //
145 PAF_ASP_Chain *
146 PAF_ASP_chainLink_ (
147     PAF_ASP_Chain *this,
148     HeapMem_Handle heap, //int heap,
149     const PAF_ASP_LinkInit *pInit,
150     PAF_ASP_Chain *from,
151     IALG_MemRec *common,
152     PAF_IALG_Config *pafConfig)
154     PAF_ASP_Link *pLink;
155     Error_Block    eb;
157     if (! this || ! pInit)
158         return this;
160     // Initialize error block
161     Error_init(&eb); 
163     //if (! (pLink = MEM_alloc (heap, sizeof(PAF_ASP_Link), 4))) {
164     if (!(pLink = Memory_alloc((IHeap_Handle)heap, sizeof(PAF_ASP_Link), 4, &eb))) {
165         if (this->log)
166             LOG_printf(this->log, "AS%d: ASP code 0x%08x alloc failure", 
167                 this->stream, pInit->thisCode.full);
168         return NULL;
169     }
171     if (! from) {
172         if (! this->fxns->linkData(pLink, pInit, this->stream, this->acp, 
173             this->log,common, pafConfig)) {
174             if (this->log)
175                 LOG_printf(this->log, "AS%d: ASP code 0x%08x link-init failure",
176                     this->stream, pInit->thisCode.full);
177             return NULL;
178         }
179     }
180     else {
181         if (! this->fxns->linkCopy(pLink, pInit, from->head)) {
182             if (this->log)
183                 LOG_printf(this->log, "AS%d: ASP code 0x%08x link-copy failure",
184                     this->stream, pInit->thisCode.full);
185             return NULL;
186         }
187     }
189     {
190         PAF_ASP_Link **ppLink;
191         for (ppLink=&this->head; *ppLink; ppLink=&(*ppLink)->next)
192             if ((*ppLink)->code.full == pInit->linkCode.full)
193                 break;
194         pLink->next = *ppLink;
195         *ppLink = pLink;
196     }
198     return this;
201 //
202 // Audio Stream Processing Chain Function - Find
203 //
204 //   Name:      PAF_ASP_chainFind_
205 //   Purpose:   Find an element in an ASP Chain.
206 //   From:      AST Parameter Chain Function -> chainFind
207 //   Uses:      None.
208 //   States:    None.
209 //   Return:    Success (found): Pointer to element.
210 //              Failure (not found): Null.
211 //   Trace:     None.
212 //
214 PAF_ASP_Link *
215 PAF_ASP_chainFind_ (
216     PAF_ASP_Chain *this,
217     PAF_ASP_AlphaCode code)
219     PAF_ASP_Link *that = this->head;
221     for ( ; that; that = that->next) {
222         if (that->code.full == code.full)
223             break;
224     }
226     return that;
229 //
230 // Audio Stream Processing Chain Function - Reset
231 //
232 //   Name:      PAF_ASP_chainReset_
233 //   Purpose:   Reset an ASP Chain by invoking for each element:
234 //              (1) The algorithm activation function (NOT PERFORMED), and
235 //              (2) The algorithm reset function.
236 //   From:      AST Parameter Chain Function -> chainReset
237 //   Uses:      See code.
238 //   States:    None.
239 //   Return:    0 on success.
240 //              Error number reported by ASP Reset Function on failure.
241 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
242 //              * ASP Reset Function errors.
243 //
245 Int
246 PAF_ASP_chainReset_ (PAF_ASP_Chain *this, PAF_AudioFrame *pAudioFrame)
248     Int errno;
250     PAF_ASP_Link *pLink;
252     for (pLink=this->head; pLink; pLink=pLink->next) {
253         ASP_Handle alg = pLink->alg;
254 #if 0
255         /* ASP Algorithms are self-activating and not framework-activated */
256         if (((ALG_Handle )alg)->fxns->algActivate)
257             ((ALG_Handle )alg)->fxns->algActivate (((ALG_Handle )alg));
258 #endif
259         if (alg->fxns->reset && (errno = alg->fxns->reset(alg, pAudioFrame))) {
260             if (this->log) {
261                 LOG_printf(this->log, "AS%d: ASP code 0x%08x reset error",
262                     this->stream, pLink->code.full);
263                 LOG_printf(this->log, "AS%d: errno = 0x%08x", 
264                     this->stream, errno);
265             }
266             return errno;
267         }
268     }
270     return 0;
273 //
274 // Audio Stream Processing Chain Function - Apply
275 //
276 //   Name:      PAF_ASP_chainApply_
277 //   Purpose:   Apply an ASP Chain by invoking for each:
278 //              (1) The algorithm apply function.
279 //   From:      AST Parameter Chain Function -> chainApply
280 //   Uses:      See code.
281 //   States:    None.
282 //   Return:    0 on success.
283 //              Error number reported by ASP Apply Function on failure.
284 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
285 //              * ASP Apply Function errors.
286 //
288 Int
289 PAF_ASP_chainApply_ (PAF_ASP_Chain *this, PAF_AudioFrame *pAudioFrame)
291     Int errno;
292     int i = 0;
294     PAF_ASP_Link *pLink;
296     for (pLink=this->head; pLink; pLink=pLink->next)
297     {
298         ASP_Handle alg = pLink->alg;
300         i++;
301         if (this->log)
302         {
303             LOG_printf(&trace, "PAF_ASP_chainApply_: AS_%d. link %d.  alg: 0x%x.",
304                        this->stream, i, alg);
305         }
306         Log_info3("PAF_ASP_chainApply_: AS_%d. link %d.  alg: 0x%x.", this->stream, i, (IArg)alg);
308         if (alg->fxns->apply /*&& (errno = alg->fxns->apply(alg, pAudioFrame))*/)
309         {
311 #ifdef PROFILER
312         {
313             volatile UInt32 time32_1, time32_2;
315             time32_1 = Timestamp_get32();
316 #endif
317             errno = alg->fxns->apply(alg, pAudioFrame);
319 #ifdef PROFILER
320             time32_2 = Timestamp_get32();
321             //Load_Stat stat;
322             //Load_getTaskLoad (Task_getIdleTask(), &stat);
323             //UInt32 intLoad = Load_calculateLoad (&stat);
324             if (start_profiling == 1)
325             {
326                 if (profile_index < MAX_NUM)
327                 {
328                     profile_array_dsp_cycles[profile_index] = (time32_2 - time32_1);
329                     //profile_array_dsp_cpuload[profile_index] = (100   - intLoad);
330                     profile_array_dsp_cpuload[profile_index] =  Load_getCPULoad();
331                     profile_index++;
332                 }
333                 else
334                 {
335                     //SW_BREAKPOINT;
336                 }
337             }
339             //TRACE_TERSE1("profiler: Timestamp_get32() cycles: %u", (time32_2 - time32_1) * factor);
340             //TRACE_TERSE2("profiler: CPU load: idle: %d other: %d", intLoad, (100 - intLoad));
341         }
342 #endif
344             if (errno && this->log)
345             {
346                 LOG_printf(this->log, "AS%d: ASP code 0x%08x apply error 0x%x.",
347                     this->stream, pLink->code.full, errno);
348                 LOG_printf(&trace, "AS%d: ASP code 0x%08x apply error 0x%x.",
349                     this->stream, pLink->code.full, errno);
350             }
351             return errno;
352         }
353     }
355     return 0;
358 //
359 // Audio Stream Processing Chain Function - Final
360 //
361 //   Name:      PAF_ASP_chainFinal_
362 //   Purpose:   Finalize an ASP Chain by invoking for each:
363 //              (1) The algorithm final function (NOT PERFORMED), and
364 //              (2) The algorithm deactivation function.
365 //   From:      AST Parameter Chain Function -> chainFinal
366 //   Uses:      See code.
367 //   States:    None.
368 //   Return:    0 on success.
369 //              Error number reported by ASP Final Function on failure.
370 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
371 //              * ASP Final Function errors.
372 //
373 //   Note:      In Audio Framework #2, PAF_ASP_FINAL is not defined and there
374 //              are no Final Functions supplied with ASP Algorithms.
376 Int
377 PAF_ASP_chainFinal_ (PAF_ASP_Chain *this, PAF_AudioFrame *pAudioFrame)
379 #ifdef PAF_ASP_FINAL
380     Int errno;
381 #endif /* PAF_ASP_FINAL */
383     PAF_ASP_Link *pLink;
385     for (pLink=this->head; pLink; pLink=pLink->next) {
386         ASP_Handle alg = pLink->alg;
387 #ifdef PAF_ASP_FINAL
388         if (alg->fxns->final && (errno = alg->fxns->final(alg, pAudioFrame))) {
389             if (this->log) {
390                 LOG_printf(this->log, "AS%d: ASP code 0x%08x final error",
391                     this->stream, pLink->code.full);
392                 LOG_printf(this->log, "AS%d: errno = 0x%08x", 
393                     this->stream, errno);
394             }
395             return errno;
396         }
397 #endif /* PAF_ASP_FINAL */
398 #if 1
399         /* ASP Algorithms are self-deactivating and framework-deactivated */
400         if (((ALG_Handle )alg)->fxns->algDeactivate)
401             ((ALG_Handle )alg)->fxns->algDeactivate (((ALG_Handle )alg));
402 #endif
403     }
405     return 0;
408 //
409 // Audio Stream Processing Chain Function - Link Data
410 //
411 //   Name:      PAF_ASP_linkData
412 //   Purpose:   Create the data for a chain link:
413 //              (1) Perform beta unit relocation,
414 //              (2) Instantiate an algorithm, and
415 //              (3) Attach the beta unit(s) of an algorithm to an ACP Algorithm
416 //                  instance.
417 //   From:      AST Parameter Chain Function -> linkData
418 //   Uses:      See code.
419 //   States:    None.
420 //   Return:    Null pointer on failure.
421 //              Pointer to the chain link on success.
422 //   Trace:     Message Log "trace" in Debug Project Configuration reports:
423 //              * Algorithm instance creation failure message.
424 //              * Beta Unit initialization success message.
425 //
427 PAF_ASP_Link *
428 PAF_ASP_linkData (
429     PAF_ASP_Link *this,
430     const PAF_ASP_LinkInit *pInit,
431     Uns stream,
432     ACP_Handle acp,
433     LOG_Obj *log,
434     IALG_MemRec *common,
435     PAF_IALG_Config *pafConfig) 
437     IALG_Status *pStatus;
438     
439     ALG_Handle alg;
440     
441     Int beta = pInit->thisCode.part.beta;
442         
443     if (log)
444         LOG_printf(log, "AS%d: beta 0x%x initialization begins.", stream, beta);
445     {
446         ALG_Handle acpAlg = (ALG_Handle) acp;
447         Int betaPrimeBase;
448         Int betaPrimeOffset;
449         acpAlg->fxns->algControl (acpAlg, ACP_GETBETAPRIMEBASE, 
450             (IALG_Status *) &betaPrimeBase);
451         acpAlg->fxns->algControl (acpAlg, ACP_GETBETAPRIMEOFFSET, 
452             (IALG_Status *) &betaPrimeOffset);
453         if (beta >= betaPrimeBase)
454             beta += (stream - 1) * betaPrimeOffset;
455     }
456     
457     this->next = NULL;
458     this->code = pInit->thisCode;
460     if (pInit->ialg_fxns) {
462         if (pInit->init_func)
463             (*pInit->init_func)();
465         if (! (alg = PAF_ALG_create(pInit->ialg_fxns,NULL,(IALG_Params *)pInit->ialg_prms,
466                      common, pafConfig))) {
467             if (log) {
468                 LOG_printf(log,
469                     "AS%d: beta 0x%x algorithm instance creation failed",
470                     stream, beta);
471             }
472             return NULL;
473         }
474     }
475     else
476         return NULL;
478     this->alg = (ASP_Handle )alg;
480     if (alg->fxns->algControl) {
481         if (! alg->fxns->algControl (alg, ACP_GETSTATUSADDRESS1, (IALG_Status *)&pStatus))
482             acp->fxns->attach (acp, pInit->thisCode.part.series, beta, pStatus);
483         if (! alg->fxns->algControl (alg, ACP_GETSTATUSADDRESS2, (IALG_Status *)&pStatus))
484             acp->fxns->attach (acp, pInit->thisCode.part.series, beta+1, pStatus);
485     }
487     if (log)
488         LOG_printf(log, "AS%d: beta 0x%x processing initialized", stream, beta);
490     return this;
493 //
494 // Audio Stream Processing Chain Function - Link Copy
495 //
496 //   Name:      PAF_ASP_linkCopy
497 //   Purpose:   Copy the data for a chain link:
498 //              (1) Find an element on a chain, and
499 //              (2) Copy the reference to the data of the link.
500 //   From:      AST Parameter Chain Function -> linkCopy
501 //   Uses:      See code.
502 //   States:    None.
503 //   Return:    Null pointer on failure.
504 //              Pointer to the chain link on success.
505 //   Trace:     None.
506 //
508 PAF_ASP_Link *
509 PAF_ASP_linkCopy (
510     PAF_ASP_Link *this,
511     const PAF_ASP_LinkInit *pInit,
512     PAF_ASP_Link *from)
514     for ( ; from; from = from->next) {
515         if (from->code.full == pInit->thisCode.full)
516             break;
517     }
519     if (! from)
520         return NULL;
522     this->next = NULL;
523     this->code = pInit->thisCode;
524     this->alg = from->alg;
526     return this;
529 //
530 // Audio Stream Processing Chain Functions
531 //
532 //   Name:      PAF_ASP_chainFxns
533 //   Purpose:   Collect the chain functions that embody the implementation 
534 //              of Audio Framework Number 2 for use as a jump table.
535 //   From:      PAF_AST_Params
536 //   Uses:      See contents.
537 //   States:    N.A.
538 //   Return:    N.A.
539 //   Trace:     None.
540 //
542 const struct PAF_ASP_ChainFxns PAF_ASP_chainFxns =
544     PAF_ASP_chainInit_,
545     PAF_ASP_chainLink_,
546     PAF_ASP_chainFind_,
547     {
548         PAF_ASP_chainReset_,
549         PAF_ASP_chainApply_,
550         PAF_ASP_chainFinal_,
551     },
552     PAF_ASP_linkData,
553     PAF_ASP_linkCopy,
554 };