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