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 picopam.c 18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Phonetic to Acoustic Mapping 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 "picodefs.h" 30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h" 31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h" 32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodata.h" 33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picopam.h" 34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdt.h" 35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpdf.h" 36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoktab.h" 37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdbg.h" 38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodsp.h" 39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" { 42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0 44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_IN_BUFF_SIZE PICODATA_BUFSIZE_PAM /*input buffer size for PAM */ 48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_OUT_PAM_SIZE PICODATA_BUFSIZE_PAM /*output buffer size for PAM*/ 49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DT_NRLFZ 5 /* nr of lfz decision trees per phoneme */ 50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DT_NRMGC 5 /* nr of mgc decision trees per phoneme */ 51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_NRSTPF 5 /* nr of states per phone */ 52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_COLLECT 0 54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_SCHEDULE 1 55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_IMMEDIATE 2 56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_FORWARD 3 57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_FORWARD_FORCE_TERM 4 58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PROCESS 5 59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PLAY 6 60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_FEED 7 61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_CONTINUE 100 63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_GOTO_SCHEDULE 1 64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_FLUSH_RECEIVED 6 65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_GOTO_FEED 7 66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PRE_SYLL_ENDED 10 67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_BREAK_ADD_SIZE 4 /*syllable feature vector increment dued to BREAK and SILENCE*/ 69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_VECT_SIZE 64+PICOPAM_BREAK_ADD_SIZE /*syllable feature vector size (bytes)*/ 70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_INVEC_SIZE 60 /*phone feature vector size */ 71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_MAX_SYLL_PER_SENT 100 /*maximum number of syllables per sentece*/ 72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_MAX_PH_PER_SENT 400 /*maximum number of phonemes per sentece*/ 73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_MAX_ITEM_PER_SENT 255 /*maximum number of attached items per sentence*/ 74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_MAX_ITEM_SIZE_PER_SENT 4096 /*maximum size of attached items per sentence*/ 75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_READY 20 /*PAM could start backward processing*/ 77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_MORE 21 /*PAM has still to collect */ 78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_NA 22 /*PAM has not to deal with this item*/ 79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_ERR 23 /*input item is not a valid item*/ 80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*sentence types:cfr pam_map_sentence_type*/ 82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DECLARATIVE 0 83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_INTERROGATIVE 1 84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_EXCLAMATIVE 2 85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_T 0 87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_P 1 88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_p 2 89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_Y 3 90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 1 92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PAM_PHR2_WITH_PR1 1 /*deal with PHR2 boundaries as with PHR1*/ 93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#else 94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PAM_PHR2_WITH_PR3 1 /*deal with PHR2 boundaries as with PHR3*/ 95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DONT_CARE_VALUE 250 /*don't care value for tree printout */ 98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DONT_CARE_VAL 10 /*don't care value for tree feeding */ 99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PH_DONT_CARE_VAL 7 /*don't care value for tree feeding (phonetic)*/ 100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_MAX_STATES_PER_PHONE 5 /*number of states per phone */ 102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_STATE_SIZE_IN_ITEM 6 /*size of a state in frame item */ 103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_FRAME_ITEM_SIZE 4+PICOPAM_MAX_STATES_PER_PHONE*PICOPAM_STATE_SIZE_IN_ITEM 104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DIR_FORW 0 /*forward adapter processing*/ 106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DIR_BACK 1 /*backward adapter processing*/ 107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_DIR_SIL 2 /*final silence attributes*/ 108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_SYLL_PAUSE 0 /*syllable but containing a pause phone*/ 110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_SYLL_SYLL 1 /*a real syllable with phonemes*/ 111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_EVENT_P_BOUND 0 /*primary boundary*/ 113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_EVENT_S_BOUND 1 /*secondary boundary*/ 114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_EVENT_W_BOUND 3 /*word boundary*/ 115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_EVENT_SYLL 4 /*syllable*/ 116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ----- CONSTANTS FOR BREAK COMMAND SUPPORT ----- */ 118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PWIDX_SBEG 0 119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PWIDX_PHR1 1 120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PWIDX_PHR2 2 121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PWIDX_SEND 3 122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PWIDX_DEFA 4 123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOPAM_PWIDX_SIZE 5 124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*----------------------------------------------------------------*/ 126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*structure related to the feature vectors for feeding the trees */ 127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*NOTE : the same data structure is used to manage the syllables */ 128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Using the first 8 fields for marking the boundaries */ 129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* and using the last 4 bytes as follows */ 130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* byte 61 : 1st attached non PAM item id(0=no item attached) */ 131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* in the "sSyllItemOffs" data structure */ 132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* byte 62 : last attached non PAM item id(0=no item attached)*/ 133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* in the "sSyllItemOffs" data structure */ 134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* byte 63..64 : offset of the start of the syllable in */ 135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* the "sPhIds" data structure */ 136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct 137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picopal_uint8 phoneV[PICOPAM_VECT_SIZE]; 139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} sFtVect, *pSftVect; 140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*---------------------------------------------------------- 142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Name : pam_subobj 143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Function: subobject definition for the pam processing 144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Shortcut: pam 145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ---------------------------------------------------------*/ 146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pam_subobj 147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------PU voice management------------------------------*/ 149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* picorsrc_Voice voice; */ 150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------PU state management------------------------------*/ 151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 procState; /* where to take up work at next processing step */ 152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 retState; /* where to go back from feed state at next p.s. */ 153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 needMoreInput; /* more data necessary to start processing */ 154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------PU input management------------------------------*/ 155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 inBuf[PICOPAM_IN_BUFF_SIZE]; /* internal input buffer */ 156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 inBufSize; /* actually allocated size */ 157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 inReadPos, inWritePos; /* next pos to read/write from/to inBuf*/ 158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------PU output management-----------------------------*/ 159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 outBuf[PICOPAM_OUT_PAM_SIZE]; /* internal output buffer */ 160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 outBufSize; /* actually allocated size */ 161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 outReadPos, outWritePos; /* next pos to read/write from/to outBuf*/ 162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- adapter working buffers --------------------*/ 163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *sPhFeats; /*feature vector for a single phone */ 164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sFtVect *sSyllFeats; /*Syllable feature vector set for the 165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen full sentence */ 166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *sPhIds; /*phone ids for the full sentence */ 167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *sSyllItems; /*items attached to the syllable */ 168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 *sSyllItemOffs;/*offset of items attached to the syllable*/ 169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- adapter general variables ---------------------*/ 170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nTotalPhonemes; /*number of phonemes in the sentence*/ 171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nCurrPhoneme; /*current phoneme in the sentence */ 172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nSyllPhoneme; /*current phoneme in the syllable */ 173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nCurrSyllable; /*current syllable in the sentence */ 174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nTotalSyllables; /*number of syllables in the sentence -> J1*/ 175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nLastAttachedItemId;/*last attached item id*/ 176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nCurrAttachedItem; /*current attached item*/ 177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nAttachedItemsSize; /*total size of the attached items*/ 178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 sType; /*Sentence type*/ 179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 pType; /*Phrase type*/ 180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single pMod; /*pitch modifier*/ 181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single dMod; /*Duration modifier*/ 182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single dRest; /*Duration modifier rest*/ 183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- adapter specific component variables ----------*/ 184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 a3_overall_syllable; /* A3 */ 185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 a3_primary_phrase_syllable; 186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b4_b5_syllable; /* B4,B5 */ 187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b6_b7_syllable; /* B6,B7 */ 188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b6_b7_state; 189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b8_b9_stressed_syllable; /* B8,B9 */ 190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b10_b11_accented_syllable; /* B10,B11 */ 191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b12_b13_syllable; /* B12,B13 */ 192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b12_b13_state; 193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b14_b15_syllable; /* B14,B15 */ 194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b14_b15_state; 195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b17_b19_syllable; /* B17,B19 */ 196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b17_b19_state; 197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b18_b20_b21_syllable; /* B18,B20,B21 */ 198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 b18_b20_b21_state; 199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 c3_overall_syllable; /* C3 */ 200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 c3_primary_phrase_syllable; 201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 d2_syllable_in_word; /* D2 */ 202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 d2_prev_syllable_in_word; 203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 d2_current_primary_phrase_word; 204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 e1_syllable_word_start; /* E1 */ 205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 e1_syllable_word_end; 206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e1_content; 207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 e2_syllable_word_start; /* E2 */ 208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 e2_syllable_word_end; 209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e3_e4_word; /* E3,E4 */ 210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e3_e4_state; 211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e5_e6_content_word; /* E5,E6 */ 212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e5_e6_content; 213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e7_e8_word; /* E7,E8 */ 214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e7_e8_content; 215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e7_e8_state; 216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e9_e11_word; /* E9,E11 */ 217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e9_e11_saw_word; 218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e9_e11_state; 219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e10_e12_e13_word; /* E10,E12,E13 */ 220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e10_e12_e13_state; 221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 e10_e12_e13_saw_word; 222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 f2_overall_word; /* F2 */ 223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 f2_word_syllable; 224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 f2_next_word_syllable; 225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 f2_current_primary_phrase_word; 226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 g1_current_secondary_phrase_syllable; /*G1 */ 227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 g1_current_syllable; 228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 g2_current_secondary_phrase_word; /*G2 */ 229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 g2_current_word; 230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 h1_current_secondary_phrase_syll; /*H1 */ 231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 h2_current_secondary_phrase_word; /*H2 */ 232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 h3_h4_current_secondary_phrase_word; /*H3,H4 */ 233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 h5_current_phrase_type; /*H5 */ 234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 h5_syllable; /* H5 */ 236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 h5_state; 237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i1_secondary_phrase_syllable; /*I1 */ 239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i1_next_secondary_phrase_syllable; 240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i2_secondary_phrase_word; /*I2 */ 241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i2_next_secondary_phrase_word; 242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 j1_utterance_syllable; /*J1 */ 243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 j2_utterance_word; /*J2 */ 244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 j3_utterance_sec_phrases; /*J3 */ 245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- constant data -------------------*/ 246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 sil_weights[PICOPAM_PWIDX_SIZE][PICOPAM_MAX_STATES_PER_PHONE]; 247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- LINGWARE related data -------------------*/ 248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokdt_DtPAM dtdur; /* dtdur knowledge base */ 249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokdt_DtPAM dtlfz[PICOPAM_DT_NRLFZ]; /* dtlfz knowledge bases */ 250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokdt_DtPAM dtmgc[PICOPAM_DT_NRMGC]; /* dtmgc knowledge bases */ 251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- Pdfs related data -------------------*/ 252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpdf_PdfDUR pdfdur; /* pdfdur knowledge base */ 253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpdf_PdfMUL pdflfz; /* pdflfz knowledge base */ 254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- Tree traversal related data -------------------*/ 255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 durIndex; 256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 numFramesState[PICOPAM_DT_NRLFZ]; 257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 lf0Index[PICOPAM_DT_NRLFZ]; 258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 mgcIndex[PICOPAM_DT_NRMGC]; 259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- temps for updating the feature vector ---------*/ 260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 phonDur; 261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single phonF0[PICOPAM_DT_NRLFZ]; 262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*---------------------- Phones related data -------------------*/ 263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoktab_Phones tabphones; 264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} pam_subobj_t; 265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ----- CONSTANTS FOR FEATURE VECTOR BUILDING (NOT PREFIXED WITH "PICOPAM_" FOR BREVITY) ----- */ 268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P1 0 /*field 1 of the input vector*/ 269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P2 1 270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P3 2 271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P4 3 272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P5 4 273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P6 5 274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P7 6 275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define bnd 6 /*boundary type item associated to the syllable = P7 */ 276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define P8 7 277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define A3 8 278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B1 9 279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B2 10 280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B3 11 281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B4 12 282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B5 13 283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B6 14 284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B7 15 285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B8 16 286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B9 17 287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B10 18 288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B11 19 289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B12 20 290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B13 21 291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B14 22 292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B15 23 293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B16 24 294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B17 25 295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B18 26 296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B19 27 297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B20 28 298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define B21 29 299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define C3 30 300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define D2 31 301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E1 32 302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E2 33 303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E3 34 304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E4 35 305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E5 36 306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E6 37 307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E7 38 308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E8 39 309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E9 40 310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E10 41 311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E11 42 312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E12 43 313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define E13 44 314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define F2 45 315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define G1 46 316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define G2 47 317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define H1 48 318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define H2 49 319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define H3 50 320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define H4 51 321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define H5 52 322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define I1 53 323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define I2 54 324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define J1 55 325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define J2 56 326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define J3 57 327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define DUR 58 /*duration component*/ 328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define F0 59 /*F0 component*/ 329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define ITM 60 /*Item Offset into sSyllItems item list*/ 330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define itm 61 /*second byte of the Item Offset */ 331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define FID 62 /*Phoneme offset in the sPhIds phoneme list*/ 332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define fid 63 /*second byte of the Phoneme offset */ 333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define Min 64 /*offset to min syllable duration (uint 16,pauses)*/ 334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define Max 66 /*offset to max syllable duration (uint 16,pauses)*/ 335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ------------------------------------------------------------------- 336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PAM feature vector indices position changes, 337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ------------------------------------------------------------------- */ 338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B1 8 339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B2 9 340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B3 10 341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B4 11 342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B5 12 343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B6 13 344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B7 14 345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B8 15 346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B9 16 347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B10 17 348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B11 18 349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B12 19 350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B13 20 351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B14 21 352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B15 22 353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B16 23 354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B17 24 355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B18 25 356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B19 26 357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B20 27 358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_B21 28 359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E1 29 360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E2 30 361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E3 31 362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E4 32 363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E5 33 364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E6 34 365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E7 35 366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E8 36 367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E9 37 368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E10 38 369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E11 39 370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E12 40 371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_E13 41 372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_A3 42 373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_C3 43 374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_D2 44 375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_F2 45 376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_G1 46 377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_I1 47 378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_G2 48 379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_I2 49 380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_H1 50 381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_H2 51 382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_H3 52 383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_H4 53 384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define T_H5 54 385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*------------------------------------------------------------------ 387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Service routines : 388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ------------------------------------------------------------------*/ 389e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivistatic pico_status_t pam_initialize(register picodata_ProcessingUnit this, picoos_int32 resetMode); 390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_terminate(register picodata_ProcessingUnit this); 391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_allocate(picoos_MemoryManager mm, pam_subobj_t *pam); 392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pam_deallocate(picoos_MemoryManager mm, pam_subobj_t *pam); 393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_subobj_deallocate(register picodata_ProcessingUnit this, 394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager mm); 395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*------------------------------------------------------------------ 396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Processing routines : 397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ------------------------------------------------------------------*/ 398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picodata_step_result_t pam_step(register picodata_ProcessingUnit this, 399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 mode, picoos_uint16 * numBytesOutput); 400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_deal_with(const picoos_uint8 *item); 401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*Utility*/ 402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_get_vowel_name(register picodata_ProcessingUnit this, 403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *item, picoos_uint8 *pos); 404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_get_pause_id(register picodata_ProcessingUnit this); 405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_map_sentence_type(picoos_uint8 iteminfo1, 407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 iteminfo2); 408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_map_phrase_type(picoos_uint8 iteminfo1, 409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 iteminfo2); 410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*Adapter*/ 412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_reset_processors(register picodata_ProcessingUnit this); 413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_reset_processors_back( 414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this); 415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_create_syllable(register picodata_ProcessingUnit this, 416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 syllType, picoos_uint8 *sContent, picoos_uint8 sentType, 417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 phType, picoos_uint8 uBoundType, picoos_uint16 uMin, 418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 uMax); 419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_process_event_feature( 420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this, picoos_uint8 nFeat, 421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 event_type, picoos_uint8 direction); 422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_process_event(register picodata_ProcessingUnit this, 423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 event_type, picoos_uint8 direction); 424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_adapter_forward_step( 425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this, picoos_uint8 *itemBase); 426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_adapter_backward_step( 427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this); 428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_do_pause(register picodata_ProcessingUnit this); 429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_adapter_do_pauses(register picodata_ProcessingUnit this); 430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*-------------- tree traversal ---------------------------------------*/ 431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_expand_vector(register picodata_ProcessingUnit this); 432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_do_tree(register picodata_ProcessingUnit this, 433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picokdt_DtPAM dtpam, const picoos_uint8 *invec, 434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_uint8 inveclen, picokdt_classify_result_t *dtres); 435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_get_f0(register picodata_ProcessingUnit this, 436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 *lf0Index, picoos_uint8 nState, picoos_single *phonF0); 437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_get_duration(register picodata_ProcessingUnit this, 438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 durIndex, picoos_uint16 *phonDur, 439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *numFramesState); 440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_update_vector(register picodata_ProcessingUnit this); 441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*-------------- FINAL ITEM FEEDING -----------------------------------------*/ 442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_put_item(register picodata_ProcessingUnit this, 443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *outBuff, picoos_uint16 outWritePos, 444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *bytesWr); 445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_put_term(picoos_uint8 *outBuff, 447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 outWritePos, picoos_uint8 *bytesWr); 448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t is_pam_command(const picoos_uint8 *qItem); 450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void get_default_boundary_limit(picoos_uint8 uBoundType, 452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 *uMinDur, picoos_uint16 *uMaxDur); 453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ------------------------------------------------------------- 455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Pico System functions 456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ------------------------------------------------------------- 457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * allocation for PAM memory on pam PU 461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param mm : handle to engine memory manager 462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param pam : handle to a pam struct 463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : allocation successful 464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : allocation errors 465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_allocate(picoos_MemoryManager mm, pam_subobj_t *pam) 469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *data; 471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 *dataI; 472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats = NULL; 474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhIds = NULL; 475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhFeats = NULL; 476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItems = NULL; 477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItemOffs = NULL; 478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------------------------------------------------- 480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PAM Local buffers ALLOCATION 481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ------------------------------------------------------------------*/ 482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*PAM Local buffers*/ 483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen data = (picopal_uint8 *) picoos_allocate(mm, sizeof(sFtVect) 484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICOPAM_MAX_SYLL_PER_SENT); 485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (data == NULL) 486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats = (sFtVect*) data; 488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen data = (picopal_uint8 *) picoos_allocate(mm, sizeof(picopal_uint8) 490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICOPAM_MAX_PH_PER_SENT); 491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (data == NULL) { 492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_deallocate(mm, pam); 493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhIds = (picopal_uint8*) data; 496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen data = (picopal_uint8 *) picoos_allocate(mm, sizeof(picopal_uint8) 498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICOPAM_VECT_SIZE); 499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (data == NULL) { 500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_deallocate(mm, pam); 501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhFeats = (picopal_uint8*) data; 504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen data = (picopal_uint8 *) picoos_allocate(mm, sizeof(picopal_uint8) 506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICOPAM_MAX_ITEM_SIZE_PER_SENT); 507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (data == NULL) { 508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_deallocate(mm, pam); 509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItems = (picopal_uint8*) data; 512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dataI = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICOPAM_MAX_ITEM_PER_SENT); 515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (data == NULL) { 516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_deallocate(mm, pam); 517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItemOffs = (picoos_int16*) dataI; 520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_allocate*/ 523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * frees allocation for DSP memory on PAM PU 526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param mm : memory manager 527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param pam : pam PU internal sub-object 528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return void 529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks modified and inserted in sub obj removal PP 15.09.08 530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pam_deallocate(picoos_MemoryManager mm, pam_subobj_t *pam) 534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------------------------------------------------- 536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Memory de-allocations 537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ------------------------------------------------------------------*/ 538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats != NULL) 539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &pam->sSyllFeats); 540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sPhIds != NULL) 541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &pam->sPhIds); 542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sPhFeats != NULL) 543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &pam->sPhFeats); 544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllItems != NULL) 545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &pam->sSyllItems); 546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllItemOffs != NULL) 547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &pam->sSyllItemOffs); 548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_deallocate*/ 550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * initialization of a pam PU 553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : handle to a PU struct 554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : init OK 555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : error on getting pkbs addresses 556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 559e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivistatic pico_status_t pam_initialize(register picodata_ProcessingUnit this, picoos_int32 resetMode) 560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t nI, nJ; 562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inBufSize = PICOPAM_IN_BUFF_SIZE; 569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outBufSize = PICOPAM_OUT_PAM_SIZE; 570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos = 0; 571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos = 0; 572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outReadPos = 0; 573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos = 0; 574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->needMoreInput = 0; 575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = 0; 576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------------------------------------------------- 578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * MANAGE INTERNAL INITIALIZATION 579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ------------------------------------------------------------------*/ 580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*init the syllable structure*/ 581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_MAX_SYLL_PER_SENT; nI++) 582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nJ = 0; nJ < PICOPAM_VECT_SIZE; nJ++) 583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[nI].phoneV[nJ] = 0; 584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_MAX_PH_PER_SENT; nI++) 586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhIds[nI] = 0; 587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_VECT_SIZE; nI++) 589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhFeats[nI] = 0; 590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_MAX_ITEM_SIZE_PER_SENT; nI++) 592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItems[nI] = 0; 593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_MAX_ITEM_PER_SENT; nI++) 595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItemOffs[nI] = 0; 596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Other variables*/ 598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); 599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nLastAttachedItemId = pam->nCurrAttachedItem = 0; 600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nAttachedItemsSize = 0; 601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 602e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivi if (resetMode == PICO_RESET_SOFT) { 6037bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi /*following initializations needed only at startup or after a full reset*/ 6047bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi return PICO_OK; 6057bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi } 6067bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi 607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*pitch and duration modifiers*/ 608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pMod = 1.0f; 609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dMod = 1.0f; 610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dRest = 0.0f; 611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* constant tables */ 614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen { 615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i, j; 616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 tmp_weights[PICOPAM_PWIDX_SIZE][PICOPAM_MAX_STATES_PER_PHONE] = { 617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen {10, 10, 10, 10, 1 }, /*SBEG*/ 618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen { 1, 4, 8, 4, 1 }, /*PHR1*/ 619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen { 1, 4, 8, 4, 1 }, /*PHR2*/ 620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen { 1, 10, 10, 10, 10 },/*SEND*/ 621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen { 1, 1, 1, 1, 1 } /*DEFAULT*/ 622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }; 623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i = 0; i < PICOPAM_PWIDX_SIZE; i++) { 624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (j = 0; j < PICOPAM_PWIDX_SIZE; j++) { 625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sil_weights[j][j] = tmp_weights[i][j]; 626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 6297bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi 6307bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi 631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*----------------------------------------------------------------- 632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * MANAGE LINGWARE INITIALIZATION IF NEEDED 633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ------------------------------------------------------------------*/ 634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* kb dtdur */ 635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtdur = picokdt_getDtPAM(this->voice->kbArray[PICOKNOW_KBID_DT_DUR]); 636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->dtdur == NULL) { 637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL); 639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("got dtdur")); 641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* kb dtlfz* */ 643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtlfz[0] = picokdt_getDtPAM( 644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_LFZ1]); 645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtlfz[1] = picokdt_getDtPAM( 646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_LFZ2]); 647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtlfz[2] = picokdt_getDtPAM( 648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_LFZ3]); 649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtlfz[3] = picokdt_getDtPAM( 650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_LFZ4]); 651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtlfz[4] = picokdt_getDtPAM( 652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_LFZ5]); 653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_DT_NRLFZ; nI++) { 654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->dtlfz[nI] == NULL) { 655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, 656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("got dtlfz%d", nI+1)); 659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* kb dtmgc* */ 662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtmgc[0] = picokdt_getDtPAM( 663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_MGC1]); 664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtmgc[1] = picokdt_getDtPAM( 665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_MGC2]); 666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtmgc[2] = picokdt_getDtPAM( 667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_MGC3]); 668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtmgc[3] = picokdt_getDtPAM( 669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_MGC4]); 670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dtmgc[4] = picokdt_getDtPAM( 671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_DT_MGC5]); 672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_DT_NRMGC; nI++) { 673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->dtmgc[nI] == NULL) { 674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, 675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, NULL); 676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("got dtmgc%d", nI+1)); 678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* kb pdfdur* */ 681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pdfdur = picokpdf_getPdfDUR( 682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_PDF_DUR]); 683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->pdfdur == NULL) { 684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL); 686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("got pdfdur")); 688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* kb pdflfz* */ 690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pdflfz = picokpdf_getPdfMUL( 691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_PDF_LFZ]); 692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->pdflfz == NULL) { 693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL); 695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("got pdflfz")); 697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* kb tabphones */ 699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->tabphones = picoktab_getPhones( 700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voice->kbArray[PICOKNOW_KBID_TAB_PHONES]); 701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->tabphones == NULL) { 702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL); 704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("got tabphones")); 706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_initialize*/ 709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * termination of a pam PU 712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : handle to a pam PU struct 713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK 714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_terminate(register picodata_ProcessingUnit this) 718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_terminate*/ 729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * deallocaton of a pam PU 732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : handle to a pam PU struct 733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param mm : engine memory manager 734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK 735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_subobj_deallocate(register picodata_ProcessingUnit this, 739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager mm) 740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t* pam; 743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mm = mm; /* avoid warning "var not used in this function"*/ 747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------------------------------------------------- 748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Memory de-allocations 749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ------------------------------------------------------------------*/ 750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats != NULL) { 751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &pam->sSyllFeats); 752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sPhIds != NULL) { 754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &pam->sPhIds); 755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sPhFeats != NULL) { 757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &pam->sPhFeats); 758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllItems != NULL) { 760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &pam->sSyllItems); 761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllItemOffs != NULL) { 763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &pam->sSyllItemOffs); 764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &this->subObj); 766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_subobj_deallocate*/ 770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * creates a new pam processing unit 773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param mm : engine memory manager 774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param common : engine common object pointer 775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param cbIn : pointer to input buffer 776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param cbOut : pointer to output buffer 777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param voice : pointer to voice structure 778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return this : pam PU handle if success 779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return NULL : if error 780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_ProcessingUnit picopam_newPamUnit(picoos_MemoryManager mm, 784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common, picodata_CharBuffer cbIn, 785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_CharBuffer cbOut, picorsrc_Voice voice) 786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_ProcessingUnit this = picodata_newProcessingUnit(mm, common, cbIn, 791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen cbOut, voice); 792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (this == NULL) { 793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->initialize = pam_initialize; 796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("picotok_newPamUnit -- set this->step to pam_step")); 798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->step = pam_step; 800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->terminate = pam_terminate; 801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subDeallocate = pam_subobj_deallocate; 802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subObj = picoos_allocate(mm, sizeof(pam_subobj_t)); 803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (this->subObj == NULL) { 804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("Error in Pam Object allocation")); 805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void*) &this); 806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }; 808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------------------------------------------------- 810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Allocate internal memory for PAM (only at PU creation time) 811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ------------------------------------------------------------------*/ 812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK != pam_allocate(mm, pam)) { 814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("Error in Pam buffers Allocation")); 815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &this->subObj); 816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *) &this); 817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*----------------------------------------------------------------- 821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Initialize memory for PAM (this may be re-used elsewhere, e.g.Reset) 822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ------------------------------------------------------------------*/ 8237bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi if (PICO_OK != pam_initialize(this, PICO_RESET_FULL)) { 824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("problem initializing the pam sub-object")); 825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return this; 827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*picopam_newPamUnit*/ 828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*------------------------------------------------------------------------------- 830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PROCESSING AND INTERNAL FUNCTIONS 831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen --------------------------------------------------------------------------------*/ 832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * initializes default duration limits for boundary items 835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param uBoundType : type of input boundary type 836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *uMinDur, *uMaxDur : addresses of values to initialize 837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return void 838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks so far initializes to 0 both values; this will leave the values given by tree prediction 839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void get_default_boundary_limit(picoos_uint8 uBoundType, 843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 *uMinDur, picoos_uint16 *uMaxDur) 844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (uBoundType) { 846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SBEG: 847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMinDur = 0; 848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMaxDur = 20; 849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SEND: 851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMinDur = 550; 852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMaxDur = 650; 853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_TERM: 855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMinDur = 0; 856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMaxDur = 0; 857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR0: 859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMinDur = 0; 860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMaxDur = 0; 861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR1: 863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMinDur = 275; 864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMaxDur = 325; 865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2: 867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMinDur = 4; 868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMaxDur = 60; 869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR3: 871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMinDur = 0; 872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *uMaxDur = 0; 873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*get_default_boundary_limit*/ 879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * checks if "neededSize" is available on "nCurrPhoneme" 882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param pam : pam subobj 883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param neededSize : the requested size 884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : size is available 885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return !=PICO_OK : size not available 886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t check_phones_size(pam_subobj_t *pam, 890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 neededSize) 891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nCurrPhoneme + neededSize) > PICOPAM_MAX_PH_PER_SENT - 1) { 893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*check_phones_size*/ 897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * checks if neededSize is available on "nCurrSyllable" 900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param pam : pam subobj 901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param neededSize : the requested size 902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : size is available 903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return !=PICO_OK : size not available 904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t check_syllables_size(pam_subobj_t *pam, 908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 neededSize) 909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nCurrSyllable + neededSize) > PICOPAM_MAX_SYLL_PER_SENT - 1) { 911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*check_syllables_size*/ 915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * verifies that local storage has enough space to receive 1 item 918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to current PU struct 919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param item : pointer to current item head 920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : resource limits would be reached during processing of input item 921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item could be processed normally 922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid 923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pamCheckResourceLimits( 927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this, const picoos_uint8 *item) 928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_itemhead_t head; 931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t sResult; 932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = TRUE; /*default : resource limits reached*/ 937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.type = item[0]; 938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.info1 = item[1]; 939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.info2 = item[2]; 940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.len = item[3]; 941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (head.type) { 943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*commands that generate syllables/phonemes*/ 944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_SYLLPHON: 945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable >= PICOPAM_MAX_SYLL_PER_SENT - 2) { 946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; /*no room for more syllables*/ 947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nCurrPhoneme + head.len) >= PICOPAM_MAX_PH_PER_SENT - 2) { 949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; /*no room for more phoneme*/ 950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_BOUND: 953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((head.info1 == PICODATA_ITEMINFO1_BOUND_SBEG) || (head.info1 954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_ITEMINFO1_BOUND_SEND) || (head.info1 955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_ITEMINFO1_BOUND_TERM) || (head.info1 956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_ITEMINFO1_BOUND_PHR1) 957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef PAM_PHR2_WITH_PR1 958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (head.info1 == PICODATA_ITEMINFO1_BOUND_PHR2) 959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ) { 961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable >= PICOPAM_MAX_SYLL_PER_SENT - 2) { 963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; /*no room for more syllables*/ 964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nCurrPhoneme + 1) >= PICOPAM_MAX_PH_PER_SENT - 2) { 966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; /*no room for more phoneme*/ 967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*all other commands has to be queued*/ 973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nAttachedItemsSize + head.len) 974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen >= PICOPAM_MAX_ITEM_SIZE_PER_SENT - 1) { 975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; /*no room for more items*/ 976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; /*no resource limits apply to current item*/ 980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pamCheckResourceLimits*/ 981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * selects items to be sent to next PU immedately 984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to current PU struct 985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param item : pointer to current item head 986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item should be passed on next PU NOW 987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item should not be passed on next PU now but should be processed 988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid 989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_check_immediate(register picodata_ProcessingUnit this, 993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_uint8 *item) 994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable <= -1) { 1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (item[0] == PICODATA_ITEM_SYLLPHON) 1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((item[0] == PICODATA_ITEM_BOUND) && (item[1] 1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_ITEMINFO1_BOUND_SBEG)) 1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (is_pam_command((picoos_uint8 *) item) == TRUE) 1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; /*no need to process data : send it*/ 1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; /*syllable struct not void : do standard processing*/ 1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pam_check_immediate*/ 1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * checks if the input item has to be queued in local storage for later resynch 1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to current PU struct 1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param item : pointer to current item head 1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item should be queued 1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item should not be queued 1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid 1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_hastobe_queued(register picodata_ProcessingUnit this, 1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_uint8 *item) 1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 1029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_itemhead_t head; 1030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.type = item[0]; 1035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.info1 = item[1]; 1036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (head.type) { 1038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*commands that generate syllables/phonemes*/ 1039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_SYLLPHON: 1040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; /*no queue needed*/ 1041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_BOUND: 1043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((head.info1 == PICODATA_ITEMINFO1_BOUND_PHR3) 1044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef PAM_PHR2_WITH_PR3 1045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ||(head.info1==PICODATA_ITEMINFO1_BOUND_PHR2) 1046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 1047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (head.info1 == PICODATA_ITEMINFO1_BOUND_PHR0)) { 1048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; /*no queue needed*/ 1049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*all other items has to be queued*/ 1054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; /*item has to be queued*/ 1057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pam_hastobe_queued*/ 1058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * queue item in local storage for later resynch 1061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to current PU struct 1062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param item : pointer to current item head 1063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item queued 1064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item not queued because of errors 1065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid 1066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_queue(register picodata_ProcessingUnit this, 1070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_uint8 *item) 1071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 1073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_itemhead_t head; 1074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nI; 1075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t sResult; 1076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = TRUE; /*default : item queued*/ 1081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.type = item[0]; 1082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.info1 = item[1]; 1083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.info2 = item[2]; 1084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.len = item[3]; 1085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*test condition on enough room to store current item in the "sSyllItems" area*/ 1087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nAttachedItemsSize + head.len + sizeof(picodata_itemhead_t)) 1088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen >= PICOPAM_MAX_ITEM_SIZE_PER_SENT - 1) { 1089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; /*resource limit reached*/ 1090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*store current offset*/ 1092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItemOffs[pam->nLastAttachedItemId] = pam->nAttachedItemsSize; 1093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*store the item to the "sSyllItems" area*/ 1094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < (head.len + sizeof(picodata_itemhead_t)); nI++) { 1095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllItems[pam->nAttachedItemsSize + nI] = item[nI]; 1096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*increment the attached items area*/ 1098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nAttachedItemsSize += nI; 1099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*increment id*/ 1101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nLastAttachedItemId++; 1102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*set start(if not initialized) and end ids of queued items in sSyllFeats*/ 1103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable > -1) { 1104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*normal case : the item is attached to current syllable*/ 1105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] == 0) { 1106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] 1107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->nLastAttachedItemId; 1108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] 1110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->nLastAttachedItemId; 1111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*special case : an item is requested to be queued even if no 1113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen syllables has been assigned to the sentence structure : 1114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen -->> use syll 0*/ 1115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[0].phoneV[ITM] == 0) { 1116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[0].phoneV[ITM] = pam->nLastAttachedItemId; 1117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[0].phoneV[itm] = pam->nLastAttachedItemId; 1119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; /*item queued successfully*/ 1121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pam_queue*/ 1122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * selects items to be dealth with by the PU processing 1125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param item : pointer to current item head 1126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item should be processed 1127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item should not be processed (maybe it ontains commands or items for other PUs) 1128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid 1129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_deal_with(const picoos_uint8 *item) 1133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_itemhead_t head; 1135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t sResult; 1136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = FALSE; 1137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.type = item[0]; 1138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.info1 = item[1]; 1139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.info2 = item[2]; 1140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen head.len = item[3]; 1141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (head.type) { 1142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_SYLLPHON: 1143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_BOUND: 1144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = TRUE; 1145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 1150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pam_deal_with*/ 1151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns true if more items has to be produced for current syllable 1154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item is to be produced 1156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item is not to be produced 1157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item pointed to by *item should be already valid 1158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pamHasToProcess(register picodata_ProcessingUnit this) 1162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 1164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nCond1, nCond2, nCond3; 1165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*conditions originating a "NOT to be processed" result */ 1171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nCond1 = pam->nCurrSyllable <= -1; 1172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nCond2 = pam->nCurrSyllable >= pam->nTotalSyllables; 1173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nCond3 = pam->nSyllPhoneme 1174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen >= pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3]; 1175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((nCond1) || (nCond2) || (nCond3)) 1177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 1180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pamHasToProcess*/ 1181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * modifies the process flags in order to point to next valid syllable phone or item to be produced 1184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item has to be produced 1186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item has not to be produced 1187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pamUpdateProcess(register picodata_ProcessingUnit this) 1191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 1193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable == -1) { 1200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*this to be able to manage sudden PU cleanup after FLUSH CMD*/ 1201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*check number of phonemes for current syllable*/ 1204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nSyllPhoneme < pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] - 1) { 1205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nSyllPhoneme++; 1206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nSyllPhoneme == pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] - 1) { 1209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*this helps in identifyng the end of syllable condition in PamHasToProcess*/ 1210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nSyllPhoneme++; 1211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*previous syllable phonemes are complete: test if any items are tied to this syllable*/ 1213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] > 0) { 1214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*there are items tied to this syllable*/ 1215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrAttachedItem == 0) { 1216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*if it is the first item to be regenerated initialize it*/ 1217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrAttachedItem 1218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM]; 1219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*not the first item : check if more*/ 1222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrAttachedItem 1223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen < pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]) { 1224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*more tied items to be regenerated*/ 1225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrAttachedItem++; 1226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*previous syllable phonemes and items are complete: switch to next syllable*/ 1231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable < pam->nTotalSyllables - 1) { 1232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable++; 1233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nSyllPhoneme = 0; 1234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrAttachedItem = 0; 1235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*no more phonemes or items to be produced*/ 1238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable++; 1239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nSyllPhoneme = 0; 1240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 1241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pamUpdateProcess*/ 1243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns true if more items has to be popped for current syllable 1246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item has to be popped 1248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item has not to be popped 1249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pamHasToPop(register picodata_ProcessingUnit this) 1253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 1255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Preliminary condition : at least 1 syllable*/ 1262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable <= -1) 1263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Preliminary condition : not maximum number of syllables*/ 1266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable >= pam->nTotalSyllables) 1267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Preliminary condition : start and end offset in current item > 0 */ 1270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] <= 0) 1271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] <= 0)) 1272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Final condition : current popped item less or eq to maximum*/ 1275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrAttachedItem 1276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen > pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]) 1277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 1278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 1280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pamHasToPop*/ 1281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns the address of an item to be popped from the current syllable queue 1284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return pop_address : item address 1286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return NULL : item not poppable 1287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 *pamPopItem(register picodata_ProcessingUnit this) 1291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 1293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nItem; 1294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Preliminary condition : at least 1 syllable*/ 1300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable <= -1) 1301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Preliminary condition : not maximum number of syllables*/ 1304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable >= pam->nTotalSyllables) 1305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Preliminary condition : start and end offset in current item > 0 */ 1308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] <= 0) 1309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] <= 0)) 1310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Final condition : current popped item less than maximum*/ 1313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrAttachedItem 1314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen > pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]) 1315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nItem = pam->nCurrAttachedItem; 1318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*please note : nItem-1 should match with actions performed in function "pam_queue(..)" */ 1319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return &(pam->sSyllItems[pam->sSyllItemOffs[nItem - 1]]); 1320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pamPopItem*/ 1322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns the address of an item popped from the syllable 0 queue 1325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return pop_address : item address 1327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return NULL : item not poppable 1328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks the item is popped only if it has been inserted in the queue before the first 1329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks item assigned to the syllable 0 i.e. 1330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks AttachedItem<=pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]-1 1331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 *pamPopAttachedSy0(register picodata_ProcessingUnit this) 1335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 1337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nItem; 1338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*should be syllable 0*/ 1344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable != 0) 1345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*start and end offset in current item > 0 */ 1348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] <= 0) 1349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] <= 0)) 1350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*if current popped item is > 0 test end condition*/ 1353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrAttachedItem > 0) { 1354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Other condition : current popped item less than maximum*/ 1355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrAttachedItem 1356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen > pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] - 1) 1357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nItem = pam->nCurrAttachedItem; 1360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return &(pam->sSyllItems[pam->sSyllItemOffs[nItem]]); 1361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} /*pamPopAttachedSy0*/ 1363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * pdf access for duration 1366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param durIndex : index of duration in the pdf 1368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param phonDur : pointer to base of array where to store the duration values 1369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param numFramesState : pointer to base of array where to store the number of frames per state 1370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : pdf retrieved 1371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : pdf not retrieved 1372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies phonDur (the requested duration value) 1373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies numFramesState (the requested number of frames per state (vector)) 1374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_get_duration(register picodata_ProcessingUnit this, 1378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 durIndex, picoos_uint16 *phonDur, 1379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *numFramesState) 1380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 1382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpdf_PdfDUR pdf; 1383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *durItem; 1384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 nFrameSize, nI; 1385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single fValue; 1386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pdf = pam->pdfdur; 1391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*make the index 0 based*/ 1392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (durIndex > 0) 1393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen durIndex--; 1394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* check */ 1396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (durIndex > pdf->numframes - 1) { 1397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("PAM durPdf access error, index overflow -> index: %d , numframes: %d", durIndex, pdf->numframes)); 1398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 1399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* base pointer */ 1401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen durItem = &(pdf->content[durIndex * pdf->vecsize]); 1402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (durItem == NULL) { 1403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("PAM durPdf access error , frame pointer = NULL")); 1404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 1405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nFrameSize = pdf->sampperframe / 16; 1407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *phonDur = ((pdf->phonquant[((*durItem) & 0xF0) >> 4]) * nFrameSize); 1408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numFramesState[0] = pdf->statequant[((*durItem) & 0x0F)]; 1409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen durItem++; 1410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numFramesState[1] = pdf->statequant[((*durItem) & 0xF0) >> 4]; 1411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numFramesState[2] = pdf->statequant[((*durItem) & 0x0F)]; 1412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen durItem++; 1413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numFramesState[3] = pdf->statequant[((*durItem) & 0xF0) >> 4]; 1414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numFramesState[4] = pdf->statequant[((*durItem) & 0x0F)]; 1415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*modification of the duration information based on the duration modifier*/ 1417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *phonDur = (picoos_uint16) (((picoos_single) * phonDur) * pam->dMod); 1418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < 5; nI++) { 1419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fValue = pam->dRest + (picoos_single) numFramesState[nI] * pam->dMod; 1420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numFramesState[nI] = (picoos_uint8) (fValue); 1421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dRest = fValue - (picoos_single) numFramesState[nI]; 1422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_get_duration*/ 1425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * pdf access for pitch 1428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param lf0Index : pointer to variable to receive index of pitch in the pdf 1430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param nI : number of the phone's state 1431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param phonF0 : pointer to variable to receive the pitch value 1432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : pdf retrieved 1433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : pdf not retrieved 1434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies phonDur (the requested duration value) 1435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies phonF0 (the requested pitch value (scalar)) 1436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_get_f0(register picodata_ProcessingUnit this, 1440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 *lf0Index, picoos_uint8 nI, picoos_single *phonF0) 1441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 1443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *lfItem, numstreams; 1444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 lf0IndexOffset, sTemp; 1445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single lfum, lfivar, lfz; 1446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0IndexOffset = lf0Index[nI]; 1452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*make the index 0 based*/ 1454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lf0IndexOffset > 0) 1455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0IndexOffset--; 1456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0IndexOffset += pam->pdflfz->stateoffset[nI]; 1458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lf0IndexOffset > pam->pdflfz->numframes - 1) { 1459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("PAM flfzPdf access error, index overflow -> index: %d , numframes: %d", lf0Index, pam->pdflfz->numframes)); 1460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 1461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* base pointer */ 1463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0IndexOffset *= pam->pdflfz->vecsize; 1464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfItem = &(pam->pdflfz->content[lf0IndexOffset]); 1466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sTemp = (picoos_uint16) (((lfItem[1] << 8)) | lfItem[0]); 1467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfum = (picoos_single) (sTemp << (pam->pdflfz->meanpowUm[0])); 1469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numstreams = 3; 1470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfivar = (picoos_single) (((picoos_uint16) lfItem[numstreams * 2]) 1471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen << pam->pdflfz->ivarpow[0]); 1472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfz = (picoos_single) lfum / (picoos_single) lfivar; 1473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfz = (picoos_single) exp((double) lfz); 1474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen phonF0[nI] = (picoos_single) lfz; 1475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*pitch modoification*/ 1477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen phonF0[nI] *= pam->pMod; 1478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_get_f0*/ 1480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * elementary rounding function 1483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param fIn : (real) input value 1484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return the rounded value 1485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_single f_round(picoos_single fIn) 1489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 iVal; 1491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single fVal; 1492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen iVal = (picoos_int32) fIn; 1494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fVal = (picoos_single) iVal; 1495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (fIn > (picoos_single) 0.0f) { 1497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((fIn - fVal) < (picoos_single) 0.5f) 1498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return fVal; 1499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return fVal + (picoos_single) 1.0f; 1501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((fVal - fIn) < (picoos_single) 0.5f) 1503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return fVal; 1504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return fVal - (picoos_single) 1.0f; 1506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*f_round*/ 1508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * updates the input vector for PAM 1511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : update successful 1513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 1514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies pam->sPhFeats[] 1515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_update_vector(register picodata_ProcessingUnit this) 1519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 1521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 numstates, nI; 1522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single fDur, f0avg, f0quant, minf0, maxf0, durquant1, durquant2, 1523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mindur, maxdur1, maxdur2; 1524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 1528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*default init*/ 1530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhFeats[DUR] = 0; 1531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhFeats[F0] = 0; 1532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* 1533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Hard coded parameters for quantization 1534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numstates = PICOPAM_NRSTPF; 1536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen f0quant = 30.0f; 1537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen minf0 = 90.0f; 1538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen maxf0 = 360.0f; 1539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen durquant1 = 20.0f; 1541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen durquant2 = 100.0f; 1542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mindur = 40.0f; 1543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen maxdur1 = 160.0f; 1544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen maxdur2 = 600.0f; 1545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen f0avg = 0.0f; 1546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < numstates; nI++) 1547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen f0avg += pam->phonF0[nI]; 1548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen f0avg /= (picoos_single) numstates; 1549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen f0avg = f_round(f0avg / f0quant) * f0quant; 1551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (f0avg < minf0) 1552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen f0avg = minf0; 1553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (f0avg > maxf0) 1554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen f0avg = maxf0; 1555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*make initial silence of sentence shorter (see also pam_put_item)*/ 1557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nCurrSyllable == 0) && (pam->nSyllPhoneme == 0)) { 1558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->phonDur = 2 * 4; 1559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fDur = (picoos_single) pam->phonDur; 1562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fDur = f_round(fDur / durquant1) * durquant1; 1563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (fDur < mindur) 1564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fDur = mindur; 1565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (fDur > maxdur1) { 1566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fDur = f_round(fDur / durquant2) * durquant2; 1567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (fDur > maxdur2) 1568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fDur = maxdur2; 1569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhFeats[DUR] = (picoos_uint8) (fDur / (picoos_single) 10.0f); 1571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhFeats[F0] = (picoos_uint8) (f0avg / (picoos_single) 10.0f); 1572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_update_vector*/ 1575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * compress a single feature in the range 0..9 1578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param inVal : the value to be compressed 1579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return compVal : the compressed value 1580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pamCompressComponent(picoos_uint8 inVal) 1584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (inVal <= 5) 1586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return inVal; 1587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((5 < inVal) && (inVal <= 10)) 1588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 6; 1589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((10 < inVal) && (inVal <= 20)) 1590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 7; 1591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((20 < inVal) && (inVal <= 30)) 1592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 8; 1593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 9; 1594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pamCompressComponent*/ 1595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * prepares the input vector for tree feeding 1598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : vector expanded 1600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on expansion or retrieving the PU pointer 1601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies pam->sPhFeats[] 1602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_expand_vector(register picodata_ProcessingUnit this) 1606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 1608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *inVect, *phonVect, *outVect, nI; 1609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nOffs, nOffs1, nLen; 1610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen inVect = &(pam->sSyllFeats[pam->nCurrSyllable].phoneV[0]); 1615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen phonVect = &(pam->sPhIds[0]); 1616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect = &(pam->sPhFeats[0]); 1617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*just copy back*/ 1618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_INVEC_SIZE; nI++) 1619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[nI] = inVect[nI]; 1620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*now fill missing fields*/ 1621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_mem_copy((void*) &(inVect[FID]), &nOffs, sizeof(nOffs)); 1622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*offset to first phone of current syllable*/ 1623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nOffs = nOffs + pam->nSyllPhoneme; /*offset to current phone of current syllable*/ 1624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nLen = inVect[B3]; /*len of current syllable*/ 1625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nSyllPhoneme >= nLen) { 1626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*error on addressing current phone*/ 1627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 1628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*previous of the previous phone*/ 1630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nOffs1 = nOffs - 2; 1631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nOffs1 >= 0) 1632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P1] = phonVect[nOffs1]; 1633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P1] = PICOPAM_PH_DONT_CARE_VAL; 1635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*previous phone*/ 1636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nOffs1 = nOffs - 1; 1637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nOffs1 >= 0) 1638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P2] = phonVect[nOffs1]; 1639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P2] = PICOPAM_PH_DONT_CARE_VAL; 1641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*^current phone*/ 1642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P3] = phonVect[nOffs]; 1643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*next phone*/ 1645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nOffs1 = nOffs + 1; 1646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nOffs1 < pam->nTotalPhonemes) 1647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P4] = phonVect[nOffs1]; 1648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P4] = PICOPAM_PH_DONT_CARE_VAL; 1650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*next of the next phone*/ 1651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nOffs1 = nOffs + 2; 1652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nOffs1 < pam->nTotalPhonemes) 1653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P5] = phonVect[nOffs1]; 1654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P5] = PICOPAM_PH_DONT_CARE_VAL; 1656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*pos of curr phone with respect to left syllable boundary*/ 1657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P6] = pam->nSyllPhoneme + 1; 1658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*pos of curr phone with respect to right syllable boundary*/ 1659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P7] = nLen - pam->nSyllPhoneme; 1660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*is current phone in consonant syllable boundary? (1:yes)*/ 1661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nSyllPhoneme < inVect[P8]) 1662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P8] = 1; 1663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[P8] = 0; 1665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_expand_vector*/ 1667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * compresses the input vector for PAM 1670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : compression successful 1672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 1673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies pam->sPhFeats[] 1674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pamCompressVector(register picodata_ProcessingUnit this) 1678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 1680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *outVect, nI; 1681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect = &(pam->sPhFeats[0]); 1686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_INVEC_SIZE; nI++) { 1687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (nI) { 1688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case P1: 1689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case P2: 1690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case P3: 1691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case P4: 1692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case P5: 1693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B1: 1694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B2: 1695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B16: 1696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E1: 1697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case H5: 1698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*don't do any compression*/ 1699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do compression*/ 1702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (outVect[nI] != PICOPAM_DONT_CARE_VALUE) 1703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[nI] = pamCompressComponent(outVect[nI]); 1704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 1705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[nI] = PICOPAM_DONT_CARE_VAL; 1706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pamCompressVector*/ 1711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * reorganizes the input vector for PAM 1714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : reorganization successful 1716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 1717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks Modifies pam->sPhFeats[] 1718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pamReorgVector(register picodata_ProcessingUnit this) 1722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 1724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *outVect, inVect[60], nI; 1725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect = &(pam->sPhFeats[0]); 1730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_INVEC_SIZE; nI++) inVect[nI] = outVect[nI]; 1731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*reorganize*/ 1732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = T_B1; nI <= T_H5; nI++) { 1733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (nI) { 1734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B1: 1735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B1] = inVect[B1]; 1736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B2: 1738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B2] = inVect[B2]; 1739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B3: 1741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B3] = inVect[B3]; 1742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B4: 1744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B4] = inVect[B4]; 1745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B5: 1747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B5] = inVect[B5]; 1748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B6: 1750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B6] = inVect[B6]; 1751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B7: 1753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B7] = inVect[B7]; 1754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B8: 1756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B8] = inVect[B8]; 1757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B9: 1759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B9] = inVect[B9]; 1760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B10: 1762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B10] = inVect[B10]; 1763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B11: 1765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B11] = inVect[B11]; 1766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B12: 1768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B12] = inVect[B12]; 1769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B13: 1771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B13] = inVect[B13]; 1772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B14: 1774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B14] = inVect[B14]; 1775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B15: 1777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B15] = inVect[B15]; 1778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B16: 1780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B16] = inVect[B16]; 1781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B17: 1783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B17] = inVect[B17]; 1784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B18: 1786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B18] = inVect[B18]; 1787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B19: 1789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B19] = inVect[B19]; 1790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B20: 1792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B20] = inVect[B20]; 1793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_B21: 1795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_B21] = inVect[B21]; 1796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E1: 1799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E1] = inVect[E1]; 1800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E2: 1802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E2] = inVect[E2]; 1803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E3: 1805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E3] = inVect[E3]; 1806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E4: 1808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E4] = inVect[E4]; 1809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E5: 1811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E5] = inVect[E5]; 1812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E6: 1814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E6] = inVect[E6]; 1815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E7: 1817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E7] = inVect[E7]; 1818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E8: 1820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E8] = inVect[E8]; 1821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E9: 1823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E9] = inVect[E9]; 1824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E10: 1826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E10] = inVect[E10]; 1827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E11: 1829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E11] = inVect[E11]; 1830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E12: 1832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E12] = inVect[E12]; 1833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_E13: 1835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_E13] = inVect[E13]; 1836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_A3: 1839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_A3] = inVect[A3]; 1840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_C3: 1842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_C3] = inVect[C3]; 1843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_D2: 1845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_D2] = inVect[D2]; 1846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_F2: 1848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_F2] = inVect[F2]; 1849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_G1: 1852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_G1] = inVect[G1]; 1853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_I1: 1855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_I1] = inVect[I1]; 1856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_G2: 1859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_G2] = inVect[G2]; 1860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_I2: 1862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_I2] = inVect[I2]; 1863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_H1: 1866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_H1] = inVect[H1]; 1867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_H2: 1869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_H2] = inVect[H2]; 1870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_H3: 1872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_H3] = inVect[H3]; 1873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_H4: 1875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_H4] = inVect[H4]; 1876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case T_H5: 1878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outVect[T_H5] = inVect[H5]; 1879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pamReorgVector*/ 1884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * puts a PAM item into PU output buffer 1887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam object pointer 1888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param outBuff : output buffer base pointer 1889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param outWritePos : offset in output buffer 1890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *bytesWr : actual bytes written 1891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : put successful 1892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 1893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_put_item(register picodata_ProcessingUnit this, 1897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *outBuff, picoos_uint16 outWritePos, picoos_uint8 *bytesWr) 1898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 1900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *sDest, nI, nType, nIdx, fde; 1901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 pos, pos32; 1902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 ft, dt; 1903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 uMinDur, uMaxDur; 1904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 1905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 1906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 1907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = &(outBuff[outWritePos]); 1909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[0] = PICODATA_ITEM_PHONE; /*Item type*/ 1910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[1] = pam->sPhFeats[P3]; /*phonetic id*/ 1911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[2] = PICOPAM_NRSTPF; /*number of states per phone*/ 1912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[3] = sizeof(picoos_uint16) * PICOPAM_NRSTPF * 3; /*size of the item*/ 1913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos = 4; 1914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*make initial silence of sentence shorter (see also UpdateVector)*/ 1915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->nCurrSyllable == 0) && (pam->nSyllPhoneme == 0)) { 1916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_NRSTPF - 1; nI++) 1917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->numFramesState[nI] = 0; 1918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->numFramesState[nI] = 2; 1919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*manage silence syllables with prescribed durations*/ 1921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos32 = Min; 1922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_read_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 1923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &pos32, &uMinDur); 1924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos32 = Max; 1925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_read_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 1926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &pos32, &uMaxDur); 1927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (uMaxDur > 0) { 1929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* Select weights*/ 1930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nType = pam->sSyllFeats[pam->nCurrSyllable].phoneV[bnd]; 1931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (nType) { 1932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SBEG: 1933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nIdx = PICOPAM_PWIDX_SBEG; 1934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR1: 1936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nIdx = PICOPAM_PWIDX_PHR1; 1937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2: 1939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nIdx = PICOPAM_PWIDX_PHR2; 1940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SEND: 1942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_TERM: 1943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nIdx = PICOPAM_PWIDX_SEND; 1944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nIdx = PICOPAM_PWIDX_DEFA; 1947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fde = 2; 1950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ft = 0; 1951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dt = 0; 1952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_transformDurations( 1953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fde, /* 2's exponent of frame duration in ms, e.g. 2 for 4ms, 3 for 8ms */ 1954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_NRSTPF, /* number of states per phone */ 1955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->numFramesState[0]), /* estimated durations */ 1956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sil_weights[nIdx], /* integer weights */ 1957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen uMinDur, /* minimum target duration in ms */ 1958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen uMaxDur, /* maximum target duration in ms */ 1959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ft, /* factor to be multiplied to get the target */ 1960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &dt /* in/out, rest in ms */ 1961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ); 1962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*put data*/ 1965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_NRSTPF; nI++) { 1966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_write_mem_pi_uint16(sDest, &pos, 1967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_uint16) pam->numFramesState[nI]); 1968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_write_mem_pi_uint16(sDest, &pos, 1969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_uint16) pam->lf0Index[nI]); 1970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_write_mem_pi_uint16(sDest, &pos, 1971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_uint16) pam->mgcIndex[nI]); 1972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *bytesWr = sizeof(picodata_itemhead_t) + sizeof(picoos_uint16) 1974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * PICOPAM_NRSTPF * 3; 1975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_put_item*/ 1977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 1979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * puts a non PAM (queued) item into PU output buffer 1980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param qItem : pointer to item to put 1981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param outBuff : output buffer base pointer 1982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param outWritePos : offset in output buffer 1983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *bytesWr : actual bytes written 1984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : put successful 1985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 1986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 1987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 1988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 1989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_put_qItem(picoos_uint8 *qItem, picoos_uint8 *outBuff, 1990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 outWritePos, picoos_uint8 *bytesWr) 1991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *sDest, nI; 1993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = &(outBuff[outWritePos]); 1994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *bytesWr = sizeof(picodata_itemhead_t); 1995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < (sizeof(picodata_itemhead_t) + qItem[3]); nI++) { 1996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[nI] = qItem[nI]; 1997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *bytesWr = nI; 1999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 2000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_put_qItem*/ 2001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * tells if an item is a PAM command (except play) 2004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param qItem : input item to test 2005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : qItem is a PAM command (except play) 2006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : qItem not a PAM command 2007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t is_pam_command(const picoos_uint8 * qItem) 2011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (qItem[0]) { 2013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_CMD: 2015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (qItem[1]) { 2016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_FLUSH: 2017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* flush is for all PU's and as such it is also for PAM*/ 2018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_PITCH: 2019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_SPEED: 2020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*is_pam_command*/ 2028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * tells if an item is a PAM PLAY command 2031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param qItem : input item to test 2032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : qItem is a PAM PLAY command 2033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : qItem not a PAM PLAY command 2034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t is_pam_play_command(picoos_uint8 *qItem) 2038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (qItem[0]) { 2040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_CMD: 2042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (qItem[1]) { 2043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_PLAY: 2044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[2] == PICODATA_ITEMINFO2_CMD_TO_PAM) 2045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*is_pam_play_command*/ 2053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * command processor for PAM pu 2056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam item subobject 2057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param qItem : input item pointer 2058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICOPAM_FLUSH_RECEIVED : when a FLUSH is received 2059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICOPAM_CONTINUE : normal command processing 2060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICODATA_PU_ERROR : errors in accessing data 2061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pamDoCommand(register picodata_ProcessingUnit this, 2065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *qItem) 2066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 2068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_single fValue; 2069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 nValue; 2070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 nPos; 2071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 2072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 2073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[0] == PICODATA_ITEM_CMD) { 2076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (qItem[1]) { 2077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_FLUSH: 2078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* flush is for all PU's and as such it is also for PAM : implement the flush!!*/ 2079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); 2080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nLastAttachedItemId = pam->nCurrAttachedItem = 0; 2081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nAttachedItemsSize = 0; 2082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_FLUSH_RECEIVED; 2083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_PITCH: 2086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_SPEED: 2087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nPos = 4; 2088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_read_mem_pi_uint16(qItem, &nPos, &nValue); 2089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[2] == 'a') { 2090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*absloute modifier*/ 2091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fValue = (picoos_single) nValue / (picoos_single) 100.0f; 2092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[1] == PICODATA_ITEMINFO1_CMD_PITCH) 2093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pMod = fValue; 2094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[1] == PICODATA_ITEMINFO1_CMD_SPEED) 2095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dMod = (1.0f / fValue); 2096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[2] == 'r') { 2098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*relative modifier*/ 2099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen fValue = (picoos_single) nValue / (picoos_single) 1000.0f; 2100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[1] == PICODATA_ITEMINFO1_CMD_PITCH) 2101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pMod *= (1.0f / fValue); 2102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (qItem[1] == PICODATA_ITEMINFO1_CMD_SPEED) 2103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dMod *= (1.0f / fValue); 2104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_CONTINUE; 2106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }/*end switch switch (qItem[1])*/ 2111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }/*end if (qItem[0]==PICODATA_ITEM_CMD)*/ 2112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_CONTINUE; 2113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pamDoCommand*/ 2114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * defines if an item has to be sent to following PUs 2117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param qItem : input item pointer 2118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return TRUE : item has to be transmitted to following PUs 2119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return FALSE : item has to be consumed internallz on PAM 2120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t isItemToPut(picoos_uint8 *qItem) 2124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (qItem[0]) { 2126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_CMD: 2127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* is a command*/ 2128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICODATA_ITEMINFO1_CMD_SPEED == qItem[1]) { 2129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* SPEED consumed here*/ 2130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_BOUND: 2134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (qItem[1]) { 2135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SBEG: 2136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR0: 2137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR1: 2138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2: 2139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR3: 2140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*boudary items consumed here except SEND,TERM*/ 2141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*all other items not explicitly mentioned here 2151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen are transmitted to next PUs*/ 2152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*isItemToPut*/ 2154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * pushes a boundary TERM item into some buffer 2157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param outBuff : output buffer base pointer 2158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param outWritePos : offset in output buffer 2159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *bytesWr : actual bytes written 2160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK 2161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks used while forcing TERM input items in forward processing 2162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_put_term(picoos_uint8 *outBuff, 2166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 outWritePos, picoos_uint8 *bytesWr) 2167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *sDest; 2169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = &(outBuff[outWritePos]); 2170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[0] = PICODATA_ITEM_BOUND; /*Item type*/ 2171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[1] = PICODATA_ITEMINFO1_BOUND_TERM; 2172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[2] = PICODATA_ITEMINFO2_BOUNDTYPE_T; 2173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest[3] = 0; /*item size*/ 2174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *bytesWr = 4; 2175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 2176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_put_term*/ 2177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * translates one full phone into a PHONE Item including DT Dur, F0 and CEP trees feature generation and traversal 2180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam item subobject pointer 2181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : processing successful 2182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICODATA_PU_ERROR : error accessing PAM object 2183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return !=PICO_OK : processing errors 2184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pamPhoneProcess(register picodata_ProcessingUnit this) 2188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 2190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t sResult; 2191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokdt_classify_result_t dTreeResult; 2192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nI, bWr; 2193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 2195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 2196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*expands current phone in current syllable in the corresponding vector pam->sPhFeats[]*/ 2199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_expand_vector(this); 2200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pamCompressVector(this); 2201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pamReorgVector(this); 2202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*tree traversal for duration*/ 2204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!pam_do_tree(this, pam->dtdur, &(pam->sPhFeats[0]), PICOPAM_INVEC_SIZE, 2205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &dTreeResult)) { 2206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("problem using pam tree dtdur, using fallback value")); 2207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dTreeResult.class = 0; 2208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->durIndex = dTreeResult.class; 2210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_get_duration(this, pam->durIndex, &(pam->phonDur), 2211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->numFramesState[0])); 2212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*tree traversal for pitch*/ 2214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_MAX_STATES_PER_PHONE; nI++) { 2215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!pam_do_tree(this, pam->dtlfz[nI], &(pam->sPhFeats[0]), 2216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_INVEC_SIZE, &dTreeResult)) { 2217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("problem using pam tree lf0Tree, using fallback value")); 2218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dTreeResult.class = 0; 2219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->lf0Index[nI] = dTreeResult.class; 2221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*pdf access for pitch*/ 2224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_MAX_STATES_PER_PHONE; nI++) { 2225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_get_f0(this, &(pam->lf0Index[0]), nI, &(pam->phonF0[0])); 2226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*update vector with duration and pitch for cep tree traversal*/ 2229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_update_vector(this); 2230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*cep tree traversal*/ 2231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_MAX_STATES_PER_PHONE; nI++) { 2232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!pam_do_tree(this, pam->dtmgc[nI], &(pam->sPhFeats[0]), 2234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_INVEC_SIZE, &dTreeResult)) { 2235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("problem using pam tree lf0Tree, using fallback value")); 2236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dTreeResult.class = 0; 2237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->mgcIndex[nI] = dTreeResult.class; 2239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*put item to output buffer*/ 2241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_put_item(this, pam->outBuf, pam->outWritePos, &bWr); 2242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICO_OK) 2243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos += bWr; 2244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 2245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 2246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 2247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pamPhoneProcess*/ 2248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * manages first syllable attached items when seen before SBEG 2251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam item subobject pointer 2252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK (0) : default return code --> means no more items to be processed before 1st syllable 2253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICOPAM_GOTO_FEED : go to feed state after this 2254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICOPAM_GOTO_SCHEDULE : flush received 2255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICODATA_PU_ERROR : errors 2256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pamDoPreSyll(register picodata_ProcessingUnit this) 2260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 2262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t sResult; 2263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 bWr, nRc; 2264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *qItem; 2265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nRc = PICOPAM_PRE_SYLL_ENDED; 2266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 2267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 2268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*regenerate initial items before the phonemes*/ 2271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((qItem = pamPopAttachedSy0(this)) != NULL) && !((qItem[0] 2272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_ITEM_BOUND) && (qItem[1] 2273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_ITEMINFO1_BOUND_SBEG))) { 2274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (isItemToPut(qItem)) { 2275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_put_qItem(qItem, pam->outBuf, pam->outWritePos, &bWr);/*popped item has to be sent to next PU*/ 2276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos += bWr; 2277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nRc = PICOPAM_GOTO_FEED; 2278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (is_pam_command(qItem) == TRUE) { 2281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nRc = pamDoCommand(this, qItem); /*popped item is a PAM command : do it NOW!!*/ 2282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((nRc == PICOPAM_FLUSH_RECEIVED) || (nRc == PICODATA_PU_ERROR)) { 2283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*FLUSH command RECEIVED or errors: stop ALL PROCESSING*/ 2284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return nRc; 2285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrAttachedItem++; 2288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nRc == 0) 2289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_CONTINUE; 2290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 2291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return nRc; 2292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*SBEG item management*/ 2294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((qItem != NULL) && (qItem[0] == PICODATA_ITEM_BOUND) && (qItem[1] 2295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_ITEMINFO1_BOUND_SBEG)) { 2296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_put_qItem(qItem, pam->outBuf, pam->outWritePos, &bWr); 2297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos += bWr; 2298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrAttachedItem++; 2299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nRc = PICOPAM_GOTO_FEED; 2300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return nRc; 2302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pamDoPreSyll*/ 2303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * performs a step of the pam processing 2306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam item subobject pointer 2307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param mode : mode for the PU 2308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *numBytesOutput : pointer to output number fo bytes produced 2309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICODATA_PU_IDLE : nothing to do 2310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICODATA_PU_BUSY : still tasks undergoing 2311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICODATA_PU_ERROR : errors on processing 2312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picodata_step_result_t pam_step(register picodata_ProcessingUnit this, 2316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 mode, picoos_uint16 * numBytesOutput) 2317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 2320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t sResult; 2322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 blen, numinb, numoutb; 2323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t rv; 2324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 bWr; 2325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 bForcedItem[4]; 2326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *qItem; 2327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numinb = 0; 2329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numoutb = 0; 2330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen rv = PICO_OK; 2331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 2333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 2336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mode = mode; /* avoid warning "var not used in this function"*/ 2337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Init number of output bytes*/ 2338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *numBytesOutput = 0; 2339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (1) { /* exit via return */ 2341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step -- doing state %i",pam->procState)); 2343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->procState) { 2345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_COLLECT: 2347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* *************** item collector ***********************************/ 2348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*collecting items from the PU input buffer*/ 2349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = picodata_cbGetItem(this->cbIn, 2350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->inBuf[pam->inWritePos]), pam->inBufSize 2351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - pam->inWritePos, &blen); 2352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) { 2353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICO_EOF) { 2354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*no items available : remain in state 0 and return idle*/ 2355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_IDLE; 2356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*errors : remain in state 0 and return error*/ 2358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step(PICOPAM_COLLECT) -- Errors on item buffer input, status: %d",sResult)); 2359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step -- got item, status: %d",sResult)); 2364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = picodata_is_valid_item( 2365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->inBuf[pam->inWritePos]), blen); 2366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != TRUE) { 2367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*input item is not valid : consume the input item and stay in COLLECT*/ 2368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos += blen; 2369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos += blen; 2370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->inReadPos >= pam->inWritePos) { 2371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos = 0; 2372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos = 0; 2373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("pam_step -- item is not valid, type: %d",pam->inBuf[pam->inWritePos])); 2374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*update input write pointer + move to "schedule" state*/ 2378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos += blen; 2379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; 2380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_SCHEDULE: 2383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* check out if more items are available */ 2384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->inReadPos >= pam->inWritePos) { 2385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*no more items : back to collect state*/ 2386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_COLLECT; 2387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* we have one full valid item, with len>0 starting at 2390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inBuf[pam->inReadPos]; here we decide how to elaborate it */ 2391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* PLAY management */ 2393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (is_pam_play_command(&(pam->inBuf[pam->inReadPos])) == TRUE) { 2394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*consume the input item : it has been managed*/ 2395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + sizeof(picodata_itemhead_t); 2397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->inReadPos >= pam->inWritePos) { 2398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos = 0; 2399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos = 0; 2400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*stay in schedule*/ 2402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam_check_immediate(this, &(pam->inBuf[pam->inReadPos]))) { 2406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* item has to be sent to next PU NOW : switch to "immediate" state */ 2407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_IMMEDIATE; 2408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pamCheckResourceLimits(this, &(pam->inBuf[pam->inReadPos]))) { 2411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* item would not fit into local buffers -->> free some space -->> 2412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch to "force term" state */ 2413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_FORWARD_FORCE_TERM; 2414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam_deal_with(&(pam->inBuf[pam->inReadPos]))) { 2418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* item has to be managed by the "forward" state : switch to forward state*/ 2419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_FORWARD; 2420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam_hastobe_queued(this, &(pam->inBuf[pam->inReadPos]))) { 2424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* item is not for PAM so it has to be queued internally */ 2425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_queue(this, &(pam->inBuf[pam->inReadPos])); 2426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*consume the input item : it has been queued*/ 2427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + sizeof(picodata_itemhead_t); 2429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->inReadPos >= pam->inWritePos) { 2430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos = 0; 2431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos = 0; 2432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*if we get here something wrong happened. Being the the item valid, 2436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch to "immediate" state -> send it to next PU -> */ 2437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step (PICOPAM_SCHEDULE) -- unexpected item is sent to next PU !!")); 2438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_IMMEDIATE; 2439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; /*PICOPAM_SCHEDULE*/ 2441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_FORWARD: 2443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*we have one full valid item, with len>0 starting at pam->inBuf[pam->inReadPos]. 2444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen furthermore this item should be in the set {BOUND,SYLL}. 2445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen No other items should arrive here*/ 2446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_adapter_forward_step(this, 2447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->inBuf[pam->inReadPos])); 2448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*decide if this item has to be queued for later re-synchronization 2449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen normally this is only done for SEND/TERM items*/ 2450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam_hastobe_queued(this, &(pam->inBuf[pam->inReadPos]))) { 2451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*item has to be queued iternally in local storage*/ 2452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_queue(this, &(pam->inBuf[pam->inReadPos])); 2453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*now assign next state according to Forward results*/ 2455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (sResult) { 2456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_READY: 2457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->needMoreInput = FALSE; 2458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*consume the input item : it has already been stored*/ 2459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + sizeof(picodata_itemhead_t); 2461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->inReadPos >= pam->inWritePos) { 2462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos = 0; 2463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos = 0; 2464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*activate backward processing*/ 2466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_adapter_backward_step(this); 2467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICO_OK) { 2468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_PROCESS; 2469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step (PICOPAM_FORWARD) -- wrong return from BackwardStep: %d -- Buffered sentence will be discarded",sResult)); 2472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); 2473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nLastAttachedItemId = pam->nCurrAttachedItem 2474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 2475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nAttachedItemsSize = 0; 2476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; 2478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_MORE: 2483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->needMoreInput = TRUE; 2484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*consume the input item : it has already been stored*/ 2485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + sizeof(picodata_itemhead_t); 2487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->inReadPos >= pam->inWritePos) { 2488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*input is finished and PAM need more data : 2489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen clenaup input buffer + switch state back to "schedule state" 2490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos = 0; 2492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos = 0; 2493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; 2494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ATOMIC; 2495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*input is not finished and need more data : 2497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen remain in state "PICOPAM_FORWARD" */ 2498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ATOMIC; 2499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_NA: 2503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*this item has not been stored in internal buffers: 2505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen assign this item to the management of 2506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen "immediate" state*/ 2507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_IMMEDIATE; 2508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } /*end switch sResult*/ 2511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; /*PICOPAM_FORWARD*/ 2512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_FORWARD_FORCE_TERM: 2514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*we have one full valid item, with len>0 2515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen starting at pam->inBuf[pam->inReadPos] but we decided 2516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen to force a TERM item before, without losing the item in 2517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen inBuf[inReadPos] : --> generate a TERM item and do the 2518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen forward processing */ 2519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_put_term(bForcedItem, 0, &bWr); 2520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_adapter_forward_step(this, &(bForcedItem[0])); 2521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (sResult) { 2522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_READY: 2523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_queue(this, &(bForcedItem[0])); 2524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*activate backward processing*/ 2525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_adapter_backward_step(this); 2526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICO_OK) { 2527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_PROCESS; 2528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step (PICOPAM_FORWARD_FORCE_TERM) -- wrong return from BackwardStep: %d -- Buffered sentence will be discarded",sResult)); 2531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); 2532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nLastAttachedItemId = pam->nCurrAttachedItem 2533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 2534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nAttachedItemsSize = 0; 2535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; 2537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step (PICOPAM_FORWARD_FORCE_TERM) -- Forced a TERM but processing do not appear to end -- Buffered sentence will be discarded",sResult)); 2543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); 2544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nLastAttachedItemId = pam->nCurrAttachedItem = 0; 2545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nAttachedItemsSize = 0; 2546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; 2548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } /*end switch sResult*/ 2552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; /*PICOPAM_FORWARD_FORCE_TERM*/ 2553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_PROCESS: 2555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PICOPAM_FRAME_ITEM_SIZE + 4) > (pam->outBufSize 2557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - pam->outWritePos)) { 2558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*WARNING (buffer overflow): leave status unchanged until output buffer free */ 2559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable == 0) { 2563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pamDoPreSyll(this); 2564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICOPAM_GOTO_FEED) { 2565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* 2566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen items pushed to output buffer : 2567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch to "feed" but then back 2568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen to "process" 2569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->retState = PICOPAM_PROCESS; 2571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_FEED; 2572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICOPAM_CONTINUE) { 2575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* 2576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen items processed (maybe commands) : 2577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (maybe we need to process other 2578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen items in pre_syll) and then back to "process" 2579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->retState = PICOPAM_PROCESS; 2581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_PROCESS; 2582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((sResult == PICOPAM_FLUSH_RECEIVED) || (sResult 2586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_PU_ERROR)) { 2587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* 2588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen items processed were a flush or 2589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen problems found: switch to "schedule" 2590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen and abort all processing 2591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->retState = PICOPAM_SCHEDULE; 2593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; 2594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICOPAM_PRE_SYLL_ENDED) { 2597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* 2598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen we get here when pam->nCurrSyllable==0 and 2599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen no more items to be processed before the syllable 2600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = sResult; 2602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pamHasToProcess(this)) { 2606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pamPhoneProcess(this) == PICO_OK) { 2607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pamUpdateProcess(this); 2608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_FEED; /*switch to feed*/ 2609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step(PICOPAM_PROCESS) --- NULL return from pamPhoneProcess")); 2612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pamHasToPop(this) != FALSE) { 2617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((qItem = pamPopItem(this)) == NULL) { 2618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step(PICOPAM_PROCESS) --- NULL return from pamPopItem")); 2619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (isItemToPut(qItem)) { 2623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*popped item has to be sent to next PU*/ 2624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_put_qItem(qItem, pam->outBuf, 2625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos, &bWr); 2626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) { 2627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step(PICOPAM_PROCESS) --- Error on writing item to output buffer")); 2628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos += bWr; /*item write ok*/ 2631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_FEED; /*switch to feed*/ 2632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*moved command processing here (after pam_put_qItem) because of FLUSH command could erase 2635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * the syllable structure and make it impossible to transmit the flush to other PUs*/ 2636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (is_pam_command(qItem) == TRUE) { 2637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pamDoCommand(this, qItem); /*popped item is a PAM command : do it NOW!!*/ 2638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((sResult == PICOPAM_FLUSH_RECEIVED) || (sResult 2639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICODATA_PU_ERROR)) { 2640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->retState = PICOPAM_SCHEDULE; 2641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; /*switch to schedule */ 2642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*update PAM status: if more items attached to the current syllable 2646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen stay in current syllable, otherwise move to next syllable and switch 2647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen to processing phones */ 2648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pamUpdateProcess(this); /*both "doCommand" or "put" : update PAM status*/ 2649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; /*switch to schedule */ 2652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; /*PICOPAM_PROCESS*/ 2656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_IMMEDIATE: 2658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* *** item is output NOW!!! */ 2659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*context: full valid item, with len> starting at pam->inBuf[pam->inReadPos]*/ 2660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numinb = PICODATA_ITEM_HEADSIZE 2661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + pam->inBuf[pam->inReadPos + 3]; 2662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = picodata_copy_item(&(pam->inBuf[pam->inReadPos]), 2663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numinb, &(pam->outBuf[pam->outWritePos]), 2664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outBufSize - pam->outWritePos, &numoutb); 2665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult == PICO_OK) { 2667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos += numinb; 2668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->inReadPos >= pam->inWritePos) { 2669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inReadPos = 0; 2670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->inWritePos = 0; 2671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->needMoreInput = FALSE; 2672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos += numoutb; 2674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_FEED; /*switch to FEED state*/ 2675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->retState = PICOPAM_SCHEDULE; /*back to SCHEDULE after FEED*/ 2676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* 2678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICO_EXC_BUF_IGNORE 2679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICO_EXC_BUF_UNDERFLOW 2680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICO_EXC_BUF_OVERFLOW 2681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step(PICOPAM_IMMEDIATE) --- wrong return from picodata_copy_item:%d",sResult)); 2683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; /*PICOPAM_IMMEDIATE*/ 2687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_FEED: 2689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* *************** item output/feeding ***********************************/ 2690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*feeding items to PU output buffer*/ 2691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = picodata_cbPutItem(this->cbOut, 2692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->outBuf[pam->outReadPos]), pam->outWritePos 2693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - pam->outReadPos, &numoutb); 2694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step -- put item, status: %d",sResult)); 2695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == sResult) { 2696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODATA_INFO_ITEM(this->voice->kbArray[PICOKNOW_KBID_DBG], 2698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_uint8 *)"pam: ", 2699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outBuf + pam->outReadPos, pam->outBufSize); 2700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outReadPos += numoutb; 2702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *numBytesOutput = numoutb; 2703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->outReadPos >= pam->outWritePos) { 2704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*reset the output pointers*/ 2705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outReadPos = 0; 2706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos = 0; 2707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*switch to appropriate state*/ 2708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->retState) { 2709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_IMMEDIATE: 2710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_IMMEDIATE; 2711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->retState = PICOPAM_SCHEDULE; 2712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_PLAY: 2715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_PLAY; 2716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->retState = PICOPAM_SCHEDULE; 2717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Define next state 2723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen a)process (if current sentence has more data to process) 2724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen b)schedule (no more data to process in current sentence) 2725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NOTE : case b)also happens when dealing with non BOUND/SYLL items*/ 2726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pamHasToProcess(this)) || (pamHasToPop(this))) { 2727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_PROCESS; 2728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable = -1; 2730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); 2731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nLastAttachedItemId = pam->nCurrAttachedItem 2732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 2733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nAttachedItemsSize = 0; 2734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nSyllPhoneme = 0; 2736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_SCHEDULE; 2737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 2740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (PICO_EXC_BUF_OVERFLOW == sResult) { 2742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step ** feeding, overflow, PICODATA_PU_OUT_FULL")); 2744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_OUT_FULL; 2745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((PICO_EXC_BUF_UNDERFLOW == sResult) 2747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (PICO_ERR_OTHER == sResult)) { 2748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("pam_step ** feeding problem, discarding item")); 2750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outReadPos = 0; 2751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->outWritePos = 0; 2752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->procState = PICOPAM_COLLECT; 2753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 2754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; /*PICOPAM_FEED*/ 2757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*NOT feeding items*/ 2760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = PICO_EXC_BUF_IGNORE; 2761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }/*end switch*/ 2763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; /*check if there is more data to process after feeding*/ 2764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }/*end while*/ 2766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_IDLE; 2767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_step*/ 2768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * performs one step of a PamTree 2771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam item subobject pointer 2772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param dtpam : the Pam decision tree 2773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *invec : the input vector pointer 2774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param inveclen : length of the input vector 2775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *dtres : the classification result 2776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return dtres->set : the result of tree traversal 2777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_do_tree(register picodata_ProcessingUnit this, 2781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picokdt_DtPAM dtpam, const picoos_uint8 *invec, 2782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_uint8 inveclen, picokdt_classify_result_t *dtres) 2783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 okay; 2785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen okay = TRUE; 2787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* construct input vector, which is set in dtpam */ 2788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!picokdt_dtPAMconstructInVec(dtpam, invec, inveclen)) { 2789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* error constructing invec */ 2790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("problem with invec")); 2791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em, PICO_WARN_INVECTOR, NULL, NULL); 2792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen okay = FALSE; 2793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* classify */ 2795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (okay && (!picokdt_dtPAMclassify(dtpam))) { 2796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* error doing classification */ 2797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("problem classifying")); 2798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em, PICO_WARN_CLASSIFICATION, NULL, 2799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL); 2800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen okay = FALSE; 2801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* decompose */ 2803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (okay && (!picokdt_dtPAMdecomposeOutClass(dtpam, dtres))) { 2804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* error decomposing */ 2805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("problem decomposing")); 2806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em, PICO_WARN_OUTVECTOR, NULL, NULL); 2807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen okay = FALSE; 2808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_TRACE(("dtpam output class: %d", dtres->class)); 2811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return dtres->set; 2813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_do_tree*/ 2814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns the carrier vowel id inside a syllable 2817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam item subobject pointer 2818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param item : the full syllable item 2819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param *pos : pointer to the variable to receive the position of the carrier vowel 2820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return the phonetic id for the carrier vowel inside the syllable 2821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_get_vowel_name(register picodata_ProcessingUnit this, 2825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *item, picoos_uint8 *pos) 2826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 2828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 *phon, nI, nCond1; 2829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 2830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 2831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 2833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (item == NULL) 2835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 2836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (item[3] == 0) 2837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 2838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen phon = &item[4]; 2839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < item[3]; nI++) { 2840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nCond1 = picoktab_isSyllCarrier(pam->tabphones, phon[nI]); 2841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nCond1) { 2842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *pos = nI; 2843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return phon[nI]; 2844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 2847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_get_vowel_name */ 2848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns the pause phone id in the current ph.alphabet 2851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : Pam sub object pointer 2852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return the (numeric) phonetic id of the pause phone in current phonetic alphabet 2853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return 0 : errors on getting the pam subobject pointer 2854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_get_pause_id(register picodata_ProcessingUnit this) 2858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nVal1; 2860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*picoos_uint8 nVal2; */ 2861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 2862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 2863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return 0; 2864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 2866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nVal1 = picoktab_getPauseID(pam->tabphones); 2867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return nVal1; 2868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_get_pause_id */ 2869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns the pam sentence type (declarative, interrogative...) 2872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param iteminfo1 : the boundary item info 1 2873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param iteminfo2 : the boundary item info 2 2874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return the sentence type suitably encoded for trees 2875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_map_sentence_type(picoos_uint8 iteminfo1, 2879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 iteminfo2) 2880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (iteminfo2) { 2882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_P: 2883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_DECLARATIVE; 2884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_T: 2885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_DECLARATIVE; 2886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_Q: 2887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_INTERROGATIVE; 2888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_E: 2889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_DECLARATIVE; 2890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_DECLARATIVE; 2892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen iteminfo1 = iteminfo1; /* avoid warning "var not used in this function"*/ 2894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_DECLARATIVE; 2895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_map_sentence_type */ 2896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * returns the pam phrase type 2899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param iteminfo1 : the boundary item info 1 2900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param iteminfo2 : the boundary item info 2 2901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return the phrase type suitably encoded for trees 2902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 pam_map_phrase_type(picoos_uint8 iteminfo1, 2906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 iteminfo2) 2907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (iteminfo2) { 2910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_P: 2911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (iteminfo1) { 2912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR1: 2913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen# ifdef PAM_PHR2_WITH_PR1 2914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2: 2915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen# endif 2916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_P; /*current_prhase type = "P" (encoded to 1) */ 2917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR3: 2919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen# ifdef PAM_PHR2_WITH_PR3 2920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2 : 2921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen# endif 2922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_p; /*current_prhase type = "p" (encoded to 2) */ 2923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SBEG: 2925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_P; /*current_prhase type = "P" (encoded to 1) */ 2926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("Map pam_map_phrase_type : unexpected iteminfo1")); 2929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_P; /*current_prhase type = "P" (encoded to 1) */ 2930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_T: 2933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_E: 2936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO2_BOUNDTYPE_Q: 2939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_Y; /*current_prhase type = "T" (encoded to 0) */ 2940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("Map pam_map_phrase_type : unexpected iteminfo2")); 2943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }PICODBG_DEBUG(("Map pam_map_phrase_type : unexpected iteminfo2")); 2946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_map_phrase_type */ 2949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 2951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * does the cleanup of the sub object processors flags at sentence start 2952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer 2953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : reset OK 2954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 2955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 2956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 2957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 2958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_reset_processors(register picodata_ProcessingUnit this) 2959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 2961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 2962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 2963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 2965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable = -1; 2967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nTotalPhonemes = pam->nSyllPhoneme = pam->nCurrPhoneme 2968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->nTotalSyllables = pam->sType = pam->pType = 0; 2969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->dRest = 0.0f; 2970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*set all to 0*/ 2971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->a3_overall_syllable = pam->a3_primary_phrase_syllable = pam->b4_b5_syllable = 2972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b6_b7_syllable = pam->b6_b7_state = pam->b8_b9_stressed_syllable = 2973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b10_b11_accented_syllable = pam->b12_b13_syllable = pam->b12_b13_state = 2974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_syllable = pam->b14_b15_state = pam->b17_b19_syllable = 2975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b17_b19_state = pam->b18_b20_b21_syllable = pam->b18_b20_b21_state = 2976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->c3_overall_syllable= pam->c3_primary_phrase_syllable = pam->d2_syllable_in_word = 2977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->d2_prev_syllable_in_word = pam->d2_current_primary_phrase_word = pam->e1_syllable_word_start = 2978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_syllable_word_end= pam->e1_content = pam->e2_syllable_word_start = 2979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e2_syllable_word_end= pam->e3_e4_word = pam->e3_e4_state = 2980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e5_e6_content_word = pam->e5_e6_content = pam->e7_e8_word = 2981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_content = pam->e7_e8_state = pam->e9_e11_word = 2982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_saw_word = pam->e9_e11_state = pam->e10_e12_e13_word = 2983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_state = pam->e10_e12_e13_saw_word = pam->f2_overall_word = 2984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->f2_word_syllable = pam->f2_next_word_syllable = pam->f2_current_primary_phrase_word = 2985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g1_current_secondary_phrase_syllable = pam->g1_current_syllable = 2986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g2_current_secondary_phrase_word = pam->g2_current_word = 2987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h1_current_secondary_phrase_syll = pam->h2_current_secondary_phrase_word = 2988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h3_h4_current_secondary_phrase_word = pam->h5_current_phrase_type = 2989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h5_syllable = pam->h5_state = pam->i1_secondary_phrase_syllable = 2990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i1_next_secondary_phrase_syllable = pam->i2_secondary_phrase_word = 2991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i2_next_secondary_phrase_word = pam->j1_utterance_syllable = 2992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->j2_utterance_word = pam->j3_utterance_sec_phrases = 0; 2993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Override 0 with 1*/ 2994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b4_b5_syllable = pam->b17_b19_syllable = pam->b18_b20_b21_syllable = 2995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_word = pam->e10_e12_e13_word = pam->e7_e8_word = 2996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h2_current_secondary_phrase_word = 1; 2997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Override 0 with -1*/ 2998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_syllable_word_start = pam->e1_syllable_word_end = pam->e2_syllable_word_start = 2999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e2_syllable_word_end = -1; 3000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 3002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_reset_processors*/ 3003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 3005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * does the cleanup of the sub object processors flags before the backward step 3006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer 3007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : reset OK 3008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 3009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 3010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 3011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 3012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_reset_processors_back( 3013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this) 3014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 3016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 3017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 3018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 3020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*set all to 0*/ 3022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->a3_overall_syllable 3023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->a3_primary_phrase_syllable 3024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b4_b5_syllable 3025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b6_b7_syllable 3026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b6_b7_state 3027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b8_b9_stressed_syllable 3028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b10_b11_accented_syllable 3029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b12_b13_syllable 3030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b12_b13_state 3031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b14_b15_syllable 3032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b14_b15_state 3033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b17_b19_syllable 3034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b17_b19_state 3035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b18_b20_b21_syllable 3036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b18_b20_b21_state 3037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->c3_overall_syllable 3038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->c3_primary_phrase_syllable 3039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->d2_syllable_in_word 3040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->d2_prev_syllable_in_word 3041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->d2_current_primary_phrase_word 3042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e1_syllable_word_start 3043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e1_syllable_word_end 3044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e1_content 3045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e2_syllable_word_start 3046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e2_syllable_word_end 3047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e3_e4_word 3048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e3_e4_state 3049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e5_e6_content_word 3050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e5_e6_content 3051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e7_e8_word 3052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e7_e8_content 3053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e7_e8_state 3054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e9_e11_word 3055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e9_e11_saw_word 3056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e9_e11_state 3057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e10_e12_e13_word 3058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e10_e12_e13_state 3059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e10_e12_e13_saw_word 3060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->f2_overall_word 3061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->f2_word_syllable 3062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->f2_next_word_syllable 3063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->f2_current_primary_phrase_word 3064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g1_current_secondary_phrase_syllable 3065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g1_current_syllable 3066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g2_current_secondary_phrase_word 3067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g2_current_word 3068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h1_current_secondary_phrase_syll 3069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h2_current_secondary_phrase_word 3070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h3_h4_current_secondary_phrase_word 3071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h5_current_phrase_type 3072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h5_state 3073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i1_secondary_phrase_syllable 3074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i1_next_secondary_phrase_syllable 3075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i2_secondary_phrase_word 3076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i2_next_secondary_phrase_word 3077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 3078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Override 0 with 1*/ 3079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b4_b5_syllable = pam->b17_b19_syllable = pam->b18_b20_b21_syllable 3080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e9_e11_word = pam->e10_e12_e13_word = pam->e7_e8_word 3081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h2_current_secondary_phrase_word = 1; 3082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Override 0 with -1*/ 3083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_syllable_word_start = pam->e1_syllable_word_end 3084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e2_syllable_word_start = pam->e2_syllable_word_end = -1; 3085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 3087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_reset_processors_back*/ 3088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 3090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * processes an input event for a specific feature 3091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer 3092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param nFeat : feature column to process 3093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param event_type : event id among syll/boundprim/boundsec/boundword 3094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param direction : forward(0)/backward(1) 3095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : process OK 3096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 3097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 3098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 3099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 3100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_process_event_feature( 3101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this, picoos_uint8 nFeat, 3102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 event_type, picoos_uint8 direction) 3103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 sDest, nI; 3105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 syllCurr; 3106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 3107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 3108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 3109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 3111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen syllCurr = pam->nCurrSyllable; 3112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (nFeat) { 3113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case A3: 3114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*processor for A3*/ 3115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 3119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == 1) || (pam->a3_primary_phrase_syllable >= 1)) { 3120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->a3_overall_syllable < 1) 3121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 3122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 3123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 3125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable 3126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - 1].phoneV[B3]; 3127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] = 0; 3129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->a3_primary_phrase_syllable++; 3131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->a3_overall_syllable++; 3132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->a3_primary_phrase_syllable = 0; 3135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do nothing*/ 3139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B1: 3143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B2: 3144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B3: 3145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*done in createSyllable*/ 3146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B4:/*processor for B4,B5*/ 3148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B4; 3151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B5; 3154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B4; 3157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] == 0) { 3161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b4_b5_syllable; 3163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b4_b5_syllable++; 3164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] = 0; 3166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND) || (event_type 3170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) { 3171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b4_b5_syllable = 1; 3172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B5:/*processor for B5 : done in B4*/ 3175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B6:/*processor for B6,B7*/ 3177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B6; 3180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B7; 3183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B6; 3186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->b6_b7_state) { 3189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) 3191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 3194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b6_b7_syllable = 1; 3195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b6_b7_state = 1; 3196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b6_b7_syllable; 3202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b6_b7_syllable++; 3203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 3205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b6_b7_syllable = 1; 3206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b6_b7_state = 0; 3209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B7:/*Done in B6*/ 3216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B8:/*processor for B8,B9*/ 3218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B8; 3221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B9; 3224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B8; 3227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b8_b9_stressed_syllable; 3232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 1) 3233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b8_b9_stressed_syllable++; 3234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b8_b9_stressed_syllable = 0; 3237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B9:/*done in B8*/ 3241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B10:/*processor for B10, B11*/ 3243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B10; 3246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B11; 3249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B10; 3252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b10_b11_accented_syllable; 3257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 1) 3258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b10_b11_accented_syllable++; 3259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b10_b11_accented_syllable = 0; 3262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B11:/*done in B10*/ 3265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B12:/*processor for B12,B13*/ 3267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B12; 3270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B13; 3273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B12; 3276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->b12_b13_state) { 3279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 0) 3282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_syllable = 0; 3286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_state = 1; 3289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b12_b13_syllable; 3296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 1) 3297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_syllable = 0; 3298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_syllable++; 3300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_state = 2; 3301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_state = 0; 3304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 2: 3306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b12_b13_syllable; 3309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 1) 3310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_syllable = 0; 3311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_syllable++; 3313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b12_b13_state = 0; 3316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B13:/*done in B12*/ 3323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B14:/*processor for B14, B15*/ 3326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B14; 3329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B15; 3332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = B14; 3335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->b14_b15_state) { 3338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 0) 3341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_syllable = 0; 3345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_state = 1; 3348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b14_b15_syllable; 3355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 1) 3356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_syllable = 0; 3357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_syllable++; 3359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_state = 2; 3360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_state = 0; 3363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 2: 3366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b14_b15_syllable; 3369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 1) 3370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_syllable = 0; 3371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_syllable++; 3373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b14_b15_state = 0; 3376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B15:/*Processor for B15 : done in B14*/ 3383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B16:/*done in createSyllable*/ 3385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B17:/*processor for B17, B19 unified */ 3387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->b17_b19_state) { 3390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 3393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 3395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b17_b19_syllable; 3396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b17_b19_syllable++; 3397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((event_type == PICOPAM_EVENT_P_BOUND) 3399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (event_type == PICOPAM_EVENT_S_BOUND)) 3400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->b17_b19_syllable > 1)) { 3401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b17_b19_syllable = 1; 3403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b17_b19_state = 1; 3404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 3409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b17_b19_syllable; 3410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 3411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b17_b19_syllable++; 3413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b17_b19_syllable = 1; 3416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do nothing*/ 3424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B18:/*processor for B18, B20, B21 unfied*/ 3428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW:/*do nothing*/ 3430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->b18_b20_b21_state) { 3433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B18] 3436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 3438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_DECLARATIVE) { 3439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 3440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b18_b20_b21_syllable; 3441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 3442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 3445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 3447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b18_b20_b21_syllable; 3448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b18_b20_b21_syllable++; 3450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((event_type == PICOPAM_EVENT_P_BOUND) 3452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (event_type == PICOPAM_EVENT_S_BOUND)) 3453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->b18_b20_b21_syllable > 1)) { 3454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b18_b20_b21_syllable = 1; 3456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b18_b20_b21_state = 1; 3457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B18] 3462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->b18_b20_b21_syllable; 3463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 3464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 3466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b18_b20_b21_syllable++; 3468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->b18_b20_b21_syllable = 1; 3471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B19:/*processor for B19 : done in B17*/ 3480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B20:/*processor for B20 : done in B18*/ 3482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case B21:/*processor for B21 : done in B18*/ 3484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case C3:/*processor for C3*/ 3486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do nothing*/ 3489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 3493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == 1) || (pam->c3_primary_phrase_syllable >= 1)) { 3494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->c3_overall_syllable < 1) 3495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 3496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 3497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 3499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable 3500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + 1].phoneV[B3]; 3501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] = 0; 3503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->c3_primary_phrase_syllable++; 3505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->c3_overall_syllable++; 3506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->c3_primary_phrase_syllable = 0; 3509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case D2:/*processor for D2*/ 3514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 3518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == 1) || (pam->d2_current_primary_phrase_word 3519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen >= 1)) 3520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[D2] 3521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->d2_prev_syllable_in_word; 3522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[D2] = 0; 3524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->d2_syllable_in_word++; 3526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND) || (event_type 3529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) { 3530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->d2_current_primary_phrase_word = 1; 3531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->d2_prev_syllable_in_word 3532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->d2_syllable_in_word; 3533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->d2_syllable_in_word = 0; 3534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*pam->d2_current_primary_phrase_word++;*/ 3535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_P_BOUND)) { 3537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->d2_current_primary_phrase_word = 0; 3538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do nothing*/ 3542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E1:/*processor for E1*/ 3546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: /*remember : content syllable indicator already on P5*/ 3548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->e1_syllable_word_start == -1) 3550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_syllable_word_start 3551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = (picoos_int8) pam->nCurrSyllable; 3552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_content = 1; 3554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_syllable_word_end 3555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = (picoos_int8) pam->nCurrSyllable; 3556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND) || (event_type 3559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) { 3560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->e1_syllable_word_start != -1) 3561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->e1_syllable_word_end != -1)) { 3562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = pam->e1_syllable_word_start; nI 3563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen <= pam->e1_syllable_word_end; nI++) 3564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[nI].phoneV[E1] 3565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e1_content; 3566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_content = 0; 3568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_syllable_word_start = -1; 3569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_syllable_word_end = -1; 3570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do nothing*/ 3574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E2:/*processor for E2*/ 3578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->e2_syllable_word_start == -1) 3582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e2_syllable_word_start 3583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = (picoos_int8) pam->nCurrSyllable; 3584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e2_syllable_word_end 3585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = (picoos_int8) pam->nCurrSyllable; 3586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND) || (event_type 3589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) { 3590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->e2_syllable_word_start != -1) 3591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->e2_syllable_word_end != -1)) { 3592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = pam->e2_syllable_word_start; nI 3593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen <= pam->e2_syllable_word_end; nI++) 3594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[nI].phoneV[E2] 3595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e2_syllable_word_end 3596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen - pam->e2_syllable_word_start 3597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen + 1; 3598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e1_content = 0; 3600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e2_syllable_word_start = -1; 3601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e2_syllable_word_end = -1; 3602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E3:/*processor for E3,E4*/ 3609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E3; 3612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E4; 3615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E3; 3618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->e3_e4_state) { 3621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) 3623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 3626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e3_e4_word = 1; 3627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e3_e4_state = 1; 3628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) 3632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e3_e4_word; 3634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) 3635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e3_e4_word = 1; 3636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_W_BOUND) 3637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e3_e4_word++; 3638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e3_e4_state = 0; 3640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E4:/*processor for E4 : done in E3*/ 3646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E5:/*processor for E5,E6*/ 3648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E5; 3651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E6; 3654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E5; 3657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e5_e6_content_word; 3662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e5_e6_content = 1; 3664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND) || (event_type 3667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) { 3668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->e5_e6_content == 1) 3669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e5_e6_content_word++; 3670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e5_e6_content = 0; 3671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e5_e6_content_word = 0; 3673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E6:/*processor for E6 : done in E5*/ 3676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E7:/*processor for E7,E8*/ 3678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E7; 3681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E8; 3684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = E7; 3687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->e7_e8_state) { 3690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_content = 1; 3696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_content = 0; 3699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND)) { 3703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->e7_e8_content == 1) { 3704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_word = 0; 3705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_content = 0; 3706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_state = 1; 3707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e7_e8_word; 3714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_content = 1; 3716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND)) { 3719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->e7_e8_content == 1) { 3720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_word = 0; 3721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_content = 0; 3722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_word++; 3724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_state = 0; 3728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e7_e8_content = 0; /*<<<<<< added */ 3729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E8:/*processor for E8 : done in E7*/ 3736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E9: 3738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*processor for E9, E11*/ 3739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->e9_e11_state) { 3742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 3745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 3747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e9_e11_word; 3748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_saw_word = 1; /*new variable, needs to be initialized to 0*/ 3749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_W_BOUND) 3751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_word++; 3752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((event_type == PICOPAM_EVENT_P_BOUND) 3753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (event_type == PICOPAM_EVENT_S_BOUND)) 3754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->e9_e11_saw_word == 1)) { /* modified*/ 3755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_word = 1; 3757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_word++; /*modified*/ 3759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_state = 1; 3760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 3765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e9_e11_word; 3766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 3767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) 3770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (event_type == PICOPAM_EVENT_S_BOUND)) 3771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_word++; 3772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e9_e11_word = 1; 3774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do nothing*/ 3781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E10:/*processor for E10, E12, E13 unified*/ 3785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW:/*do nothing*/ 3787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->e10_e12_e13_state) { 3790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 3791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E10] 3793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_saw_word = 1; 3795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 3796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_DECLARATIVE) { 3797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 3798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e10_e12_e13_word; 3799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 3800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 3803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 3805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e10_e12_e13_word; 3806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_W_BOUND) 3809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_word++; 3810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*if (((event_type==PICOPAM_EVENT_P_BOUND)||(event_type==PICOPAM_EVENT_S_BOUND))&&(pam->e10_e12_e13_word>1)) {*/ 3812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((event_type == PICOPAM_EVENT_P_BOUND) 3813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (event_type == PICOPAM_EVENT_S_BOUND)) 3814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->e10_e12_e13_saw_word > 0)) { 3815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_word = 1; 3817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_word++; 3819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_state = 1; 3820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 3823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E10] 3825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->e10_e12_e13_word; 3826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 3827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 3829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DONT_CARE_VALUE; 3830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) 3832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen || (event_type == PICOPAM_EVENT_S_BOUND)) 3833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_word++; 3834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->e10_e12_e13_word = 1; 3836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E11:/*processor for E11 : done in E9*/ 3845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E12:/*processor for E12 : done in E10*/ 3847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case E13:/*processor for E13 : done in E10*/ 3849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case F2: 3852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW:/*do nothing*/ 3854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->f2_current_primary_phrase_word >= 1)/*at least second word in current primary phrase*/ 3858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] 3859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->f2_next_word_syllable; 3860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*first word in current primary phrase*/ 3862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] = 0; 3863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->f2_word_syllable++; 3864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND) || (event_type 3867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) {/*word - end : switch*/ 3868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->f2_next_word_syllable = pam->f2_word_syllable; 3869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->f2_word_syllable = 0; 3870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND)/*mark first word in current primary phrase*/ 3872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->f2_current_primary_phrase_word = 0; 3873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else /*mark next word in current primary phrase(enables output in PICOPAM_EVENT_SYLL)*/ 3874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND)) 3876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->f2_current_primary_phrase_word++; 3877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case G1: 3881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->g1_current_secondary_phrase_syllable > 0) 3885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[G1] 3886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g1_current_secondary_phrase_syllable; 3887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[G1] = 0; 3889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g1_current_syllable++; 3890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 3892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g1_current_secondary_phrase_syllable 3893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g1_current_syllable; 3894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g1_current_syllable = 0; 3895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g1_current_secondary_phrase_syllable = 0; 3898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g1_current_syllable = 0; 3899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: /*do nothing*/ 3901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case G2: 3905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->g2_current_secondary_phrase_word > 0) 3909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[G2] 3910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g2_current_secondary_phrase_word; 3911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else 3912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[G2] = 0; 3913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_W_BOUND) 3915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g2_current_word++; 3916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 3918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g2_current_secondary_phrase_word 3919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->g2_current_word + 1; 3920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g2_current_word = 0; 3921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g2_current_secondary_phrase_word = 0; 3924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->g2_current_word = 0; 3925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: /*do nothing*/ 3928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case H1: 3932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h1_current_secondary_phrase_syll++; 3936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 3937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h1_current_secondary_phrase_syll; 3938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_S_BOUND) || (event_type 3940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) 3941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h1_current_secondary_phrase_syll = 0; 3942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) 3945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 3946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h1_current_secondary_phrase_syll; 3947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) 3948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h1_current_secondary_phrase_syll 3949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1]; 3950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h1_current_secondary_phrase_syll 3952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H1]; 3953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case H2: 3957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 3960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h2_current_secondary_phrase_word; 3962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_W_BOUND) { 3964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h2_current_secondary_phrase_word++; 3965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h2_current_secondary_phrase_word; 3967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 3969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h2_current_secondary_phrase_word + 1; 3971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h2_current_secondary_phrase_word = 0; 3972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 3974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable > 1) 3975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2] 3976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h2_current_secondary_phrase_word + 1; 3977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h2_current_secondary_phrase_word = 0; 3978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) 3982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h2_current_secondary_phrase_word; 3984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) 3985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h2_current_secondary_phrase_word 3986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2]; 3987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 3988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h2_current_secondary_phrase_word 3989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2]; 3990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case H3:/*processor for H3,H4 unified */ 3994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 3995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 3996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = H3; 3997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 3999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = H4; 4000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 4002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sDest = H3; 4003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 4006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 4007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->h3_h4_current_secondary_phrase_word; 4008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_S_BOUND) || (event_type 4010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) 4011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h3_h4_current_secondary_phrase_word++; 4012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case H4: /*processor for H4 : already in H3*/ 4014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case H5:/*processor for H5*/ 4017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 4018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 4019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 4021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pam->h5_state) { 4022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 0: 4023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) 4024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] 4025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5]; 4026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 4027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h5_state = 1; 4028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case 1: 4031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 4032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] 4033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_P) 4034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 4035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == 0)) 4036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] 4037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_p; 4038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 4040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->h5_state = 0; 4041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 4044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 4049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case I1:/*processor for I1*/ 4054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 4055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 4056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 4057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i1_secondary_phrase_syllable++; 4058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i1_secondary_phrase_syllable; 4060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_S_BOUND) || (event_type 4062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) 4063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i1_secondary_phrase_syllable = 0; 4064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 4066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 4067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i1_next_secondary_phrase_syllable; 4069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 4071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i1_next_secondary_phrase_syllable 4072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i1_secondary_phrase_syllable; 4073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i1_secondary_phrase_syllable 4074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1]; 4075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 4077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i1_next_secondary_phrase_syllable = 0; 4078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i1_secondary_phrase_syllable 4079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[I1]; 4080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case I2: /*processor for I2*/ 4085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 4086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 4087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 4088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i2_secondary_phrase_word; 4090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_W_BOUND) 4092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i2_secondary_phrase_word++; 4093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_P_BOUND) || (event_type 4095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND)) 4096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i2_secondary_phrase_word = 1; 4097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 4100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 4101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i2_next_secondary_phrase_word; 4103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 4105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i2_next_secondary_phrase_word 4106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->i2_secondary_phrase_word; 4107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i2_secondary_phrase_word 4108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2]; 4109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 4111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i2_next_secondary_phrase_word = 0; 4112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->i2_secondary_phrase_word 4113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[I2]; 4114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case J1: /*processor for J1 */ 4119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 4120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 4121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_SYLL) { 4122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] != 1) 4123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->j1_utterance_syllable++; 4124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 4127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[J1] 4128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->j1_utterance_syllable; 4129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case J2: /*processor for J2*/ 4133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 4134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 4135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 4136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_S_BOUND) || (event_type 4137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen == PICOPAM_EVENT_P_BOUND)) 4138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->j2_utterance_word++; 4139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 4141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[J2] 4142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->j2_utterance_word - 1; 4143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case J3: /*processor for J3*/ 4147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (direction) { 4148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_FORW: 4149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) { 4150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->j3_utterance_sec_phrases++; 4151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) { 4154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->j3_utterance_sec_phrases++; 4155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOPAM_DIR_BACK: 4159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[J3] 4160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->j3_utterance_sec_phrases - 1; 4161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 4166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_process_event_feature*/ 4167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 4169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * processes an input event spanning it to all column features 4170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer 4171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param event_type : event id among syll/boundprim/boundsec/boundword 4172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param direction : forward(0)/backward(1) 4173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : process OK 4174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 4175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 4176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 4177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 4178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_process_event(register picodata_ProcessingUnit this, 4179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 event_type, picoos_uint8 direction) 4180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 4181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nFeat; 4182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t nResult; 4183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 4185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 4186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 4189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (direction == PICOPAM_DIR_FORW) { 4191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_P_BOUND) 4192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*primary boundary*/ 4193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P2] = 1; 4194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_S_BOUND) 4195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*secondary boundary*/ 4196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P3] = 1; 4197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (event_type == PICOPAM_EVENT_W_BOUND) 4198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*word boundary*/ 4199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P4] = 1; 4200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nFeat = A3; nFeat <= J3; nFeat++) { 4202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nResult = pam_process_event_feature(this, nFeat, event_type, direction); 4203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nResult != PICO_OK) 4204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return nResult; 4205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 4207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_process_event*/ 4208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 4210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * inserts a syllable inside the subobj sentence data struct. 4211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer 4212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param syllType : the syllable type (pause/syllable) 4213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param sContent : the item content 4214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param sentType : the sentence type 4215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param phType : the phrase type 4216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param uBoundType : the boundary type (only for silence syllables) 4217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param uMinDur, uMaxDur : the mimimum and maximum duration (only for silence syllables) 4218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : syllable creation successful 4219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors in one internal function (check_phones_size..) 4220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 4221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 4222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 4223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_create_syllable(register picodata_ProcessingUnit this, 4224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 syllType, picoos_uint8 *sContent, picoos_uint8 sentType, 4225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 phType, picoos_uint8 uBoundType, picoos_uint16 uMinDur, 4226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 uMaxDur) 4227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 4228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 4229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nI; 4230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 pos; 4231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* picoos_uint8 *npUi16; */ 4232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 pos32; 4233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 4235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 4238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos = 0; 4239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*check buffer full condition on number of syllables*/ 4240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (check_syllables_size(pam, 1) != PICO_OK) { 4241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (syllType == PICOPAM_SYLL_PAUSE) { 4245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*check buffer full condition on number of phonemes*/ 4246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (check_phones_size(pam, 1) != PICO_OK) { 4247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (syllType == PICOPAM_SYLL_SYLL) { 4251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*check item availability*/ 4252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sContent == NULL) { 4253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*check buffer full condition on number of phonemes*/ 4256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (check_phones_size(pam, sContent[3]) != PICO_OK) { 4257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*open new syllable*/ 4262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable = pam->nCurrSyllable + 1; 4263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*cleanup*/ 4264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < PICOPAM_VECT_SIZE; nI++) { 4265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable > 0) { 4266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] = 0; 4267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 4268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((nI >= ITM) && (nI <= itm)) { 4269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] > 0) { 4270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*do not cleanup "attached item offset" fields (ITM, itm): 4271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen an already existing attached item could be lost*/ 4272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 4273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*cleanup "attached item offset"*/ 4274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] = 0; 4275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 4277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*cleanup all fields except "attached item offset" (ITM, itm)*/ 4278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] = 0; 4279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*set minimum and maximum duration values*/ 4283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((uMinDur == 0) && (uMaxDur == 0) && (syllType == PICOPAM_SYLL_PAUSE)) { 4284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*both 0 : use default duration limits for boundaries*/ 4285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen get_default_boundary_limit(uBoundType, &uMinDur, &uMaxDur); 4286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (uMinDur > 0) { 4288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos32 = Min; 4289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_write_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 4290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &pos32, uMinDur); 4291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (uMaxDur > 0) { 4293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos32 = Max; 4294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_write_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 4295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &pos32, uMaxDur); 4296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*END OF BREAK COMMAND SUPPORT*/ 4298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (syllType == PICOPAM_SYLL_PAUSE) { 4300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*initialize a pause syllable*/ 4301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sentType == PICOPAM_DECLARATIVE) 4302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DECLARATIVE; 4304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sentType == PICOPAM_INTERROGATIVE) 4305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_INTERROGATIVE; 4307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[bnd] = uBoundType; 4309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] = 1; /*this means the syllable contains a pause-silence*/ 4310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P8] = 1; 4311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*b1,b2,b9,b11,b13,b15,e1,e6,e8,e10 already set to 0*/ 4313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] 4315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B4] 4316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B5] 4317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B6] 4318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B7] 4319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 1; 4320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B16] 4322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_PH_DONT_CARE_VAL; /*name of the vowel in the syllable = NONE */ 4323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E2] 4325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E3] 4326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E4] = 1; 4327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] = phType; 4329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Store current phonetic codes in input phonetic string*/ 4331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhIds[pam->nCurrPhoneme] = pam_get_pause_id(this); 4332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_mem_copy((void*) &pam->nCurrPhoneme, 4333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->sSyllFeats[pam->nCurrSyllable].phoneV[FID]), 4334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sizeof(pam->nCurrPhoneme)); 4335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrPhoneme++; 4336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nTotalPhonemes++; 4337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*add 1 to total number of syllables*/ 4338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nTotalSyllables++; 4339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 4341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (syllType == PICOPAM_SYLL_SYLL) { 4343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*initialize a real syllable*/ 4344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sContent[2] > PICODATA_ACC0) 4345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] = 1; /*set content syllable indicator*/ 4346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sentType == PICOPAM_DECLARATIVE) 4347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_DECLARATIVE; 4349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sentType == PICOPAM_INTERROGATIVE) 4350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = PICOPAM_INTERROGATIVE; 4352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((sContent[2] >= PICODATA_ACC1) && (sContent[2] <= PICODATA_ACC4)) 4354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*stressed*/ 4355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] = 1; 4356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((sContent[2] >= PICODATA_ACC1) && (sContent[2] <= PICODATA_ACC2)) 4358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*accented*/ 4359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] = 1; 4360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] = sContent[3];/*len*/ 4362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable > 30) 4364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable = pam->nCurrSyllable; 4365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B16] = pam_get_vowel_name(this, 4367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sContent, &pos); /*name of the vowel in the syllable*/ 4368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[P8] = pos; /*temp for storing the position of the vowel*/ 4370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] = phType; 4372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Store current phonetic codes in input phonetic string*/ 4374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_mem_copy((void*) &pam->nCurrPhoneme, 4375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen &(pam->sSyllFeats[pam->nCurrSyllable].phoneV[FID]), 4376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sizeof(pam->nCurrPhoneme)); 4377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (nI = 0; nI < sContent[3]; nI++) 4378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sPhIds[pam->nCurrPhoneme + nI] = sContent[4 + nI]; 4379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrPhoneme += nI; 4380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nTotalPhonemes += nI; 4381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*add 1 to total number of syllables*/ 4382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nTotalSyllables++; 4383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 4384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*if no SyllType has been identified -->> error*/ 4386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_create_syllable*/ 4388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 4390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * performs the forward step of the PAM adapter 4391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer 4392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param itemBase : pointer to current item 4393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICOPAM_READY : forward step ok, the sentence is complete 4394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICOPAM_MORE : forward step ok, but more data needed to complete the sentence 4395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors in one internal function (CreateSyllable..) 4396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 4397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 4398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 4399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_adapter_forward_step( 4400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this, picoos_uint8 *itemBase) 4401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 4402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 4403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t sResult; 4404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 uMinDur, uMaxDur; 4405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 nPos; 4406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 4408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 4411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen uMinDur = uMaxDur = 0; /*default 0 : not initialized*/ 4412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (itemBase[0]) { 4413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_BOUND: 4414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*received a boundary item*/ 4415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (itemBase[1]) { 4416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SBEG: 4417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR1: 4418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef PAM_PHR2_WITH_PR1 4419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2: 4420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 4421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SEND: 4422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_TERM: 4423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (itemBase[3] == 2 * sizeof(picoos_uint16)) { 4424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*only when the item len duration is equal to 2 int16 --> get the values*/ 4425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nPos = 4; 4426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_read_mem_pi_uint16(itemBase, &nPos, &uMinDur); 4427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_read_mem_pi_uint16(itemBase, &nPos, &uMaxDur); 4428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 4431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (itemBase[1]) { 4434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SBEG: 4435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* received a sentence init boundary */ 4436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); /*reset all processor variables*/ 4437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType 4438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam_map_sentence_type(itemBase[1], itemBase[2]); 4439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pType = pam_map_phrase_type(itemBase[1], itemBase[2]); 4440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*create silence syll and process P_BOUND event*/ 4441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType, pam->pType, itemBase[1], uMinDur, 4443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen uMaxDur); 4444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_MORE; 4451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR1: 4454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef PAM_PHR2_WITH_PR1 4455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2: 4456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 4457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*received a primary boundary*/ 4458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType 4459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam_map_sentence_type(itemBase[1], itemBase[2]); 4460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pType = pam_map_phrase_type(itemBase[1], itemBase[2]); 4461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*create silence syll and process P_BOUND event*/ 4462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType, pam->pType, itemBase[1], uMinDur, 4464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen uMaxDur); 4465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_MORE; 4472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef PAM_PHR2_WITH_PR3 4475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR2 : 4476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 4477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR3: 4478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*received a secondary boundary*/ 4479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*process S_BOUND event*/ 4480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_S_BOUND, 4481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*determine new sentence and Phrase types for following syllables*/ 4483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType 4484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam_map_sentence_type(itemBase[1], itemBase[2]); 4485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->pType = pam_map_phrase_type(itemBase[1], itemBase[2]); 4486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_MORE; 4489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_PHR0: 4492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*received a word end boundary*/ 4493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*process W_BOUND event*/ 4494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_W_BOUND, 4495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_MORE; 4499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_SEND: 4502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*received a SEND boundary*/ 4503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*insert a new silence syllable and process P_BOUND event*/ 4504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*create silence syll and process P_BOUND event*/ 4505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType, pam->pType, itemBase[1], uMinDur, 4507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen uMaxDur); 4508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_READY; 4515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_BOUND_TERM: 4518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* received a flush boundary*/ 4519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable == -1) { 4520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_NA; 4521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*insert a new silence syllable and process P_BOUND event*/ 4523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*create silence syll and process P_BOUND event*/ 4524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType, pam->pType, itemBase[1], uMinDur, 4526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen uMaxDur); 4527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_READY; 4534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 4537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*boundary type not known*/ 4538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_NA; 4539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }/*end switch (itemBase[1])*/ 4541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; /*end case PICODATA_ITEM_BOUND*/ 4542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_SYLLPHON: 4544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*received a syllable item*/ 4545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* ------------------------------------------------------------------ 4546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen following code has to be used if we do expect 4547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen SYLL items arrive even without SBEG items starting the sentence. 4548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this may happen after a term has been issued to make room in local storage. 4549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 4550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable == -1) { 4551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors(this); 4552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*insert an SBEG with sType and pType taken from previous sentence*/ 4553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType, pam->pType, PICODATA_ITEMINFO1_BOUND_SBEG, 4555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 0, 0); 4556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* ------------------------------------------------------------------*/ 4564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_create_syllable(this, PICOPAM_SYLL_SYLL, itemBase, 4565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sType, pam->pType, 0, 0, 0); 4566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen sResult = pam_process_event(this, PICOPAM_EVENT_SYLL, 4569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOPAM_DIR_FORW); 4570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (sResult != PICO_OK) 4571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return sResult; 4572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_MORE; 4573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 4576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_NA; 4577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 4578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_adapter_forward_step*/ 4581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 4583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * performs the backward step of the PAM adapter 4584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer 4585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : backward step complete 4586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 4587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks derived in some parts from the pam forward code 4588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 4589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 4590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 4591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_adapter_backward_step( 4592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register picodata_ProcessingUnit this) 4593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 4594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 4595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 nProcessed; 4596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 nSyll; 4597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 4599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 4602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Resets the processors for the backward step*/ 4604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_reset_processors_back(this); 4605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Do the backward step*/ 4606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nSyll = pam->nCurrSyllable; 4607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (pam->nCurrSyllable >= 0) { 4608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nProcessed = 0; 4609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P2] == 1) { 4610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*primary boundary*/ 4611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_process_event(this, PICOPAM_EVENT_P_BOUND, PICOPAM_DIR_BACK); 4612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable--; 4613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nProcessed = 1; 4614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((nProcessed == 0) 4616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P3] == 1)) { 4617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*secondary boundary*/ 4618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_process_event(this, PICOPAM_EVENT_S_BOUND, PICOPAM_DIR_BACK); 4619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_process_event(this, PICOPAM_EVENT_SYLL, PICOPAM_DIR_BACK); 4620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable--; 4621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nProcessed = 1; 4622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((nProcessed == 0) 4624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P4] == 1)) { 4625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*word boundary*/ 4626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_process_event(this, PICOPAM_EVENT_W_BOUND, PICOPAM_DIR_BACK); 4627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_process_event(this, PICOPAM_EVENT_SYLL, PICOPAM_DIR_BACK); 4628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable--; 4629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nProcessed = 1; 4630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nProcessed == 0) { 4632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*non boundaried syllable*/ 4633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_process_event(this, PICOPAM_EVENT_SYLL, PICOPAM_DIR_BACK); 4634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable--; 4635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nProcessed = 0; 4636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }/*end while (pam->nCurrSyllable>=0)*/ 4638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*reset syllpointer to original value*/ 4639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable = nSyll; 4640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Perform pause processing*/ 4641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_adapter_do_pauses(this); 4642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable = 0; 4643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nSyllPhoneme = 0; 4644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 4646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_adapter_backward_step*/ 4647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 4649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * processes a pause (silence) syllable after backward processing 4650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer : processes a pause (silence) syllable after backward processing 4651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : backward step complete 4652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 4653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks pam->nCurrSyllable should point to a pause item 4654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks this function should be called after backward processing 4655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks this function corresponds to initializing silence phonemes with 4656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @remarks values derived from previous or following syllables 4657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 4658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 4659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 4660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_do_pause(register picodata_ProcessingUnit this) 4661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 4662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 syllCurr; 4663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_subobj_t *pam; 4664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 4665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 4668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen syllCurr = pam->nCurrSyllable; 4669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*processor for all features that can be inherited from previous syll (or word/phrase)*/ 4671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable > 0) { 4672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 4673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B3]; 4674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B8] 4675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B8]; 4676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B10] 4677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B10]; 4678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B12] 4679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B12]; 4680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B14] 4681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B14]; 4682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 4683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B17]; 4684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 4685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B19]; 4686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 4687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B20]; 4688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 4689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B21]; 4690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[D2] 4692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E2]; 4693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[G1] 4694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H1]; 4695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[G2] 4696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2]; 4697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E5] 4699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E5]; 4700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E7] 4701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E7]; 4702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 4703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E9]; 4704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 4705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E11]; 4706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 4707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E12]; 4708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 4709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E13]; 4710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 4711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E13]; 4712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 4714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H1]; 4715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 4716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2]; 4717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H3] 4718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H3]; 4719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H4] 4720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H4]; 4721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 4723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 4724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen =pam->sSyllFeats[pam->nCurrSyllable].phoneV[B8] 4725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B10] 4726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B12] 4727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B14] 4728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 4729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 4730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 4731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 4732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E5] 4733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 4734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 4735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 4736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 4737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 4738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H3] 4739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 4740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*init values different from 0*/ 4742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H4] 4743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[J3]; 4744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] = PICOPAM_p; 4745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*processor for all features that can be inherited from next syll (or word/phrase)*/ 4749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->nCurrSyllable < pam->nTotalSyllables - 1) { 4750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*non last syllable*/ 4751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 4752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[B3]; 4753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] 4754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[E2]; 4755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[H1]; 4757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[H2]; 4759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 4760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*last syllable*/ 4761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 4762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] 4763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen = 0; 4766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Other fixed values derived from de-facto standard*/ 4769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->sSyllFeats[pam->nCurrSyllable].phoneV[B18] = 0; 4770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 4772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_do_pause*/ 4773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 4775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * performs the initialization of pause "syllables" 4776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param this : pointer to PAM PU sub object pointer : processes a pause (silence) syllable after backward processing 4777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_OK : pause processing successful 4778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 4779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callgraph 4780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @callergraph 4781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 4782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t pam_adapter_do_pauses(register picodata_ProcessingUnit this) 4783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 4784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pam_subobj_t * pam; 4785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 nSyll; 4786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 4788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 4789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam = (pam_subobj_t *) this->subObj; 4791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*Do the pause processing*/ 4793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nSyll = pam->nCurrSyllable; 4794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (pam->nCurrSyllable >= 0) { 4795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P2] == 1) { 4796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*pause processing*/ 4797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam_do_pause(this); 4798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 4799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable--; 4800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen }/*end while (pam->nCurrSyllable>=0)*/ 4801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*reset syllpointer to original value*/ 4802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pam->nCurrSyllable = nSyll; 4803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICOPAM_READY; 4804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}/*pam_adapter_do_pauses*/ 4805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 4807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 4808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 4809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 4810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* picopam.c end */ 4811