picopam.c revision 7bc39b0d41efe0d8733490d54e14bc392d9f0b6d
1ea91cc579ade536e3a08498a8157921dd4f533d1ager@chromium.org/* 243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Licensed under the Apache License, Version 2.0 (the "License"); 543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * you may not use this file except in compliance with the License. 643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * You may obtain a copy of the License at 743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * http://www.apache.org/licenses/LICENSE-2.0 943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Unless required by applicable law or agreed to in writing, software 1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * distributed under the License is distributed on an "AS IS" BASIS, 1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * See the License for the specific language governing permissions and 1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * limitations under the License. 1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @file picopam.c 1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Phonetic to Acoustic Mapping PU - Implementation 2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * All rights reserved. 2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * History: 2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * - 2009-04-20 -- initial version 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "picodefs.h" 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "picoos.h" 3143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "picodbg.h" 32f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org#include "picodata.h" 33d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org#include "picopam.h" 34c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org#include "picokdt.h" 35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#include "picokpdf.h" 3601beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org#include "picoktab.h" 3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include "picokdbg.h" 38ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#include "picodsp.h" 39f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org 401456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org#ifdef __cplusplus 41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgextern "C" { 42f5aa83707f1db5aecb22f6c3bfd5042f629d5fcfkasperl@chromium.org#endif 437c537e2abe09729ed6cb827b4dd206470d8c4a42ager@chromium.org#if 0 44a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 4671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org 4771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org#define PICOPAM_IN_BUFF_SIZE PICODATA_BUFSIZE_PAM /*input buffer size for PAM */ 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define PICOPAM_OUT_PAM_SIZE PICODATA_BUFSIZE_PAM /*output buffer size for PAM*/ 4910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define PICOPAM_DT_NRLFZ 5 /* nr of lfz decision trees per phoneme */ 50ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_DT_NRMGC 5 /* nr of mgc decision trees per phoneme */ 51ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_NRSTPF 5 /* nr of states per phone */ 52ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 53ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_COLLECT 0 54ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_SCHEDULE 1 55ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_IMMEDIATE 2 56ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_FORWARD 3 57d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_FORWARD_FORCE_TERM 4 58d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PROCESS 5 59d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PLAY 6 60d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_FEED 7 61d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 62c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#define PICOPAM_CONTINUE 100 63c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#define PICOPAM_GOTO_SCHEDULE 1 64c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#define PICOPAM_FLUSH_RECEIVED 6 65c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#define PICOPAM_GOTO_FEED 7 66c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#define PICOPAM_PRE_SYLL_ENDED 10 67c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org 68c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#define PICOPAM_BREAK_ADD_SIZE 4 /*syllable feature vector increment dued to BREAK and SILENCE*/ 69c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org#define PICOPAM_VECT_SIZE 64+PICOPAM_BREAK_ADD_SIZE /*syllable feature vector size (bytes)*/ 70ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_INVEC_SIZE 60 /*phone feature vector size */ 71ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_MAX_SYLL_PER_SENT 100 /*maximum number of syllables per sentece*/ 72ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_MAX_PH_PER_SENT 400 /*maximum number of phonemes per sentece*/ 73ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_MAX_ITEM_PER_SENT 255 /*maximum number of attached items per sentence*/ 74ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_MAX_ITEM_SIZE_PER_SENT 4096 /*maximum size of attached items per sentence*/ 75ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 76ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_READY 20 /*PAM could start backward processing*/ 77ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_MORE 21 /*PAM has still to collect */ 78ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_NA 22 /*PAM has not to deal with this item*/ 79ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_ERR 23 /*input item is not a valid item*/ 80d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 81ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/*sentence types:cfr pam_map_sentence_type*/ 82d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_DECLARATIVE 0 837ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org#define PICOPAM_INTERROGATIVE 1 84d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_EXCLAMATIVE 2 85d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 86d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_T 0 87ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_P 1 88d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_p 2 89d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_Y 3 90d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 91d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#if 1 92d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PAM_PHR2_WITH_PR1 1 /*deal with PHR2 boundaries as with PHR1*/ 93d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#else 94d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PAM_PHR2_WITH_PR3 1 /*deal with PHR2 boundaries as with PHR3*/ 95d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#endif 96d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 97d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_DONT_CARE_VALUE 250 /*don't care value for tree printout */ 98d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_DONT_CARE_VAL 10 /*don't care value for tree feeding */ 99d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PH_DONT_CARE_VAL 7 /*don't care value for tree feeding (phonetic)*/ 100d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 101d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_MAX_STATES_PER_PHONE 5 /*number of states per phone */ 102d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_STATE_SIZE_IN_ITEM 6 /*size of a state in frame item */ 103d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_FRAME_ITEM_SIZE 4+PICOPAM_MAX_STATES_PER_PHONE*PICOPAM_STATE_SIZE_IN_ITEM 104ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 105d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_DIR_FORW 0 /*forward adapter processing*/ 106d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_DIR_BACK 1 /*backward adapter processing*/ 107d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_DIR_SIL 2 /*final silence attributes*/ 108ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 109d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_SYLL_PAUSE 0 /*syllable but containing a pause phone*/ 110ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define PICOPAM_SYLL_SYLL 1 /*a real syllable with phonemes*/ 111d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 112d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_EVENT_P_BOUND 0 /*primary boundary*/ 113d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_EVENT_S_BOUND 1 /*secondary boundary*/ 114d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_EVENT_W_BOUND 3 /*word boundary*/ 115d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_EVENT_SYLL 4 /*syllable*/ 116d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 117d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* ----- CONSTANTS FOR BREAK COMMAND SUPPORT ----- */ 118d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PWIDX_SBEG 0 119d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PWIDX_PHR1 1 120d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PWIDX_PHR2 2 121d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PWIDX_SEND 3 122d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PWIDX_DEFA 4 123d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define PICOPAM_PWIDX_SIZE 5 124d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 125c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org/*----------------------------------------------------------------*/ 126d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/*structure related to the feature vectors for feeding the trees */ 127c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org/*NOTE : the same data structure is used to manage the syllables */ 128d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* Using the first 8 fields for marking the boundaries */ 129ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/* and using the last 4 bytes as follows */ 130d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* byte 61 : 1st attached non PAM item id(0=no item attached) */ 131d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* in the "sSyllItemOffs" data structure */ 132d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* byte 62 : last attached non PAM item id(0=no item attached)*/ 133d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* in the "sSyllItemOffs" data structure */ 134d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/* byte 63..64 : offset of the start of the syllable in */ 135ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/* the "sPhIds" data structure */ 136d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgtypedef struct 137d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 138d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picopal_uint8 phoneV[PICOPAM_VECT_SIZE]; 139ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} sFtVect, *pSftVect; 140d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 141d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/*---------------------------------------------------------- 142d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org Name : pam_subobj 143d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org Function: subobject definition for the pam processing 144ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Shortcut: pam 145d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org ---------------------------------------------------------*/ 146d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgtypedef struct pam_subobj 147d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 148d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*----------------------PU voice management------------------------------*/ 149d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /* picorsrc_Voice voice; */ 150d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*----------------------PU state management------------------------------*/ 151ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 procState; /* where to take up work at next processing step */ 152d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 retState; /* where to go back from feed state at next p.s. */ 153ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 needMoreInput; /* more data necessary to start processing */ 154d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*----------------------PU input management------------------------------*/ 155d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 inBuf[PICOPAM_IN_BUFF_SIZE]; /* internal input buffer */ 156d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 inBufSize; /* actually allocated size */ 157d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 inReadPos, inWritePos; /* next pos to read/write from/to inBuf*/ 158d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*----------------------PU output management-----------------------------*/ 159d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 outBuf[PICOPAM_OUT_PAM_SIZE]; /* internal output buffer */ 160c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org picoos_uint16 outBufSize; /* actually allocated size */ 161d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 outReadPos, outWritePos; /* next pos to read/write from/to outBuf*/ 162ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*---------------------- adapter working buffers --------------------*/ 163d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 *sPhFeats; /*feature vector for a single phone */ 164d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org sFtVect *sSyllFeats; /*Syllable feature vector set for the 165ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org full sentence */ 166c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org picoos_uint8 *sPhIds; /*phone ids for the full sentence */ 167d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 *sSyllItems; /*items attached to the syllable */ 168d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int16 *sSyllItemOffs;/*offset of items attached to the syllable*/ 1697ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org /*---------------------- adapter general variables ---------------------*/ 170d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int16 nTotalPhonemes; /*number of phonemes in the sentence*/ 171d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int16 nCurrPhoneme; /*current phoneme in the sentence */ 172d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int16 nSyllPhoneme; /*current phoneme in the syllable */ 173c22f2d813ad21e25e8df5d4a371fd63f582e4262danno@chromium.org picoos_int16 nCurrSyllable; /*current syllable in the sentence */ 1747ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org picoos_int16 nTotalSyllables; /*number of syllables in the sentence -> J1*/ 1757ca89addc38b7479d2d7526d2043283ab7480ffcdanno@chromium.org picoos_uint8 nLastAttachedItemId;/*last attached item id*/ 176d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 nCurrAttachedItem; /*current attached item*/ 177d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int16 nAttachedItemsSize; /*total size of the attached items*/ 178d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 sType; /*Sentence type*/ 179d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 pType; /*Phrase type*/ 180d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_single pMod; /*pitch modifier*/ 181ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_single dMod; /*Duration modifier*/ 182ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_single dRest; /*Duration modifier rest*/ 183ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*---------------------- adapter specific component variables ----------*/ 184d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 a3_overall_syllable; /* A3 */ 185d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 a3_primary_phrase_syllable; 186d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 b4_b5_syllable; /* B4,B5 */ 187ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b6_b7_syllable; /* B6,B7 */ 188ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b6_b7_state; 189ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b8_b9_stressed_syllable; /* B8,B9 */ 190ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b10_b11_accented_syllable; /* B10,B11 */ 191ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b12_b13_syllable; /* B12,B13 */ 192ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b12_b13_state; 193d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 b14_b15_syllable; /* B14,B15 */ 194d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 b14_b15_state; 195d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 b17_b19_syllable; /* B17,B19 */ 196ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b17_b19_state; 197ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b18_b20_b21_syllable; /* B18,B20,B21 */ 198ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 b18_b20_b21_state; 199ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 c3_overall_syllable; /* C3 */ 200d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 c3_primary_phrase_syllable; 201d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 d2_syllable_in_word; /* D2 */ 202d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 d2_prev_syllable_in_word; 203d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 d2_current_primary_phrase_word; 204d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int8 e1_syllable_word_start; /* E1 */ 205d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int8 e1_syllable_word_end; 206d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e1_content; 207d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int8 e2_syllable_word_start; /* E2 */ 208ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_int8 e2_syllable_word_end; 209ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 e3_e4_word; /* E3,E4 */ 210ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 e3_e4_state; 211ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 e5_e6_content_word; /* E5,E6 */ 212d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e5_e6_content; 213d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e7_e8_word; /* E7,E8 */ 214d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e7_e8_content; 215d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e7_e8_state; 216d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e9_e11_word; /* E9,E11 */ 217d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e9_e11_saw_word; 218d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e9_e11_state; 219d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e10_e12_e13_word; /* E10,E12,E13 */ 220ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 e10_e12_e13_state; 221d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 e10_e12_e13_saw_word; 222ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 f2_overall_word; /* F2 */ 223d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 f2_word_syllable; 224d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 f2_next_word_syllable; 225d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 f2_current_primary_phrase_word; 226ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_int8 g1_current_secondary_phrase_syllable; /*G1 */ 227d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int8 g1_current_syllable; 228d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int8 g2_current_secondary_phrase_word; /*G2 */ 229d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_int8 g2_current_word; 230ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 h1_current_secondary_phrase_syll; /*H1 */ 231ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 h2_current_secondary_phrase_word; /*H2 */ 232ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 h3_h4_current_secondary_phrase_word; /*H3,H4 */ 233ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 h5_current_phrase_type; /*H5 */ 234ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 235ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 h5_syllable; /* H5 */ 236d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 h5_state; 237d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 238d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 i1_secondary_phrase_syllable; /*I1 */ 239ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 i1_next_secondary_phrase_syllable; 240ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 i2_secondary_phrase_word; /*I2 */ 241ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 i2_next_secondary_phrase_word; 242ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 j1_utterance_syllable; /*J1 */ 243d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 j2_utterance_word; /*J2 */ 244d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 j3_utterance_sec_phrases; /*J3 */ 245d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*---------------------- constant data -------------------*/ 246ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint16 sil_weights[PICOPAM_PWIDX_SIZE][PICOPAM_MAX_STATES_PER_PHONE]; 247ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*---------------------- LINGWARE related data -------------------*/ 248ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picokdt_DtPAM dtdur; /* dtdur knowledge base */ 24910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org picokdt_DtPAM dtlfz[PICOPAM_DT_NRLFZ]; /* dtlfz knowledge bases */ 250d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picokdt_DtPAM dtmgc[PICOPAM_DT_NRMGC]; /* dtmgc knowledge bases */ 251d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*---------------------- Pdfs related data -------------------*/ 252ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picokpdf_PdfDUR pdfdur; /* pdfdur knowledge base */ 25310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org picokpdf_PdfMUL pdflfz; /* pdflfz knowledge base */ 25410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org /*---------------------- Tree traversal related data -------------------*/ 255ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint16 durIndex; 25610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org picoos_uint8 numFramesState[PICOPAM_DT_NRLFZ]; 257d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 lf0Index[PICOPAM_DT_NRLFZ]; 258d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 mgcIndex[PICOPAM_DT_NRMGC]; 259d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*---------------------- temps for updating the feature vector ---------*/ 260d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 phonDur; 26110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org picoos_single phonF0[PICOPAM_DT_NRLFZ]; 26210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org /*---------------------- Phones related data -------------------*/ 263ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoktab_Phones tabphones; 264ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} pam_subobj_t; 265d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 266d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 26710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org/* ----- CONSTANTS FOR FEATURE VECTOR BUILDING (NOT PREFIXED WITH "PICOPAM_" FOR BREVITY) ----- */ 268ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define P1 0 /*field 1 of the input vector*/ 26910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define P2 1 27010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define P3 2 27110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define P4 3 27210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define P5 4 27310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define P6 5 27410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define P7 6 27510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define bnd 6 /*boundary type item associated to the syllable = P7 */ 27610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define P8 7 27710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define A3 8 27810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B1 9 27910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B2 10 28010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B3 11 28110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B4 12 28210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B5 13 28310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B6 14 28410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B7 15 28510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B8 16 28610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B9 17 28710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B10 18 28810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B11 19 28910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B12 20 29010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B13 21 29110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B14 22 29210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B15 23 29310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B16 24 29410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B17 25 29510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B18 26 29610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B19 27 29710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B20 28 29810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define B21 29 29910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define C3 30 30010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define D2 31 30110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E1 32 30210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E2 33 30310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E3 34 30410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E4 35 30510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E5 36 30610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E6 37 30710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E7 38 30810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E8 39 30910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E9 40 31010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E10 41 31110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E11 42 31210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E12 43 31310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define E13 44 31410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define F2 45 31510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define G1 46 31610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define G2 47 31710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define H1 48 31810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define H2 49 31910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define H3 50 32010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define H4 51 32110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define H5 52 32210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define I1 53 32310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define I2 54 32410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define J1 55 32510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org#define J2 56 326ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define J3 57 327ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define DUR 58 /*duration component*/ 328ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define F0 59 /*F0 component*/ 329ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define ITM 60 /*Item Offset into sSyllItems item list*/ 330ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define itm 61 /*second byte of the Item Offset */ 331ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define FID 62 /*Phoneme offset in the sPhIds phoneme list*/ 332ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define fid 63 /*second byte of the Phoneme offset */ 333ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define Min 64 /*offset to min syllable duration (uint 16,pauses)*/ 334ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define Max 66 /*offset to max syllable duration (uint 16,pauses)*/ 335ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/* ------------------------------------------------------------------- 336ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org PAM feature vector indices position changes, 337ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org ------------------------------------------------------------------- */ 338ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B1 8 339ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B2 9 340ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B3 10 341ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B4 11 342ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B5 12 343ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B6 13 344ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B7 14 345ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B8 15 346ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B9 16 347ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B10 17 348ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B11 18 349ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B12 19 350ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B13 20 351ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B14 21 352ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B15 22 353ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B16 23 354ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B17 24 355ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B18 25 356ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B19 26 357ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B20 27 358ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_B21 28 359ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E1 29 360ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E2 30 361ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E3 31 362ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E4 32 363ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E5 33 364d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define T_E6 34 365d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define T_E7 35 366ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E8 36 367d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define T_E9 37 368ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E10 38 369ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E11 39 370ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E12 40 371ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_E13 41 372d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define T_A3 42 373ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_C3 43 374ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_D2 44 375ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_F2 45 376ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_G1 46 377ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_I1 47 378ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_G2 48 379ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_I2 49 380ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_H1 50 381ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_H2 51 382ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_H3 52 383ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_H4 53 384ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org#define T_H5 54 385ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 386ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/*------------------------------------------------------------------ 387ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Service routines : 388ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org ------------------------------------------------------------------*/ 389ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_initialize(register picodata_ProcessingUnit this, picoos_int32 r_mode); 390ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_terminate(register picodata_ProcessingUnit this); 391ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_allocate(picoos_MemoryManager mm, pam_subobj_t *pam); 392ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic void pam_deallocate(picoos_MemoryManager mm, pam_subobj_t *pam); 393ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_subobj_deallocate(register picodata_ProcessingUnit this, 394ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_MemoryManager mm); 395ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/*------------------------------------------------------------------ 396ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org Processing routines : 397ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org ------------------------------------------------------------------*/ 398ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic picodata_step_result_t pam_step(register picodata_ProcessingUnit this, 399ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_int16 mode, picoos_uint16 * numBytesOutput); 400ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_deal_with(const picoos_uint8 *item); 401ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/*Utility*/ 402ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic picoos_uint8 pam_get_vowel_name(register picodata_ProcessingUnit this, 403ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 *item, picoos_uint8 *pos); 404ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic picoos_uint8 pam_get_pause_id(register picodata_ProcessingUnit this); 405ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 406ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic picoos_uint8 pam_map_sentence_type(picoos_uint8 iteminfo1, 407ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 iteminfo2); 408ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic picoos_uint8 pam_map_phrase_type(picoos_uint8 iteminfo1, 409ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 iteminfo2); 410ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 411ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/*Adapter*/ 412ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_reset_processors(register picodata_ProcessingUnit this); 413ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_reset_processors_back( 414ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org register picodata_ProcessingUnit this); 415ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_create_syllable(register picodata_ProcessingUnit this, 416d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 syllType, picoos_uint8 *sContent, picoos_uint8 sentType, 417ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 phType, picoos_uint8 uBoundType, picoos_uint16 uMin, 418ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint16 uMax); 419ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_process_event_feature( 420ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org register picodata_ProcessingUnit this, picoos_uint8 nFeat, 421ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 event_type, picoos_uint8 direction); 422ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_process_event(register picodata_ProcessingUnit this, 423d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 event_type, picoos_uint8 direction); 424d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgstatic pico_status_t pam_adapter_forward_step( 425d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org register picodata_ProcessingUnit this, picoos_uint8 *itemBase); 426ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_adapter_backward_step( 427ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org register picodata_ProcessingUnit this); 428ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_do_pause(register picodata_ProcessingUnit this); 429ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_adapter_do_pauses(register picodata_ProcessingUnit this); 430d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/*-------------- tree traversal ---------------------------------------*/ 431ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_expand_vector(register picodata_ProcessingUnit this); 432ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic picoos_uint8 pam_do_tree(register picodata_ProcessingUnit this, 433ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org const picokdt_DtPAM dtpam, const picoos_uint8 *invec, 434ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org const picoos_uint8 inveclen, picokdt_classify_result_t *dtres); 435ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_get_f0(register picodata_ProcessingUnit this, 436ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint16 *lf0Index, picoos_uint8 nState, picoos_single *phonF0); 437d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgstatic pico_status_t pam_get_duration(register picodata_ProcessingUnit this, 438d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 durIndex, picoos_uint16 *phonDur, 439ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 *numFramesState); 440ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_update_vector(register picodata_ProcessingUnit this); 441ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/*-------------- FINAL ITEM FEEDING -----------------------------------------*/ 442ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_put_item(register picodata_ProcessingUnit this, 443ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 *outBuff, picoos_uint16 outWritePos, 444ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 *bytesWr); 445ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 446ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_put_term(picoos_uint8 *outBuff, 447ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint16 outWritePos, picoos_uint8 *bytesWr); 448ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 449ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t is_pam_command(const picoos_uint8 *qItem); 450ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 451d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgstatic void get_default_boundary_limit(picoos_uint8 uBoundType, 452d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint16 *uMinDur, picoos_uint16 *uMaxDur); 453ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 454ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/* ------------------------------------------------------------- 455ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * Pico System functions 456ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * ------------------------------------------------------------- 457ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org */ 458ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 459ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/** 460ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * allocation for PAM memory on pam PU 461ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @param mm : handle to engine memory manager 462ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @param pam : handle to a pam struct 463d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @return PICO_OK : allocation successful 464d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @return PICO_ERR_OTHER : allocation errors 465ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @callgraph 466ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @callergraph 467ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org */ 468ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_allocate(picoos_MemoryManager mm, pam_subobj_t *pam) 469c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org{ 470ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 *data; 471ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_int16 *dataI; 472ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 473ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sSyllFeats = NULL; 474ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sPhIds = NULL; 475ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sPhFeats = NULL; 476ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sSyllItems = NULL; 477ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sSyllItemOffs = NULL; 478ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 479ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*----------------------------------------------------------------- 480ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * PAM Local buffers ALLOCATION 481ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org ------------------------------------------------------------------*/ 482ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*PAM Local buffers*/ 483ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org data = (picopal_uint8 *) picoos_allocate(mm, sizeof(sFtVect) 484ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * PICOPAM_MAX_SYLL_PER_SENT); 485ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (data == NULL) 486ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_ERR_OTHER; 487ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sSyllFeats = (sFtVect*) data; 488ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 489ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org data = (picopal_uint8 *) picoos_allocate(mm, sizeof(picopal_uint8) 490ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * PICOPAM_MAX_PH_PER_SENT); 491ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (data == NULL) { 492ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam_deallocate(mm, pam); 493ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_ERR_OTHER; 494ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 495ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sPhIds = (picopal_uint8*) data; 496ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 497ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org data = (picopal_uint8 *) picoos_allocate(mm, sizeof(picopal_uint8) 498ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * PICOPAM_VECT_SIZE); 499ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (data == NULL) { 500ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam_deallocate(mm, pam); 501ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_ERR_OTHER; 502ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 503ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sPhFeats = (picopal_uint8*) data; 504ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 505ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org data = (picopal_uint8 *) picoos_allocate(mm, sizeof(picopal_uint8) 506ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * PICOPAM_MAX_ITEM_SIZE_PER_SENT); 507ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (data == NULL) { 508ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam_deallocate(mm, pam); 509ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_ERR_OTHER; 510ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 511ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sSyllItems = (picopal_uint8*) data; 512ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 513ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org dataI = (picoos_int16 *) picoos_allocate(mm, sizeof(picoos_int16) 514ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * PICOPAM_MAX_ITEM_PER_SENT); 515ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (data == NULL) { 516ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam_deallocate(mm, pam); 517ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_ERR_OTHER; 518ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 519ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->sSyllItemOffs = (picoos_int16*) dataI; 520ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 521ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_OK; 522ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}/*pam_allocate*/ 523ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 524ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/** 525ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * frees allocation for DSP memory on PAM PU 526ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @param mm : memory manager 527ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @param pam : pam PU internal sub-object 528ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @return void 529ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @remarks modified and inserted in sub obj removal PP 15.09.08 530ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @callgraph 531ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @callergraph 532ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org */ 533ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic void pam_deallocate(picoos_MemoryManager mm, pam_subobj_t *pam) 534ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org{ 535ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*----------------------------------------------------------------- 536ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * Memory de-allocations 537ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * ------------------------------------------------------------------*/ 53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->sSyllFeats != NULL) 53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_deallocate(mm, (void *) &pam->sSyllFeats); 54043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->sPhIds != NULL) 54143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_deallocate(mm, (void *) &pam->sPhIds); 54243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->sPhFeats != NULL) 54343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_deallocate(mm, (void *) &pam->sPhFeats); 54443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->sSyllItems != NULL) 545ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org picoos_deallocate(mm, (void *) &pam->sSyllItems); 54643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->sSyllItemOffs != NULL) 54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_deallocate(mm, (void *) &pam->sSyllItemOffs); 54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 54943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}/*pam_deallocate*/ 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 551245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org/** 552245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org * initialization of a pam PU 553245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org * @param this : handle to a PU struct 55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return PICO_OK : init OK 55543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return PICO_ERR_OTHER : error on getting pkbs addresses 55643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callgraph 55743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callergraph 55843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 55943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenstatic pico_status_t pam_initialize(register picodata_ProcessingUnit this, picoos_int32 r_mode) 56043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 56143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pico_status_t nI, nJ; 56243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam_subobj_t *pam; 5631e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 5641e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (NULL == this || NULL == this->subObj) { 5651e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org return PICO_ERR_OTHER; 5661e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org } 5671e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org pam = (pam_subobj_t *) this->subObj; 5681e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org pam->inBufSize = PICOPAM_IN_BUFF_SIZE; 5691e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org pam->outBufSize = PICOPAM_OUT_PAM_SIZE; 5701e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org pam->inReadPos = 0; 57143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->inWritePos = 0; 57243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->outReadPos = 0; 57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->outWritePos = 0; 57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->needMoreInput = 0; 57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->procState = 0; 57643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /*----------------------------------------------------------------- 57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * MANAGE INTERNAL INITIALIZATION 57943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ------------------------------------------------------------------*/ 58043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /*init the syllable structure*/ 58143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < PICOPAM_MAX_SYLL_PER_SENT; nI++) 58243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nJ = 0; nJ < PICOPAM_VECT_SIZE; nJ++) 58343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->sSyllFeats[nI].phoneV[nJ] = 0; 5846d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 58543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < PICOPAM_MAX_PH_PER_SENT; nI++) 58643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->sPhIds[nI] = 0; 58743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 58843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < PICOPAM_VECT_SIZE; nI++) 58943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->sPhFeats[nI] = 0; 59043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 59143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < PICOPAM_MAX_ITEM_SIZE_PER_SENT; nI++) 5921e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org pam->sSyllItems[nI] = 0; 5931e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org 59443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < PICOPAM_MAX_ITEM_PER_SENT; nI++) 5953811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org pam->sSyllItemOffs[nI] = 0; 5963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 5973811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org /*Other variables*/ 59843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam_reset_processors(this); 59943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->nLastAttachedItemId = pam->nCurrAttachedItem = 0; 600245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org pam->nAttachedItemsSize = 0; 601245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 602ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (r_mode == PICO_RESET_SOFT) { 60343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /*following initializations needed only at startup or after a full reset*/ 60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return PICO_OK; 60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /*pitch and duration modifiers*/ 60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->pMod = 1.0f; 60943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->dMod = 1.0f; 6109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com pam->dRest = 0.0f; 61143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 61274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 613ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* constant tables */ 614a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org { 61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_uint8 i, j; 61643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_uint16 tmp_weights[PICOPAM_PWIDX_SIZE][PICOPAM_MAX_STATES_PER_PHONE] = { 61743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen {10, 10, 10, 10, 1 }, /*SBEG*/ 6184a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org { 1, 4, 8, 4, 1 }, /*PHR1*/ 61943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { 1, 4, 8, 4, 1 }, /*PHR2*/ 62043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { 1, 10, 10, 10, 10 },/*SEND*/ 62143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen { 1, 1, 1, 1, 1 } /*DEFAULT*/ 62243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org for (i = 0; i < PICOPAM_PWIDX_SIZE; i++) { 62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (j = 0; j < PICOPAM_PWIDX_SIZE; j++) { 625a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org pam->sil_weights[j][j] = tmp_weights[i][j]; 62671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org } 62743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 62843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 62943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 630a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 63143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/*----------------------------------------------------------------- 6325323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org * MANAGE LINGWARE INITIALIZATION IF NEEDED 63343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ------------------------------------------------------------------*/ 63443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* kb dtdur */ 63543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->dtdur = picokdt_getDtPAM(this->voice->kbArray[PICOKNOW_KBID_DT_DUR]); 63643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->dtdur == NULL) { 63743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 63843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NULL); 63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return PICO_ERR_OTHER; 64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }PICODBG_DEBUG(("got dtdur")); 64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* kb dtlfz* */ 643ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam->dtlfz[0] = picokdt_getDtPAM( 6446d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org this->voice->kbArray[PICOKNOW_KBID_DT_LFZ1]); 6456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org pam->dtlfz[1] = picokdt_getDtPAM( 6465d00b60c201d860c74821f553fdc34f4e057b411lrn@chromium.org this->voice->kbArray[PICOKNOW_KBID_DT_LFZ2]); 6473811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org pam->dtlfz[2] = picokdt_getDtPAM( 6483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org this->voice->kbArray[PICOKNOW_KBID_DT_LFZ3]); 6493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org pam->dtlfz[3] = picokdt_getDtPAM( 6503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org this->voice->kbArray[PICOKNOW_KBID_DT_LFZ4]); 651ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam->dtlfz[4] = picokdt_getDtPAM( 652ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org this->voice->kbArray[PICOKNOW_KBID_DT_LFZ5]); 65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < PICOPAM_DT_NRLFZ; nI++) { 65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->dtlfz[nI] == NULL) { 65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, 65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NULL, NULL); 6573811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return PICO_ERR_OTHER; 6583811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org }PICODBG_DEBUG(("got dtlfz%d", nI+1)); 6593811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org } 660068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* kb dtmgc* */ 66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->dtmgc[0] = picokdt_getDtPAM( 66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->voice->kbArray[PICOKNOW_KBID_DT_MGC1]); 66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->dtmgc[1] = picokdt_getDtPAM( 66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->voice->kbArray[PICOKNOW_KBID_DT_MGC2]); 66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->dtmgc[2] = picokdt_getDtPAM( 667e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org this->voice->kbArray[PICOKNOW_KBID_DT_MGC3]); 668e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pam->dtmgc[3] = picokdt_getDtPAM( 66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->voice->kbArray[PICOKNOW_KBID_DT_MGC4]); 670e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org pam->dtmgc[4] = picokdt_getDtPAM( 67143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->voice->kbArray[PICOKNOW_KBID_DT_MGC5]); 67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < PICOPAM_DT_NRMGC; nI++) { 67343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->dtmgc[nI] == NULL) { 67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, 6753811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org NULL, NULL); 6763811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org return PICO_ERR_OTHER; 67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }PICODBG_DEBUG(("got dtmgc%d", nI+1)); 678e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* kb pdfdur* */ 68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam->pdfdur = picokpdf_getPdfDUR( 68243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->voice->kbArray[PICOKNOW_KBID_PDF_DUR]); 68343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->pdfdur == NULL) { 68443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 68571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org NULL); 68671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org return PICO_ERR_OTHER; 68743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }PICODBG_DEBUG(("got pdfdur")); 68843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /* kb pdflfz* */ 690ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam->pdflfz = picokpdf_getPdfMUL( 69143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->voice->kbArray[PICOKNOW_KBID_PDF_LFZ]); 69243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (pam->pdflfz == NULL) { 69343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen NULL); 69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return PICO_ERR_OTHER; 696ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org }PICODBG_DEBUG(("got pdflfz")); 697ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 698ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /* kb tabphones */ 699ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->tabphones = picoktab_getPhones( 700750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org this->voice->kbArray[PICOKNOW_KBID_TAB_PHONES]); 701ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (pam->tabphones == NULL) { 702750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING, NULL, 7038e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org NULL); 704ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_ERR_OTHER; 705ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org }PICODBG_DEBUG(("got tabphones")); 706ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 7078e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return PICO_OK; 708c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org}/*pam_initialize*/ 709c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 710c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org/** 711ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * termination of a pam PU 712ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * @param this : handle to a pam PU struct 713ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * @return PICO_OK 714ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * @callgraph 715ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * @callergraph 71610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org */ 717ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgstatic pico_status_t pam_terminate(register picodata_ProcessingUnit this) 718d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 719ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 7208e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org pam_subobj_t *pam; 721ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 722ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (NULL == this || NULL == this->subObj) { 7238e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org return PICO_ERR_OTHER; 724ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 725ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam = (pam_subobj_t *) this->subObj; 726ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 727eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org return PICO_OK; 7288e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org}/*pam_terminate*/ 729d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 730d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org/** 731d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * deallocaton of a pam PU 732d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @param this : handle to a pam PU struct 733d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @param mm : engine memory manager 734d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @return PICO_OK 735d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @callgraph 736d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @callergraph 737d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org */ 738d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgstatic pico_status_t pam_subobj_deallocate(register picodata_ProcessingUnit this, 739d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_MemoryManager mm) 740d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org{ 741d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 742d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org pam_subobj_t* pam; 743d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 744d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org if (NULL != this) { 745d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org pam = (pam_subobj_t *) this->subObj; 746755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org mm = mm; /* avoid warning "var not used in this function"*/ 747ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /*----------------------------------------------------------------- 748ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * Memory de-allocations 749755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org * ------------------------------------------------------------------*/ 750755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (pam->sSyllFeats != NULL) { 751755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org picoos_deallocate(this->common->mm, (void *) &pam->sSyllFeats); 752755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org } 753381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (pam->sPhIds != NULL) { 75443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_deallocate(this->common->mm, (void *) &pam->sPhIds); 7556f10e41fef1524c70846d970268de222e41c594cager@chromium.org } 7566f10e41fef1524c70846d970268de222e41c594cager@chromium.org if (pam->sPhFeats != NULL) { 7576f10e41fef1524c70846d970268de222e41c594cager@chromium.org picoos_deallocate(this->common->mm, (void *) &pam->sPhFeats); 7586f10e41fef1524c70846d970268de222e41c594cager@chromium.org } 7596f10e41fef1524c70846d970268de222e41c594cager@chromium.org if (pam->sSyllItems != NULL) { 760ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org picoos_deallocate(this->common->mm, (void *) &pam->sSyllItems); 761ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 762381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (pam->sSyllItemOffs != NULL) { 763381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org picoos_deallocate(this->common->mm, (void *) &pam->sSyllItemOffs); 76443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 76543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_deallocate(this->common->mm, (void *) &this->subObj); 76643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 76743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 768ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org return PICO_OK; 769ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org}/*pam_subobj_deallocate*/ 770ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org 771ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org/** 772f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org * creates a new pam processing unit 773f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org * @param mm : engine memory manager 774f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org * @param common : engine common object pointer 775f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org * @param cbIn : pointer to input buffer 776f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org * @param cbOut : pointer to output buffer 777ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org * @param voice : pointer to voice structure 778ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * @return this : pam PU handle if success 779ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @return NULL : if error 780381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @callgraph 781381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @callergraph 78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenpicodata_ProcessingUnit picopam_newPamUnit(picoos_MemoryManager mm, 78443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_Common common, picodata_CharBuffer cbIn, 785f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org picodata_CharBuffer cbOut, picorsrc_Voice voice) 786ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 787ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 788f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org register pam_subobj_t * pam; 789f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org 790f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org picodata_ProcessingUnit this = picodata_newProcessingUnit(mm, common, cbIn, 791f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org cbOut, voice); 792f05f2913e034b9332e55c02c9395e701725c02c1kmillikin@chromium.org if (this == NULL) { 79343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return NULL; 794ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 795ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org this->initialize = pam_initialize; 796b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 797381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org PICODBG_DEBUG(("picotok_newPamUnit -- set this->step to pam_step")); 79843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 79943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->step = pam_step; 80043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->terminate = pam_terminate; 80143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen this->subDeallocate = pam_subobj_deallocate; 8029085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org this->subObj = picoos_allocate(mm, sizeof(pam_subobj_t)); 80343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (this->subObj == NULL) { 80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PICODBG_ERROR(("Error in Pam Object allocation")); 805ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org picoos_deallocate(mm, (void*) &this); 806ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return NULL; 80743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen }; 80843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 809eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org /*----------------------------------------------------------------- 810381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * Allocate internal memory for PAM (only at PU creation time) 811381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * ------------------------------------------------------------------*/ 81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam = (pam_subobj_t *) this->subObj; 81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (PICO_OK != pam_allocate(mm, pam)) { 81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PICODBG_ERROR(("Error in Pam buffers Allocation")); 81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_deallocate(mm, (void *) &this->subObj); 816ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org picoos_deallocate(mm, (void *) &this); 81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return NULL; 81883e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org } 81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /*----------------------------------------------------------------- 821750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * Initialize memory for PAM (this may be re-used elsewhere, e.g.Reset) 822f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org * ------------------------------------------------------------------*/ 823f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (PICO_OK != pam_initialize(this, PICO_RESET_FULL)) { 824f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org PICODBG_ERROR(("problem initializing the pam sub-object")); 825f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 826f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return this; 827f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org}/*picopam_newPamUnit*/ 828f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 829f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org/*------------------------------------------------------------------------------- 830f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org PROCESSING AND INTERNAL FUNCTIONS 831f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org --------------------------------------------------------------------------------*/ 832f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 83343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 83443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * initializes default duration limits for boundary items 83543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param uBoundType : type of input boundary type 83643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param *uMinDur, *uMaxDur : addresses of values to initialize 83743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return void 83843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @remarks so far initializes to 0 both values; this will leave the values given by tree prediction 83943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callgraph 84043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callergraph 84143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen */ 8425aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.orgstatic void get_default_boundary_limit(picoos_uint8 uBoundType, 8435aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org picoos_uint16 *uMinDur, picoos_uint16 *uMaxDur) 844ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org{ 845ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org switch (uBoundType) { 8465aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org case PICODATA_ITEMINFO1_BOUND_SBEG: 8475aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org *uMinDur = 0; 8485aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org *uMaxDur = 20; 8495aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org break; 850381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org case PICODATA_ITEMINFO1_BOUND_SEND: 85143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *uMinDur = 550; 85243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *uMaxDur = 650; 85343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 85443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case PICODATA_ITEMINFO1_BOUND_TERM: 8555aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org *uMinDur = 0; 8565aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org *uMaxDur = 0; 857ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org break; 858ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org case PICODATA_ITEMINFO1_BOUND_PHR0: 8595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org *uMinDur = 0; 8605aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org *uMaxDur = 0; 8615aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org break; 8625aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org case PICODATA_ITEMINFO1_BOUND_PHR1: 863381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org *uMinDur = 275; 86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *uMaxDur = 325; 86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 866b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case PICODATA_ITEMINFO1_BOUND_PHR2: 867c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org *uMinDur = 4; 868c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org *uMaxDur = 60; 869c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org break; 870ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org case PICODATA_ITEMINFO1_BOUND_PHR3: 871c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org *uMinDur = 0; 872c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org *uMaxDur = 0; 873c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org break; 874c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org default: 875c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org break; 876c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org } 877068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 8781f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org}/*get_default_boundary_limit*/ 87932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org 880ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/** 881068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * checks if "neededSize" is available on "nCurrPhoneme" 882068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * @param pam : pam subobj 883068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * @param neededSize : the requested size 884068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * @return PICO_OK : size is available 8858e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org * @return !=PICO_OK : size not available 8868e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org * @callgraph 8878e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org * @callergraph 8888e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org */ 889ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgstatic pico_status_t check_phones_size(pam_subobj_t *pam, 890ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org picoos_int16 neededSize) 891ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org{ 892ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org if ((pam->nCurrPhoneme + neededSize) > PICOPAM_MAX_PH_PER_SENT - 1) { 89383130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return PICO_ERR_OTHER; 89483130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org } 89583130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org return PICO_OK; 896ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}/*check_phones_size*/ 897ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org 898ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org/** 899ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org * checks if neededSize is available on "nCurrSyllable" 90083130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org * @param pam : pam subobj 90183130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org * @param neededSize : the requested size 90283130cfc204d3ffed6832a7ef149b19328a58b33svenpanne@chromium.org * @return PICO_OK : size is available 903068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * @return !=PICO_OK : size not available 904068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org * @callgraph 9051f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org * @callergraph 9061f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.org */ 9071f34ad3eadf9b0e6b8ed415817d276f54dd6d06bdanno@chromium.orgstatic pico_status_t check_syllables_size(pam_subobj_t *pam, 9088e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org picoos_int16 neededSize) 9098e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org{ 9109259716434187c932704601f700375e53d865de8rossberg@chromium.org if ((pam->nCurrSyllable + neededSize) > PICOPAM_MAX_SYLL_PER_SENT - 1) { 9119259716434187c932704601f700375e53d865de8rossberg@chromium.org return PICO_ERR_OTHER; 9128e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org } 9138e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org return PICO_OK; 9148e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org}/*check_syllables_size*/ 915068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org 9168e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org/** 9178e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org * verifies that local storage has enough space to receive 1 item 918236ad9617a7359a463144a6ebeb5431a70f769cfager@chromium.org * @param this : pointer to current PU struct 919b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org * @param item : pointer to current item head 920b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org * @return TRUE : resource limits would be reached during processing of input item 921ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @return FALSE : item could be processed normally 922b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org * @remarks item pointed to by *item should be already valid 923b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org * @callgraph 924b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org * @callergraph 925381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org */ 926b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgstatic pico_status_t pamCheckResourceLimits( 927b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org register picodata_ProcessingUnit this, const picoos_uint8 *item) 928b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org{ 9299fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org register pam_subobj_t * pam; 93041044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org picodata_itemhead_t head; 931381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org pico_status_t sResult; 93241044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org if (NULL == this || NULL == this->subObj) { 93341044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org return PICODATA_PU_ERROR; 93441044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org } 93541044eb0969b0d7d5c041a077519a36efa6aff27kasperl@chromium.org pam = (pam_subobj_t *) this->subObj; 936381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org sResult = TRUE; /*default : resource limits reached*/ 937381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org head.type = item[0]; 938381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org head.info1 = item[1]; 939b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org head.info2 = item[2]; 940b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org head.len = item[3]; 941b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 942b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org switch (head.type) { 943381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org /*commands that generate syllables/phonemes*/ 944b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case PICODATA_ITEM_SYLLPHON: 945b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org if (pam->nCurrSyllable >= PICOPAM_MAX_SYLL_PER_SENT - 2) { 946b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return sResult; /*no room for more syllables*/ 947b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 948381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if ((pam->nCurrPhoneme + head.len) >= PICOPAM_MAX_PH_PER_SENT - 2) { 949b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org return sResult; /*no room for more phoneme*/ 950b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 951b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org break; 952b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org case PICODATA_ITEM_BOUND: 953381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if ((head.info1 == PICODATA_ITEMINFO1_BOUND_SBEG) || (head.info1 954b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org == PICODATA_ITEMINFO1_BOUND_SEND) || (head.info1 955381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org == PICODATA_ITEMINFO1_BOUND_TERM) || (head.info1 956381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org == PICODATA_ITEMINFO1_BOUND_PHR1) 957b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org#ifdef PAM_PHR2_WITH_PR1 958b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org || (head.info1 == PICODATA_ITEMINFO1_BOUND_PHR2) 959b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org#endif 9609fe21c6d4c657d15af27c8751257d3e2bf113e45kasperl@chromium.org ) { 961ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 962ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (pam->nCurrSyllable >= PICOPAM_MAX_SYLL_PER_SENT - 2) { 963381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return sResult; /*no room for more syllables*/ 964b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 965381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if ((pam->nCurrPhoneme + 1) >= PICOPAM_MAX_PH_PER_SENT - 2) { 966381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return sResult; /*no room for more phoneme*/ 967b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 968b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org } 969b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org break; 970e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org 971c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org default: 972ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /*all other commands has to be queued*/ 973e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org if ((pam->nAttachedItemsSize + head.len) 974ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org >= PICOPAM_MAX_ITEM_SIZE_PER_SENT - 1) { 97537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return sResult; /*no room for more items*/ 97637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 97737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com break; 97837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com } 97937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return FALSE; /*no resource limits apply to current item*/ 980303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org} /*pamCheckResourceLimits*/ 981303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 982303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org/** 983303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org * selects items to be sent to next PU immedately 984303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org * @param this : pointer to current PU struct 985303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org * @param item : pointer to current item head 98637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @return TRUE : item should be passed on next PU NOW 98737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @return FALSE : item should not be passed on next PU now but should be processed 98837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @remarks item pointed to by *item should be already valid 989381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @callgraph 99037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com * @callergraph 99137abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com */ 992381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.orgstatic pico_status_t pam_check_immediate(register picodata_ProcessingUnit this, 99337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com const picoos_uint8 *item) 99437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com{ 99537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com register pam_subobj_t * pam; 99637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (NULL == this || NULL == this->subObj) { 99737abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return PICODATA_PU_ERROR; 998381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 99937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com pam = (pam_subobj_t *) this->subObj; 100037abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com 1001381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (pam->nCurrSyllable <= -1) { 100237abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if (item[0] == PICODATA_ITEM_SYLLPHON) 100337abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return FALSE; 100437abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com if ((item[0] == PICODATA_ITEM_BOUND) && (item[1] 100537abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com == PICODATA_ITEMINFO1_BOUND_SBEG)) 100637abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return FALSE; 1007381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org if (is_pam_command((picoos_uint8 *) item) == TRUE) 100837abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return FALSE; 100937abdec9cad6edeba05b5c7a9ff73c25f5df2b70christian.plesner.hansen@gmail.com return TRUE; /*no need to process data : send it*/ 1010381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 1011381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return FALSE; /*syllable struct not void : do standard processing*/ 1012b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 1013b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org} /*pam_check_immediate*/ 1014b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org 101543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen/** 1016ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * checks if the input item has to be queued in local storage for later resynch 101743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param this : pointer to current PU struct 101843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param item : pointer to current item head 101943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return TRUE : item should be queued 102043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return FALSE : item should not be queued 102143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @remarks item pointed to by *item should be already valid 102243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callgraph 102343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callergraph 1024750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org */ 1025ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgstatic pico_status_t pam_hastobe_queued(register picodata_ProcessingUnit this, 102643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const picoos_uint8 *item) 102783e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org{ 102843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen register pam_subobj_t * pam; 1029750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org picodata_itemhead_t head; 1030750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (NULL == this || NULL == this->subObj) { 1031750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return PICODATA_PU_ERROR; 1032750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 1033750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org pam = (pam_subobj_t *) this->subObj; 1034f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org head.type = item[0]; 1035f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org head.info1 = item[1]; 1036f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org 1037f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org switch (head.type) { 1038f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org /*commands that generate syllables/phonemes*/ 1039f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org case PICODATA_ITEM_SYLLPHON: 1040f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return FALSE; /*no queue needed*/ 1041f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org break; 1042f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org case PICODATA_ITEM_BOUND: 1043f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if ((head.info1 == PICODATA_ITEMINFO1_BOUND_PHR3) 1044750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org#ifdef PAM_PHR2_WITH_PR3 104543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ||(head.info1==PICODATA_ITEMINFO1_BOUND_PHR2) 104643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif 104743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen || (head.info1 == PICODATA_ITEMINFO1_BOUND_PHR0)) { 104843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return FALSE; /*no queue needed*/ 104943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1050ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org break; 105143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 105283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org default: 105343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /*all other items has to be queued*/ 10547979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org break; 105543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 105643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return TRUE; /*item has to be queued*/ 1057e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org} /*pam_hastobe_queued*/ 105843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1059ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org/** 106043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * queue item in local storage for later resynch 106183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org * @param this : pointer to current PU struct 106243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param item : pointer to current item head 10637979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org * @return TRUE : item queued 106443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @return FALSE : item not queued because of errors 106543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @remarks item pointed to by *item should be already valid 106643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callgraph 106743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @callergraph 1068ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org */ 10697979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.orgstatic pico_status_t pam_queue(register picodata_ProcessingUnit this, 107043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen const picoos_uint8 *item) 107143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 107243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen register pam_subobj_t * pam; 107343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picodata_itemhead_t head; 1074ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org picoos_uint8 nI; 1075ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pico_status_t sResult; 1076b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org if (NULL == this || NULL == this->subObj) { 1077381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return PICODATA_PU_ERROR; 1078381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 107943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam = (pam_subobj_t *) this->subObj; 108043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen sResult = TRUE; /*default : item queued*/ 108143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen head.type = item[0]; 108243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen head.info1 = item[1]; 1083ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org head.info2 = item[2]; 1084ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org head.len = item[3]; 1085b3284ad36ee358a35b81379ad1c449e4f8021362kasperl@chromium.org 1086381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org /*test condition on enough room to store current item in the "sSyllItems" area*/ 108743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((pam->nAttachedItemsSize + head.len + sizeof(picodata_itemhead_t)) 108843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen >= PICOPAM_MAX_ITEM_SIZE_PER_SENT - 1) { 108943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return FALSE; /*resource limit reached*/ 1090ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1091e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org /*store current offset*/ 1092ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam->sSyllItemOffs[pam->nLastAttachedItemId] = pam->nAttachedItemsSize; 1093ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /*store the item to the "sSyllItems" area*/ 1094ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org for (nI = 0; nI < (head.len + sizeof(picodata_itemhead_t)); nI++) { 1095ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam->sSyllItems[pam->nAttachedItemsSize + nI] = item[nI]; 1096e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org } 1097ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /*increment the attached items area*/ 1098ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam->nAttachedItemsSize += nI; 1099ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1100750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org /*increment id*/ 1101ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org pam->nLastAttachedItemId++; 1102c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org /*set start(if not initialized) and end ids of queued items in sSyllFeats*/ 1103ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (pam->nCurrSyllable > -1) { 11041510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /*normal case : the item is attached to current syllable*/ 11055f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] == 0) { 11065f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] 110701beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org = pam->nLastAttachedItemId; 1108750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 1109750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] 1110750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org = pam->nLastAttachedItemId; 1111750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } else { 1112750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org /*special case : an item is requested to be queued even if no 1113f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org syllables has been assigned to the sentence structure : 1114f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org -->> use syll 0*/ 1115f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org if (pam->sSyllFeats[0].phoneV[ITM] == 0) { 1116f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org pam->sSyllFeats[0].phoneV[ITM] = pam->nLastAttachedItemId; 1117f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 1118f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org pam->sSyllFeats[0].phoneV[itm] = pam->nLastAttachedItemId; 1119f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 1120f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org return TRUE; /*item queued successfully*/ 1121750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org} /*pam_queue*/ 112201beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org 112301beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org/** 1124ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org * selects items to be dealth with by the PU processing 1125ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org * @param item : pointer to current item head 1126ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org * @return TRUE : item should be processed 1127750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @return FALSE : item should not be processed (maybe it ontains commands or items for other PUs) 1128c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org * @remarks item pointed to by *item should be already valid 1129750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @callgraph 1130ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org * @callergraph 1131ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org */ 1132ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgstatic pico_status_t pam_deal_with(const picoos_uint8 *item) 1133750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org{ 1134c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org picodata_itemhead_t head; 1135750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org pico_status_t sResult; 1136ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org sResult = FALSE; 1137ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org head.type = item[0]; 1138ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org head.info1 = item[1]; 1139750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org head.info2 = item[2]; 1140c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org head.len = item[3]; 1141750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org switch (head.type) { 114201beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org case PICODATA_ITEM_SYLLPHON: 114301beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org case PICODATA_ITEM_BOUND: 114401beca7f8d9f549e04ec575a0bca96d859ab55a5ager@chromium.org sResult = TRUE; 1145ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org break; 1146ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org default: 1147ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org break; 11481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return sResult; 1150ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org} /*pam_deal_with*/ 11511510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11521510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org/** 11531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * returns true if more items has to be produced for current syllable 11541510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @param this : Pam object pointer 11551510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @return TRUE : item is to be produced 11561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @return FALSE : item is not to be produced 11571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @remarks item pointed to by *item should be already valid 11581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @callgraph 11591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @callergraph 11601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org */ 1161c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgstatic picoos_uint8 pamHasToProcess(register picodata_ProcessingUnit this) 1162ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org{ 1163c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org register pam_subobj_t * pam; 1164d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org picoos_uint8 nCond1, nCond2, nCond3; 11651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 11661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (NULL == this || NULL == this->subObj) { 1167ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICODATA_PU_ERROR; 11681510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 11691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org pam = (pam_subobj_t *) this->subObj; 1170381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org /*conditions originating a "NOT to be processed" result */ 1171381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org nCond1 = pam->nCurrSyllable <= -1; 117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen nCond2 = pam->nCurrSyllable >= pam->nTotalSyllables; 117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen nCond3 = pam->nSyllPhoneme 117443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen >= pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3]; 11753a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 11763a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if ((nCond1) || (nCond2) || (nCond3)) 1177750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return FALSE; 1178c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org 1179ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return TRUE; 1180c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org} /*pamHasToProcess*/ 1181d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 11821510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org/** 11831510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * modifies the process flags in order to point to next valid syllable phone or item to be produced 1184ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @param this : Pam object pointer 11851510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @return TRUE : item has to be produced 1186750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @return FALSE : item has not to be produced 1187750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @callgraph 1188750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @callergraph 1189750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org */ 1190750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic pico_status_t pamUpdateProcess(register picodata_ProcessingUnit this) 1191ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org{ 1192750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org register pam_subobj_t * pam; 11938e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org 11948e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org if (NULL == this || NULL == this->subObj) { 11953a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return PICODATA_PU_ERROR; 11963a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 11973a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org pam = (pam_subobj_t *) this->subObj; 11983a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 11993a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (pam->nCurrSyllable == -1) { 12003a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org /*this to be able to manage sudden PU cleanup after FLUSH CMD*/ 12014e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org return PICO_OK; 1202750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org } 1203c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org /*check number of phonemes for current syllable*/ 1204ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (pam->nSyllPhoneme < pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] - 1) { 1205c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org pam->nSyllPhoneme++; 1206d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return PICO_OK; 12071510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12081510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (pam->nSyllPhoneme == pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] - 1) { 1209c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org /*this helps in identifyng the end of syllable condition in PamHasToProcess*/ 12107979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org pam->nSyllPhoneme++; 1211ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /*previous syllable phonemes are complete: test if any items are tied to this syllable*/ 1213ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] > 0) { 12141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /*there are items tied to this syllable*/ 1215750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (pam->nCurrAttachedItem == 0) { 1216750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org /*if it is the first item to be regenerated initialize it*/ 1217750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org pam->nCurrAttachedItem 1218750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org = pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM]; 1219750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org return PICO_OK; 1220ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } else { 1221750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org /*not the first item : check if more*/ 1222750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org if (pam->nCurrAttachedItem 12233a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org < pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]) { 12243a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org /*more tied items to be regenerated*/ 12255aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org pam->nCurrAttachedItem++; 1226381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return PICO_OK; 122743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 122843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 122943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 12303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org /*previous syllable phonemes and items are complete: switch to next syllable*/ 12313a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org if (pam->nCurrSyllable < pam->nTotalSyllables - 1) { 12323a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org pam->nCurrSyllable++; 1233eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org pam->nSyllPhoneme = 0; 12343a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org pam->nCurrAttachedItem = 0; 12353a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return PICO_OK; 12364e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org } 12371e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org /*no more phonemes or items to be produced*/ 1238c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org pam->nCurrSyllable++; 1239ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam->nSyllPhoneme = 0; 1240c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org return PICO_ERR_OTHER; 1241d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org 12421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org} /*pamUpdateProcess*/ 12431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 1244ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org/** 12451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * returns true if more items has to be popped for current syllable 124683e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org * @param this : Pam object pointer 12473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org * @return TRUE : item has to be popped 12481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org * @return FALSE : item has not to be popped 1249750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @callgraph 1250750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @callergraph 1251750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org */ 1252750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic picoos_uint8 pamHasToPop(register picodata_ProcessingUnit this) 1253750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org{ 1254ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org register pam_subobj_t * pam; 1255750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org 12561e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org if (NULL == this || NULL == this->subObj) { 12573a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org return PICODATA_PU_ERROR; 12583a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org } 12595aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org pam = (pam_subobj_t *) this->subObj; 1260381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 1261245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org /*Preliminary condition : at least 1 syllable*/ 1262245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org if (pam->nCurrSyllable <= -1) 1263245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return FALSE; 1264ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1265ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*Preliminary condition : not maximum number of syllables*/ 1266ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (pam->nCurrSyllable >= pam->nTotalSyllables) 1267c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org return FALSE; 1268ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1269c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org /*Preliminary condition : start and end offset in current item > 0 */ 1270d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] <= 0) 12711510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org || (pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] <= 0)) 12721510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org return FALSE; 1273ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 12741510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /*Final condition : current popped item less or eq to maximum*/ 12751510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (pam->nCurrAttachedItem 12765aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org > pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]) 1277381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return FALSE; 127843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 127943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return TRUE; 128043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} /*pamHasToPop*/ 12814a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 1282c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org/** 1283c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org * returns the address of an item to be popped from the current syllable queue 1284c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org * @param this : Pam object pointer 12858e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org * @return pop_address : item address 1286d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @return NULL : item not poppable 12874a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org * @callgraph 12884a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org * @callergraph 12894a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org */ 12904a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.orgstatic picoos_uint8 *pamPopItem(register picodata_ProcessingUnit this) 129171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org{ 1292c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org register pam_subobj_t * pam; 1293ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 nItem; 1294c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org if (NULL == this || NULL == this->subObj) { 1295d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org return NULL; 12961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org } 12971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org pam = (pam_subobj_t *) this->subObj; 1298ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 12991510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /*Preliminary condition : at least 1 syllable*/ 13001510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (pam->nCurrSyllable <= -1) 130171daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org return NULL; 13021510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org 13035aa501ca9fb4dfb30f4191aac135202fe8d80e4aager@chromium.org /*Preliminary condition : not maximum number of syllables*/ 130471daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org if (pam->nCurrSyllable >= pam->nTotalSyllables) 130571daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org return NULL; 130671daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org 130771daaf639544be2a6638e3566f78e0b14f05cd7bager@chromium.org /*Preliminary condition : start and end offset in current item > 0 */ 130843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] <= 0) 1309c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org || (pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] <= 0)) 1310c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org return NULL; 1311c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org 1312d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*Final condition : current popped item less than maximum*/ 1313b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (pam->nCurrAttachedItem 1314b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org > pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]) 1315b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return NULL; 1316b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1317b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org nItem = pam->nCurrAttachedItem; 1318c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org /*please note : nItem-1 should match with actions performed in function "pam_queue(..)" */ 1319c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org return &(pam->sSyllItems[pam->sSyllItemOffs[nItem - 1]]); 1320c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org 1321d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org} /*pamPopItem*/ 1322ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1323c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org/** 1324ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * returns the address of an item popped from the syllable 0 queue 1325ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @param this : Pam object pointer 1326ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @return pop_address : item address 1327ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @return NULL : item not poppable 1328ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @remarks the item is popped only if it has been inserted in the queue before the first 1329b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * @remarks item assigned to the syllable 0 i.e. 1330b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * @remarks AttachedItem<=pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm]-1 1331ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @callgraph 1332c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org * @callergraph 1333c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org */ 1334c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.orgstatic picoos_uint8 *pamPopAttachedSy0(register picodata_ProcessingUnit this) 1335ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org{ 1336ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org register pam_subobj_t * pam; 1337ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 nItem; 1338ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (NULL == this || NULL == this->subObj) { 1339c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return NULL; 1340c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org } 1341ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pam = (pam_subobj_t *) this->subObj; 1342c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org 1343c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org /*should be syllable 0*/ 1344c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org if (pam->nCurrSyllable != 0) 1345ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return NULL; 1346ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1347ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*start and end offset in current item > 0 */ 1348ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[ITM] <= 0) 1349c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org || (pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] <= 0)) 1350c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return NULL; 1351e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 1352c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org /*if current popped item is > 0 test end condition*/ 1353ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org if (pam->nCurrAttachedItem > 0) { 1354ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*Other condition : current popped item less than maximum*/ 1355c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org if (pam->nCurrAttachedItem 1356c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org > pam->sSyllFeats[pam->nCurrSyllable].phoneV[itm] - 1) 1357c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return NULL; 1358ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 1359c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org nItem = pam->nCurrAttachedItem; 1360c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org return &(pam->sSyllItems[pam->sSyllItemOffs[nItem]]); 1361ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org 1362c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org} /*pamPopAttachedSy0*/ 1363b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1364e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org/** 1365d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * pdf access for duration 1366d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @param this : Pam object pointer 1367d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @param durIndex : index of duration in the pdf 1368d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @param phonDur : pointer to base of array where to store the duration values 1369d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @param numFramesState : pointer to base of array where to store the number of frames per state 1370d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @return PICO_OK : pdf retrieved 1371d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @return PICO_ERR_OTHER : pdf not retrieved 1372d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @remarks Modifies phonDur (the requested duration value) 1373d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @remarks Modifies numFramesState (the requested number of frames per state (vector)) 1374d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @callgraph 1375b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org * @callergraph 13768e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org */ 137710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.orgstatic pico_status_t pam_get_duration(register picodata_ProcessingUnit this, 13788e8294a88dc7d58f579aee0ba08c19fc8a616e2dsgjesse@chromium.org picoos_uint16 durIndex, picoos_uint16 *phonDur, 1379ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint8 *numFramesState) 13805f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org{ 1381b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org pam_subobj_t *pam; 1382b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org picokpdf_PdfDUR pdf; 1383b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org picoos_uint8 *durItem; 1384b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org picoos_uint16 nFrameSize, nI; 1385b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org picoos_single fValue; 1386b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org pam = (pam_subobj_t *) this->subObj; 1387b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (NULL == this || NULL == this->subObj) { 1388b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org return PICODATA_PU_ERROR; 1389c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org } 1390c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org pdf = pam->pdfdur; 1391c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org /*make the index 0 based*/ 1392b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org if (durIndex > 0) 1393b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org durIndex--; 1394b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 1395b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org /* check */ 1396b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (durIndex > pdf->numframes - 1) { 1397b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org PICODBG_ERROR(("PAM durPdf access error, index overflow -> index: %d , numframes: %d", durIndex, pdf->numframes)); 1398b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return PICO_ERR_OTHER; 1399c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org } 1400ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /* base pointer */ 14015f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org durItem = &(pdf->content[durIndex * pdf->vecsize]); 1402eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org if (durItem == NULL) { 1403eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org PICODBG_ERROR(("PAM durPdf access error , frame pointer = NULL")); 14045f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return PICO_ERR_OTHER; 1405eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org } 1406381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org nFrameSize = pdf->sampperframe / 16; 140743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen *phonDur = ((pdf->phonquant[((*durItem) & 0xF0) >> 4]) * nFrameSize); 140843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen numFramesState[0] = pdf->statequant[((*durItem) & 0x0F)]; 140943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen durItem++; 141043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen numFramesState[1] = pdf->statequant[((*durItem) & 0xF0) >> 4]; 1411ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org numFramesState[2] = pdf->statequant[((*durItem) & 0x0F)]; 1412ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org durItem++; 1413381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org numFramesState[3] = pdf->statequant[((*durItem) & 0xF0) >> 4]; 141443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen numFramesState[4] = pdf->statequant[((*durItem) & 0x0F)]; 141543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 141643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen /*modification of the duration information based on the duration modifier*/ 1417381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org *phonDur = (picoos_uint16) (((picoos_single) * phonDur) * pam->dMod); 141843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (nI = 0; nI < 5; nI++) { 1419381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org fValue = pam->dRest + (picoos_single) numFramesState[nI] * pam->dMod; 142043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen numFramesState[nI] = (picoos_uint8) (fValue); 1421381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org pam->dRest = fValue - (picoos_single) numFramesState[nI]; 1422381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 142343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return PICO_OK; 142443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}/*pam_get_duration*/ 142543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1426750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org/** 1427ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * pdf access for pitch 1428ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org * @param this : Pam object pointer 14298bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org * @param lf0Index : pointer to variable to receive index of pitch in the pdf 14308bb60585bafbf81564e6b30fcf18c82615a76f95ager@chromium.org * @param nI : number of the phone's state 1431c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org * @param phonF0 : pointer to variable to receive the pitch value 1432381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @return PICO_OK : pdf retrieved 1433381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @return PICO_ERR_OTHER : pdf not retrieved 1434381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @remarks Modifies phonDur (the requested duration value) 1435750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @remarks Modifies phonF0 (the requested pitch value (scalar)) 1436750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @callgraph 1437750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org * @callergraph 1438750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org */ 1439750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.orgstatic pico_status_t pam_get_f0(register picodata_ProcessingUnit this, 1440ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picoos_uint16 *lf0Index, picoos_uint8 nI, picoos_single *phonF0) 1441750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org{ 1442381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org pam_subobj_t *pam; 1443381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org picoos_uint8 *lfItem, numstreams; 144443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_uint16 lf0IndexOffset, sTemp; 144543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_single lfum, lfivar, lfz; 144643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 144743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam = (pam_subobj_t *) this->subObj; 1448ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (NULL == this || NULL == this->subObj) { 1449ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICODATA_PU_ERROR; 1450e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org } 1451e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org lf0IndexOffset = lf0Index[nI]; 1452e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 1453e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org /*make the index 0 based*/ 1454e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org if (lf0IndexOffset > 0) 1455e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org lf0IndexOffset--; 1456e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org 1457e959c18cf7193e2f021245584a3c8f1f32f82c92kasperl@chromium.org lf0IndexOffset += pam->pdflfz->stateoffset[nI]; 145843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (lf0IndexOffset > pam->pdflfz->numframes - 1) { 1459ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org PICODBG_ERROR(("PAM flfzPdf access error, index overflow -> index: %d , numframes: %d", lf0Index, pam->pdflfz->numframes)); 1460ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org return PICO_ERR_OTHER; 1461381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org } 1462381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org /* base pointer */ 146343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lf0IndexOffset *= pam->pdflfz->vecsize; 146443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 146543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lfItem = &(pam->pdflfz->content[lf0IndexOffset]); 146643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen sTemp = (picoos_uint16) (((lfItem[1] << 8)) | lfItem[0]); 1467ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1468ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org lfum = (picoos_single) (sTemp << (pam->pdflfz->meanpowUm[0])); 1469381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org numstreams = 3; 1470381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org lfivar = (picoos_single) (((picoos_uint16) lfItem[numstreams * 2]) 147143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen << pam->pdflfz->ivarpow[0]); 147243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lfz = (picoos_single) lfum / (picoos_single) lfivar; 147343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen lfz = (picoos_single) exp((double) lfz); 1474769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com phonF0[nI] = (picoos_single) lfz; 1475ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1476ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*pitch modoification*/ 1477381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org phonF0[nI] *= pam->pMod; 1478381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org return PICO_OK; 1479769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com}/*pam_get_f0*/ 1480769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com 1481769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com/** 1482769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com * elementary rounding function 1483ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org * @param fIn : (real) input value 1484769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com * @return the rounded value 1485769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com * @callgraph 1486769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com * @callergraph 1487769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com */ 1488769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.comstatic picoos_single f_round(picoos_single fIn) 1489ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org{ 1490381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org picoos_int32 iVal; 1491381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org picoos_single fVal; 1492381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 1493381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org iVal = (picoos_int32) fIn; 1494769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com fVal = (picoos_single) iVal; 1495381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org 1496769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com if (fIn > (picoos_single) 0.0f) { 1497769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com if ((fIn - fVal) < (picoos_single) 0.5f) 1498769cc962a043dd8d92cc010dd2c50bc26f652c94mads.s.ager@gmail.com return fVal; 149943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen else 1500ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return fVal + (picoos_single) 1.0f; 1501ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } else { 15025f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org if ((fVal - fIn) < (picoos_single) 0.5f) 15035f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org return fVal; 150432280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org else 150577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org return fVal - (picoos_single) 1.0f; 150677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org } 150777ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org}/*f_round*/ 150877ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org 150977ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org/** 151077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org * updates the input vector for PAM 151177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org * @param this : Pam object pointer 1512eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org * @return PICO_OK : update successful 1513381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 1514381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @remarks Modifies pam->sPhFeats[] 1515381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org * @callgraph 15167be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org * @callergraph 1517eadaf2282ee421d7a63a21d71369b029105341ccager@chromium.org */ 15185f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgstatic pico_status_t pam_update_vector(register picodata_ProcessingUnit this) 1519381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org{ 1520381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org pam_subobj_t *pam; 1521381abbb58260f2fc7d346d0e2f83d0f132a4c14bager@chromium.org picoos_uint8 numstates, nI; 152243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_single fDur, f0avg, f0quant, minf0, maxf0, durquant1, durquant2, 1523245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org mindur, maxdur1, maxdur2; 1524245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org 15254f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org pam = (pam_subobj_t *) this->subObj; 15264f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org if (NULL == this || NULL == this->subObj) { 1527245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org return PICO_ERR_OTHER; 1528245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org } 1529245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org /*default init*/ 15304f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org pam->sPhFeats[DUR] = 0; 1531ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org pam->sPhFeats[F0] = 0; 15324f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org /* 15335c838251403b0be9a882540f1922577abba4c872ager@chromium.org Hard coded parameters for quantization 15345c838251403b0be9a882540f1922577abba4c872ager@chromium.org */ 15355c838251403b0be9a882540f1922577abba4c872ager@chromium.org numstates = PICOPAM_NRSTPF; 15365c838251403b0be9a882540f1922577abba4c872ager@chromium.org f0quant = 30.0f; 15375323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org minf0 = 90.0f; 15385c838251403b0be9a882540f1922577abba4c872ager@chromium.org maxf0 = 360.0f; 1539ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 15405c838251403b0be9a882540f1922577abba4c872ager@chromium.org durquant1 = 20.0f; 1541ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org durquant2 = 100.0f; 1542b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org mindur = 40.0f; 1543755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org maxdur1 = 160.0f; 1544245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org maxdur2 = 600.0f; 1545245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org f0avg = 0.0f; 1546245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org for (nI = 0; nI < numstates; nI++) 15474f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org f0avg += pam->phonF0[nI]; 1548ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org f0avg /= (picoos_single) numstates; 15494f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org 15505c838251403b0be9a882540f1922577abba4c872ager@chromium.org f0avg = f_round(f0avg / f0quant) * f0quant; 1551ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org if (f0avg < minf0) 15525c838251403b0be9a882540f1922577abba4c872ager@chromium.org f0avg = minf0; 15535c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (f0avg > maxf0) 1554ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org f0avg = maxf0; 15555c838251403b0be9a882540f1922577abba4c872ager@chromium.org 15565c838251403b0be9a882540f1922577abba4c872ager@chromium.org /*make initial silence of sentence shorter (see also pam_put_item)*/ 15575c838251403b0be9a882540f1922577abba4c872ager@chromium.org if ((pam->nCurrSyllable == 0) && (pam->nSyllPhoneme == 0)) { 15585323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org pam->phonDur = 2 * 4; 15595c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 15605c838251403b0be9a882540f1922577abba4c872ager@chromium.org 1561b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org fDur = (picoos_single) pam->phonDur; 1562755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org fDur = f_round(fDur / durquant1) * durquant1; 1563245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org if (fDur < mindur) 15649085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org fDur = mindur; 15659085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org if (fDur > maxdur1) { 1566755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org fDur = f_round(fDur / durquant2) * durquant2; 1567755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org if (fDur > maxdur2) 1568ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org fDur = maxdur2; 15694f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org } 1570755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org pam->sPhFeats[DUR] = (picoos_uint8) (fDur / (picoos_single) 10.0f); 1571755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org pam->sPhFeats[F0] = (picoos_uint8) (f0avg / (picoos_single) 10.0f); 1572755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org 1573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return PICO_OK; 1574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}/*pam_update_vector*/ 1575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org/** 1577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * compress a single feature in the range 0..9 1578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @param inVal : the value to be compressed 1579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @return compVal : the compressed value 1580a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @callgraph 1581a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @callergraph 1582a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org */ 1583a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgstatic picoos_uint8 pamCompressComponent(picoos_uint8 inVal) 15847b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org{ 15857b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org if (inVal <= 5) 15867b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org return inVal; 15877b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org if ((5 < inVal) && (inVal <= 10)) 1588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return 6; 15897b26015ac58e54e88f4214e248f772ad4f055477whesse@chromium.org if ((10 < inVal) && (inVal <= 20)) 1590a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return 7; 1591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if ((20 < inVal) && (inVal <= 30)) 1592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return 8; 1593a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return 9; 1594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}/*pamCompressComponent*/ 1595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 1596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org/** 1597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * prepares the input vector for tree feeding 1598a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @param this : Pam object pointer 1599a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @return PICO_OK : vector expanded 1600a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @return PICO_ERR_OTHER : errors on expansion or retrieving the PU pointer 1601a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @remarks Modifies pam->sPhFeats[] 1602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @callgraph 1603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org * @callergraph 1604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org */ 16057c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgstatic pico_status_t pam_expand_vector(register picodata_ProcessingUnit this) 16067c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org{ 1607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org pam_subobj_t *pam; 16087c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org picoos_uint8 *inVect, *phonVect, *outVect, nI; 160979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org picoos_int16 nOffs, nOffs1, nLen; 161071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org pam = (pam_subobj_t *) this->subObj; 1611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (NULL == this || NULL == this->subObj) { 1612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org return PICODATA_PU_ERROR; 1613a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org } 1614b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org inVect = &(pam->sSyllFeats[pam->nCurrSyllable].phoneV[0]); 1615152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org phonVect = &(pam->sPhIds[0]); 1616152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org outVect = &(pam->sPhFeats[0]); 1617152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org /*just copy back*/ 1618152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org for (nI = 0; nI < PICOPAM_INVEC_SIZE; nI++) 1619152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org outVect[nI] = inVect[nI]; 1620a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org /*now fill missing fields*/ 1621152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org picoos_mem_copy((void*) &(inVect[FID]), &nOffs, sizeof(nOffs)); 1622a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org /*offset to first phone of current syllable*/ 1623a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org nOffs = nOffs + pam->nSyllPhoneme; /*offset to current phone of current syllable*/ 1624a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org nLen = inVect[B3]; /*len of current syllable*/ 1625a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (pam->nSyllPhoneme >= nLen) { 1626152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org /*error on addressing current phone*/ 162771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org return PICO_ERR_OTHER; 1628152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org } 1629a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org /*previous of the previous phone*/ 1630a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org nOffs1 = nOffs - 2; 1631a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org if (nOffs1 >= 0) 1632a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org outVect[P1] = phonVect[nOffs1]; 1633a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org else 1634876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org outVect[P1] = PICOPAM_PH_DONT_CARE_VAL; 1635a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org /*previous phone*/ 1636152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org nOffs1 = nOffs - 1; 1637152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org if (nOffs1 >= 0) 163871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org outVect[P2] = phonVect[nOffs1]; 163971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org else 1640c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org outVect[P2] = PICOPAM_PH_DONT_CARE_VAL; 164179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org /*^current phone*/ 164279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[P3] = phonVect[nOffs]; 164379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org 164479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org /*next phone*/ 164579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org nOffs1 = nOffs + 1; 164679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org if (nOffs1 < pam->nTotalPhonemes) 164779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[P4] = phonVect[nOffs1]; 164879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org else 164979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[P4] = PICOPAM_PH_DONT_CARE_VAL; 165079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org /*next of the next phone*/ 165179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org nOffs1 = nOffs + 2; 165279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org if (nOffs1 < pam->nTotalPhonemes) 165379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[P5] = phonVect[nOffs1]; 165479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org else 165579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[P5] = PICOPAM_PH_DONT_CARE_VAL; 165679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org /*pos of curr phone with respect to left syllable boundary*/ 165779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[P6] = pam->nSyllPhoneme + 1; 165879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org /*pos of curr phone with respect to right syllable boundary*/ 16591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org outVect[P7] = nLen - pam->nSyllPhoneme; 16601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org /*is current phone in consonant syllable boundary? (1:yes)*/ 16611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org if (pam->nSyllPhoneme < inVect[P8]) 16621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org outVect[P8] = 1; 166379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org else 166479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[P8] = 0; 166579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org return PICO_OK; 166679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org}/*pam_expand_vector*/ 166779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org 166879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org/** 166979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org * compresses the input vector for PAM 167079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org * @param this : Pam object pointer 167179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org * @return PICO_OK : compression successful 167279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 167379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org * @remarks Modifies pam->sPhFeats[] 167479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org * @callgraph 167579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org * @callergraph 167679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org */ 167779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.orgstatic pico_status_t pamCompressVector(register picodata_ProcessingUnit this) 167879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org{ 167979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org pam_subobj_t *pam; 168079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org picoos_uint8 *outVect, nI; 168179e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org pam = (pam_subobj_t *) this->subObj; 168279e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org if (NULL == this || NULL == this->subObj) { 168379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org return PICODATA_PU_ERROR; 168479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org } 168579e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect = &(pam->sPhFeats[0]); 168679e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org for (nI = 0; nI < PICOPAM_INVEC_SIZE; nI++) { 168779e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org switch (nI) { 168879e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org case P1: 168979e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org case P2: 169079e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org case P3: 16911510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org case P4: 16921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org case P5: 1693c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case B1: 169479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org case B2: 1695c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case B16: 1696c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case E1: 1697c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case H5: 16985c838251403b0be9a882540f1922577abba4c872ager@chromium.org /*don't do any compression*/ 1699c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org break; 17007c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org default: 1701994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org /*do compression*/ 17027c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org if (outVect[nI] != PICOPAM_DONT_CARE_VALUE) 170379e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org outVect[nI] = pamCompressComponent(outVect[nI]); 17045c838251403b0be9a882540f1922577abba4c872ager@chromium.org else 17055c838251403b0be9a882540f1922577abba4c872ager@chromium.org outVect[nI] = PICOPAM_DONT_CARE_VAL; 17065c838251403b0be9a882540f1922577abba4c872ager@chromium.org break; 17075c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 17085c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 17095c838251403b0be9a882540f1922577abba4c872ager@chromium.org return PICO_OK; 171034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org}/*pamCompressVector*/ 171134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org 171234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org/** 171334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org * reorganizes the input vector for PAM 171434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org * @param this : Pam object pointer 1715e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org * @return PICO_OK : reorganization successful 17161e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 17171e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org * @remarks Modifies pam->sPhFeats[] 171834e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org * @callgraph 1719f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org * @callergraph 1720f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org */ 1721f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.orgstatic pico_status_t pamReorgVector(register picodata_ProcessingUnit this) 172234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org{ 172334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org pam_subobj_t *pam; 17244e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org picoos_uint8 *outVect, inVect[60], nI; 17251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org pam = (pam_subobj_t *) this->subObj; 172634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org if (NULL == this || NULL == this->subObj) { 172734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org return PICODATA_PU_ERROR; 1728f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org } 172934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect = &(pam->sPhFeats[0]); 173034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org for (nI = 0; nI < PICOPAM_INVEC_SIZE; nI++) inVect[nI] = outVect[nI]; 17314e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org /*reorganize*/ 173234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org for (nI = T_B1; nI <= T_H5; nI++) { 173334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org switch (nI) { 1734f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org case T_B1: 173534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect[T_B1] = inVect[B1]; 173634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org break; 1737e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org case T_B2: 17381e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org outVect[T_B2] = inVect[B2]; 173934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org break; 174034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org case T_B3: 174134e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect[T_B3] = inVect[B3]; 174234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org break; 174334e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org case T_B4: 174434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect[T_B4] = inVect[B4]; 174534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org break; 174634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org case T_B5: 174734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect[T_B5] = inVect[B5]; 1748f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org break; 174934e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org case T_B6: 175034e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect[T_B6] = inVect[B6]; 1751f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org break; 175234e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org case T_B7: 17534e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org outVect[T_B7] = inVect[B7]; 175434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org break; 175534e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org case T_B8: 175634e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect[T_B8] = inVect[B8]; 175734e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org break; 1758152a0b013d7d17f4fe9d04cdce58ec3d6fab2aa5sgjesse@chromium.org case T_B9: 1759c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org outVect[T_B9] = inVect[B9]; 17607c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org break; 1761994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case T_B10: 1762c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org outVect[T_B10] = inVect[B10]; 17637c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org break; 1764720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org case T_B11: 1765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org outVect[T_B11] = inVect[B11]; 17667c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org break; 176771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org case T_B12: 176871affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org outVect[T_B12] = inVect[B12]; 176971affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org break; 177071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org case T_B13: 1771c1789eecd43bf9c5497636592bf14fa754d04c89machenbach@chromium.org outVect[T_B13] = inVect[B13]; 17727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org break; 1773ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case T_B14: 177434e60787ea1e76f3ee49e859f71f036170c21f0elrn@chromium.org outVect[T_B14] = inVect[B14]; 177571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org break; 177671affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org case T_B15: 177771affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org outVect[T_B15] = inVect[B15]; 1778ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org break; 1779ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org case T_B16: 1780c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org outVect[T_B16] = inVect[B16]; 17817c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org break; 1782994edf6a113fb3651536b60073df05a72a95f77erossberg@chromium.org case T_B17: 17837c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org outVect[T_B17] = inVect[B17]; 178479e7902fa5f94747b5383dd40f3002dd8b62303arossberg@chromium.org break; 1785b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case T_B18: 17867c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org outVect[T_B18] = inVect[B18]; 17877c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org break; 1788750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org case T_B19: 1789ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org outVect[T_B19] = inVect[B19]; 1790750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org break; 1791ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org case T_B20: 1792f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org outVect[T_B20] = inVect[B20]; 1793ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org break; 1794ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org case T_B21: 1795ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org outVect[T_B21] = inVect[B21]; 1796f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org break; 1797ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 1798ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org case T_E1: 1799ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org outVect[T_E1] = inVect[E1]; 1800ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org break; 180143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case T_E2: 180210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E2] = inVect[E2]; 180310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 180410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E3: 180510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E3] = inVect[E3]; 180610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 180710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E4: 180810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E4] = inVect[E4]; 180910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 181010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E5: 181110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E5] = inVect[E5]; 181210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 181310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E6: 181410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E6] = inVect[E6]; 181510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 181610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E7: 181710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E7] = inVect[E7]; 181810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 181910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E8: 182010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E8] = inVect[E8]; 182110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 182210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E9: 182310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E9] = inVect[E9]; 182410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 182510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E10: 182610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E10] = inVect[E10]; 182710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 182810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E11: 182910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E11] = inVect[E11]; 183010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 183110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E12: 183210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E12] = inVect[E12]; 183310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 183410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_E13: 183510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_E13] = inVect[E13]; 183610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 183710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 183810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_A3: 183910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_A3] = inVect[A3]; 184010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 184110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_C3: 184210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_C3] = inVect[C3]; 184310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 184410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_D2: 184510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_D2] = inVect[D2]; 184610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 184710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_F2: 184810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_F2] = inVect[F2]; 184910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 185010480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 185110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_G1: 185210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_G1] = inVect[G1]; 185310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 185410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_I1: 185510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_I1] = inVect[I1]; 185610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 185710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org 185810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_G2: 1859ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org outVect[T_G2] = inVect[G2]; 1860ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org break; 1861ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case T_I2: 1862ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org outVect[T_I2] = inVect[I2]; 186343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 18644a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 18654a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org case T_H1: 18664a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org outVect[T_H1] = inVect[H1]; 18674a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org break; 18684a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org case T_H2: 1869d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org outVect[T_H2] = inVect[H2]; 187071affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org break; 187171affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org case T_H3: 187271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org outVect[T_H3] = inVect[H3]; 187371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org break; 187410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org case T_H4: 187510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_H4] = inVect[H4]; 187610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 187743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case T_H5: 187810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org outVect[T_H5] = inVect[H5]; 187910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 1880d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } 188110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org } 18824a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org return PICO_OK; 18836d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}/*pamReorgVector*/ 18846d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org 1885ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org/** 1886ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org * puts a PAM item into PU output buffer 1887ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org * @param this : Pam object pointer 18883e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org * @param outBuff : output buffer base pointer 188943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen * @param outWritePos : offset in output buffer 18907979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org * @param *bytesWr : actual bytes written 1891d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org * @return PICO_OK : put successful 1892245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.org * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 18933e87580939cb78c5802369f723680d4a16cc2902ager@chromium.org * @callgraph 1894ce5e87bd905d592a8bd612b3dedf7a994177c13aager@chromium.org * @callergraph 18953811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org */ 18963811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgstatic pico_status_t pam_put_item(register picodata_ProcessingUnit this, 189743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_uint8 *outBuff, picoos_uint16 outWritePos, picoos_uint8 *bytesWr) 189843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen{ 189932280cf2786219b2d9a668f7f00778fb59ac40b3mstarzinger@chromium.org pam_subobj_t *pam; 19008e8d8825f97138de12985f8e0d3163074dff5258ulan@chromium.org picoos_uint8 *sDest, nI, nType, nIdx, fde; 190143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_uint32 pos, pos32; 190243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_int16 ft, dt; 190343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen picoos_uint16 uMinDur, uMaxDur; 190443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen pam = (pam_subobj_t *) this->subObj; 1905355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org if (NULL == this || NULL == this->subObj) { 1906355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org return PICODATA_PU_ERROR; 1907ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org } 1908d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org sDest = &(outBuff[outWritePos]); 1909ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org sDest[0] = PICODATA_ITEM_PHONE; /*Item type*/ 1910ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org sDest[1] = pam->sPhFeats[P3]; /*phonetic id*/ 1911ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org sDest[2] = PICOPAM_NRSTPF; /*number of states per phone*/ 1912355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org sDest[3] = sizeof(picoos_uint16) * PICOPAM_NRSTPF * 3; /*size of the item*/ 1913ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org pos = 4; 1914ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org /*make initial silence of sentence shorter (see also UpdateVector)*/ 1915d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org if ((pam->nCurrSyllable == 0) && (pam->nSyllPhoneme == 0)) { 1916d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org for (nI = 0; nI < PICOPAM_NRSTPF - 1; nI++) 1917d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org pam->numFramesState[nI] = 0; 1918d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org pam->numFramesState[nI] = 2; 1919d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org } else { 1920d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org /*manage silence syllables with prescribed durations*/ 1921355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org pos32 = Min; 1922355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org picoos_read_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 1923355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org &pos32, &uMinDur); 1924355cfd19c23ac613f2738a40e356ea48297f7d5eyangguo@chromium.org pos32 = Max; 1925ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org picoos_read_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 1926ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org &pos32, &uMaxDur); 1927ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1928ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (uMaxDur > 0) { 1929ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org /* Select weights*/ 1930030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org nType = pam->sSyllFeats[pam->nCurrSyllable].phoneV[bnd]; 1931030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org switch (nType) { 1932ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org case PICODATA_ITEMINFO1_BOUND_SBEG: 1933755c5b1cc880bc54405d2652f934a941e8fcda4asgjesse@chromium.org nIdx = PICOPAM_PWIDX_SBEG; 193443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 193543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case PICODATA_ITEMINFO1_BOUND_PHR1: 193643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen nIdx = PICOPAM_PWIDX_PHR1; 193743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 193843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case PICODATA_ITEMINFO1_BOUND_PHR2: 193943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen nIdx = PICOPAM_PWIDX_PHR2; 194043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 194143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case PICODATA_ITEMINFO1_BOUND_SEND: 194271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org case PICODATA_ITEMINFO1_BOUND_TERM: 194343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen nIdx = PICOPAM_PWIDX_SEND; 194410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 1945d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org default: 194610480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org nIdx = PICOPAM_PWIDX_DEFA; 194710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org break; 194810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org } 194910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org fde = 2; 1950ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org ft = 0; 1951d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org dt = 0; 1952ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org picodata_transformDurations( 1953ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org fde, /* 2's exponent of frame duration in ms, e.g. 2 for 4ms, 3 for 8ms */ 1954ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org PICOPAM_NRSTPF, /* number of states per phone */ 1955ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org &(pam->numFramesState[0]), /* estimated durations */ 1956030d38ee536bc25856546e75fdac60d1a0c42bddwhesse@chromium.org pam->sil_weights[nIdx], /* integer weights */ 195743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uMinDur, /* minimum target duration in ms */ 195843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen uMaxDur, /* maximum target duration in ms */ 195943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ft, /* factor to be multiplied to get the target */ 1960 &dt /* in/out, rest in ms */ 1961 ); 1962 } 1963 } 1964 /*put data*/ 1965 for (nI = 0; nI < PICOPAM_NRSTPF; nI++) { 1966 picoos_write_mem_pi_uint16(sDest, &pos, 1967 (picoos_uint16) pam->numFramesState[nI]); 1968 picoos_write_mem_pi_uint16(sDest, &pos, 1969 (picoos_uint16) pam->lf0Index[nI]); 1970 picoos_write_mem_pi_uint16(sDest, &pos, 1971 (picoos_uint16) pam->mgcIndex[nI]); 1972 } 1973 *bytesWr = sizeof(picodata_itemhead_t) + sizeof(picoos_uint16) 1974 * PICOPAM_NRSTPF * 3; 1975 return PICO_OK; 1976}/*pam_put_item*/ 1977 1978/** 1979 * puts a non PAM (queued) item into PU output buffer 1980 * @param qItem : pointer to item to put 1981 * @param outBuff : output buffer base pointer 1982 * @param outWritePos : offset in output buffer 1983 * @param *bytesWr : actual bytes written 1984 * @return PICO_OK : put successful 1985 * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 1986 * @callgraph 1987 * @callergraph 1988 */ 1989static pico_status_t pam_put_qItem(picoos_uint8 *qItem, picoos_uint8 *outBuff, 1990 picoos_uint16 outWritePos, picoos_uint8 *bytesWr) 1991{ 1992 picoos_uint8 *sDest, nI; 1993 sDest = &(outBuff[outWritePos]); 1994 *bytesWr = sizeof(picodata_itemhead_t); 1995 for (nI = 0; nI < (sizeof(picodata_itemhead_t) + qItem[3]); nI++) { 1996 sDest[nI] = qItem[nI]; 1997 } 1998 *bytesWr = nI; 1999 return PICO_OK; 2000}/*pam_put_qItem*/ 2001 2002/** 2003 * tells if an item is a PAM command (except play) 2004 * @param qItem : input item to test 2005 * @return TRUE : qItem is a PAM command (except play) 2006 * @return FALSE : qItem not a PAM command 2007 * @callgraph 2008 * @callergraph 2009 */ 2010static pico_status_t is_pam_command(const picoos_uint8 * qItem) 2011{ 2012 switch (qItem[0]) { 2013 2014 case PICODATA_ITEM_CMD: 2015 switch (qItem[1]) { 2016 case PICODATA_ITEMINFO1_CMD_FLUSH: 2017 /* flush is for all PU's and as such it is also for PAM*/ 2018 case PICODATA_ITEMINFO1_CMD_PITCH: 2019 case PICODATA_ITEMINFO1_CMD_SPEED: 2020 return TRUE; 2021 break; 2022 default: 2023 break; 2024 } 2025 } 2026 return FALSE; 2027}/*is_pam_command*/ 2028 2029/** 2030 * tells if an item is a PAM PLAY command 2031 * @param qItem : input item to test 2032 * @return TRUE : qItem is a PAM PLAY command 2033 * @return FALSE : qItem not a PAM PLAY command 2034 * @callgraph 2035 * @callergraph 2036 */ 2037static pico_status_t is_pam_play_command(picoos_uint8 *qItem) 2038{ 2039 switch (qItem[0]) { 2040 2041 case PICODATA_ITEM_CMD: 2042 switch (qItem[1]) { 2043 case PICODATA_ITEMINFO1_CMD_PLAY: 2044 if (qItem[2] == PICODATA_ITEMINFO2_CMD_TO_PAM) 2045 return TRUE; 2046 break; 2047 default: 2048 break; 2049 } 2050 } 2051 return FALSE; 2052}/*is_pam_play_command*/ 2053 2054/** 2055 * command processor for PAM pu 2056 * @param this : Pam item subobject 2057 * @param qItem : input item pointer 2058 * @return PICOPAM_FLUSH_RECEIVED : when a FLUSH is received 2059 * @return PICOPAM_CONTINUE : normal command processing 2060 * @return PICODATA_PU_ERROR : errors in accessing data 2061 * @callgraph 2062 * @callergraph 2063 */ 2064static pico_status_t pamDoCommand(register picodata_ProcessingUnit this, 2065 picoos_uint8 *qItem) 2066{ 2067 pam_subobj_t *pam; 2068 picoos_single fValue; 2069 picoos_uint16 nValue; 2070 picoos_uint32 nPos; 2071 pam = (pam_subobj_t *) this->subObj; 2072 if (NULL == this || NULL == this->subObj) { 2073 return PICODATA_PU_ERROR; 2074 } 2075 if (qItem[0] == PICODATA_ITEM_CMD) { 2076 switch (qItem[1]) { 2077 case PICODATA_ITEMINFO1_CMD_FLUSH: 2078 /* flush is for all PU's and as such it is also for PAM : implement the flush!!*/ 2079 pam_reset_processors(this); 2080 pam->nLastAttachedItemId = pam->nCurrAttachedItem = 0; 2081 pam->nAttachedItemsSize = 0; 2082 return PICOPAM_FLUSH_RECEIVED; 2083 break; 2084 2085 case PICODATA_ITEMINFO1_CMD_PITCH: 2086 case PICODATA_ITEMINFO1_CMD_SPEED: 2087 nPos = 4; 2088 picoos_read_mem_pi_uint16(qItem, &nPos, &nValue); 2089 if (qItem[2] == 'a') { 2090 /*absloute modifier*/ 2091 fValue = (picoos_single) nValue / (picoos_single) 100.0f; 2092 if (qItem[1] == PICODATA_ITEMINFO1_CMD_PITCH) 2093 pam->pMod = fValue; 2094 if (qItem[1] == PICODATA_ITEMINFO1_CMD_SPEED) 2095 pam->dMod = (1.0f / fValue); 2096 } 2097 if (qItem[2] == 'r') { 2098 /*relative modifier*/ 2099 fValue = (picoos_single) nValue / (picoos_single) 1000.0f; 2100 if (qItem[1] == PICODATA_ITEMINFO1_CMD_PITCH) 2101 pam->pMod *= (1.0f / fValue); 2102 if (qItem[1] == PICODATA_ITEMINFO1_CMD_SPEED) 2103 pam->dMod *= (1.0f / fValue); 2104 } 2105 return PICOPAM_CONTINUE; 2106 break; 2107 2108 default: 2109 break; 2110 }/*end switch switch (qItem[1])*/ 2111 }/*end if (qItem[0]==PICODATA_ITEM_CMD)*/ 2112 return PICOPAM_CONTINUE; 2113}/*pamDoCommand*/ 2114 2115/** 2116 * defines if an item has to be sent to following PUs 2117 * @param qItem : input item pointer 2118 * @return TRUE : item has to be transmitted to following PUs 2119 * @return FALSE : item has to be consumed internallz on PAM 2120 * @callgraph 2121 * @callergraph 2122 */ 2123static pico_status_t isItemToPut(picoos_uint8 *qItem) 2124{ 2125 switch (qItem[0]) { 2126 case PICODATA_ITEM_CMD: 2127 /* is a command*/ 2128 if (PICODATA_ITEMINFO1_CMD_SPEED == qItem[1]) { 2129 /* SPEED consumed here*/ 2130 return FALSE; 2131 } 2132 break; 2133 case PICODATA_ITEM_BOUND: 2134 switch (qItem[1]) { 2135 case PICODATA_ITEMINFO1_BOUND_SBEG: 2136 case PICODATA_ITEMINFO1_BOUND_PHR0: 2137 case PICODATA_ITEMINFO1_BOUND_PHR1: 2138 case PICODATA_ITEMINFO1_BOUND_PHR2: 2139 case PICODATA_ITEMINFO1_BOUND_PHR3: 2140 /*boudary items consumed here except SEND,TERM*/ 2141 return FALSE; 2142 break; 2143 default: 2144 break; 2145 } 2146 break; 2147 default: 2148 break; 2149 } 2150 /*all other items not explicitly mentioned here 2151 are transmitted to next PUs*/ 2152 return TRUE; 2153}/*isItemToPut*/ 2154 2155/** 2156 * pushes a boundary TERM item into some buffer 2157 * @param outBuff : output buffer base pointer 2158 * @param outWritePos : offset in output buffer 2159 * @param *bytesWr : actual bytes written 2160 * @return PICO_OK 2161 * @remarks used while forcing TERM input items in forward processing 2162 * @callgraph 2163 * @callergraph 2164 */ 2165static pico_status_t pam_put_term(picoos_uint8 *outBuff, 2166 picoos_uint16 outWritePos, picoos_uint8 *bytesWr) 2167{ 2168 picoos_uint8 *sDest; 2169 sDest = &(outBuff[outWritePos]); 2170 sDest[0] = PICODATA_ITEM_BOUND; /*Item type*/ 2171 sDest[1] = PICODATA_ITEMINFO1_BOUND_TERM; 2172 sDest[2] = PICODATA_ITEMINFO2_BOUNDTYPE_T; 2173 sDest[3] = 0; /*item size*/ 2174 *bytesWr = 4; 2175 return PICO_OK; 2176}/*pam_put_term*/ 2177 2178/** 2179 * translates one full phone into a PHONE Item including DT Dur, F0 and CEP trees feature generation and traversal 2180 * @param this : Pam item subobject pointer 2181 * @return PICO_OK : processing successful 2182 * @return PICODATA_PU_ERROR : error accessing PAM object 2183 * @return !=PICO_OK : processing errors 2184 * @callgraph 2185 * @callergraph 2186 */ 2187static pico_status_t pamPhoneProcess(register picodata_ProcessingUnit this) 2188{ 2189 pam_subobj_t *pam; 2190 pico_status_t sResult; 2191 picokdt_classify_result_t dTreeResult; 2192 picoos_uint8 nI, bWr; 2193 2194 pam = (pam_subobj_t *) this->subObj; 2195 if (NULL == this || NULL == this->subObj) { 2196 return PICODATA_PU_ERROR; 2197 } 2198 /*expands current phone in current syllable in the corresponding vector pam->sPhFeats[]*/ 2199 sResult = pam_expand_vector(this); 2200 sResult = pamCompressVector(this); 2201 sResult = pamReorgVector(this); 2202 2203 /*tree traversal for duration*/ 2204 if (!pam_do_tree(this, pam->dtdur, &(pam->sPhFeats[0]), PICOPAM_INVEC_SIZE, 2205 &dTreeResult)) { 2206 PICODBG_WARN(("problem using pam tree dtdur, using fallback value")); 2207 dTreeResult.class = 0; 2208 } 2209 pam->durIndex = dTreeResult.class; 2210 sResult = pam_get_duration(this, pam->durIndex, &(pam->phonDur), 2211 &(pam->numFramesState[0])); 2212 2213 /*tree traversal for pitch*/ 2214 for (nI = 0; nI < PICOPAM_MAX_STATES_PER_PHONE; nI++) { 2215 if (!pam_do_tree(this, pam->dtlfz[nI], &(pam->sPhFeats[0]), 2216 PICOPAM_INVEC_SIZE, &dTreeResult)) { 2217 PICODBG_WARN(("problem using pam tree lf0Tree, using fallback value")); 2218 dTreeResult.class = 0; 2219 } 2220 pam->lf0Index[nI] = dTreeResult.class; 2221 } 2222 2223 /*pdf access for pitch*/ 2224 for (nI = 0; nI < PICOPAM_MAX_STATES_PER_PHONE; nI++) { 2225 sResult = pam_get_f0(this, &(pam->lf0Index[0]), nI, &(pam->phonF0[0])); 2226 } 2227 2228 /*update vector with duration and pitch for cep tree traversal*/ 2229 sResult = pam_update_vector(this); 2230 /*cep tree traversal*/ 2231 for (nI = 0; nI < PICOPAM_MAX_STATES_PER_PHONE; nI++) { 2232 2233 if (!pam_do_tree(this, pam->dtmgc[nI], &(pam->sPhFeats[0]), 2234 PICOPAM_INVEC_SIZE, &dTreeResult)) { 2235 PICODBG_WARN(("problem using pam tree lf0Tree, using fallback value")); 2236 dTreeResult.class = 0; 2237 } 2238 pam->mgcIndex[nI] = dTreeResult.class; 2239 } 2240 /*put item to output buffer*/ 2241 sResult = pam_put_item(this, pam->outBuf, pam->outWritePos, &bWr); 2242 if (sResult == PICO_OK) 2243 pam->outWritePos += bWr; 2244 else 2245 return sResult; 2246 return PICO_OK; 2247}/*pamPhoneProcess*/ 2248 2249/** 2250 * manages first syllable attached items when seen before SBEG 2251 * @param this : Pam item subobject pointer 2252 * @return PICO_OK (0) : default return code --> means no more items to be processed before 1st syllable 2253 * @return PICOPAM_GOTO_FEED : go to feed state after this 2254 * @return PICOPAM_GOTO_SCHEDULE : flush received 2255 * @return PICODATA_PU_ERROR : errors 2256 * @callgraph 2257 * @callergraph 2258 */ 2259static pico_status_t pamDoPreSyll(register picodata_ProcessingUnit this) 2260{ 2261 pam_subobj_t *pam; 2262 pico_status_t sResult; 2263 picoos_uint8 bWr, nRc; 2264 picoos_uint8 *qItem; 2265 nRc = PICOPAM_PRE_SYLL_ENDED; 2266 pam = (pam_subobj_t *) this->subObj; 2267 if (NULL == this || NULL == this->subObj) { 2268 return PICODATA_PU_ERROR; 2269 } 2270 /*regenerate initial items before the phonemes*/ 2271 if (((qItem = pamPopAttachedSy0(this)) != NULL) && !((qItem[0] 2272 == PICODATA_ITEM_BOUND) && (qItem[1] 2273 == PICODATA_ITEMINFO1_BOUND_SBEG))) { 2274 if (isItemToPut(qItem)) { 2275 pam_put_qItem(qItem, pam->outBuf, pam->outWritePos, &bWr);/*popped item has to be sent to next PU*/ 2276 pam->outWritePos += bWr; 2277 nRc = PICOPAM_GOTO_FEED; 2278 } 2279 2280 if (is_pam_command(qItem) == TRUE) { 2281 nRc = pamDoCommand(this, qItem); /*popped item is a PAM command : do it NOW!!*/ 2282 if ((nRc == PICOPAM_FLUSH_RECEIVED) || (nRc == PICODATA_PU_ERROR)) { 2283 /*FLUSH command RECEIVED or errors: stop ALL PROCESSING*/ 2284 return nRc; 2285 } 2286 } 2287 pam->nCurrAttachedItem++; 2288 if (nRc == 0) 2289 return PICOPAM_CONTINUE; 2290 else 2291 return nRc; 2292 } 2293 /*SBEG item management*/ 2294 if ((qItem != NULL) && (qItem[0] == PICODATA_ITEM_BOUND) && (qItem[1] 2295 == PICODATA_ITEMINFO1_BOUND_SBEG)) { 2296 sResult = pam_put_qItem(qItem, pam->outBuf, pam->outWritePos, &bWr); 2297 pam->outWritePos += bWr; 2298 pam->nCurrAttachedItem++; 2299 nRc = PICOPAM_GOTO_FEED; 2300 } 2301 return nRc; 2302}/*pamDoPreSyll*/ 2303 2304/** 2305 * performs a step of the pam processing 2306 * @param this : Pam item subobject pointer 2307 * @param mode : mode for the PU 2308 * @param *numBytesOutput : pointer to output number fo bytes produced 2309 * @return PICODATA_PU_IDLE : nothing to do 2310 * @return PICODATA_PU_BUSY : still tasks undergoing 2311 * @return PICODATA_PU_ERROR : errors on processing 2312 * @callgraph 2313 * @callergraph 2314 */ 2315static picodata_step_result_t pam_step(register picodata_ProcessingUnit this, 2316 picoos_int16 mode, picoos_uint16 * numBytesOutput) 2317{ 2318 2319 register pam_subobj_t * pam; 2320 2321 pico_status_t sResult; 2322 picoos_uint16 blen, numinb, numoutb; 2323 pico_status_t rv; 2324 picoos_uint8 bWr; 2325 picoos_uint8 bForcedItem[4]; 2326 picoos_uint8 *qItem; 2327 2328 numinb = 0; 2329 numoutb = 0; 2330 rv = PICO_OK; 2331 2332 if (NULL == this || NULL == this->subObj) { 2333 return PICODATA_PU_ERROR; 2334 } 2335 pam = (pam_subobj_t *) this->subObj; 2336 mode = mode; /* avoid warning "var not used in this function"*/ 2337 /*Init number of output bytes*/ 2338 *numBytesOutput = 0; 2339 2340 while (1) { /* exit via return */ 2341 2342 PICODBG_DEBUG(("pam_step -- doing state %i",pam->procState)); 2343 2344 switch (pam->procState) { 2345 2346 case PICOPAM_COLLECT: 2347 /* *************** item collector ***********************************/ 2348 /*collecting items from the PU input buffer*/ 2349 sResult = picodata_cbGetItem(this->cbIn, 2350 &(pam->inBuf[pam->inWritePos]), pam->inBufSize 2351 - pam->inWritePos, &blen); 2352 if (sResult != PICO_OK) { 2353 if (sResult == PICO_EOF) { 2354 /*no items available : remain in state 0 and return idle*/ 2355 return PICODATA_PU_IDLE; 2356 } else { 2357 /*errors : remain in state 0 and return error*/ 2358 PICODBG_DEBUG(("pam_step(PICOPAM_COLLECT) -- Errors on item buffer input, status: %d",sResult)); 2359 return PICODATA_PU_ERROR; 2360 } 2361 } 2362 2363 PICODBG_DEBUG(("pam_step -- got item, status: %d",sResult)); 2364 sResult = picodata_is_valid_item( 2365 &(pam->inBuf[pam->inWritePos]), blen); 2366 if (sResult != TRUE) { 2367 /*input item is not valid : consume the input item and stay in COLLECT*/ 2368 pam->inWritePos += blen; 2369 pam->inReadPos += blen; 2370 if (pam->inReadPos >= pam->inWritePos) { 2371 pam->inReadPos = 0; 2372 pam->inWritePos = 0; 2373 }PICODBG_DEBUG(("pam_step -- item is not valid, type: %d",pam->inBuf[pam->inWritePos])); 2374 return PICODATA_PU_BUSY; 2375 } 2376 2377 /*update input write pointer + move to "schedule" state*/ 2378 pam->inWritePos += blen; 2379 pam->procState = PICOPAM_SCHEDULE; 2380 return PICODATA_PU_BUSY; 2381 2382 case PICOPAM_SCHEDULE: 2383 /* check out if more items are available */ 2384 if (pam->inReadPos >= pam->inWritePos) { 2385 /*no more items : back to collect state*/ 2386 pam->procState = PICOPAM_COLLECT; 2387 return PICODATA_PU_BUSY; 2388 } 2389 /* we have one full valid item, with len>0 starting at 2390 pam->inBuf[pam->inReadPos]; here we decide how to elaborate it */ 2391 2392 /* PLAY management */ 2393 if (is_pam_play_command(&(pam->inBuf[pam->inReadPos])) == TRUE) { 2394 /*consume the input item : it has been managed*/ 2395 pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2396 + sizeof(picodata_itemhead_t); 2397 if (pam->inReadPos >= pam->inWritePos) { 2398 pam->inReadPos = 0; 2399 pam->inWritePos = 0; 2400 } 2401 /*stay in schedule*/ 2402 return PICODATA_PU_BUSY; 2403 } 2404 2405 if (pam_check_immediate(this, &(pam->inBuf[pam->inReadPos]))) { 2406 /* item has to be sent to next PU NOW : switch to "immediate" state */ 2407 pam->procState = PICOPAM_IMMEDIATE; 2408 return PICODATA_PU_BUSY; 2409 } 2410 if (pamCheckResourceLimits(this, &(pam->inBuf[pam->inReadPos]))) { 2411 /* item would not fit into local buffers -->> free some space -->> 2412 switch to "force term" state */ 2413 pam->procState = PICOPAM_FORWARD_FORCE_TERM; 2414 return PICODATA_PU_BUSY; 2415 } 2416 2417 if (pam_deal_with(&(pam->inBuf[pam->inReadPos]))) { 2418 /* item has to be managed by the "forward" state : switch to forward state*/ 2419 pam->procState = PICOPAM_FORWARD; 2420 return PICODATA_PU_BUSY; 2421 } 2422 2423 if (pam_hastobe_queued(this, &(pam->inBuf[pam->inReadPos]))) { 2424 /* item is not for PAM so it has to be queued internally */ 2425 pam_queue(this, &(pam->inBuf[pam->inReadPos])); 2426 /*consume the input item : it has been queued*/ 2427 pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2428 + sizeof(picodata_itemhead_t); 2429 if (pam->inReadPos >= pam->inWritePos) { 2430 pam->inReadPos = 0; 2431 pam->inWritePos = 0; 2432 } 2433 return PICODATA_PU_BUSY; 2434 } 2435 /*if we get here something wrong happened. Being the the item valid, 2436 switch to "immediate" state -> send it to next PU -> */ 2437 PICODBG_DEBUG(("pam_step (PICOPAM_SCHEDULE) -- unexpected item is sent to next PU !!")); 2438 pam->procState = PICOPAM_IMMEDIATE; 2439 return PICODATA_PU_BUSY; 2440 break; /*PICOPAM_SCHEDULE*/ 2441 2442 case PICOPAM_FORWARD: 2443 /*we have one full valid item, with len>0 starting at pam->inBuf[pam->inReadPos]. 2444 furthermore this item should be in the set {BOUND,SYLL}. 2445 No other items should arrive here*/ 2446 sResult = pam_adapter_forward_step(this, 2447 &(pam->inBuf[pam->inReadPos])); 2448 /*decide if this item has to be queued for later re-synchronization 2449 normally this is only done for SEND/TERM items*/ 2450 if (pam_hastobe_queued(this, &(pam->inBuf[pam->inReadPos]))) { 2451 /*item has to be queued iternally in local storage*/ 2452 pam_queue(this, &(pam->inBuf[pam->inReadPos])); 2453 } 2454 /*now assign next state according to Forward results*/ 2455 switch (sResult) { 2456 case PICOPAM_READY: 2457 pam->needMoreInput = FALSE; 2458 /*consume the input item : it has already been stored*/ 2459 pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2460 + sizeof(picodata_itemhead_t); 2461 if (pam->inReadPos >= pam->inWritePos) { 2462 pam->inReadPos = 0; 2463 pam->inWritePos = 0; 2464 } 2465 /*activate backward processing*/ 2466 sResult = pam_adapter_backward_step(this); 2467 if (sResult == PICO_OK) { 2468 pam->procState = PICOPAM_PROCESS; 2469 return PICODATA_PU_BUSY; 2470 } else { 2471 PICODBG_DEBUG(("pam_step (PICOPAM_FORWARD) -- wrong return from BackwardStep: %d -- Buffered sentence will be discarded",sResult)); 2472 pam_reset_processors(this); 2473 pam->nLastAttachedItemId = pam->nCurrAttachedItem 2474 = 0; 2475 pam->nAttachedItemsSize = 0; 2476 2477 pam->procState = PICOPAM_SCHEDULE; 2478 return PICODATA_PU_BUSY; 2479 } 2480 break; 2481 2482 case PICOPAM_MORE: 2483 pam->needMoreInput = TRUE; 2484 /*consume the input item : it has already been stored*/ 2485 pam->inReadPos += pam->inBuf[pam->inReadPos + 3] 2486 + sizeof(picodata_itemhead_t); 2487 if (pam->inReadPos >= pam->inWritePos) { 2488 /*input is finished and PAM need more data : 2489 clenaup input buffer + switch state back to "schedule state" 2490 */ 2491 pam->inReadPos = 0; 2492 pam->inWritePos = 0; 2493 pam->procState = PICOPAM_SCHEDULE; 2494 return PICODATA_PU_ATOMIC; 2495 } else { 2496 /*input is not finished and need more data : 2497 remain in state "PICOPAM_FORWARD" */ 2498 return PICODATA_PU_ATOMIC; 2499 } 2500 break; 2501 2502 case PICOPAM_NA: 2503 default: 2504 /*this item has not been stored in internal buffers: 2505 assign this item to the management of 2506 "immediate" state*/ 2507 pam->procState = PICOPAM_IMMEDIATE; 2508 return PICODATA_PU_BUSY; 2509 break; 2510 } /*end switch sResult*/ 2511 break; /*PICOPAM_FORWARD*/ 2512 2513 case PICOPAM_FORWARD_FORCE_TERM: 2514 /*we have one full valid item, with len>0 2515 starting at pam->inBuf[pam->inReadPos] but we decided 2516 to force a TERM item before, without losing the item in 2517 inBuf[inReadPos] : --> generate a TERM item and do the 2518 forward processing */ 2519 pam_put_term(bForcedItem, 0, &bWr); 2520 sResult = pam_adapter_forward_step(this, &(bForcedItem[0])); 2521 switch (sResult) { 2522 case PICOPAM_READY: 2523 pam_queue(this, &(bForcedItem[0])); 2524 /*activate backward processing*/ 2525 sResult = pam_adapter_backward_step(this); 2526 if (sResult == PICO_OK) { 2527 pam->procState = PICOPAM_PROCESS; 2528 return PICODATA_PU_BUSY; 2529 } else { 2530 PICODBG_DEBUG(("pam_step (PICOPAM_FORWARD_FORCE_TERM) -- wrong return from BackwardStep: %d -- Buffered sentence will be discarded",sResult)); 2531 pam_reset_processors(this); 2532 pam->nLastAttachedItemId = pam->nCurrAttachedItem 2533 = 0; 2534 pam->nAttachedItemsSize = 0; 2535 2536 pam->procState = PICOPAM_SCHEDULE; 2537 return PICODATA_PU_BUSY; 2538 } 2539 break; 2540 2541 default: 2542 PICODBG_DEBUG(("pam_step (PICOPAM_FORWARD_FORCE_TERM) -- Forced a TERM but processing do not appear to end -- Buffered sentence will be discarded",sResult)); 2543 pam_reset_processors(this); 2544 pam->nLastAttachedItemId = pam->nCurrAttachedItem = 0; 2545 pam->nAttachedItemsSize = 0; 2546 2547 pam->procState = PICOPAM_SCHEDULE; 2548 return PICODATA_PU_BUSY; 2549 break; 2550 2551 } /*end switch sResult*/ 2552 break; /*PICOPAM_FORWARD_FORCE_TERM*/ 2553 2554 case PICOPAM_PROCESS: 2555 2556 if ((PICOPAM_FRAME_ITEM_SIZE + 4) > (pam->outBufSize 2557 - pam->outWritePos)) { 2558 /*WARNING (buffer overflow): leave status unchanged until output buffer free */ 2559 return PICODATA_PU_BUSY; 2560 } 2561 2562 if (pam->nCurrSyllable == 0) { 2563 sResult = pamDoPreSyll(this); 2564 if (sResult == PICOPAM_GOTO_FEED) { 2565 /* 2566 items pushed to output buffer : 2567 switch to "feed" but then back 2568 to "process" 2569 */ 2570 pam->retState = PICOPAM_PROCESS; 2571 pam->procState = PICOPAM_FEED; 2572 return PICODATA_PU_BUSY; 2573 } 2574 if (sResult == PICOPAM_CONTINUE) { 2575 /* 2576 items processed (maybe commands) : 2577 return (maybe we need to process other 2578 items in pre_syll) and then back to "process" 2579 */ 2580 pam->retState = PICOPAM_PROCESS; 2581 pam->procState = PICOPAM_PROCESS; 2582 return PICODATA_PU_BUSY; 2583 } 2584 2585 if ((sResult == PICOPAM_FLUSH_RECEIVED) || (sResult 2586 == PICODATA_PU_ERROR)) { 2587 /* 2588 items processed were a flush or 2589 problems found: switch to "schedule" 2590 and abort all processing 2591 */ 2592 pam->retState = PICOPAM_SCHEDULE; 2593 pam->procState = PICOPAM_SCHEDULE; 2594 return PICODATA_PU_BUSY; 2595 } 2596 if (sResult == PICOPAM_PRE_SYLL_ENDED) { 2597 /* 2598 we get here when pam->nCurrSyllable==0 and 2599 no more items to be processed before the syllable 2600 */ 2601 sResult = sResult; 2602 } 2603 } 2604 2605 if (pamHasToProcess(this)) { 2606 if (pamPhoneProcess(this) == PICO_OK) { 2607 sResult = pamUpdateProcess(this); 2608 pam->procState = PICOPAM_FEED; /*switch to feed*/ 2609 return PICODATA_PU_BUSY; 2610 } else { 2611 PICODBG_DEBUG(("pam_step(PICOPAM_PROCESS) --- NULL return from pamPhoneProcess")); 2612 return PICODATA_PU_ERROR; 2613 } 2614 } 2615 2616 if (pamHasToPop(this) != FALSE) { 2617 if ((qItem = pamPopItem(this)) == NULL) { 2618 PICODBG_DEBUG(("pam_step(PICOPAM_PROCESS) --- NULL return from pamPopItem")); 2619 return PICODATA_PU_ERROR; 2620 } 2621 2622 if (isItemToPut(qItem)) { 2623 /*popped item has to be sent to next PU*/ 2624 sResult = pam_put_qItem(qItem, pam->outBuf, 2625 pam->outWritePos, &bWr); 2626 if (sResult != PICO_OK) { 2627 PICODBG_DEBUG(("pam_step(PICOPAM_PROCESS) --- Error on writing item to output buffer")); 2628 return PICODATA_PU_ERROR; 2629 } 2630 pam->outWritePos += bWr; /*item write ok*/ 2631 pam->procState = PICOPAM_FEED; /*switch to feed*/ 2632 } 2633 2634 /*moved command processing here (after pam_put_qItem) because of FLUSH command could erase 2635 * the syllable structure and make it impossible to transmit the flush to other PUs*/ 2636 if (is_pam_command(qItem) == TRUE) { 2637 sResult = pamDoCommand(this, qItem); /*popped item is a PAM command : do it NOW!!*/ 2638 if ((sResult == PICOPAM_FLUSH_RECEIVED) || (sResult 2639 == PICODATA_PU_ERROR)) { 2640 pam->retState = PICOPAM_SCHEDULE; 2641 pam->procState = PICOPAM_SCHEDULE; /*switch to schedule */ 2642 return PICODATA_PU_BUSY; 2643 } 2644 } 2645 /*update PAM status: if more items attached to the current syllable 2646 stay in current syllable, otherwise move to next syllable and switch 2647 to processing phones */ 2648 sResult = pamUpdateProcess(this); /*both "doCommand" or "put" : update PAM status*/ 2649 return PICODATA_PU_BUSY; 2650 } else { 2651 pam->procState = PICOPAM_SCHEDULE; /*switch to schedule */ 2652 return PICODATA_PU_BUSY; 2653 } 2654 2655 break; /*PICOPAM_PROCESS*/ 2656 2657 case PICOPAM_IMMEDIATE: 2658 /* *** item is output NOW!!! */ 2659 /*context: full valid item, with len> starting at pam->inBuf[pam->inReadPos]*/ 2660 numinb = PICODATA_ITEM_HEADSIZE 2661 + pam->inBuf[pam->inReadPos + 3]; 2662 sResult = picodata_copy_item(&(pam->inBuf[pam->inReadPos]), 2663 numinb, &(pam->outBuf[pam->outWritePos]), 2664 pam->outBufSize - pam->outWritePos, &numoutb); 2665 2666 if (sResult == PICO_OK) { 2667 pam->inReadPos += numinb; 2668 if (pam->inReadPos >= pam->inWritePos) { 2669 pam->inReadPos = 0; 2670 pam->inWritePos = 0; 2671 pam->needMoreInput = FALSE; 2672 } 2673 pam->outWritePos += numoutb; 2674 pam->procState = PICOPAM_FEED; /*switch to FEED state*/ 2675 pam->retState = PICOPAM_SCHEDULE; /*back to SCHEDULE after FEED*/ 2676 } else { 2677 /* 2678 PICO_EXC_BUF_IGNORE 2679 PICO_EXC_BUF_UNDERFLOW 2680 PICO_EXC_BUF_OVERFLOW 2681 */ 2682 PICODBG_DEBUG(("pam_step(PICOPAM_IMMEDIATE) --- wrong return from picodata_copy_item:%d",sResult)); 2683 return PICODATA_PU_ERROR; 2684 } 2685 return PICODATA_PU_BUSY; 2686 break; /*PICOPAM_IMMEDIATE*/ 2687 2688 case PICOPAM_FEED: 2689 /* *************** item output/feeding ***********************************/ 2690 /*feeding items to PU output buffer*/ 2691 sResult = picodata_cbPutItem(this->cbOut, 2692 &(pam->outBuf[pam->outReadPos]), pam->outWritePos 2693 - pam->outReadPos, &numoutb); 2694 PICODBG_DEBUG(("pam_step -- put item, status: %d",sResult)); 2695 if (PICO_OK == sResult) { 2696 2697 PICODATA_INFO_ITEM(this->voice->kbArray[PICOKNOW_KBID_DBG], 2698 (picoos_uint8 *)"pam: ", 2699 pam->outBuf + pam->outReadPos, pam->outBufSize); 2700 2701 pam->outReadPos += numoutb; 2702 *numBytesOutput = numoutb; 2703 if (pam->outReadPos >= pam->outWritePos) { 2704 /*reset the output pointers*/ 2705 pam->outReadPos = 0; 2706 pam->outWritePos = 0; 2707 /*switch to appropriate state*/ 2708 switch (pam->retState) { 2709 case PICOPAM_IMMEDIATE: 2710 pam->procState = PICOPAM_IMMEDIATE; 2711 pam->retState = PICOPAM_SCHEDULE; 2712 return PICODATA_PU_BUSY; 2713 break; 2714 case PICOPAM_PLAY: 2715 pam->procState = PICOPAM_PLAY; 2716 pam->retState = PICOPAM_SCHEDULE; 2717 return PICODATA_PU_BUSY; 2718 break; 2719 default: 2720 break; 2721 } 2722 /*Define next state 2723 a)process (if current sentence has more data to process) 2724 b)schedule (no more data to process in current sentence) 2725 NOTE : case b)also happens when dealing with non BOUND/SYLL items*/ 2726 if ((pamHasToProcess(this)) || (pamHasToPop(this))) { 2727 pam->procState = PICOPAM_PROCESS; 2728 } else { 2729 pam->nCurrSyllable = -1; 2730 pam_reset_processors(this); 2731 pam->nLastAttachedItemId = pam->nCurrAttachedItem 2732 = 0; 2733 pam->nAttachedItemsSize = 0; 2734 2735 pam->nSyllPhoneme = 0; 2736 pam->procState = PICOPAM_SCHEDULE; 2737 } 2738 } 2739 return PICODATA_PU_BUSY; 2740 2741 } else if (PICO_EXC_BUF_OVERFLOW == sResult) { 2742 2743 PICODBG_DEBUG(("pam_step ** feeding, overflow, PICODATA_PU_OUT_FULL")); 2744 return PICODATA_PU_OUT_FULL; 2745 2746 } else if ((PICO_EXC_BUF_UNDERFLOW == sResult) 2747 || (PICO_ERR_OTHER == sResult)) { 2748 2749 PICODBG_DEBUG(("pam_step ** feeding problem, discarding item")); 2750 pam->outReadPos = 0; 2751 pam->outWritePos = 0; 2752 pam->procState = PICOPAM_COLLECT; 2753 return PICODATA_PU_ERROR; 2754 2755 } 2756 break; /*PICOPAM_FEED*/ 2757 2758 default: 2759 /*NOT feeding items*/ 2760 sResult = PICO_EXC_BUF_IGNORE; 2761 break; 2762 }/*end switch*/ 2763 return PICODATA_PU_BUSY; /*check if there is more data to process after feeding*/ 2764 2765 }/*end while*/ 2766 return PICODATA_PU_IDLE; 2767}/*pam_step*/ 2768 2769/** 2770 * performs one step of a PamTree 2771 * @param this : Pam item subobject pointer 2772 * @param dtpam : the Pam decision tree 2773 * @param *invec : the input vector pointer 2774 * @param inveclen : length of the input vector 2775 * @param *dtres : the classification result 2776 * @return dtres->set : the result of tree traversal 2777 * @callgraph 2778 * @callergraph 2779 */ 2780static picoos_uint8 pam_do_tree(register picodata_ProcessingUnit this, 2781 const picokdt_DtPAM dtpam, const picoos_uint8 *invec, 2782 const picoos_uint8 inveclen, picokdt_classify_result_t *dtres) 2783{ 2784 picoos_uint8 okay; 2785 2786 okay = TRUE; 2787 /* construct input vector, which is set in dtpam */ 2788 if (!picokdt_dtPAMconstructInVec(dtpam, invec, inveclen)) { 2789 /* error constructing invec */ 2790 PICODBG_WARN(("problem with invec")); 2791 picoos_emRaiseWarning(this->common->em, PICO_WARN_INVECTOR, NULL, NULL); 2792 okay = FALSE; 2793 } 2794 /* classify */ 2795 if (okay && (!picokdt_dtPAMclassify(dtpam))) { 2796 /* error doing classification */ 2797 PICODBG_WARN(("problem classifying")); 2798 picoos_emRaiseWarning(this->common->em, PICO_WARN_CLASSIFICATION, NULL, 2799 NULL); 2800 okay = FALSE; 2801 } 2802 /* decompose */ 2803 if (okay && (!picokdt_dtPAMdecomposeOutClass(dtpam, dtres))) { 2804 /* error decomposing */ 2805 PICODBG_WARN(("problem decomposing")); 2806 picoos_emRaiseWarning(this->common->em, PICO_WARN_OUTVECTOR, NULL, NULL); 2807 okay = FALSE; 2808 } 2809 2810 PICODBG_TRACE(("dtpam output class: %d", dtres->class)); 2811 2812 return dtres->set; 2813}/*pam_do_tree*/ 2814 2815/** 2816 * returns the carrier vowel id inside a syllable 2817 * @param this : Pam item subobject pointer 2818 * @param item : the full syllable item 2819 * @param *pos : pointer to the variable to receive the position of the carrier vowel 2820 * @return the phonetic id for the carrier vowel inside the syllable 2821 * @callgraph 2822 * @callergraph 2823 */ 2824static picoos_uint8 pam_get_vowel_name(register picodata_ProcessingUnit this, 2825 picoos_uint8 *item, picoos_uint8 *pos) 2826{ 2827 pam_subobj_t *pam; 2828 picoos_uint8 *phon, nI, nCond1; 2829 if (NULL == this || NULL == this->subObj) { 2830 return 0; 2831 } 2832 pam = (pam_subobj_t *) this->subObj; 2833 2834 if (item == NULL) 2835 return 0; 2836 if (item[3] == 0) 2837 return 0; 2838 phon = &item[4]; 2839 for (nI = 0; nI < item[3]; nI++) { 2840 nCond1 = picoktab_isSyllCarrier(pam->tabphones, phon[nI]); 2841 if (nCond1) { 2842 *pos = nI; 2843 return phon[nI]; 2844 } 2845 } 2846 return 0; 2847}/*pam_get_vowel_name */ 2848 2849/** 2850 * returns the pause phone id in the current ph.alphabet 2851 * @param this : Pam sub object pointer 2852 * @return the (numeric) phonetic id of the pause phone in current phonetic alphabet 2853 * @return 0 : errors on getting the pam subobject pointer 2854 * @callgraph 2855 * @callergraph 2856 */ 2857static picoos_uint8 pam_get_pause_id(register picodata_ProcessingUnit this) 2858{ 2859 picoos_uint8 nVal1; 2860 /*picoos_uint8 nVal2; */ 2861 pam_subobj_t *pam; 2862 if (NULL == this || NULL == this->subObj) { 2863 return 0; 2864 } 2865 pam = (pam_subobj_t *) this->subObj; 2866 nVal1 = picoktab_getPauseID(pam->tabphones); 2867 return nVal1; 2868}/*pam_get_pause_id */ 2869 2870/** 2871 * returns the pam sentence type (declarative, interrogative...) 2872 * @param iteminfo1 : the boundary item info 1 2873 * @param iteminfo2 : the boundary item info 2 2874 * @return the sentence type suitably encoded for trees 2875 * @callgraph 2876 * @callergraph 2877 */ 2878static picoos_uint8 pam_map_sentence_type(picoos_uint8 iteminfo1, 2879 picoos_uint8 iteminfo2) 2880{ 2881 switch (iteminfo2) { 2882 case PICODATA_ITEMINFO2_BOUNDTYPE_P: 2883 return PICOPAM_DECLARATIVE; 2884 case PICODATA_ITEMINFO2_BOUNDTYPE_T: 2885 return PICOPAM_DECLARATIVE; 2886 case PICODATA_ITEMINFO2_BOUNDTYPE_Q: 2887 return PICOPAM_INTERROGATIVE; 2888 case PICODATA_ITEMINFO2_BOUNDTYPE_E: 2889 return PICOPAM_DECLARATIVE; 2890 default: 2891 return PICOPAM_DECLARATIVE; 2892 } 2893 iteminfo1 = iteminfo1; /* avoid warning "var not used in this function"*/ 2894 return PICOPAM_DECLARATIVE; 2895}/*pam_map_sentence_type */ 2896 2897/** 2898 * returns the pam phrase type 2899 * @param iteminfo1 : the boundary item info 1 2900 * @param iteminfo2 : the boundary item info 2 2901 * @return the phrase type suitably encoded for trees 2902 * @callgraph 2903 * @callergraph 2904 */ 2905static picoos_uint8 pam_map_phrase_type(picoos_uint8 iteminfo1, 2906 picoos_uint8 iteminfo2) 2907{ 2908 2909 switch (iteminfo2) { 2910 case PICODATA_ITEMINFO2_BOUNDTYPE_P: 2911 switch (iteminfo1) { 2912 case PICODATA_ITEMINFO1_BOUND_PHR1: 2913# ifdef PAM_PHR2_WITH_PR1 2914 case PICODATA_ITEMINFO1_BOUND_PHR2: 2915# endif 2916 return PICOPAM_P; /*current_prhase type = "P" (encoded to 1) */ 2917 break; 2918 case PICODATA_ITEMINFO1_BOUND_PHR3: 2919# ifdef PAM_PHR2_WITH_PR3 2920 case PICODATA_ITEMINFO1_BOUND_PHR2 : 2921# endif 2922 return PICOPAM_p; /*current_prhase type = "p" (encoded to 2) */ 2923 break; 2924 case PICODATA_ITEMINFO1_BOUND_SBEG: 2925 return PICOPAM_P; /*current_prhase type = "P" (encoded to 1) */ 2926 break; 2927 default: 2928 PICODBG_DEBUG(("Map pam_map_phrase_type : unexpected iteminfo1")); 2929 return PICOPAM_P; /*current_prhase type = "P" (encoded to 1) */ 2930 break; 2931 } 2932 case PICODATA_ITEMINFO2_BOUNDTYPE_T: 2933 return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2934 break; 2935 case PICODATA_ITEMINFO2_BOUNDTYPE_E: 2936 return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2937 break; 2938 case PICODATA_ITEMINFO2_BOUNDTYPE_Q: 2939 return PICOPAM_Y; /*current_prhase type = "T" (encoded to 0) */ 2940 break; 2941 default: 2942 PICODBG_DEBUG(("Map pam_map_phrase_type : unexpected iteminfo2")); 2943 return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2944 break; 2945 }PICODBG_DEBUG(("Map pam_map_phrase_type : unexpected iteminfo2")); 2946 return PICOPAM_T; /*current_prhase type = "T" (encoded to 0) */ 2947 2948}/*pam_map_phrase_type */ 2949 2950/** 2951 * does the cleanup of the sub object processors flags at sentence start 2952 * @param this : pointer to PAM PU sub object pointer 2953 * @return PICO_OK : reset OK 2954 * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 2955 * @callgraph 2956 * @callergraph 2957 */ 2958static pico_status_t pam_reset_processors(register picodata_ProcessingUnit this) 2959{ 2960 pam_subobj_t *pam; 2961 if (NULL == this || NULL == this->subObj) { 2962 return PICO_ERR_OTHER; 2963 } 2964 pam = (pam_subobj_t *) this->subObj; 2965 2966 pam->nCurrSyllable = -1; 2967 pam->nTotalPhonemes = pam->nSyllPhoneme = pam->nCurrPhoneme 2968 = pam->nTotalSyllables = pam->sType = pam->pType = 0; 2969 pam->dRest = 0.0f; 2970 /*set all to 0*/ 2971 pam->a3_overall_syllable = pam->a3_primary_phrase_syllable = pam->b4_b5_syllable = 2972 pam->b6_b7_syllable = pam->b6_b7_state = pam->b8_b9_stressed_syllable = 2973 pam->b10_b11_accented_syllable = pam->b12_b13_syllable = pam->b12_b13_state = 2974 pam->b14_b15_syllable = pam->b14_b15_state = pam->b17_b19_syllable = 2975 pam->b17_b19_state = pam->b18_b20_b21_syllable = pam->b18_b20_b21_state = 2976 pam->c3_overall_syllable= pam->c3_primary_phrase_syllable = pam->d2_syllable_in_word = 2977 pam->d2_prev_syllable_in_word = pam->d2_current_primary_phrase_word = pam->e1_syllable_word_start = 2978 pam->e1_syllable_word_end= pam->e1_content = pam->e2_syllable_word_start = 2979 pam->e2_syllable_word_end= pam->e3_e4_word = pam->e3_e4_state = 2980 pam->e5_e6_content_word = pam->e5_e6_content = pam->e7_e8_word = 2981 pam->e7_e8_content = pam->e7_e8_state = pam->e9_e11_word = 2982 pam->e9_e11_saw_word = pam->e9_e11_state = pam->e10_e12_e13_word = 2983 pam->e10_e12_e13_state = pam->e10_e12_e13_saw_word = pam->f2_overall_word = 2984 pam->f2_word_syllable = pam->f2_next_word_syllable = pam->f2_current_primary_phrase_word = 2985 pam->g1_current_secondary_phrase_syllable = pam->g1_current_syllable = 2986 pam->g2_current_secondary_phrase_word = pam->g2_current_word = 2987 pam->h1_current_secondary_phrase_syll = pam->h2_current_secondary_phrase_word = 2988 pam->h3_h4_current_secondary_phrase_word = pam->h5_current_phrase_type = 2989 pam->h5_syllable = pam->h5_state = pam->i1_secondary_phrase_syllable = 2990 pam->i1_next_secondary_phrase_syllable = pam->i2_secondary_phrase_word = 2991 pam->i2_next_secondary_phrase_word = pam->j1_utterance_syllable = 2992 pam->j2_utterance_word = pam->j3_utterance_sec_phrases = 0; 2993 /*Override 0 with 1*/ 2994 pam->b4_b5_syllable = pam->b17_b19_syllable = pam->b18_b20_b21_syllable = 2995 pam->e9_e11_word = pam->e10_e12_e13_word = pam->e7_e8_word = 2996 pam->h2_current_secondary_phrase_word = 1; 2997 /*Override 0 with -1*/ 2998 pam->e1_syllable_word_start = pam->e1_syllable_word_end = pam->e2_syllable_word_start = 2999 pam->e2_syllable_word_end = -1; 3000 3001 return PICO_OK; 3002}/*pam_reset_processors*/ 3003 3004/** 3005 * does the cleanup of the sub object processors flags before the backward step 3006 * @param this : pointer to PAM PU sub object pointer 3007 * @return PICO_OK : reset OK 3008 * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 3009 * @callgraph 3010 * @callergraph 3011 */ 3012static pico_status_t pam_reset_processors_back( 3013 register picodata_ProcessingUnit this) 3014{ 3015 pam_subobj_t *pam; 3016 if (NULL == this || NULL == this->subObj) { 3017 return PICO_ERR_OTHER; 3018 } 3019 pam = (pam_subobj_t *) this->subObj; 3020 3021 /*set all to 0*/ 3022 pam->a3_overall_syllable 3023 = pam->a3_primary_phrase_syllable 3024 = pam->b4_b5_syllable 3025 = pam->b6_b7_syllable 3026 = pam->b6_b7_state 3027 = pam->b8_b9_stressed_syllable 3028 = pam->b10_b11_accented_syllable 3029 = pam->b12_b13_syllable 3030 = pam->b12_b13_state 3031 = pam->b14_b15_syllable 3032 = pam->b14_b15_state 3033 = pam->b17_b19_syllable 3034 = pam->b17_b19_state 3035 = pam->b18_b20_b21_syllable 3036 = pam->b18_b20_b21_state 3037 = pam->c3_overall_syllable 3038 = pam->c3_primary_phrase_syllable 3039 = pam->d2_syllable_in_word 3040 = pam->d2_prev_syllable_in_word 3041 = pam->d2_current_primary_phrase_word 3042 = pam->e1_syllable_word_start 3043 = pam->e1_syllable_word_end 3044 = pam->e1_content 3045 = pam->e2_syllable_word_start 3046 = pam->e2_syllable_word_end 3047 = pam->e3_e4_word 3048 = pam->e3_e4_state 3049 = pam->e5_e6_content_word 3050 = pam->e5_e6_content 3051 = pam->e7_e8_word 3052 = pam->e7_e8_content 3053 = pam->e7_e8_state 3054 = pam->e9_e11_word 3055 = pam->e9_e11_saw_word 3056 = pam->e9_e11_state 3057 = pam->e10_e12_e13_word 3058 = pam->e10_e12_e13_state 3059 = pam->e10_e12_e13_saw_word 3060 = pam->f2_overall_word 3061 = pam->f2_word_syllable 3062 = pam->f2_next_word_syllable 3063 = pam->f2_current_primary_phrase_word 3064 = pam->g1_current_secondary_phrase_syllable 3065 = pam->g1_current_syllable 3066 = pam->g2_current_secondary_phrase_word 3067 = pam->g2_current_word 3068 = pam->h1_current_secondary_phrase_syll 3069 = pam->h2_current_secondary_phrase_word 3070 = pam->h3_h4_current_secondary_phrase_word 3071 = pam->h5_current_phrase_type 3072 = pam->h5_state 3073 = pam->i1_secondary_phrase_syllable 3074 = pam->i1_next_secondary_phrase_syllable 3075 = pam->i2_secondary_phrase_word 3076 = pam->i2_next_secondary_phrase_word 3077 = 0; 3078 /*Override 0 with 1*/ 3079 pam->b4_b5_syllable = pam->b17_b19_syllable = pam->b18_b20_b21_syllable 3080 = pam->e9_e11_word = pam->e10_e12_e13_word = pam->e7_e8_word 3081 = pam->h2_current_secondary_phrase_word = 1; 3082 /*Override 0 with -1*/ 3083 pam->e1_syllable_word_start = pam->e1_syllable_word_end 3084 = pam->e2_syllable_word_start = pam->e2_syllable_word_end = -1; 3085 3086 return PICO_OK; 3087}/*pam_reset_processors_back*/ 3088 3089/** 3090 * processes an input event for a specific feature 3091 * @param this : pointer to PAM PU sub object pointer 3092 * @param nFeat : feature column to process 3093 * @param event_type : event id among syll/boundprim/boundsec/boundword 3094 * @param direction : forward(0)/backward(1) 3095 * @return PICO_OK : process OK 3096 * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 3097 * @callgraph 3098 * @callergraph 3099 */ 3100static pico_status_t pam_process_event_feature( 3101 register picodata_ProcessingUnit this, picoos_uint8 nFeat, 3102 picoos_uint8 event_type, picoos_uint8 direction) 3103{ 3104 picoos_uint8 sDest, nI; 3105 picoos_uint16 syllCurr; 3106 pam_subobj_t *pam; 3107 if (NULL == this || NULL == this->subObj) { 3108 return PICO_ERR_OTHER; 3109 } 3110 pam = (pam_subobj_t *) this->subObj; 3111 syllCurr = pam->nCurrSyllable; 3112 switch (nFeat) { 3113 case A3: 3114 /*processor for A3*/ 3115 switch (direction) { 3116 case PICOPAM_DIR_FORW: 3117 if (event_type == PICOPAM_EVENT_SYLL) { 3118 if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 3119 == 1) || (pam->a3_primary_phrase_syllable >= 1)) { 3120 if (pam->a3_overall_syllable < 1) 3121 pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 3122 = 0; 3123 else 3124 pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 3125 = pam->sSyllFeats[pam->nCurrSyllable 3126 - 1].phoneV[B3]; 3127 } else { 3128 pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] = 0; 3129 } 3130 pam->a3_primary_phrase_syllable++; 3131 pam->a3_overall_syllable++; 3132 } 3133 if (event_type == PICOPAM_EVENT_P_BOUND) { 3134 pam->a3_primary_phrase_syllable = 0; 3135 } 3136 break; 3137 case PICOPAM_DIR_BACK: 3138 /*do nothing*/ 3139 break; 3140 } 3141 break; 3142 case B1: 3143 case B2: 3144 case B3: 3145 /*done in createSyllable*/ 3146 break; 3147 case B4:/*processor for B4,B5*/ 3148 switch (direction) { 3149 case PICOPAM_DIR_FORW: 3150 sDest = B4; 3151 break; 3152 case PICOPAM_DIR_BACK: 3153 sDest = B5; 3154 break; 3155 default: 3156 sDest = B4; 3157 break; 3158 } 3159 if (event_type == PICOPAM_EVENT_SYLL) { 3160 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] == 0) { 3161 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3162 = pam->b4_b5_syllable; 3163 pam->b4_b5_syllable++; 3164 } else { 3165 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] = 0; 3166 } 3167 } 3168 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3169 == PICOPAM_EVENT_S_BOUND) || (event_type 3170 == PICOPAM_EVENT_P_BOUND)) { 3171 pam->b4_b5_syllable = 1; 3172 } 3173 break; 3174 case B5:/*processor for B5 : done in B4*/ 3175 break; 3176 case B6:/*processor for B6,B7*/ 3177 switch (direction) { 3178 case PICOPAM_DIR_FORW: 3179 sDest = B6; 3180 break; 3181 case PICOPAM_DIR_BACK: 3182 sDest = B7; 3183 break; 3184 default: 3185 sDest = B6; 3186 break; 3187 } 3188 switch (pam->b6_b7_state) { 3189 case 0: 3190 if (event_type == PICOPAM_EVENT_SYLL) 3191 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3192 = PICOPAM_DONT_CARE_VALUE; 3193 if (event_type == PICOPAM_EVENT_S_BOUND) { 3194 pam->b6_b7_syllable = 1; 3195 pam->b6_b7_state = 1; 3196 } 3197 break; 3198 case 1: 3199 if (event_type == PICOPAM_EVENT_SYLL) { 3200 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3201 = pam->b6_b7_syllable; 3202 pam->b6_b7_syllable++; 3203 } 3204 if (event_type == PICOPAM_EVENT_S_BOUND) { 3205 pam->b6_b7_syllable = 1; 3206 } 3207 if (event_type == PICOPAM_EVENT_P_BOUND) { 3208 pam->b6_b7_state = 0; 3209 } 3210 break; 3211 default: 3212 break; 3213 } 3214 break; 3215 case B7:/*Done in B6*/ 3216 break; 3217 case B8:/*processor for B8,B9*/ 3218 switch (direction) { 3219 case PICOPAM_DIR_FORW: 3220 sDest = B8; 3221 break; 3222 case PICOPAM_DIR_BACK: 3223 sDest = B9; 3224 break; 3225 default: 3226 sDest = B8; 3227 break; 3228 } 3229 if (event_type == PICOPAM_EVENT_SYLL) { 3230 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3231 = pam->b8_b9_stressed_syllable; 3232 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 1) 3233 pam->b8_b9_stressed_syllable++; 3234 } 3235 if (event_type == PICOPAM_EVENT_P_BOUND) { 3236 pam->b8_b9_stressed_syllable = 0; 3237 } 3238 3239 break; 3240 case B9:/*done in B8*/ 3241 break; 3242 case B10:/*processor for B10, B11*/ 3243 switch (direction) { 3244 case PICOPAM_DIR_FORW: 3245 sDest = B10; 3246 break; 3247 case PICOPAM_DIR_BACK: 3248 sDest = B11; 3249 break; 3250 default: 3251 sDest = B10; 3252 break; 3253 } 3254 if (event_type == PICOPAM_EVENT_SYLL) { 3255 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3256 = pam->b10_b11_accented_syllable; 3257 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 1) 3258 pam->b10_b11_accented_syllable++; 3259 } 3260 if (event_type == PICOPAM_EVENT_P_BOUND) { 3261 pam->b10_b11_accented_syllable = 0; 3262 } 3263 break; 3264 case B11:/*done in B10*/ 3265 break; 3266 case B12:/*processor for B12,B13*/ 3267 switch (direction) { 3268 case PICOPAM_DIR_FORW: 3269 sDest = B12; 3270 break; 3271 case PICOPAM_DIR_BACK: 3272 sDest = B13; 3273 break; 3274 default: 3275 sDest = B12; 3276 break; 3277 } 3278 switch (pam->b12_b13_state) { 3279 case 0: 3280 if (event_type == PICOPAM_EVENT_SYLL) { 3281 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 0) 3282 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3283 = PICOPAM_DONT_CARE_VALUE; 3284 else { 3285 pam->b12_b13_syllable = 0; 3286 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3287 = PICOPAM_DONT_CARE_VALUE; 3288 pam->b12_b13_state = 1; 3289 } 3290 } 3291 break; 3292 case 1: 3293 if (event_type == PICOPAM_EVENT_SYLL) { 3294 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3295 = pam->b12_b13_syllable; 3296 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 1) 3297 pam->b12_b13_syllable = 0; 3298 else 3299 pam->b12_b13_syllable++; 3300 pam->b12_b13_state = 2; 3301 } 3302 if (event_type == PICOPAM_EVENT_P_BOUND) 3303 pam->b12_b13_state = 0; 3304 break; 3305 case 2: 3306 if (event_type == PICOPAM_EVENT_SYLL) { 3307 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3308 = pam->b12_b13_syllable; 3309 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] == 1) 3310 pam->b12_b13_syllable = 0; 3311 else 3312 pam->b12_b13_syllable++; 3313 } 3314 if (event_type == PICOPAM_EVENT_P_BOUND) 3315 pam->b12_b13_state = 0; 3316 3317 break; 3318 default: 3319 break; 3320 } 3321 break; 3322 case B13:/*done in B12*/ 3323 break; 3324 3325 case B14:/*processor for B14, B15*/ 3326 switch (direction) { 3327 case PICOPAM_DIR_FORW: 3328 sDest = B14; 3329 break; 3330 case PICOPAM_DIR_BACK: 3331 sDest = B15; 3332 break; 3333 default: 3334 sDest = B14; 3335 break; 3336 } 3337 switch (pam->b14_b15_state) { 3338 case 0: 3339 if (event_type == PICOPAM_EVENT_SYLL) { 3340 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 0) 3341 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3342 = PICOPAM_DONT_CARE_VALUE; 3343 else { 3344 pam->b14_b15_syllable = 0; 3345 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3346 = PICOPAM_DONT_CARE_VALUE; 3347 pam->b14_b15_state = 1; 3348 } 3349 } 3350 break; 3351 case 1: 3352 if (event_type == PICOPAM_EVENT_SYLL) { 3353 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3354 = pam->b14_b15_syllable; 3355 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 1) 3356 pam->b14_b15_syllable = 0; 3357 else 3358 pam->b14_b15_syllable++; 3359 pam->b14_b15_state = 2; 3360 } 3361 if (event_type == PICOPAM_EVENT_P_BOUND) { 3362 pam->b14_b15_state = 0; 3363 } 3364 break; 3365 case 2: 3366 if (event_type == PICOPAM_EVENT_SYLL) { 3367 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3368 = pam->b14_b15_syllable; 3369 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] == 1) 3370 pam->b14_b15_syllable = 0; 3371 else 3372 pam->b14_b15_syllable++; 3373 } 3374 if (event_type == PICOPAM_EVENT_P_BOUND) { 3375 pam->b14_b15_state = 0; 3376 } 3377 break; 3378 default: 3379 break; 3380 } 3381 break; 3382 case B15:/*Processor for B15 : done in B14*/ 3383 break; 3384 case B16:/*done in createSyllable*/ 3385 break; 3386 case B17:/*processor for B17, B19 unified */ 3387 switch (direction) { 3388 case PICOPAM_DIR_FORW: 3389 switch (pam->b17_b19_state) { 3390 case 0: 3391 if (event_type == PICOPAM_EVENT_SYLL) { 3392 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 3393 = PICOPAM_DONT_CARE_VALUE; 3394 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 3395 = pam->b17_b19_syllable; 3396 pam->b17_b19_syllable++; 3397 } 3398 if (((event_type == PICOPAM_EVENT_P_BOUND) 3399 || (event_type == PICOPAM_EVENT_S_BOUND)) 3400 && (pam->b17_b19_syllable > 1)) { 3401 if (event_type == PICOPAM_EVENT_P_BOUND) 3402 pam->b17_b19_syllable = 1; 3403 pam->b17_b19_state = 1; 3404 } 3405 break; 3406 case 1: 3407 if (event_type == PICOPAM_EVENT_SYLL) { 3408 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 3409 = pam->b17_b19_syllable; 3410 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 3411 = PICOPAM_DONT_CARE_VALUE; 3412 pam->b17_b19_syllable++; 3413 } 3414 if (event_type == PICOPAM_EVENT_P_BOUND) { 3415 pam->b17_b19_syllable = 1; 3416 } 3417 break; 3418 default: 3419 break; 3420 } 3421 break; 3422 case PICOPAM_DIR_BACK: 3423 /*do nothing*/ 3424 break; 3425 } 3426 break; 3427 case B18:/*processor for B18, B20, B21 unfied*/ 3428 switch (direction) { 3429 case PICOPAM_DIR_FORW:/*do nothing*/ 3430 break; 3431 case PICOPAM_DIR_BACK: 3432 switch (pam->b18_b20_b21_state) { 3433 case 0: 3434 if (event_type == PICOPAM_EVENT_SYLL) { 3435 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B18] 3436 = PICOPAM_DONT_CARE_VALUE; 3437 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 3438 == PICOPAM_DECLARATIVE) { 3439 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 3440 = pam->b18_b20_b21_syllable; 3441 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 3442 = PICOPAM_DONT_CARE_VALUE; 3443 } else { 3444 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 3445 = PICOPAM_DONT_CARE_VALUE; 3446 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 3447 = pam->b18_b20_b21_syllable; 3448 } 3449 pam->b18_b20_b21_syllable++; 3450 } 3451 if (((event_type == PICOPAM_EVENT_P_BOUND) 3452 || (event_type == PICOPAM_EVENT_S_BOUND)) 3453 && (pam->b18_b20_b21_syllable > 1)) { 3454 if (event_type == PICOPAM_EVENT_P_BOUND) 3455 pam->b18_b20_b21_syllable = 1; 3456 pam->b18_b20_b21_state = 1; 3457 } 3458 break; 3459 case 1: 3460 if (event_type == PICOPAM_EVENT_SYLL) { 3461 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B18] 3462 = pam->b18_b20_b21_syllable; 3463 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 3464 = PICOPAM_DONT_CARE_VALUE; 3465 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 3466 = PICOPAM_DONT_CARE_VALUE; 3467 pam->b18_b20_b21_syllable++; 3468 } 3469 if (event_type == PICOPAM_EVENT_P_BOUND) { 3470 pam->b18_b20_b21_syllable = 1; 3471 } 3472 break; 3473 default: 3474 break; 3475 } 3476 break; 3477 } 3478 break; 3479 case B19:/*processor for B19 : done in B17*/ 3480 break; 3481 case B20:/*processor for B20 : done in B18*/ 3482 break; 3483 case B21:/*processor for B21 : done in B18*/ 3484 break; 3485 case C3:/*processor for C3*/ 3486 switch (direction) { 3487 case PICOPAM_DIR_FORW: 3488 /*do nothing*/ 3489 break; 3490 case PICOPAM_DIR_BACK: 3491 if (event_type == PICOPAM_EVENT_SYLL) { 3492 if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 3493 == 1) || (pam->c3_primary_phrase_syllable >= 1)) { 3494 if (pam->c3_overall_syllable < 1) 3495 pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 3496 = 0; 3497 else 3498 pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 3499 = pam->sSyllFeats[pam->nCurrSyllable 3500 + 1].phoneV[B3]; 3501 } else { 3502 pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] = 0; 3503 } 3504 pam->c3_primary_phrase_syllable++; 3505 pam->c3_overall_syllable++; 3506 } 3507 if (event_type == PICOPAM_EVENT_P_BOUND) { 3508 pam->c3_primary_phrase_syllable = 0; 3509 } 3510 break; 3511 } 3512 break; 3513 case D2:/*processor for D2*/ 3514 switch (direction) { 3515 case PICOPAM_DIR_FORW: 3516 if (event_type == PICOPAM_EVENT_SYLL) { 3517 if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 3518 == 1) || (pam->d2_current_primary_phrase_word 3519 >= 1)) 3520 pam->sSyllFeats[pam->nCurrSyllable].phoneV[D2] 3521 = pam->d2_prev_syllable_in_word; 3522 else 3523 pam->sSyllFeats[pam->nCurrSyllable].phoneV[D2] = 0; 3524 3525 pam->d2_syllable_in_word++; 3526 } 3527 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3528 == PICOPAM_EVENT_S_BOUND) || (event_type 3529 == PICOPAM_EVENT_P_BOUND)) { 3530 pam->d2_current_primary_phrase_word = 1; 3531 pam->d2_prev_syllable_in_word 3532 = pam->d2_syllable_in_word; 3533 pam->d2_syllable_in_word = 0; 3534 /*pam->d2_current_primary_phrase_word++;*/ 3535 } 3536 if ((event_type == PICOPAM_EVENT_P_BOUND)) { 3537 pam->d2_current_primary_phrase_word = 0; 3538 } 3539 break; 3540 case PICOPAM_DIR_BACK: 3541 /*do nothing*/ 3542 break; 3543 } 3544 break; 3545 case E1:/*processor for E1*/ 3546 switch (direction) { 3547 case PICOPAM_DIR_FORW: /*remember : content syllable indicator already on P5*/ 3548 if (event_type == PICOPAM_EVENT_SYLL) { 3549 if (pam->e1_syllable_word_start == -1) 3550 pam->e1_syllable_word_start 3551 = (picoos_int8) pam->nCurrSyllable; 3552 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3553 pam->e1_content = 1; 3554 pam->e1_syllable_word_end 3555 = (picoos_int8) pam->nCurrSyllable; 3556 } 3557 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3558 == PICOPAM_EVENT_S_BOUND) || (event_type 3559 == PICOPAM_EVENT_P_BOUND)) { 3560 if ((pam->e1_syllable_word_start != -1) 3561 && (pam->e1_syllable_word_end != -1)) { 3562 for (nI = pam->e1_syllable_word_start; nI 3563 <= pam->e1_syllable_word_end; nI++) 3564 pam->sSyllFeats[nI].phoneV[E1] 3565 = pam->e1_content; 3566 } 3567 pam->e1_content = 0; 3568 pam->e1_syllable_word_start = -1; 3569 pam->e1_syllable_word_end = -1; 3570 } 3571 break; 3572 case PICOPAM_DIR_BACK: 3573 /*do nothing*/ 3574 break; 3575 } 3576 break; 3577 case E2:/*processor for E2*/ 3578 switch (direction) { 3579 case PICOPAM_DIR_FORW: 3580 if (event_type == PICOPAM_EVENT_SYLL) { 3581 if (pam->e2_syllable_word_start == -1) 3582 pam->e2_syllable_word_start 3583 = (picoos_int8) pam->nCurrSyllable; 3584 pam->e2_syllable_word_end 3585 = (picoos_int8) pam->nCurrSyllable; 3586 } 3587 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3588 == PICOPAM_EVENT_S_BOUND) || (event_type 3589 == PICOPAM_EVENT_P_BOUND)) { 3590 if ((pam->e2_syllable_word_start != -1) 3591 && (pam->e2_syllable_word_end != -1)) { 3592 for (nI = pam->e2_syllable_word_start; nI 3593 <= pam->e2_syllable_word_end; nI++) 3594 pam->sSyllFeats[nI].phoneV[E2] 3595 = pam->e2_syllable_word_end 3596 - pam->e2_syllable_word_start 3597 + 1; 3598 } 3599 pam->e1_content = 0; 3600 pam->e2_syllable_word_start = -1; 3601 pam->e2_syllable_word_end = -1; 3602 } 3603 break; 3604 case PICOPAM_DIR_BACK: 3605 break; 3606 } 3607 break; 3608 case E3:/*processor for E3,E4*/ 3609 switch (direction) { 3610 case PICOPAM_DIR_FORW: 3611 sDest = E3; 3612 break; 3613 case PICOPAM_DIR_BACK: 3614 sDest = E4; 3615 break; 3616 default: 3617 sDest = E3; 3618 break; 3619 } 3620 switch (pam->e3_e4_state) { 3621 case 0: 3622 if (event_type == PICOPAM_EVENT_SYLL) 3623 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3624 = PICOPAM_DONT_CARE_VALUE; 3625 if (event_type == PICOPAM_EVENT_S_BOUND) { 3626 pam->e3_e4_word = 1; 3627 pam->e3_e4_state = 1; 3628 } 3629 break; 3630 case 1: 3631 if (event_type == PICOPAM_EVENT_SYLL) 3632 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3633 = pam->e3_e4_word; 3634 if (event_type == PICOPAM_EVENT_S_BOUND) 3635 pam->e3_e4_word = 1; 3636 if (event_type == PICOPAM_EVENT_W_BOUND) 3637 pam->e3_e4_word++; 3638 if (event_type == PICOPAM_EVENT_P_BOUND) 3639 pam->e3_e4_state = 0; 3640 break; 3641 default: 3642 break; 3643 } 3644 break; 3645 case E4:/*processor for E4 : done in E3*/ 3646 break; 3647 case E5:/*processor for E5,E6*/ 3648 switch (direction) { 3649 case PICOPAM_DIR_FORW: 3650 sDest = E5; 3651 break; 3652 case PICOPAM_DIR_BACK: 3653 sDest = E6; 3654 break; 3655 default: 3656 sDest = E5; 3657 break; 3658 } 3659 if (event_type == PICOPAM_EVENT_SYLL) { 3660 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3661 = pam->e5_e6_content_word; 3662 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3663 pam->e5_e6_content = 1; 3664 } 3665 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3666 == PICOPAM_EVENT_S_BOUND) || (event_type 3667 == PICOPAM_EVENT_P_BOUND)) { 3668 if (pam->e5_e6_content == 1) 3669 pam->e5_e6_content_word++; 3670 pam->e5_e6_content = 0; 3671 if (event_type == PICOPAM_EVENT_P_BOUND) 3672 pam->e5_e6_content_word = 0; 3673 } 3674 break; 3675 case E6:/*processor for E6 : done in E5*/ 3676 break; 3677 case E7:/*processor for E7,E8*/ 3678 switch (direction) { 3679 case PICOPAM_DIR_FORW: 3680 sDest = E7; 3681 break; 3682 case PICOPAM_DIR_BACK: 3683 sDest = E8; 3684 break; 3685 default: 3686 sDest = E7; 3687 break; 3688 } 3689 switch (pam->e7_e8_state) { 3690 case 0: 3691 if (event_type == PICOPAM_EVENT_SYLL) { 3692 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3693 = PICOPAM_DONT_CARE_VALUE; 3694 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3695 pam->e7_e8_content = 1; 3696 } 3697 if (event_type == PICOPAM_EVENT_P_BOUND) { 3698 pam->e7_e8_content = 0; 3699 } 3700 3701 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3702 == PICOPAM_EVENT_S_BOUND)) { 3703 if (pam->e7_e8_content == 1) { 3704 pam->e7_e8_word = 0; 3705 pam->e7_e8_content = 0; 3706 pam->e7_e8_state = 1; 3707 } 3708 } 3709 break; 3710 case 1: 3711 if (event_type == PICOPAM_EVENT_SYLL) { 3712 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 3713 = pam->e7_e8_word; 3714 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] == 1) 3715 pam->e7_e8_content = 1; 3716 } 3717 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3718 == PICOPAM_EVENT_S_BOUND)) { 3719 if (pam->e7_e8_content == 1) { 3720 pam->e7_e8_word = 0; 3721 pam->e7_e8_content = 0; 3722 } else { 3723 pam->e7_e8_word++; 3724 } 3725 } 3726 if (event_type == PICOPAM_EVENT_P_BOUND) { 3727 pam->e7_e8_state = 0; 3728 pam->e7_e8_content = 0; /*<<<<<< added */ 3729 } 3730 3731 default: 3732 break; 3733 } 3734 break; 3735 case E8:/*processor for E8 : done in E7*/ 3736 break; 3737 case E9: 3738 /*processor for E9, E11*/ 3739 switch (direction) { 3740 case PICOPAM_DIR_FORW: 3741 switch (pam->e9_e11_state) { 3742 case 0: 3743 if (event_type == PICOPAM_EVENT_SYLL) { 3744 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 3745 = PICOPAM_DONT_CARE_VALUE; 3746 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 3747 = pam->e9_e11_word; 3748 pam->e9_e11_saw_word = 1; /*new variable, needs to be initialized to 0*/ 3749 } 3750 if (event_type == PICOPAM_EVENT_W_BOUND) 3751 pam->e9_e11_word++; 3752 if (((event_type == PICOPAM_EVENT_P_BOUND) 3753 || (event_type == PICOPAM_EVENT_S_BOUND)) 3754 && (pam->e9_e11_saw_word == 1)) { /* modified*/ 3755 if (event_type == PICOPAM_EVENT_P_BOUND) 3756 pam->e9_e11_word = 1; 3757 else 3758 pam->e9_e11_word++; /*modified*/ 3759 pam->e9_e11_state = 1; 3760 } 3761 break; 3762 case 1: 3763 if (event_type == PICOPAM_EVENT_SYLL) { 3764 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 3765 = pam->e9_e11_word; 3766 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 3767 = PICOPAM_DONT_CARE_VALUE; 3768 } 3769 if ((event_type == PICOPAM_EVENT_W_BOUND) 3770 || (event_type == PICOPAM_EVENT_S_BOUND)) 3771 pam->e9_e11_word++; 3772 if (event_type == PICOPAM_EVENT_P_BOUND) 3773 pam->e9_e11_word = 1; 3774 break; 3775 default: 3776 break; 3777 } 3778 break; 3779 case PICOPAM_DIR_BACK: 3780 /*do nothing*/ 3781 break; 3782 } 3783 break; 3784 case E10:/*processor for E10, E12, E13 unified*/ 3785 switch (direction) { 3786 case PICOPAM_DIR_FORW:/*do nothing*/ 3787 break; 3788 case PICOPAM_DIR_BACK: 3789 switch (pam->e10_e12_e13_state) { 3790 case 0: 3791 if (event_type == PICOPAM_EVENT_SYLL) { 3792 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E10] 3793 = PICOPAM_DONT_CARE_VALUE; 3794 pam->e10_e12_e13_saw_word = 1; 3795 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 3796 == PICOPAM_DECLARATIVE) { 3797 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 3798 = pam->e10_e12_e13_word; 3799 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 3800 = PICOPAM_DONT_CARE_VALUE; 3801 } else { 3802 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 3803 = PICOPAM_DONT_CARE_VALUE; 3804 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 3805 = pam->e10_e12_e13_word; 3806 } 3807 } 3808 if (event_type == PICOPAM_EVENT_W_BOUND) 3809 pam->e10_e12_e13_word++; 3810 3811 /*if (((event_type==PICOPAM_EVENT_P_BOUND)||(event_type==PICOPAM_EVENT_S_BOUND))&&(pam->e10_e12_e13_word>1)) {*/ 3812 if (((event_type == PICOPAM_EVENT_P_BOUND) 3813 || (event_type == PICOPAM_EVENT_S_BOUND)) 3814 && (pam->e10_e12_e13_saw_word > 0)) { 3815 if (event_type == PICOPAM_EVENT_P_BOUND) 3816 pam->e10_e12_e13_word = 1; 3817 else 3818 pam->e10_e12_e13_word++; 3819 pam->e10_e12_e13_state = 1; 3820 } 3821 break; 3822 case 1: 3823 if (event_type == PICOPAM_EVENT_SYLL) { 3824 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E10] 3825 = pam->e10_e12_e13_word; 3826 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 3827 = PICOPAM_DONT_CARE_VALUE; 3828 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 3829 = PICOPAM_DONT_CARE_VALUE; 3830 } 3831 if ((event_type == PICOPAM_EVENT_W_BOUND) 3832 || (event_type == PICOPAM_EVENT_S_BOUND)) 3833 pam->e10_e12_e13_word++; 3834 if (event_type == PICOPAM_EVENT_P_BOUND) 3835 pam->e10_e12_e13_word = 1; 3836 break; 3837 default: 3838 break; 3839 } 3840 break; 3841 } 3842 break; 3843 3844 case E11:/*processor for E11 : done in E9*/ 3845 break; 3846 case E12:/*processor for E12 : done in E10*/ 3847 break; 3848 case E13:/*processor for E13 : done in E10*/ 3849 break; 3850 3851 case F2: 3852 switch (direction) { 3853 case PICOPAM_DIR_FORW:/*do nothing*/ 3854 break; 3855 case PICOPAM_DIR_BACK: 3856 if (event_type == PICOPAM_EVENT_SYLL) { 3857 if (pam->f2_current_primary_phrase_word >= 1)/*at least second word in current primary phrase*/ 3858 pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] 3859 = pam->f2_next_word_syllable; 3860 else 3861 /*first word in current primary phrase*/ 3862 pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] = 0; 3863 pam->f2_word_syllable++; 3864 } 3865 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3866 == PICOPAM_EVENT_S_BOUND) || (event_type 3867 == PICOPAM_EVENT_P_BOUND)) {/*word - end : switch*/ 3868 pam->f2_next_word_syllable = pam->f2_word_syllable; 3869 pam->f2_word_syllable = 0; 3870 } 3871 if (event_type == PICOPAM_EVENT_P_BOUND)/*mark first word in current primary phrase*/ 3872 pam->f2_current_primary_phrase_word = 0; 3873 else /*mark next word in current primary phrase(enables output in PICOPAM_EVENT_SYLL)*/ 3874 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 3875 == PICOPAM_EVENT_S_BOUND)) 3876 pam->f2_current_primary_phrase_word++; 3877 break; 3878 } 3879 break; 3880 case G1: 3881 switch (direction) { 3882 case PICOPAM_DIR_FORW: 3883 if (event_type == PICOPAM_EVENT_SYLL) { 3884 if (pam->g1_current_secondary_phrase_syllable > 0) 3885 pam->sSyllFeats[pam->nCurrSyllable].phoneV[G1] 3886 = pam->g1_current_secondary_phrase_syllable; 3887 else 3888 pam->sSyllFeats[pam->nCurrSyllable].phoneV[G1] = 0; 3889 pam->g1_current_syllable++; 3890 } 3891 if (event_type == PICOPAM_EVENT_S_BOUND) { 3892 pam->g1_current_secondary_phrase_syllable 3893 = pam->g1_current_syllable; 3894 pam->g1_current_syllable = 0; 3895 } 3896 if (event_type == PICOPAM_EVENT_P_BOUND) { 3897 pam->g1_current_secondary_phrase_syllable = 0; 3898 pam->g1_current_syllable = 0; 3899 } 3900 case PICOPAM_DIR_BACK: /*do nothing*/ 3901 break; 3902 } 3903 break; 3904 case G2: 3905 switch (direction) { 3906 case PICOPAM_DIR_FORW: 3907 if (event_type == PICOPAM_EVENT_SYLL) { 3908 if (pam->g2_current_secondary_phrase_word > 0) 3909 pam->sSyllFeats[pam->nCurrSyllable].phoneV[G2] 3910 = pam->g2_current_secondary_phrase_word; 3911 else 3912 pam->sSyllFeats[pam->nCurrSyllable].phoneV[G2] = 0; 3913 } 3914 if (event_type == PICOPAM_EVENT_W_BOUND) 3915 pam->g2_current_word++; 3916 3917 if (event_type == PICOPAM_EVENT_S_BOUND) { 3918 pam->g2_current_secondary_phrase_word 3919 = pam->g2_current_word + 1; 3920 pam->g2_current_word = 0; 3921 } 3922 if (event_type == PICOPAM_EVENT_P_BOUND) { 3923 pam->g2_current_secondary_phrase_word = 0; 3924 pam->g2_current_word = 0; 3925 } 3926 break; 3927 case PICOPAM_DIR_BACK: /*do nothing*/ 3928 break; 3929 } 3930 break; 3931 case H1: 3932 switch (direction) { 3933 case PICOPAM_DIR_FORW: 3934 if (event_type == PICOPAM_EVENT_SYLL) { 3935 pam->h1_current_secondary_phrase_syll++; 3936 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 3937 = pam->h1_current_secondary_phrase_syll; 3938 } 3939 if ((event_type == PICOPAM_EVENT_S_BOUND) || (event_type 3940 == PICOPAM_EVENT_P_BOUND)) 3941 pam->h1_current_secondary_phrase_syll = 0; 3942 break; 3943 case PICOPAM_DIR_BACK: 3944 if (event_type == PICOPAM_EVENT_SYLL) 3945 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 3946 = pam->h1_current_secondary_phrase_syll; 3947 if (event_type == PICOPAM_EVENT_S_BOUND) 3948 pam->h1_current_secondary_phrase_syll 3949 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1]; 3950 if (event_type == PICOPAM_EVENT_P_BOUND) 3951 pam->h1_current_secondary_phrase_syll 3952 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H1]; 3953 break; 3954 } 3955 break; 3956 case H2: 3957 switch (direction) { 3958 case PICOPAM_DIR_FORW: 3959 if (event_type == PICOPAM_EVENT_SYLL) { 3960 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3961 = pam->h2_current_secondary_phrase_word; 3962 } 3963 if (event_type == PICOPAM_EVENT_W_BOUND) { 3964 pam->h2_current_secondary_phrase_word++; 3965 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3966 = pam->h2_current_secondary_phrase_word; 3967 } 3968 if (event_type == PICOPAM_EVENT_S_BOUND) { 3969 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3970 = pam->h2_current_secondary_phrase_word + 1; 3971 pam->h2_current_secondary_phrase_word = 0; 3972 } 3973 if (event_type == PICOPAM_EVENT_P_BOUND) { 3974 if (pam->nCurrSyllable > 1) 3975 pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2] 3976 = pam->h2_current_secondary_phrase_word + 1; 3977 pam->h2_current_secondary_phrase_word = 0; 3978 } 3979 break; 3980 case PICOPAM_DIR_BACK: 3981 if (event_type == PICOPAM_EVENT_SYLL) 3982 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 3983 = pam->h2_current_secondary_phrase_word; 3984 if (event_type == PICOPAM_EVENT_S_BOUND) 3985 pam->h2_current_secondary_phrase_word 3986 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2]; 3987 if (event_type == PICOPAM_EVENT_P_BOUND) 3988 pam->h2_current_secondary_phrase_word 3989 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2]; 3990 break; 3991 } 3992 break; 3993 case H3:/*processor for H3,H4 unified */ 3994 switch (direction) { 3995 case PICOPAM_DIR_FORW: 3996 sDest = H3; 3997 break; 3998 case PICOPAM_DIR_BACK: 3999 sDest = H4; 4000 break; 4001 default: 4002 sDest = H3; 4003 break; 4004 } 4005 if (event_type == PICOPAM_EVENT_SYLL) { 4006 pam->sSyllFeats[pam->nCurrSyllable].phoneV[sDest] 4007 = pam->h3_h4_current_secondary_phrase_word; 4008 } 4009 if ((event_type == PICOPAM_EVENT_S_BOUND) || (event_type 4010 == PICOPAM_EVENT_P_BOUND)) 4011 pam->h3_h4_current_secondary_phrase_word++; 4012 break; 4013 case H4: /*processor for H4 : already in H3*/ 4014 break; 4015 4016 case H5:/*processor for H5*/ 4017 switch (direction) { 4018 case PICOPAM_DIR_FORW: 4019 break; 4020 case PICOPAM_DIR_BACK: 4021 switch (pam->h5_state) { 4022 case 0: 4023 if (event_type == PICOPAM_EVENT_SYLL) 4024 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] 4025 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5]; 4026 if (event_type == PICOPAM_EVENT_S_BOUND) { 4027 pam->h5_state = 1; 4028 } 4029 break; 4030 case 1: 4031 if (event_type == PICOPAM_EVENT_SYLL) { 4032 if ((pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] 4033 == PICOPAM_P) 4034 && (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] 4035 == 0)) 4036 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] 4037 = PICOPAM_p; 4038 } 4039 if (event_type == PICOPAM_EVENT_P_BOUND) { 4040 pam->h5_state = 0; 4041 } 4042 break; 4043 default: 4044 break; 4045 } 4046 break; 4047 4048 default: 4049 break; 4050 } 4051 break; 4052 4053 case I1:/*processor for I1*/ 4054 switch (direction) { 4055 case PICOPAM_DIR_FORW: 4056 if (event_type == PICOPAM_EVENT_SYLL) { 4057 pam->i1_secondary_phrase_syllable++; 4058 pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4059 = pam->i1_secondary_phrase_syllable; 4060 } 4061 if ((event_type == PICOPAM_EVENT_S_BOUND) || (event_type 4062 == PICOPAM_EVENT_P_BOUND)) 4063 pam->i1_secondary_phrase_syllable = 0; 4064 break; 4065 case PICOPAM_DIR_BACK: 4066 if (event_type == PICOPAM_EVENT_SYLL) { 4067 pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4068 = pam->i1_next_secondary_phrase_syllable; 4069 } 4070 if (event_type == PICOPAM_EVENT_S_BOUND) { 4071 pam->i1_next_secondary_phrase_syllable 4072 = pam->i1_secondary_phrase_syllable; 4073 pam->i1_secondary_phrase_syllable 4074 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1]; 4075 } 4076 if (event_type == PICOPAM_EVENT_P_BOUND) { 4077 pam->i1_next_secondary_phrase_syllable = 0; 4078 pam->i1_secondary_phrase_syllable 4079 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[I1]; 4080 } 4081 break; 4082 } 4083 break; 4084 case I2: /*processor for I2*/ 4085 switch (direction) { 4086 case PICOPAM_DIR_FORW: 4087 if (event_type == PICOPAM_EVENT_SYLL) { 4088 pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4089 = pam->i2_secondary_phrase_word; 4090 } 4091 if (event_type == PICOPAM_EVENT_W_BOUND) 4092 pam->i2_secondary_phrase_word++; 4093 4094 if ((event_type == PICOPAM_EVENT_P_BOUND) || (event_type 4095 == PICOPAM_EVENT_S_BOUND)) 4096 pam->i2_secondary_phrase_word = 1; 4097 4098 break; 4099 case PICOPAM_DIR_BACK: 4100 if (event_type == PICOPAM_EVENT_SYLL) { 4101 pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4102 = pam->i2_next_secondary_phrase_word; 4103 } 4104 if (event_type == PICOPAM_EVENT_S_BOUND) { 4105 pam->i2_next_secondary_phrase_word 4106 = pam->i2_secondary_phrase_word; 4107 pam->i2_secondary_phrase_word 4108 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2]; 4109 } 4110 if (event_type == PICOPAM_EVENT_P_BOUND) { 4111 pam->i2_next_secondary_phrase_word = 0; 4112 pam->i2_secondary_phrase_word 4113 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[I2]; 4114 } 4115 break; 4116 } 4117 break; 4118 case J1: /*processor for J1 */ 4119 switch (direction) { 4120 case PICOPAM_DIR_FORW: 4121 if (event_type == PICOPAM_EVENT_SYLL) { 4122 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] != 1) 4123 pam->j1_utterance_syllable++; 4124 } 4125 break; 4126 case PICOPAM_DIR_BACK: 4127 pam->sSyllFeats[pam->nCurrSyllable].phoneV[J1] 4128 = pam->j1_utterance_syllable; 4129 break; 4130 } 4131 break; 4132 case J2: /*processor for J2*/ 4133 switch (direction) { 4134 case PICOPAM_DIR_FORW: 4135 if ((event_type == PICOPAM_EVENT_W_BOUND) || (event_type 4136 == PICOPAM_EVENT_S_BOUND) || (event_type 4137 == PICOPAM_EVENT_P_BOUND)) 4138 pam->j2_utterance_word++; 4139 break; 4140 case PICOPAM_DIR_BACK: 4141 pam->sSyllFeats[pam->nCurrSyllable].phoneV[J2] 4142 = pam->j2_utterance_word - 1; 4143 break; 4144 } 4145 break; 4146 case J3: /*processor for J3*/ 4147 switch (direction) { 4148 case PICOPAM_DIR_FORW: 4149 if (event_type == PICOPAM_EVENT_S_BOUND) { 4150 pam->j3_utterance_sec_phrases++; 4151 break; 4152 } 4153 if (event_type == PICOPAM_EVENT_P_BOUND) { 4154 pam->j3_utterance_sec_phrases++; 4155 break; 4156 } 4157 break; 4158 case PICOPAM_DIR_BACK: 4159 pam->sSyllFeats[pam->nCurrSyllable].phoneV[J3] 4160 = pam->j3_utterance_sec_phrases - 1; 4161 break; 4162 } 4163 break; 4164 } 4165 return PICO_OK; 4166}/*pam_process_event_feature*/ 4167 4168/** 4169 * processes an input event spanning it to all column features 4170 * @param this : pointer to PAM PU sub object pointer 4171 * @param event_type : event id among syll/boundprim/boundsec/boundword 4172 * @param direction : forward(0)/backward(1) 4173 * @return PICO_OK : process OK 4174 * @return PICO_ERR_OTHER : errors on getting pam sub obj pointer 4175 * @callgraph 4176 * @callergraph 4177 */ 4178static pico_status_t pam_process_event(register picodata_ProcessingUnit this, 4179 picoos_uint8 event_type, picoos_uint8 direction) 4180{ 4181 picoos_uint8 nFeat; 4182 pico_status_t nResult; 4183 4184 pam_subobj_t *pam; 4185 if (NULL == this || NULL == this->subObj) { 4186 return PICO_ERR_OTHER; 4187 } 4188 pam = (pam_subobj_t *) this->subObj; 4189 4190 if (direction == PICOPAM_DIR_FORW) { 4191 if (event_type == PICOPAM_EVENT_P_BOUND) 4192 /*primary boundary*/ 4193 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P2] = 1; 4194 if (event_type == PICOPAM_EVENT_S_BOUND) 4195 /*secondary boundary*/ 4196 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P3] = 1; 4197 if (event_type == PICOPAM_EVENT_W_BOUND) 4198 /*word boundary*/ 4199 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P4] = 1; 4200 } 4201 for (nFeat = A3; nFeat <= J3; nFeat++) { 4202 nResult = pam_process_event_feature(this, nFeat, event_type, direction); 4203 if (nResult != PICO_OK) 4204 return nResult; 4205 } 4206 return PICO_OK; 4207}/*pam_process_event*/ 4208 4209/** 4210 * inserts a syllable inside the subobj sentence data struct. 4211 * @param this : pointer to PAM PU sub object pointer 4212 * @param syllType : the syllable type (pause/syllable) 4213 * @param sContent : the item content 4214 * @param sentType : the sentence type 4215 * @param phType : the phrase type 4216 * @param uBoundType : the boundary type (only for silence syllables) 4217 * @param uMinDur, uMaxDur : the mimimum and maximum duration (only for silence syllables) 4218 * @return PICO_OK : syllable creation successful 4219 * @return PICO_ERR_OTHER : errors in one internal function (check_phones_size..) 4220 * @callgraph 4221 * @callergraph 4222 */ 4223static pico_status_t pam_create_syllable(register picodata_ProcessingUnit this, 4224 picoos_uint8 syllType, picoos_uint8 *sContent, picoos_uint8 sentType, 4225 picoos_uint8 phType, picoos_uint8 uBoundType, picoos_uint16 uMinDur, 4226 picoos_uint16 uMaxDur) 4227{ 4228 pam_subobj_t *pam; 4229 picoos_uint8 nI; 4230 picoos_uint8 pos; 4231 /* picoos_uint8 *npUi16; */ 4232 picoos_uint32 pos32; 4233 4234 if (NULL == this || NULL == this->subObj) { 4235 return PICO_ERR_OTHER; 4236 } 4237 pam = (pam_subobj_t *) this->subObj; 4238 pos = 0; 4239 /*check buffer full condition on number of syllables*/ 4240 if (check_syllables_size(pam, 1) != PICO_OK) { 4241 return PICO_ERR_OTHER; 4242 } 4243 4244 if (syllType == PICOPAM_SYLL_PAUSE) { 4245 /*check buffer full condition on number of phonemes*/ 4246 if (check_phones_size(pam, 1) != PICO_OK) { 4247 return PICO_ERR_OTHER; 4248 } 4249 } 4250 if (syllType == PICOPAM_SYLL_SYLL) { 4251 /*check item availability*/ 4252 if (sContent == NULL) { 4253 return PICO_ERR_OTHER; 4254 } 4255 /*check buffer full condition on number of phonemes*/ 4256 if (check_phones_size(pam, sContent[3]) != PICO_OK) { 4257 return PICO_ERR_OTHER; 4258 } 4259 } 4260 4261 /*open new syllable*/ 4262 pam->nCurrSyllable = pam->nCurrSyllable + 1; 4263 /*cleanup*/ 4264 for (nI = 0; nI < PICOPAM_VECT_SIZE; nI++) { 4265 if (pam->nCurrSyllable > 0) { 4266 pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] = 0; 4267 } else { 4268 if ((nI >= ITM) && (nI <= itm)) { 4269 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] > 0) { 4270 /*do not cleanup "attached item offset" fields (ITM, itm): 4271 an already existing attached item could be lost*/ 4272 } else { 4273 /*cleanup "attached item offset"*/ 4274 pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] = 0; 4275 } 4276 } else { 4277 /*cleanup all fields except "attached item offset" (ITM, itm)*/ 4278 pam->sSyllFeats[pam->nCurrSyllable].phoneV[nI] = 0; 4279 } 4280 } 4281 } 4282 /*set minimum and maximum duration values*/ 4283 if ((uMinDur == 0) && (uMaxDur == 0) && (syllType == PICOPAM_SYLL_PAUSE)) { 4284 /*both 0 : use default duration limits for boundaries*/ 4285 get_default_boundary_limit(uBoundType, &uMinDur, &uMaxDur); 4286 } 4287 if (uMinDur > 0) { 4288 pos32 = Min; 4289 picoos_write_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 4290 &pos32, uMinDur); 4291 } 4292 if (uMaxDur > 0) { 4293 pos32 = Max; 4294 picoos_write_mem_pi_uint16(pam->sSyllFeats[pam->nCurrSyllable].phoneV, 4295 &pos32, uMaxDur); 4296 } 4297 /*END OF BREAK COMMAND SUPPORT*/ 4298 4299 if (syllType == PICOPAM_SYLL_PAUSE) { 4300 /*initialize a pause syllable*/ 4301 if (sentType == PICOPAM_DECLARATIVE) 4302 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4303 = PICOPAM_DECLARATIVE; 4304 if (sentType == PICOPAM_INTERROGATIVE) 4305 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4306 = PICOPAM_INTERROGATIVE; 4307 4308 pam->sSyllFeats[pam->nCurrSyllable].phoneV[bnd] = uBoundType; 4309 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P1] = 1; /*this means the syllable contains a pause-silence*/ 4310 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P8] = 1; 4311 4312 /*b1,b2,b9,b11,b13,b15,e1,e6,e8,e10 already set to 0*/ 4313 4314 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] 4315 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B4] 4316 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B5] 4317 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B6] 4318 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B7] 4319 = 1; 4320 4321 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B16] 4322 = PICOPAM_PH_DONT_CARE_VAL; /*name of the vowel in the syllable = NONE */ 4323 4324 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E2] 4325 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E3] 4326 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E4] = 1; 4327 4328 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] = phType; 4329 4330 /*Store current phonetic codes in input phonetic string*/ 4331 pam->sPhIds[pam->nCurrPhoneme] = pam_get_pause_id(this); 4332 picoos_mem_copy((void*) &pam->nCurrPhoneme, 4333 &(pam->sSyllFeats[pam->nCurrSyllable].phoneV[FID]), 4334 sizeof(pam->nCurrPhoneme)); 4335 pam->nCurrPhoneme++; 4336 pam->nTotalPhonemes++; 4337 /*add 1 to total number of syllables*/ 4338 pam->nTotalSyllables++; 4339 4340 return PICO_OK; 4341 } 4342 if (syllType == PICOPAM_SYLL_SYLL) { 4343 /*initialize a real syllable*/ 4344 if (sContent[2] > PICODATA_ACC0) 4345 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P5] = 1; /*set content syllable indicator*/ 4346 if (sentType == PICOPAM_DECLARATIVE) 4347 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4348 = PICOPAM_DECLARATIVE; 4349 if (sentType == PICOPAM_INTERROGATIVE) 4350 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P6] 4351 = PICOPAM_INTERROGATIVE; 4352 4353 if ((sContent[2] >= PICODATA_ACC1) && (sContent[2] <= PICODATA_ACC4)) 4354 /*stressed*/ 4355 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B1] = 1; 4356 4357 if ((sContent[2] >= PICODATA_ACC1) && (sContent[2] <= PICODATA_ACC2)) 4358 /*accented*/ 4359 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B2] = 1; 4360 4361 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B3] = sContent[3];/*len*/ 4362 4363 if (pam->nCurrSyllable > 30) 4364 pam->nCurrSyllable = pam->nCurrSyllable; 4365 4366 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B16] = pam_get_vowel_name(this, 4367 sContent, &pos); /*name of the vowel in the syllable*/ 4368 4369 pam->sSyllFeats[pam->nCurrSyllable].phoneV[P8] = pos; /*temp for storing the position of the vowel*/ 4370 4371 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] = phType; 4372 4373 /*Store current phonetic codes in input phonetic string*/ 4374 picoos_mem_copy((void*) &pam->nCurrPhoneme, 4375 &(pam->sSyllFeats[pam->nCurrSyllable].phoneV[FID]), 4376 sizeof(pam->nCurrPhoneme)); 4377 for (nI = 0; nI < sContent[3]; nI++) 4378 pam->sPhIds[pam->nCurrPhoneme + nI] = sContent[4 + nI]; 4379 pam->nCurrPhoneme += nI; 4380 pam->nTotalPhonemes += nI; 4381 /*add 1 to total number of syllables*/ 4382 pam->nTotalSyllables++; 4383 return PICO_OK; 4384 } 4385 /*if no SyllType has been identified -->> error*/ 4386 return PICO_ERR_OTHER; 4387}/*pam_create_syllable*/ 4388 4389/** 4390 * performs the forward step of the PAM adapter 4391 * @param this : pointer to PAM PU sub object pointer 4392 * @param itemBase : pointer to current item 4393 * @return PICOPAM_READY : forward step ok, the sentence is complete 4394 * @return PICOPAM_MORE : forward step ok, but more data needed to complete the sentence 4395 * @return PICO_ERR_OTHER : errors in one internal function (CreateSyllable..) 4396 * @callgraph 4397 * @callergraph 4398 */ 4399static pico_status_t pam_adapter_forward_step( 4400 register picodata_ProcessingUnit this, picoos_uint8 *itemBase) 4401{ 4402 register pam_subobj_t * pam; 4403 pico_status_t sResult; 4404 picoos_uint16 uMinDur, uMaxDur; 4405 picoos_uint32 nPos; 4406 4407 if (NULL == this || NULL == this->subObj) { 4408 return PICO_ERR_OTHER; 4409 } 4410 pam = (pam_subobj_t *) this->subObj; 4411 uMinDur = uMaxDur = 0; /*default 0 : not initialized*/ 4412 switch (itemBase[0]) { 4413 case PICODATA_ITEM_BOUND: 4414 /*received a boundary item*/ 4415 switch (itemBase[1]) { 4416 case PICODATA_ITEMINFO1_BOUND_SBEG: 4417 case PICODATA_ITEMINFO1_BOUND_PHR1: 4418#ifdef PAM_PHR2_WITH_PR1 4419 case PICODATA_ITEMINFO1_BOUND_PHR2: 4420#endif 4421 case PICODATA_ITEMINFO1_BOUND_SEND: 4422 case PICODATA_ITEMINFO1_BOUND_TERM: 4423 if (itemBase[3] == 2 * sizeof(picoos_uint16)) { 4424 /*only when the item len duration is equal to 2 int16 --> get the values*/ 4425 nPos = 4; 4426 picoos_read_mem_pi_uint16(itemBase, &nPos, &uMinDur); 4427 picoos_read_mem_pi_uint16(itemBase, &nPos, &uMaxDur); 4428 } 4429 break; 4430 default: 4431 break; 4432 } 4433 switch (itemBase[1]) { 4434 case PICODATA_ITEMINFO1_BOUND_SBEG: 4435 /* received a sentence init boundary */ 4436 pam_reset_processors(this); /*reset all processor variables*/ 4437 pam->sType 4438 = pam_map_sentence_type(itemBase[1], itemBase[2]); 4439 pam->pType = pam_map_phrase_type(itemBase[1], itemBase[2]); 4440 /*create silence syll and process P_BOUND event*/ 4441 sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4442 pam->sType, pam->pType, itemBase[1], uMinDur, 4443 uMaxDur); 4444 if (sResult != PICO_OK) 4445 return sResult; 4446 sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4447 PICOPAM_DIR_FORW); 4448 if (sResult != PICO_OK) 4449 return sResult; 4450 return PICOPAM_MORE; 4451 break; 4452 4453 case PICODATA_ITEMINFO1_BOUND_PHR1: 4454#ifdef PAM_PHR2_WITH_PR1 4455 case PICODATA_ITEMINFO1_BOUND_PHR2: 4456#endif 4457 /*received a primary boundary*/ 4458 pam->sType 4459 = pam_map_sentence_type(itemBase[1], itemBase[2]); 4460 pam->pType = pam_map_phrase_type(itemBase[1], itemBase[2]); 4461 /*create silence syll and process P_BOUND event*/ 4462 sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4463 pam->sType, pam->pType, itemBase[1], uMinDur, 4464 uMaxDur); 4465 if (sResult != PICO_OK) 4466 return sResult; 4467 sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4468 PICOPAM_DIR_FORW); 4469 if (sResult != PICO_OK) 4470 return sResult; 4471 return PICOPAM_MORE; 4472 break; 4473 4474#ifdef PAM_PHR2_WITH_PR3 4475 case PICODATA_ITEMINFO1_BOUND_PHR2 : 4476#endif 4477 case PICODATA_ITEMINFO1_BOUND_PHR3: 4478 /*received a secondary boundary*/ 4479 /*process S_BOUND event*/ 4480 sResult = pam_process_event(this, PICOPAM_EVENT_S_BOUND, 4481 PICOPAM_DIR_FORW); 4482 /*determine new sentence and Phrase types for following syllables*/ 4483 pam->sType 4484 = pam_map_sentence_type(itemBase[1], itemBase[2]); 4485 pam->pType = pam_map_phrase_type(itemBase[1], itemBase[2]); 4486 if (sResult != PICO_OK) 4487 return sResult; 4488 return PICOPAM_MORE; 4489 break; 4490 4491 case PICODATA_ITEMINFO1_BOUND_PHR0: 4492 /*received a word end boundary*/ 4493 /*process W_BOUND event*/ 4494 sResult = pam_process_event(this, PICOPAM_EVENT_W_BOUND, 4495 PICOPAM_DIR_FORW); 4496 if (sResult != PICO_OK) 4497 return sResult; 4498 return PICOPAM_MORE; 4499 break; 4500 4501 case PICODATA_ITEMINFO1_BOUND_SEND: 4502 /*received a SEND boundary*/ 4503 /*insert a new silence syllable and process P_BOUND event*/ 4504 /*create silence syll and process P_BOUND event*/ 4505 sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4506 pam->sType, pam->pType, itemBase[1], uMinDur, 4507 uMaxDur); 4508 if (sResult != PICO_OK) 4509 return sResult; 4510 sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4511 PICOPAM_DIR_FORW); 4512 if (sResult != PICO_OK) 4513 return sResult; 4514 return PICOPAM_READY; 4515 break; 4516 4517 case PICODATA_ITEMINFO1_BOUND_TERM: 4518 /* received a flush boundary*/ 4519 if (pam->nCurrSyllable == -1) { 4520 return PICOPAM_NA; 4521 } 4522 /*insert a new silence syllable and process P_BOUND event*/ 4523 /*create silence syll and process P_BOUND event*/ 4524 sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4525 pam->sType, pam->pType, itemBase[1], uMinDur, 4526 uMaxDur); 4527 if (sResult != PICO_OK) 4528 return sResult; 4529 sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4530 PICOPAM_DIR_FORW); 4531 if (sResult != PICO_OK) 4532 return sResult; 4533 return PICOPAM_READY; 4534 break; 4535 4536 default: 4537 /*boundary type not known*/ 4538 return PICOPAM_NA; 4539 break; 4540 }/*end switch (itemBase[1])*/ 4541 break; /*end case PICODATA_ITEM_BOUND*/ 4542 4543 case PICODATA_ITEM_SYLLPHON: 4544 /*received a syllable item*/ 4545 /* ------------------------------------------------------------------ 4546 following code has to be used if we do expect 4547 SYLL items arrive even without SBEG items starting the sentence. 4548 this may happen after a term has been issued to make room in local storage. 4549 */ 4550 if (pam->nCurrSyllable == -1) { 4551 pam_reset_processors(this); 4552 /*insert an SBEG with sType and pType taken from previous sentence*/ 4553 sResult = pam_create_syllable(this, PICOPAM_SYLL_PAUSE, NULL, 4554 pam->sType, pam->pType, PICODATA_ITEMINFO1_BOUND_SBEG, 4555 0, 0); 4556 if (sResult != PICO_OK) 4557 return sResult; 4558 sResult = pam_process_event(this, PICOPAM_EVENT_P_BOUND, 4559 PICOPAM_DIR_FORW); 4560 if (sResult != PICO_OK) 4561 return sResult; 4562 } 4563 /* ------------------------------------------------------------------*/ 4564 sResult = pam_create_syllable(this, PICOPAM_SYLL_SYLL, itemBase, 4565 pam->sType, pam->pType, 0, 0, 0); 4566 if (sResult != PICO_OK) 4567 return sResult; 4568 sResult = pam_process_event(this, PICOPAM_EVENT_SYLL, 4569 PICOPAM_DIR_FORW); 4570 if (sResult != PICO_OK) 4571 return sResult; 4572 return PICOPAM_MORE; 4573 break; 4574 4575 default: 4576 return PICOPAM_NA; 4577 break; 4578 } 4579 return PICO_ERR_OTHER; 4580}/*pam_adapter_forward_step*/ 4581 4582/** 4583 * performs the backward step of the PAM adapter 4584 * @param this : pointer to PAM PU sub object pointer 4585 * @return PICO_OK : backward step complete 4586 * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 4587 * @remarks derived in some parts from the pam forward code 4588 * @callgraph 4589 * @callergraph 4590 */ 4591static pico_status_t pam_adapter_backward_step( 4592 register picodata_ProcessingUnit this) 4593{ 4594 register pam_subobj_t * pam; 4595 picoos_uint8 nProcessed; 4596 picoos_uint16 nSyll; 4597 4598 if (NULL == this || NULL == this->subObj) { 4599 return PICO_ERR_OTHER; 4600 } 4601 pam = (pam_subobj_t *) this->subObj; 4602 4603 /*Resets the processors for the backward step*/ 4604 pam_reset_processors_back(this); 4605 /*Do the backward step*/ 4606 nSyll = pam->nCurrSyllable; 4607 while (pam->nCurrSyllable >= 0) { 4608 nProcessed = 0; 4609 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P2] == 1) { 4610 /*primary boundary*/ 4611 pam_process_event(this, PICOPAM_EVENT_P_BOUND, PICOPAM_DIR_BACK); 4612 pam->nCurrSyllable--; 4613 nProcessed = 1; 4614 } 4615 if ((nProcessed == 0) 4616 && (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P3] == 1)) { 4617 /*secondary boundary*/ 4618 pam_process_event(this, PICOPAM_EVENT_S_BOUND, PICOPAM_DIR_BACK); 4619 pam_process_event(this, PICOPAM_EVENT_SYLL, PICOPAM_DIR_BACK); 4620 pam->nCurrSyllable--; 4621 nProcessed = 1; 4622 } 4623 if ((nProcessed == 0) 4624 && (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P4] == 1)) { 4625 /*word boundary*/ 4626 pam_process_event(this, PICOPAM_EVENT_W_BOUND, PICOPAM_DIR_BACK); 4627 pam_process_event(this, PICOPAM_EVENT_SYLL, PICOPAM_DIR_BACK); 4628 pam->nCurrSyllable--; 4629 nProcessed = 1; 4630 } 4631 if (nProcessed == 0) { 4632 /*non boundaried syllable*/ 4633 pam_process_event(this, PICOPAM_EVENT_SYLL, PICOPAM_DIR_BACK); 4634 pam->nCurrSyllable--; 4635 nProcessed = 0; 4636 } 4637 }/*end while (pam->nCurrSyllable>=0)*/ 4638 /*reset syllpointer to original value*/ 4639 pam->nCurrSyllable = nSyll; 4640 /*Perform pause processing*/ 4641 pam_adapter_do_pauses(this); 4642 pam->nCurrSyllable = 0; 4643 pam->nSyllPhoneme = 0; 4644 4645 return PICO_OK; 4646}/*pam_adapter_backward_step*/ 4647 4648/** 4649 * processes a pause (silence) syllable after backward processing 4650 * @param this : pointer to PAM PU sub object pointer : processes a pause (silence) syllable after backward processing 4651 * @return PICO_OK : backward step complete 4652 * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 4653 * @remarks pam->nCurrSyllable should point to a pause item 4654 * @remarks this function should be called after backward processing 4655 * @remarks this function corresponds to initializing silence phonemes with 4656 * @remarks values derived from previous or following syllables 4657 * @callgraph 4658 * @callergraph 4659 */ 4660static pico_status_t pam_do_pause(register picodata_ProcessingUnit this) 4661{ 4662 picoos_uint16 syllCurr; 4663 pam_subobj_t *pam; 4664 if (NULL == this || NULL == this->subObj) { 4665 return PICO_ERR_OTHER; 4666 } 4667 pam = (pam_subobj_t *) this->subObj; 4668 syllCurr = pam->nCurrSyllable; 4669 4670 /*processor for all features that can be inherited from previous syll (or word/phrase)*/ 4671 if (pam->nCurrSyllable > 0) { 4672 pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 4673 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B3]; 4674 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B8] 4675 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B8]; 4676 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B10] 4677 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B10]; 4678 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B12] 4679 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B12]; 4680 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B14] 4681 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B14]; 4682 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 4683 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B17]; 4684 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 4685 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B19]; 4686 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 4687 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B20]; 4688 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 4689 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[B21]; 4690 4691 pam->sSyllFeats[pam->nCurrSyllable].phoneV[D2] 4692 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E2]; 4693 pam->sSyllFeats[pam->nCurrSyllable].phoneV[G1] 4694 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H1]; 4695 pam->sSyllFeats[pam->nCurrSyllable].phoneV[G2] 4696 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2]; 4697 4698 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E5] 4699 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E5]; 4700 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E7] 4701 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E7]; 4702 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 4703 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E9]; 4704 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 4705 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E11]; 4706 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 4707 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E12]; 4708 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 4709 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E13]; 4710 pam->sSyllFeats[pam->nCurrSyllable].phoneV[E13] 4711 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[E13]; 4712 4713 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 4714 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H1]; 4715 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 4716 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H2]; 4717 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H3] 4718 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H3]; 4719 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H4] 4720 = pam->sSyllFeats[pam->nCurrSyllable - 1].phoneV[H4]; 4721 4722 } else { 4723 pam->sSyllFeats[pam->nCurrSyllable].phoneV[A3] 4724 =pam->sSyllFeats[pam->nCurrSyllable].phoneV[B8] 4725 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B10] 4726 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B12] 4727 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B14] 4728 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B17] 4729 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B19] 4730 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B20] 4731 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[B21] 4732 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E5] 4733 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E9] 4734 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E11] 4735 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[E12] 4736 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H1] 4737 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H2] 4738 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[H3] 4739 = 0; 4740 4741 /*init values different from 0*/ 4742 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H4] 4743 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[J3]; 4744 pam->sSyllFeats[pam->nCurrSyllable].phoneV[H5] = PICOPAM_p; 4745 4746 } 4747 4748 /*processor for all features that can be inherited from next syll (or word/phrase)*/ 4749 if (pam->nCurrSyllable < pam->nTotalSyllables - 1) { 4750 /*non last syllable*/ 4751 pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 4752 = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[B3]; 4753 pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] 4754 = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[E2]; 4755 pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4756 = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[H1]; 4757 pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4758 = pam->sSyllFeats[pam->nCurrSyllable + 1].phoneV[H2]; 4759 } else { 4760 /*last syllable*/ 4761 pam->sSyllFeats[pam->nCurrSyllable].phoneV[C3] 4762 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[F2] 4763 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I1] 4764 = pam->sSyllFeats[pam->nCurrSyllable].phoneV[I2] 4765 = 0; 4766 } 4767 4768 /*Other fixed values derived from de-facto standard*/ 4769 pam->sSyllFeats[pam->nCurrSyllable].phoneV[B18] = 0; 4770 4771 return PICO_OK; 4772}/*pam_do_pause*/ 4773 4774/** 4775 * performs the initialization of pause "syllables" 4776 * @param this : pointer to PAM PU sub object pointer : processes a pause (silence) syllable after backward processing 4777 * @return PICO_OK : pause processing successful 4778 * @return PICO_ERR_OTHER : errors on retrieving the PU pointer 4779 * @callgraph 4780 * @callergraph 4781 */ 4782static pico_status_t pam_adapter_do_pauses(register picodata_ProcessingUnit this) 4783{ 4784 register pam_subobj_t * pam; 4785 picoos_uint16 nSyll; 4786 4787 if (NULL == this || NULL == this->subObj) { 4788 return PICO_ERR_OTHER; 4789 } 4790 pam = (pam_subobj_t *) this->subObj; 4791 4792 /*Do the pause processing*/ 4793 nSyll = pam->nCurrSyllable; 4794 while (pam->nCurrSyllable >= 0) { 4795 if (pam->sSyllFeats[pam->nCurrSyllable].phoneV[P2] == 1) { 4796 /*pause processing*/ 4797 pam_do_pause(this); 4798 } 4799 pam->nCurrSyllable--; 4800 }/*end while (pam->nCurrSyllable>=0)*/ 4801 /*reset syllpointer to original value*/ 4802 pam->nCurrSyllable = nSyll; 4803 return PICOPAM_READY; 4804}/*pam_adapter_do_pauses*/ 4805 4806#ifdef __cplusplus 4807} 4808#endif 4809 4810/* picopam.c end */ 4811