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