1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License");
5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License.
6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at
7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *     http://www.apache.org/licenses/LICENSE-2.0
9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software
11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS,
12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and
14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License.
15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picosig.c
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Signal Generation PU - Implementation
20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved.
23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History:
25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version
26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h"
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodsp.h"
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picosig2.h"
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodata.h"
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picosig.h"
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h"
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpdf.h"
36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" {
39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0
41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOSIG_IN_BUFF_SIZE PICODATA_BUFSIZE_SIG   /*input buffer size for SIG */
45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOSIG_OUT_BUFF_SIZE PICODATA_BUFSIZE_SIG  /*output buffer size for SIG*/
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOSIG_COLLECT     0
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOSIG_SCHEDULE    1
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOSIG_PLAY        2
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOSIG_PROCESS     3
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOSIG_FEED        4
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*----------------------------------------------------------
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen // Internal function declarations
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen //---------------------------------------------------------*/
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picodata_step_result_t sigStep(register picodata_ProcessingUnit this,
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 mode, picoos_uint16 * numBytesOutput);
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*----------------------------------------------------------
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen // Name    :   sig_subobj
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen // Function:   subobject definition for the sig processing
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen // Shortcut:   sig
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen //---------------------------------------------------------*/
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct sig_subobj
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*----------------------PU voice management------------------------------*/
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* picorsrc_Voice voice; */
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*----------------------PU state management------------------------------*/
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 procState; /* where to take up work at next processing step */
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 retState;  /* where to return after next processing step */
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 needMoreInput; /* more data necessary to start processing   */
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*----------------------PU input management------------------------------*/
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inBuf[PICOSIG_IN_BUFF_SIZE]; /* internal input buffer */
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 inBufSize;/* actually allocated size */
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 inReadPos, inWritePos; /* next pos to read/write from/to inBuf*/
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*Input audio file management*/
78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char sInSDFileName[255];
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_SDFile sInSDFile;
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 sInSDFilePos;
81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*----------------------PU output management-----------------------------*/
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 outBuf[PICOSIG_OUT_BUFF_SIZE]; /* internal output buffer */
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 outBufSize;                /* actually allocated size */
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 outReadPos, outWritePos;  /* next pos to read/write from/to outBuf*/
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_bool outSwitch;                  /* output destination switch 0:buffer, 1:file*/
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char sOutSDFileName[255];        /* output file name */
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_SDFile sOutSDFile;               /* output file handle */
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_single fSampNorm;                /* running normalization factor */
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 nNumFrame;                /* running count for frame number in output items */
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*---------------------- other working variables ---------------------------*/
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 innerProcState; /*where to take up work at next processing step*/
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*-----------------------Definition of the local storage for this PU--------*/
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_innerobj_t sig_inner;
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_single pMod; /*pitch modifier*/
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_single vMod; /*Volume modifier*/
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_single sMod; /*speaker modifier*/
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*knowledge bases */
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokpdf_PdfMUL pdflfz, pdfmgc;
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 scmeanpowLFZ, scmeanpowMGC;
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 scmeanLFZ, scmeanMGC;
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokpdf_PdfPHS pdfphs;
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} sig_subobj_t;
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ******************************************************************************
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *   generic PU management
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ********************************************************************************/
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * initialization of the PU (processing unit)
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    this : sig PU object
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_OK : init ok
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_ERR_OTHER : init failed
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
117e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivistatic pico_status_t sigInitialize(register picodata_ProcessingUnit this, picoos_int32 resetMode)
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subobj_t *sig_subObj;
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_OTHER;
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj = (sig_subobj_t *) this->subObj;
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->inBufSize = PICOSIG_IN_BUFF_SIZE;
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->outBufSize = PICOSIG_OUT_BUFF_SIZE;
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->inReadPos = 0;
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->inWritePos = 0;
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->outReadPos = 0;
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->outWritePos = 0;
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->needMoreInput = 0;
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->procState = PICOSIG_COLLECT;
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->retState = PICOSIG_COLLECT;
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->innerProcState = 0;
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->nNumFrame = 0;
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*-----------------------------------------------------------------
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     * MANAGE Item I/O control management
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     ------------------------------------------------------------------*/
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->sInSDFile = NULL;
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->sInSDFilePos = 0;
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->sInSDFileName[0] = '\0';
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->outSwitch = 0; /*PU sends output to buffer (nextPU)*/
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->sOutSDFile = NULL;
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->sOutSDFileName[0] = '\0';
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj->nNumFrame = 0;
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*-----------------------------------------------------------------
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     * MANAGE LINGWARE INITIALIZATION IF NEEDED
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     ------------------------------------------------------------------*/
150e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivi    if (resetMode == PICO_RESET_FULL) {
1517bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        /*not done when resetting SOFT*/
1527bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->pdfmgc = picokpdf_getPdfMUL(
1537bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi                this->voice->kbArray[PICOKNOW_KBID_PDF_MGC]);
1547bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->pdflfz = picokpdf_getPdfMUL(
1557bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi                this->voice->kbArray[PICOKNOW_KBID_PDF_LFZ]);
1567bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->pdfphs = picokpdf_getPdfPHS(
1577bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi                this->voice->kbArray[PICOKNOW_KBID_PDF_PHS]);
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1597bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->scmeanpowLFZ = sig_subObj->pdflfz->bigpow
1607bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi                - sig_subObj->pdflfz->meanpow;
1617bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->scmeanpowMGC = sig_subObj->pdfmgc->bigpow
1627bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi                - sig_subObj->pdfmgc->meanpow;
1637bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->scmeanLFZ = (1 << (picoos_uint32) sig_subObj->scmeanpowLFZ);
1647bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->scmeanMGC = (1 << (picoos_uint32) sig_subObj->scmeanpowMGC);
1657bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->fSampNorm = PICOSIG_NORM1 * sig_subObj->pdfmgc->amplif;
1667bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        /*-----------------------------------------------------------------
1677bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi         * Initialize memory for DSP
1687bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi         * ------------------------------------------------------------------*/
169e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivi        sigDspInitialize(&(sig_subObj->sig_inner), resetMode);
1707bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        /*-----------------------------------------------------------------
1717bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi         * Initialize modifiers
1727bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi         * ------------------------------------------------------------------*/
1737bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        /*pitch , volume , speaker modifiers*/
1747bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->pMod = 1.0f;
1757bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->vMod = 1.0f;
1767bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        sig_subObj->sMod = 1.0f;
1777bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi    } else {
1787bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        /*-----------------------------------------------------------------
1797bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi         * Initialize memory for DSP
1807bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi         * ------------------------------------------------------------------*/
181e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivi        sigDspInitialize(&(sig_subObj->sig_inner), resetMode);
1827bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi    }
183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*sigInitialize*/
187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * terminates the PU (processing unit)
190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    this : sig PU object
191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_OK : termination ok
192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_ERR_OTHER : termination failed
193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t sigTerminate(register picodata_ProcessingUnit this)
197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subobj_t *sig_subObj;
200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_OTHER;
202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj = (sig_subobj_t *) this->subObj;
204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*sigTerminate*/
207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * deallocates the PU (processing unit) sub object
210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    this : sig PU object
211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    mm : the engine memory manager
212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_OK : deallocation ok
213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_ERR_OTHER : deallocation failed
214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t sigSubObjDeallocate(register picodata_ProcessingUnit this,
218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_MemoryManager mm)
219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subobj_t *sig_subObj;
221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((NULL == this) || ((this)->subObj == NULL)) {
222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_OTHER;
223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj = (sig_subobj_t *) (this)->subObj;
225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (sig_subObj->sInSDFile != NULL) {
227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_sdfCloseIn(this->common, &(sig_subObj->sInSDFile));
228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        sig_subObj->sInSDFile = NULL;
229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        sig_subObj->sInSDFileName[0] = '\0';
230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (sig_subObj->sOutSDFile != NULL) {
233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_sdfCloseOut(this->common, &(sig_subObj->sOutSDFile));
234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        sig_subObj->sOutSDFile = NULL;
235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        sig_subObj->sOutSDFileName[0] = '\0';
236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sigDeallocate(mm, &(sig_subObj->sig_inner));
239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_deallocate(this->common->mm, (void *) &this->subObj);
241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*sigSubObjDeallocate*/
244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * creates a new sig processing unit
247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    mm : the engine memory manager
248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    common : the engine common object
249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    cbIn : the PU input buffer
250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    cbOut : the PU output buffer
251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    voice : the voice descriptor object
252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  a valid PU handle if creation is OK
253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  NULL if creation is !=OK
254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_ProcessingUnit picosig_newSigUnit(picoos_MemoryManager mm,
258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_Common common, picodata_CharBuffer cbIn,
259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_CharBuffer cbOut, picorsrc_Voice voice)
260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subobj_t *sig_subObj;
262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_ProcessingUnit this = picodata_newProcessingUnit(mm, common, cbIn,
264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            cbOut, voice);
265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->initialize = sigInitialize;
269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("picosig_newSigUnit -- creating SIG PU"));
271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*Init function pointers*/
272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->step = sigStep;
273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->terminate = sigTerminate;
274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subDeallocate = sigSubObjDeallocate;
275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*sub obj allocation*/
276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subObj = picoos_allocate(mm, sizeof(sig_subobj_t));
277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this->subObj) {
279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("Error in Sig Object allocation"));
280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm, (void *) &this);
281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj = (sig_subobj_t *) this->subObj;
284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*-----------------------------------------------------------------
286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     * Allocate memory for DSP inner algorithms
287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     * ------------------------------------------------------------------*/
288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (sigAllocate(mm, &(sig_subObj->sig_inner)) != 0) {
289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("Error in Sig Sub Object Allocation"));
290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen         picoos_deallocate(mm, (void *) &this);
291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*-----------------------------------------------------------------
295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     * Initialize memory for DSP (this may be re-used elsewhere, e.g.Reset)
296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     * ------------------------------------------------------------------*/
2977bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi    if (PICO_OK != sigInitialize(this, PICO_RESET_FULL)) {
298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("Error in iSig Sub Object initialization"));
299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        sigDeallocate(mm, &(sig_subObj->sig_inner));
300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm, (void *) &this);
301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }PICODBG_DEBUG(("SIG PU creation succeded!!"));
303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*picosig_newSigUnit*/
305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * pdf access for phase
308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    this : sig object pointer
309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    phsIndex : index of phase vectot in the pdf
310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    phsVect : pointer to base of array where to store the phase values
311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    numComponents : pointer to the variable to store the number of components
312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return   PICO_OK : pdf retrieved
313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return   PICO_ERR_OTHER : pdf not retrieved
314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t getPhsFromPdf(register picodata_ProcessingUnit this,
318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 phsIndex, picoos_int32 *phsVect,
319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 *numComponents)
320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subobj_t *sig_subObj;
322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokpdf_PdfPHS pdf;
323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    static int nFrame = 0;
324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 nIndexValue;
326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *nCurrIndexOffset, *nContent;
327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nI;
328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICODATA_PU_ERROR;
331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj = (sig_subobj_t *) this->subObj;
333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pdf = sig_subObj->pdfphs;
334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*check incoming index*/
335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (phsIndex >= pdf->numvectors) {
336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICODATA_PU_ERROR;
337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nCurrIndexOffset = ((picoos_uint8*) pdf->indexBase) + phsIndex * sizeof(picoos_uint32);
339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nIndexValue = (0xFF000000 & ((*(nCurrIndexOffset+3)) << 24)) | (0x00FF0000 & ((*(nCurrIndexOffset+2)) << 16)) |
340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                  (0x0000FF00 & ((*(nCurrIndexOffset+1)) << 8))  | (0x000000FF & ((*nCurrIndexOffset)));
341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nContent = pdf->contentBase;
342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nContent += nIndexValue;
343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *numComponents = (picoos_int16) *nContent++;
344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*numComponents>PICODSP_PHASEORDER) {
345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("WARNING : Frame %d -- Phase vector[%d] Components = %d --> too big\n",  nFrame, phsIndex, *numComponents));
346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *numComponents = PICODSP_PHASEORDER;
347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (nI=0; nI<*numComponents; nI++) {
349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        phsVect[nI] = (picoos_int32) *nContent++;
350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (nI=*numComponents; nI<PICODSP_PHASEORDER; nI++) {
352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        phsVect[nI] = 0;
353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nFrame++;
355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*getPhsFromPdf*/
357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * processes one item with sig algo
360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    this : the PU object pointer
361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    inReadPos : read position in input buffer
362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    numinb : number of bytes in input buffer (including header)
363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    outWritePos : write position in output buffer
364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    numoutb : number of bytes produced in output buffer
365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_OK : processing successful and terminated
366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_STEP_BUSY : processing successful but still things to do
367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  PICO_ERR_OTHER : errors
368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks processes a full input item
369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks input data is one or more item, taken from local storage
370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks output data is one or more item, written in local storage
371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t sigProcess(register picodata_ProcessingUnit this,
375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 inReadPos, picoos_uint16 numinb,
376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 outWritePos, picoos_uint16 *numoutb)
377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    register sig_subobj_t * sig_subObj;
380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 n_i;
381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 n_frames, n_count;
382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 *s_data, offset;
383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 f_data, mlt, *t1, *tmp1, *tmp2;
384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 tmp_uint16;
385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picopal_int16 tmp_int16;
386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i, cnt;
387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 hop_p_half;
388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj = (sig_subobj_t *) this->subObj;
390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    numinb = numinb; /* avoid warning "var not used in this function"*/
392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*defaults to 0 for output bytes*/
394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *numoutb = 0;
395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*Input buffer contains an item FRAME_PAR*/
397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (sig_subObj->innerProcState) {
398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 0:
400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*---------------------------------------------
401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             Shifting old values
402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             ---------------------------------------------*/
403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (n_count = 0; n_count < CEPST_BUFF_SIZE-1; n_count++) {
404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.F0Buff[n_count]=sig_subObj->sig_inner.F0Buff[n_count+1];
405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.PhIdBuff[n_count]=sig_subObj->sig_inner.PhIdBuff[n_count+1];
406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.VoicingBuff[n_count]=sig_subObj->sig_inner.VoicingBuff[n_count+1];
407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.FuVBuff[n_count]=sig_subObj->sig_inner.FuVBuff[n_count+1];
408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (n_count = 0; n_count < PHASE_BUFF_SIZE-1; n_count++) {
410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.VoxBndBuff[n_count]=sig_subObj->sig_inner.VoxBndBuff[n_count+1];
411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmp1 = sig_subObj->sig_inner.CepBuff[0];
414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (n_count = 0; n_count < CEPST_BUFF_SIZE-1; n_count++) {
415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.CepBuff[n_count]=sig_subObj->sig_inner.CepBuff[n_count+1];
416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.CepBuff[CEPST_BUFF_SIZE-1]=tmp1;
418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmp1 = sig_subObj->sig_inner.PhsBuff[0];
420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (n_count = 0; n_count < PHASE_BUFF_SIZE-1; n_count++) {
421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.PhsBuff[n_count]=sig_subObj->sig_inner.PhsBuff[n_count+1];
422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.PhsBuff[PHASE_BUFF_SIZE-1]=tmp1;
424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*---------------------------------------------
426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             Frame related initializations
427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             ---------------------------------------------*/
428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.prevVoiced_p = sig_subObj->sig_inner.voiced_p;
429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*---------------------------------------------
430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             Get input data from PU buffer in internal buffers
431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             -------------------------------------------------*/
432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*load the phonetic id code*/
433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_mem_copy((void *) &sig_subObj->inBuf[inReadPos
434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    + sizeof(picodata_itemhead_t)],                   /*src*/
435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (void *) &tmp_uint16, sizeof(tmp_uint16));                /*dest+size*/
436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.PhIdBuff[CEPST_BUFF_SIZE-1] = (picoos_int16) tmp_uint16; /*store into newest*/
437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmp_uint16 = (picoos_int16) sig_subObj->sig_inner.PhIdBuff[0];                 /*assign oldest*/
438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.phId_p = (picoos_int16) tmp_uint16;                      /*assign oldest*/
439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*load pitch values*/
441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (i = 0; i < sig_subObj->pdflfz->ceporder; i++) {
442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_mem_copy((void *) &(sig_subObj->inBuf[inReadPos
443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        + sizeof(picodata_itemhead_t) + sizeof(tmp_uint16) + 3
444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        * i * sizeof(tmp_uint16)]),                   /*src*/
445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (void *) &tmp_uint16, sizeof(tmp_uint16));            /*dest+size*/
446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.F0Buff[CEPST_BUFF_SIZE-1] = (picoos_int16) tmp_uint16;/*store into newest*/
448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                tmp_uint16 = (picoos_int16) sig_subObj->sig_inner.F0Buff[0];                /*assign oldest*/
449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*convert in float*/
451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.F0_p
452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (tmp_uint16 ? ((picoos_single) tmp_uint16
453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                / sig_subObj->scmeanLFZ) : (picoos_single) 0.0);
454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (sig_subObj->sig_inner.F0_p != (picoos_single) 0.0f) {
456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->sig_inner.F0_p = (picoos_single) exp(
457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            (picoos_single) sig_subObj->sig_inner.F0_p);
458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* voicing */
461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_mem_copy((void *) &(sig_subObj->inBuf[inReadPos
462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        + sizeof(picodata_itemhead_t) + sizeof(tmp_uint16) + 3
463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        * i * sizeof(tmp_uint16) + sizeof(tmp_uint16)]),/*src*/
464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (void *) &tmp_uint16, sizeof(tmp_uint16));              /*dest+size*/
465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.VoicingBuff[CEPST_BUFF_SIZE-1] = (picoos_int16) tmp_uint16;/*store into newest*/
467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                tmp_uint16 = (picoos_int16) sig_subObj->sig_inner.VoicingBuff[0];                /*assign oldest*/
468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.voicing = (picoos_single) ((tmp_uint16
470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        & 0x01) * 8 + (tmp_uint16 & 0x0e) / 2)
471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        / (picoos_single) 15.0f;
472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* unrectified f0 */
474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_mem_copy((void *) &(sig_subObj->inBuf[inReadPos
475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        + sizeof(picodata_itemhead_t) + sizeof(tmp_uint16) + 3
476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        * i * sizeof(tmp_uint16) + 2 * sizeof(tmp_uint16)]),/*src*/
477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (void *) &tmp_uint16, sizeof(tmp_uint16));                  /*dest+size*/
478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.FuVBuff[CEPST_BUFF_SIZE-1] = (picoos_int16) tmp_uint16;/*store into newest*/
480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                tmp_uint16 = (picoos_int16) sig_subObj->sig_inner.FuVBuff[0];                /*assign oldest*/
481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.Fuv_p = (picoos_single) tmp_uint16
483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        / sig_subObj->scmeanLFZ;
484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.Fuv_p = (picoos_single) EXP((double)sig_subObj->sig_inner.Fuv_p);
485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*load cep values*/
487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            offset = inReadPos + sizeof(picodata_itemhead_t)
488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    + sizeof(tmp_uint16) +
489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    3 * sig_subObj->pdflfz->ceporder * sizeof(tmp_int16);
490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmp1 = sig_subObj->sig_inner.CepBuff[CEPST_BUFF_SIZE-1];   /*store into CURR */
492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmp2 = sig_subObj->sig_inner.CepBuff[0];                   /*assign oldest*/
493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (i = 0; i < sig_subObj->pdfmgc->ceporder; i++) {
495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_mem_copy((void *) &(sig_subObj->inBuf[offset + i
496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        * sizeof(tmp_int16)]),                /*src*/
497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (void *) &tmp_int16, sizeof(tmp_int16));    /*dest+size*/
498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                tmp1 [i] = (picoos_int32) tmp_int16;
500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.wcep_pI[i] = (picoos_int32) tmp2[i];
501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (sig_subObj->inBuf[inReadPos+ 3] > sig_subObj->inBuf[inReadPos+ 2]*2 + 8) {
504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*load phase values*/
505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*get the index*/
506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_mem_copy((void *) &(sig_subObj->inBuf[offset + sig_subObj->pdfmgc->ceporder
507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        * sizeof(tmp_int16)]),                /*src*/
508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (void *) &tmp_int16, sizeof(tmp_int16));    /*dest+size*/
509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*store into buffers*/
511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                tmp1 = sig_subObj->sig_inner.PhsBuff[PHASE_BUFF_SIZE-1];
512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*retrieve values from pdf*/
513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                getPhsFromPdf(this, tmp_int16, tmp1, &(sig_subObj->sig_inner.VoxBndBuff[PHASE_BUFF_SIZE-1]));
514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* no support for phase found */
516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.VoxBndBuff[PHASE_BUFF_SIZE-1] = 0;
517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*pitch modifier*/
520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.F0_p *= sig_subObj->pMod;
521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.Fuv_p *= sig_subObj->pMod;
522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (sig_subObj->sig_inner.F0_p > 0.0f) {
523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.voiced_p = 1;
524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sig_inner.voiced_p = 0;
526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->sig_inner.n_available++;
528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (sig_subObj->sig_inner.n_available>3)  sig_subObj->sig_inner.n_available = 3;
529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (sig_subObj->sig_inner.n_available < 3) {
531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return PICO_STEP_BUSY;
532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState = 3;
535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_STEP_BUSY;
536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 3:
538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*Convert from mfcc to power spectrum*/
539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            save_transition_frame(&(sig_subObj->sig_inner));
540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            mel_2_lin_lookup(&(sig_subObj->sig_inner), sig_subObj->scmeanpowMGC);
541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState += 1;
542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_STEP_BUSY;
543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 4:
545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*Reconstruct PHASE SPECTRUM */
546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            phase_spec2(&(sig_subObj->sig_inner));
547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState += 1;
548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_STEP_BUSY;
549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 5:
551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*Prepare Envelope spectrum for inverse FFT*/
552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            env_spec(&(sig_subObj->sig_inner));
553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState += 1;
554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_STEP_BUSY;
555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 6:
557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*Generate the impulse response of the vocal tract */
558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            impulse_response(&(sig_subObj->sig_inner));
559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState += 1;
560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_STEP_BUSY;
561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 7:
563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*Sum up N impulse responses according to excitation  */
564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            td_psola2(&(sig_subObj->sig_inner));
565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState += 1;
566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_STEP_BUSY;
567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 8:
569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*Ovladd */
570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            overlap_add(&(sig_subObj->sig_inner));
571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState += 1;
572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_STEP_BUSY;
573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case 9:
575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*-----------------------------------------
576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             Save the output FRAME item (0:hop-1)
577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             swap remaining buffer
578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             ---------------------------------------------*/
579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            n_frames = 2;
580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *numoutb = 0;
581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            hop_p_half = (sig_subObj->sig_inner.hop_p) / 2;
582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (n_count = 0; n_count < n_frames; n_count++) {
583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[outWritePos]
584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) PICODATA_ITEM_FRAME;
585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[outWritePos + 1]
586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) (hop_p_half);
587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[outWritePos + 2]
588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) (sig_subObj->nNumFrame % ((hop_p_half)));
589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[outWritePos + 3]
590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) sig_subObj->sig_inner.hop_p;
591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                s_data = (picoos_int16 *) &(sig_subObj->outBuf[outWritePos + 4]);
592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*range control and clipping*/
594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                mlt = (picoos_int32) ((sig_subObj->fSampNorm * sig_subObj->vMod)
595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        * PICODSP_END_FLOAT_NORM);
596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                t1 = &(sig_subObj->sig_inner.WavBuff_p[n_count * (hop_p_half)]);
597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                for (n_i = 0; n_i < hop_p_half; n_i++) { /*Normalization*/
598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    f_data = *t1++ * mlt;
599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (f_data >= 0)
600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        f_data >>= 14;
601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    else
602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        f_data = -(-f_data >> 14);
603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (f_data > PICOSIG_MAXAMP)
604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        f_data = PICOSIG_MAXAMP;
605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (f_data < PICOSIG_MINAMP)
606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        f_data = PICOSIG_MINAMP;
607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    *s_data = (picoos_int16) (f_data);
608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    s_data++;
609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->nNumFrame = sig_subObj->nNumFrame + 1;
611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                *numoutb += ((picoos_int16) n_i * sizeof(picoos_int16)) + 4;
612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                outWritePos += *numoutb;
613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }/*end for n_count*/
614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*Swap remaining buffer*/
615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            cnt = sig_subObj->sig_inner.m2_p - sig_subObj->sig_inner.hop_p;
616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmp1 = sig_subObj->sig_inner.WavBuff_p;
617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmp2
618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    = &(sig_subObj->sig_inner.WavBuff_p[sig_subObj->sig_inner.hop_p]);
619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            FAST_DEVICE(cnt,*(tmp1++)=*(tmp2++);)
620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            ;
621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            cnt = sig_subObj->sig_inner.m2_p - (sig_subObj->sig_inner.m2_p
622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    - sig_subObj->sig_inner.hop_p);
623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            FAST_DEVICE(cnt,*(tmp1++)=0;)
624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            ;
625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->innerProcState = 0; /*reset to step 0*/
626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            sig_subObj->nNumFrame += 2;
627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_OK;
628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_ERR_OTHER;
630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_ERR_OTHER;
632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*sigProcess*/
633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * selects items to be dealth with by this PU
636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    item : pointer to current item head
637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  TRUE : item should be managed
638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  FALSE : item should be passed on next PU
639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid
640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t sig_deal_with(const picoos_uint8 *item)
644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_itemhead_t head;
646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t s_result;
647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    s_result = FALSE;
648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.type = item[0];
649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.info1 = item[1];
650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.info2 = item[2];
651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.len = item[3];
652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (head.type) {
653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_FRAME_PAR:
654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /*the only item that is managed by sig, so far, is "FRAME_PAR"*/
655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            s_result = TRUE;
656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_CMD:
658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if ((head.info1 == PICODATA_ITEMINFO1_CMD_PLAY) || (head.info1
659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_SAVE) || (head.info1
660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_UNSAVE)) {
661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (head.info2 == PICODATA_ITEMINFO2_CMD_TO_SIG) {
662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return TRUE;
663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if ((head.info1 == PICODATA_ITEMINFO1_CMD_PITCH) || (head.info1
666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_VOLUME) || (head.info1
667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_SPEAKER)) {
668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return TRUE;
669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return s_result;
675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*sig_deal_with*/
676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * selects items to be managed as commands by this PU
679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    item : pointer to current item head
680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  TRUE : item should be managed as a command
681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  FALSE : item is not a PU command
682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid
683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t sig_is_command(const picoos_uint8 *item)
687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_itemhead_t head;
689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.type = item[0];
690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.info1 = item[1];
691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.info2 = item[2];
692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    head.len = item[3];
693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (head.type) {
694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_CMD:
695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if ((head.info1 == PICODATA_ITEMINFO1_CMD_PLAY) || (head.info1
696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_SAVE) || (head.info1
697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_UNSAVE)) {
698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (head.info2 == PICODATA_ITEMINFO2_CMD_TO_SIG) {
699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return TRUE;
700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if ((head.info1 == PICODATA_ITEMINFO1_CMD_PITCH) || (head.info1
703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_VOLUME) || (head.info1
704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    == PICODATA_ITEMINFO1_CMD_SPEAKER)) {
705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return TRUE;
706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*sig_is_command*/
713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * performs a step of the sig processing
716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    this : pointer to current PU (Control Unit)
717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    mode : mode for the PU
718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    numBytesOutput : pointer to number of bytes produced (output)
719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param    this : pointer to current PU (Control Unit)
720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return  one of the "picodata_step_result_t" values
721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph
722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph
723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picodata_step_result_t sigStep(register picodata_ProcessingUnit this,
725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 mode, picoos_uint16 * numBytesOutput)
726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    register sig_subobj_t * sig_subObj;
728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t s_result;
729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_bool b_res;
730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t s_deal_with;
731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 blen;
732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 numinb, numoutb;
733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t rv;
734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 *s_data;
735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 hop_p_half;
736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 n_samp, n_i;
737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char s_temp_file_name[255];
738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 n_start, n_fram, n_bytes;
739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_single f_value;
740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 n_value;
741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 n_pos;
742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*wav file play volume control*/
743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 *s_t1;
744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 sf_data, sf_mlt;
745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 sf;
746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_encoding_t enc;
747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint32 numSamples;
748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    numinb = 0;
750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    numoutb = 0;
751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    rv = PICO_OK;
752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    s_result = PICO_OK;
753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICODATA_PU_ERROR;
756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    sig_subObj = (sig_subobj_t *) this->subObj;
758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /*Init number of output bytes*/
760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *numBytesOutput = 0;
761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    mode = mode; /* avoid warning "var not used in this function" */
763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (1) { /* exit via return */
765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("picosig.sigStep -- doing state %i",sig_subObj->procState));
767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (sig_subObj->procState) {
769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICOSIG_COLLECT:
771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* ************** item collector ***********************************/
772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*collecting items from the PU input buffer*/
773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                s_result = picodata_cbGetItem(this->cbIn,
774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        &(sig_subObj->inBuf[sig_subObj->inWritePos]),
775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->inBufSize - sig_subObj->inWritePos, &blen);
776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("picosig.sigStep -- got item, status: %d",rv));
778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (s_result == PICO_EOF) {
780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*no items available : remain in state 0 and return idle*/
781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_IDLE;
782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if ((PICO_OK == s_result) && (blen > 0)) {
784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* we now have one item : CHECK IT */
785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    s_result = picodata_is_valid_item(
786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &(sig_subObj->inBuf[sig_subObj->inWritePos]), blen);
787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (s_result != TRUE) {
788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_DEBUG(("picosig.sigStep -- item is not valid: discard"));
789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /*Item not valid : remain in state PICOSIG_COLLECT*/
790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return PICODATA_PU_BUSY;
791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*item ok: it could be sent to schedule state*/
793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->inWritePos += blen;
794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->needMoreInput = FALSE;
795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->procState = PICOSIG_SCHEDULE;
796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* uncomment next to split into two steps */
797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_ATOMIC;
798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*no EOF, no OK --> errors : remain in state PICOSIG_COLLECT and return error*/
800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return PICODATA_PU_ERROR;
801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICOSIG_SCHEDULE:
804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* *************** item processing ***********************************/
805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                numinb = PICODATA_ITEM_HEADSIZE
806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        + sig_subObj->inBuf[sig_subObj->inReadPos + 3];
807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*verify that current item has to be dealth with by this PU*/
809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                s_deal_with = sig_deal_with(
810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        &(sig_subObj->inBuf[sig_subObj->inReadPos]));
811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                switch (s_deal_with) {
813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case TRUE:
815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /* we have to manage this item */
816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (FALSE == sig_is_command(
817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                &(sig_subObj->inBuf[sig_subObj->inReadPos])))
818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        {
819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /*no commands, item to deal with : switch to process state*/
820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->procState = PICOSIG_PROCESS;
821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->retState = PICOSIG_COLLECT;
822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            return PICODATA_PU_BUSY; /*data still to process or to feed*/
823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } else {
825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /*we need to manage this item as a SIG command-item*/
827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            switch (sig_subObj->inBuf[sig_subObj->inReadPos + 1]) {
829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                case PICODATA_ITEMINFO1_CMD_PLAY:
831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*CMD recognized : consume the command */
832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->inReadPos += numinb;
833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->inReadPos
834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            >= sig_subObj->inWritePos) {
835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inReadPos = 0;
836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inWritePos = 0;
837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*default next state setting*/
839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->procState =
840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       sig_subObj->retState = PICOSIG_COLLECT;
841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*--------- wav file play management --------------*/
843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->sInSDFile != NULL) {
844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /*input wav file is already open : return*/
845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_BUSY;
846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*get temp file name*/
848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_strlcpy(
849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            (picoos_char*) s_temp_file_name,
850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            (picoos_char*) &(sig_subObj->inBuf[sig_subObj->inReadPos
851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    + 4]),
852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->inBuf[sig_subObj->inReadPos
853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    + 3] + 1);
854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*avoid input/output file name clashes*/
855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->sOutSDFile != NULL) {
856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        if (picoos_strncmp(
857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                (picoos_char*) s_temp_file_name,
858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                (picoos_char*) sig_subObj->sOutSDFileName,
859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                picoos_strlen(
860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                        (picoos_char*) s_temp_file_name))
861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                == 0) {
862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            PICODBG_WARN(("input and output files has the same name!\n"));
863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            return PICODATA_PU_BUSY;
864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        }
865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*actual sampled data file open*/
867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    b_res = picoos_sdfOpenIn(this->common,
868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                &(sig_subObj->sInSDFile),
869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        s_temp_file_name, &sf,
870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                &enc, &numSamples);
871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (b_res != TRUE) {
872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICODBG_DEBUG(("Error on opening file %s\n", s_temp_file_name));
873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->sInSDFile = NULL;
874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->sInSDFileName[0] = '\0';
875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_BUSY;
876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*input file handle is now valid : store filename*/
878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_strlcpy(
879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            (picoos_char*) sig_subObj->sInSDFileName,
880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            (picoos_char*) s_temp_file_name,
881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->inBuf[sig_subObj->inReadPos
882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    + 3] + 1);
883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->sInSDFilePos = 0;
884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*switch to state PLAY and return*/
885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->procState =
886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->retState = PICOSIG_PLAY;
887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    return PICODATA_PU_BUSY;
888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    break;
889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                case PICODATA_ITEMINFO1_CMD_SAVE:
891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*CMD recognized : consume the command */
892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->inReadPos += numinb;
893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->inReadPos
894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            >= sig_subObj->inWritePos) {
895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inReadPos = 0;
896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inWritePos = 0;
897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*prepare return state*/
899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->procState = PICOSIG_COLLECT;
900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->retState = PICOSIG_COLLECT;
901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*check about output file*/
902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if ((sig_subObj->sOutSDFile != NULL)
903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            || (sig_subObj->outSwitch == 1)) {
904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /*output sig file is already active : return*/
905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_BUSY;
906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*get temp file name*/
908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_strlcpy(
909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            (picoos_char*) s_temp_file_name,
910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            (picoos_char*) &(sig_subObj->inBuf[sig_subObj->inReadPos
911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    + 4]),
912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->inBuf[sig_subObj->inReadPos
913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    + 3] + 1);
914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*check extension*/
915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (picoos_has_extension(s_temp_file_name,
916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            PICODATA_PUTYPE_WAV_OUTPUT_EXTENSION)
917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            == FALSE){
918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /*extension unsupported : return*/
919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_BUSY;
920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*avoid input/output file name clashes*/
922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->sInSDFile != NULL) {
923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        if (picoos_strncmp(
924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                (picoos_char*) sig_subObj->sInSDFileName,
925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                (picoos_char*) s_temp_file_name,
926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                picoos_strlen(
927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                        (picoos_char*) sig_subObj->sInSDFileName))
928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                == 0) {
929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            /*input and output files has the same name : do not allow opening for writing*/
930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            PICODBG_WARN(("input and output files has the same name!\n"));
931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            return PICODATA_PU_BUSY;
932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        }
933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*try to open*/
935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_sdfOpenOut(this->common,
936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &(sig_subObj->sOutSDFile),
937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            s_temp_file_name,
938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            SAMPLE_FREQ_16KHZ, PICOOS_ENC_LIN);
939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->sOutSDFile == NULL) {
940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICODBG_DEBUG(("Error on opening file %s\n", sig_subObj->sOutSDFileName));
941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->outSwitch = 0;
942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->sOutSDFileName[0] = '\0';
943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    } else {
944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /*open OK*/
945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->outSwitch = 1;
946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /*store output filename*/
947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        picoos_strlcpy(
948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                (picoos_char*) sig_subObj->sOutSDFileName,
949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                (picoos_char*) s_temp_file_name,
950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                sig_subObj->inBuf[sig_subObj->inReadPos + 3] + 1);
951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    return PICODATA_PU_BUSY;
953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    break;
954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                case PICODATA_ITEMINFO1_CMD_UNSAVE:
956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*CMD recognized : consume the command */
957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->inReadPos += numinb;
958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->inReadPos
959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            >= sig_subObj->inWritePos) {
960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inReadPos = 0;
961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inWritePos = 0;
962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*prepare return state*/
964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->procState = PICOSIG_COLLECT;
965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->retState = PICOSIG_COLLECT;
966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*close the output file if any*/
967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if ((sig_subObj->sOutSDFile == NULL)
968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            || (sig_subObj->outSwitch == 0)) {
969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /*output sig file is not active : return*/
970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICODBG_DEBUG(("Error on requesting a binary samples file output closing : no file output handle exist\n"));
971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_BUSY;
972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_sdfCloseOut(this->common,
974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &(sig_subObj->sOutSDFile));
975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->outSwitch = 0;
976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->sOutSDFile = NULL;
977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->sOutSDFileName[0] = '\0';
978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    return PICODATA_PU_BUSY;
979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    break;
980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                case PICODATA_ITEMINFO1_CMD_PITCH:
982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                case PICODATA_ITEMINFO1_CMD_VOLUME:
983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                case PICODATA_ITEMINFO1_CMD_SPEAKER:
984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    n_pos = 4;
985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_read_mem_pi_uint16(
986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &(sig_subObj->inBuf[sig_subObj->inReadPos]),
987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &n_pos, &n_value);
988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    b_res = FALSE;
989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    switch (sig_subObj->inBuf[sig_subObj->inReadPos + 2]) {
990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        case 'a' :
991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /*absloute modifier*/
992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        f_value = (picoos_single) n_value
993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                / (picoos_single) 100.0f;
994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            b_res = TRUE;
995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            break;
996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        case 'r' :
997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            /*relative modifier*/
998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            f_value = (picoos_single) n_value
999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    / (picoos_single) 1000.0f;
1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            b_res = TRUE;
1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            break;
1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        default :
1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            f_value = (picoos_single)0; /*avoid warnings*/
1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            break;
1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (b_res) {
1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        switch (sig_subObj->inBuf[sig_subObj->inReadPos + 1]) {
1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            case PICODATA_ITEMINFO1_CMD_PITCH :
1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->pMod = f_value;
1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                break;
1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            case PICODATA_ITEMINFO1_CMD_VOLUME :
1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->vMod = f_value;
1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                break;
1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            case PICODATA_ITEMINFO1_CMD_SPEAKER :
1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->sMod = f_value;
1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->sig_inner.sMod_p
1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    = sig_subObj->sMod;
1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            /*call the function needed to initialize the speaker factor*/
1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            mel_2_lin_init(
1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    &(sig_subObj->sig_inner));
1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                 break;
1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            default :
1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                break;
1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        }
1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*CMD recognized : consume the command */
1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->inReadPos += numinb;
1029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->inReadPos
1030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            >= sig_subObj->inWritePos) {
1031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inReadPos = 0;
1032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->inWritePos = 0;
1033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
1034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*prepare proc state*/
1035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->procState = PICOSIG_COLLECT;
1036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->retState = PICOSIG_COLLECT;
1037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    return PICODATA_PU_BUSY;
1038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    break;
1039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                default:
1040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    break;
1041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }/*switch command type*/
1042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } /*end if is command*/
1043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case FALSE:
1046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /*we DO NOT have to deal with this item on this PU.
1048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                         * Normally these are still alive boundary or flush items*/
1049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /*copy item from PU input to PU output buffer,
1050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                         * i.e. make it ready to FEED*/
1051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        s_result = picodata_copy_item(
1052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                &(sig_subObj->inBuf[sig_subObj->inReadPos]),
1053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                numinb,
1054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                &(sig_subObj->outBuf[sig_subObj->outWritePos]),
1055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                sig_subObj->outBufSize - sig_subObj->outWritePos,
1056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                &numoutb);
1057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (s_result != PICO_OK) {
1058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /*item not prepared properly to be sent to next PU :
1059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             * do not change state and retry next time*/
1060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->procState = PICOSIG_SCHEDULE;
1061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->retState = PICOSIG_COLLECT;
1062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            return PICODATA_PU_BUSY; /*data still to process or to feed*/
1063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /*if end of sentence reset number of frames(only needed for debugging purposes)*/
1066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if ((sig_subObj->inBuf[sig_subObj->inReadPos]
1067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                == PICODATA_ITEM_BOUND)
1068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                && ((sig_subObj->inBuf[sig_subObj->inReadPos + 1]
1069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        == PICODATA_ITEMINFO1_BOUND_SEND)
1070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        || (sig_subObj->inBuf[sig_subObj->inReadPos
1071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                + 1]
1072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                == PICODATA_ITEMINFO1_BOUND_TERM))) {
1073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODBG_INFO(("End of sentence - Processed frames : %d",
1074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            sig_subObj->nNumFrame));
1075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->nNumFrame = 0;
1076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /*item processed and put in oputput buffer : consume the item*/
1079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->inReadPos += numinb;
1080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->outWritePos += numoutb;
1081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if (sig_subObj->inReadPos >= sig_subObj->inWritePos) {
1082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                /* inBuf exhausted */
1083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                sig_subObj->inReadPos = 0;
1084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                sig_subObj->inWritePos = 0;
1085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                sig_subObj->needMoreInput = FALSE;
1086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->procState = PICOSIG_FEED;
1088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sig_subObj->retState = PICOSIG_COLLECT;
1089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return PICODATA_PU_BUSY; /*data still to process or to feed*/
1090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    default:
1093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }/*end switch s_deal_with*/
1095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break; /*end case sig_schedule*/
1097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICOSIG_PROCESS:
1099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* *************** item processing ***********************************/
1100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                numinb = PICODATA_ITEM_HEADSIZE
1101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        + sig_subObj->inBuf[sig_subObj->inReadPos + 3];
1102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*Process a full item*/
1104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                s_result = sigProcess(this, sig_subObj->inReadPos, numinb,
1105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->outWritePos, &numoutb);
1106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (s_result == PICO_OK) {
1108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->inReadPos += numinb;
1109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (sig_subObj->inReadPos >= sig_subObj->inWritePos) {
1110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->inReadPos = 0;
1111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->inWritePos = 0;
1112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->needMoreInput = FALSE;
1113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->outWritePos += numoutb;
1115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->procState = PICOSIG_FEED;
1116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->retState = PICOSIG_COLLECT;
1117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_DEBUG(("picosig.sigStep -- leaving PICO_PROC, inReadPos = %i, outWritePos = %i",sig_subObj->inReadPos, sig_subObj->outWritePos));
1118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_BUSY; /*data to feed*/
1119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return PICODATA_PU_BUSY; /*data still to process : remain in PROCESS STATE*/
1121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICOSIG_PLAY:
1124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*management of wav file play*/
1126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                s_data = (picoos_int16 *) &(sig_subObj->outBuf[sig_subObj->outWritePos + 4]);
1127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                hop_p_half = sig_subObj->sig_inner.hop_p / 2;
1128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*read directly into PU output buffer*/
1129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                n_samp = hop_p_half;
1130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                b_res = picoos_sdfGetSamples(sig_subObj->sInSDFile,
1131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->sInSDFilePos, &n_samp, s_data);
1132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->sInSDFilePos += n_samp;
1133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if ((FALSE == b_res) || (0 == n_samp)) {
1135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*file play is complete or file read error*/
1136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    picoos_sdfCloseIn(this->common, &(sig_subObj->sInSDFile));
1137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->sInSDFile = NULL;
1138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->sInSDFileName[0] = '\0';
1139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->procState = PICOSIG_COLLECT;
1140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->retState = PICOSIG_COLLECT;
1141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_BUSY; /*check if data in input buffer*/
1142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*-----------------------------------*/
1144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*Volume control of wav file playback*/
1145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*    (code borrowed from sigProcess)*/
1146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*Volume mod and clipping control    */
1147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*     directly into PU output buffer*/
1148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*-----------------------------------*/
1149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sf_mlt = (picoos_int32) ((sig_subObj->vMod) * 16.0f);
1150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                s_t1 = &(s_data[0]);
1151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                for (n_i = 0; n_i < n_samp; n_i++) {
1153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (*s_t1 != 0) {
1154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sf_data = (picoos_int32) (*s_t1) * sf_mlt;
1155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sf_data >>= 4;
1156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (sf_data > PICOSIG_MAXAMP) {
1157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sf_data = PICOSIG_MAXAMP;
1158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } else if (sf_data < PICOSIG_MINAMP) {
1159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            sf_data = PICOSIG_MINAMP;
1160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        *s_t1 = (picoos_int16) (sf_data);
1162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    s_t1++;
1164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*Add header info*/
1166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[sig_subObj->outWritePos]
1167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) PICODATA_ITEM_FRAME;
1168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[sig_subObj->outWritePos + 1]
1169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) n_samp;
1170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[sig_subObj->outWritePos + 2]
1171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) (sig_subObj->nNumFrame % (hop_p_half)); /*number of frame % 64*/
1172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outBuf[sig_subObj->outWritePos + 3]
1173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        = (picoos_uint8) n_samp * 2;
1174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*Item content*/
1175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->outWritePos += (n_samp * sizeof(picoos_int16)) + 4; /*including header*/
1176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->procState = PICOSIG_FEED;
1177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                sig_subObj->retState = PICOSIG_PLAY;
1178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICOSIG_FEED:
1181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* ************** item output/feeding ***********************************/
1182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                switch (sig_subObj->outSwitch) {
1183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case 0:
1184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /*feeding items to PU output buffer*/
1185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        s_result = picodata_cbPutItem(this->cbOut,
1186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                &(sig_subObj->outBuf[sig_subObj->outReadPos]),
1187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                sig_subObj->outWritePos - sig_subObj->outReadPos,
1188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                &numoutb);
1189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case 1:
1191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        /*feeding items to file*/
1192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (sig_subObj->outBuf[sig_subObj->outReadPos]
1193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                == PICODATA_ITEM_FRAME) {
1194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if ((sig_subObj->sOutSDFile) != NULL) {
1195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                n_start = (picoos_uint32) (sig_subObj->outReadPos)
1196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                + PICODATA_ITEM_HEADSIZE;
1197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                n_bytes = (picoos_uint32) sig_subObj->outBuf[(sig_subObj->outReadPos)
1198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                + PICODATA_ITEMIND_LEN];
1199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                n_fram = (picoos_uint32) sig_subObj->outBuf[(sig_subObj->outReadPos)
1200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                + PICODATA_ITEMIND_INFO2];
1201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                if (picoos_sdfPutSamples(
1202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->sOutSDFile,
1203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        n_bytes / 2,
1204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        (picoos_int16*) &(sig_subObj->outBuf[n_start]))) {
1205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    PICODBG_DEBUG(("Nframe:%d - Nbytes %d\n", n_fram, n_bytes));
1206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    numoutb = n_bytes + 4;
1207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    s_result = PICO_OK;
1208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /* also feed item to next PU */
1209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    s_result = picodata_cbPutItem(
1210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    this->cbOut,
1211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    &(sig_subObj->outBuf[sig_subObj->outReadPos]),
1212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    sig_subObj->outWritePos
1213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                            - sig_subObj->outReadPos,
1214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                    &numoutb);
1215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                } else {
1216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    /*write error : close file + cleanup handles*/
1217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (sig_subObj->sOutSDFile != NULL) {
1218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        picoos_sdfCloseOut(this->common, &(sig_subObj->sOutSDFile));
1219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        sig_subObj->sOutSDFile = NULL;
1220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
1221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->sOutSDFileName[0] = '\0';
1222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    sig_subObj->outSwitch = 0;
1223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    PICODBG_DEBUG(("Error in writing :%d bytes to output file %s\n", numoutb, &(sig_subObj->sOutSDFileName[0])));
1224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    s_result = PICO_ERR_OTHER;
1225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                }
1226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } else {
1228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /*continue to feed following PU with items != FRAME */
1229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            s_result = picodata_cbPutItem(
1230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            this->cbOut,
1231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &(sig_subObj->outBuf[sig_subObj->outReadPos]),
1232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                sig_subObj->outWritePos  - sig_subObj->outReadPos,
1233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &numoutb);
1234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    default:
1237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        s_result = PICO_ERR_OTHER;
1238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
1239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("picosig.sigStep -- put item, status: %d",s_result));
1241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (PICO_OK == s_result) {
1243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->outReadPos += numoutb;
1245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    *numBytesOutput = numoutb;
1246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*-------------------------*/
1247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*reset the output pointers*/
1248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*-------------------------*/
1249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (sig_subObj->outReadPos >= sig_subObj->outWritePos) {
1250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->outReadPos = 0;
1251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->outWritePos = 0;
1252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        sig_subObj->procState = sig_subObj->retState;
1253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_BUSY;
1255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else if (PICO_EXC_BUF_OVERFLOW == s_result) {
1257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_DEBUG(("picosig.sigStep ** feeding, overflow, PICODATA_PU_OUT_FULL"));
1259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_OUT_FULL;
1260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else if ((PICO_EXC_BUF_UNDERFLOW == s_result)
1262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        || (PICO_ERR_OTHER == s_result)) {
1263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_DEBUG(("picosig.sigStep ** feeding problem, discarding item"));
1265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->outReadPos = 0;
1266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->outWritePos = 0;
1267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    sig_subObj->procState = sig_subObj->retState;
1268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_ERROR;
1269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            default:
1273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /*NOT feeding items*/
1274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                s_result = PICO_EXC_BUF_IGNORE;
1275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }/*end switch*/
1277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICODATA_PU_BUSY; /*check if there is more data to process after feeding*/
1278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }/*end while*/
1280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICODATA_PU_IDLE;
1281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*sigStep*/
1282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
1284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Picosig.c end */
1288