Home | History | Annotate | Download | only in lib
      1 /*
      2  * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 /**
     17  * @file picodata.h
     18  *
     19  * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
     20  * All rights reserved.
     21  *
     22  * History:
     23  * - 2009-04-20 -- initial version
     24  *
     25  */
     26 #ifndef PICODATA_H_
     27 #define PICODATA_H_
     28 
     29 #include "picodefs.h"
     30 #include "picoos.h"
     31 #include "picotrns.h"
     32 #include "picokfst.h"
     33 #include "picorsrc.h"
     34 
     35 #ifdef __cplusplus
     36 extern "C" {
     37 #endif
     38 #if 0
     39 }
     40 #endif
     41 
     42 
     43 /* ***************************************************************
     44  *                   Constants                                   *
     45  *****************************************************************/
     46 
     47 #define PICODATA_MAX_ITEMS_PER_PHRASE 30
     48 
     49 /**
     50  * @addtogroup picodata
     51  * <b> Pico Data : Item Format </b>\n
     52  *
     53   The item header is identical for all item types and PUs. Item types
     54  that are not handled by a PU are copied.
     55 
     56  Item Header structure\n
     57  ---------------------
     58    - Byte     Content
     59    - 0x00     item type
     60    - 0x01     item info 1
     61    - 0x02     item info 2
     62    - 0x03     item length in bytes (not including the header)
     63 
     64  depending on the item type/info, a specific subheader may follow
     65  (included in length)
     66 */
     67 
     68 /* item header fields (tmp.: use item functions below to acces header fields */
     69 #define PICODATA_ITEMIND_TYPE  0
     70 #define PICODATA_ITEMIND_INFO1 1
     71 #define PICODATA_ITEMIND_INFO2 2
     72 #define PICODATA_ITEMIND_LEN   3
     73 
     74 /* ***************************************************************
     75  *                   CharBuffer                                  *
     76  *****************************************************************/
     77 typedef struct picodata_char_buffer * picodata_CharBuffer;
     78 
     79 picodata_CharBuffer picodata_newCharBuffer(picoos_MemoryManager mm,
     80         picoos_Common common, picoos_objsize_t size);
     81 
     82 void picodata_disposeCharBuffer(picoos_MemoryManager mm,
     83                                 picodata_CharBuffer * this);
     84 
     85 /* should not be used for PUs but only for feeding the initial cb */
     86 pico_status_t picodata_cbPutCh(register picodata_CharBuffer this, picoos_char ch);
     87 
     88 /* should not be used for PUs other than first PU in the chain (picotok) */
     89 picoos_int16 picodata_cbGetCh(register picodata_CharBuffer this);
     90 
     91 /* reset cb (as if after newCharBuffer) */
     92 pico_status_t picodata_cbReset (register picodata_CharBuffer this);
     93 
     94 /* ** CharBuffer item functions, cf. below in items section ****/
     95 
     96 /* ***************************************************************
     97  *                   items                                       *
     98  *****************************************************************/
     99 
    100 /* item header size */
    101 #define PICODATA_ITEM_HEADSIZE 4
    102 
    103 typedef struct picodata_itemhead
    104 {
    105     picoos_uint8 type;
    106     picoos_uint8 info1;
    107     picoos_uint8 info2;
    108     picoos_uint8 len;
    109 } picodata_itemhead_t;
    110 
    111 
    112 /* -------------- System wide defines referred to by items -------- */
    113 /* ---- These maybe better stored in a knowledge module/resoruce*/
    114 #define PICODATA_ACC0  '\x30' /*  48  '0' */
    115 #define PICODATA_ACC1  '\x31' /*  49  '1' */
    116 #define PICODATA_ACC2  '\x32' /*  50  '2' */
    117 #define PICODATA_ACC3  '\x33' /*  51  '3' */
    118 #define PICODATA_ACC4  '\x34' /*  52  '4' */
    119 
    120 /* reserved for future use:
    121  * user-imposed Part-Of-Speech ids for user lexica and phoneme tags
    122  * These values should be applied BEFORE POS-disambiguation. The POS lingware either assigns the same
    123  * ids to corresponding internal unique or composed POS or else the POS-D will consider these values
    124  * "default" */
    125 #define PICODATA_POS_XNPR 20
    126 #define PICODATA_POS_XN   21
    127 #define PICODATA_POS_XV   22
    128 #define PICODATA_POS_XA   23
    129 #define PICODATA_POS_XADV 24
    130 #define PICODATA_POS_XX   25
    131 
    132 /* ------------------------- item types ---------------------------- */
    133 /* new item types, info1, info2 to be defined during PU development  */
    134 /* make sure this stays in sync with "is_valid_itemtype" function    */
    135 #define PICODATA_ITEM_WSEQ_GRAPH '\x73'  /* 115, 's' */
    136 #define PICODATA_ITEM_TOKEN      '\x74'  /* 116  't' */
    137 #define PICODATA_ITEM_WORDGRAPH  '\x67'  /* 103  'g' */
    138 #define PICODATA_ITEM_WORDINDEX  '\x69'  /* 105  'i' */
    139 #define PICODATA_ITEM_WORDPHON   '\x77'  /* 119  'w' */
    140 #define PICODATA_ITEM_SYLLPHON   '\x79'  /* 121  'y' */
    141 #define PICODATA_ITEM_BOUND      '\x62'  /*  98  'b' */
    142 /* #define PICODATA_ITEM_BOUND_DUR  '\x64' */ /* 100  'd' */ /* duration-constrained bound */
    143 #define PICODATA_ITEM_PUNC       '\x70'  /* 112  'p' */
    144 #define PICODATA_ITEM_CMD        '\x63'  /*  99  'c' */
    145 #define PICODATA_ITEM_PHONE      '\x68'  /* 104  'h' */ /*reserved for PAM*/
    146 #define PICODATA_ITEM_FRAME_PAR  '\x6b'  /* 107  'k' */ /*reserved for CEP*/
    147 #define PICODATA_ITEM_FRAME      '\x66'  /* 102  'f' */ /*reserved for SIG*/
    148 #define PICODATA_ITEM_OTHER      '\x6f'  /* 111  'o' */
    149 #define PICODATA_ITEM_ERR        '\x00'  /*   0 '^@' */
    150 
    151 /* generic iteminfo1 */
    152 #define PICODATA_ITEMINFO1_ERR   '\x00'  /*   0 '^@' */  /* error state */
    153 #define PICODATA_ITEMINFO1_NA    '\x01'  /*   1 '^A' */  /* not applicable */
    154 
    155 /* generic iteminfo2 */
    156 #define PICODATA_ITEMINFO2_ERR   '\x00'  /*   0 '^@' */ /* error state */
    157 #define PICODATA_ITEMINFO2_NA    '\x01'  /*   1 '^A' */ /* not applicable */
    158 
    159 /* ------------------------- PUNC item type ---------------------------- */
    160 /* iteminfo1 */
    161 #define PICODATA_ITEMINFO1_PUNC_SENTEND       '\x73'  /* 115  's' */
    162 #define PICODATA_ITEMINFO1_PUNC_PHRASEEND     '\x70'  /* 112  'p' */
    163 #define PICODATA_ITEMINFO1_PUNC_FLUSH         '\x66'  /* 102  'f' */
    164 /* iteminfo2 */
    165 #define PICODATA_ITEMINFO2_PUNC_SENT_T        '\x74'  /* 116  't' */
    166 #define PICODATA_ITEMINFO2_PUNC_SENT_Q        '\x71'  /* 113  'q' */
    167 #define PICODATA_ITEMINFO2_PUNC_SENT_E        '\x65'  /* 101  'e' */
    168 #define PICODATA_ITEMINFO2_PUNC_PHRASE        '\x70'  /* 112  'p' */
    169 #define PICODATA_ITEMINFO2_PUNC_PHRASE_FORCED '\x66'  /* 102  'f' */
    170 /* len for PUNC item is ALWAYS = 0 */
    171 /* ------------------------- BOUND item type ---------------------------- */
    172 /* iteminfo1 : phrase strength*/
    173 #define PICODATA_ITEMINFO1_BOUND_SBEG  '\x62'  /*  98 'b', at sentence begin */
    174 #define PICODATA_ITEMINFO1_BOUND_SEND  '\x73'  /* 115 's', at sentence end */
    175 #define PICODATA_ITEMINFO1_BOUND_TERM  '\x74'  /* 116 't', replaces a flush */
    176 #define PICODATA_ITEMINFO1_BOUND_PHR0  '\x30'  /*  48 '0', no break, no item */
    177 #define PICODATA_ITEMINFO1_BOUND_PHR1  '\x31'  /*  49 '1', pri. phrase bound. */
    178 #define PICODATA_ITEMINFO1_BOUND_PHR2  '\x32'  /*  50 '2', short break */
    179 #define PICODATA_ITEMINFO1_BOUND_PHR3  '\x33'  /*  51 '3', sec. phr. bound., no break*/
    180 /* iteminfo2 : phrase type*/
    181 #define PICODATA_ITEMINFO2_BOUNDTYPE_P '\x50'  /*  80 'P' */
    182 #define PICODATA_ITEMINFO2_BOUNDTYPE_T '\x54'  /*  84 'T' */
    183 #define PICODATA_ITEMINFO2_BOUNDTYPE_Q '\x51'  /*  81 'Q' */
    184 #define PICODATA_ITEMINFO2_BOUNDTYPE_E '\x45'  /*  69 'E' */
    185 /* len for BOUND item is ALWAYS = 0 */
    186 /* ------------------------- CMD item type ---------------------------- */
    187 /* iteminfo1 */
    188 #define PICODATA_ITEMINFO1_CMD_FLUSH          'f' /* 102 flush command (all PUs)*/
    189 #define PICODATA_ITEMINFO1_CMD_PLAY           'p' /* 112 play command : PU in info 2 will read items from file-->Filename in item content.*/
    190 #define PICODATA_ITEMINFO1_CMD_SAVE           's' /* 115 save command : PU in info 2 will save items to file-->Filename in item content.*/
    191 #define PICODATA_ITEMINFO1_CMD_UNSAVE         'u' /* 117 save command : PU in info 2 will stop saving items to file*/
    192 #define PICODATA_ITEMINFO1_CMD_PROSDOMAIN     'd' /* 100 prosody domain : domain type in info 2, domain name in item content */
    193 #define PICODATA_ITEMINFO1_CMD_SPELL          'e' /* 101 spell command : info 2 contains start/stop info,
    194                                                     spell type/pause len as little endian uint16 in item content */
    195 #define PICODATA_ITEMINFO1_CMD_IGNSIG         'i' /* ignore signal command : info 2 contains start/stop info */
    196 #define PICODATA_ITEMINFO1_CMD_PHONEME        'o' /* phoneme command : info 2 contains start/stop info, phonemes in item content */
    197 #define PICODATA_ITEMINFO1_CMD_IGNORE         'I' /* ignore text command : info 2 contains start/stop info */
    198 #define PICODATA_ITEMINFO1_CMD_SIL            'z' /* silence command : info 2 contains type of silence;
    199                                                      silence duration as little endian uint16 in item content */
    200 #define PICODATA_ITEMINFO1_CMD_CONTEXT        'c' /* context command : context name in item content */
    201 #define PICODATA_ITEMINFO1_CMD_VOICE          'v' /* context command : voice name in item content */
    202 #define PICODATA_ITEMINFO1_CMD_MARKER         'm' /* marker command : marker name in item content */
    203 #define PICODATA_ITEMINFO1_CMD_PITCH          'P' /* 80 pitch command : abs/rel info in info 2; pitch level as little endian
    204                                                      uint16 in item content; relative value is in promille */
    205 #define PICODATA_ITEMINFO1_CMD_SPEED          'R' /* 82 speed command : abs/rel info in info 2, speed level as little endian
    206                                                      uint16 in item content; elative value is in promille */
    207 #define PICODATA_ITEMINFO1_CMD_VOLUME         'V' /* 86 volume command : abs/rel info in info 2, volume level as little endian
    208                                                      uint16 in item content; relative value is in promille */
    209 #define PICODATA_ITEMINFO1_CMD_SPEAKER        'S' /* 83 speaker command : abs/rel info in info 2, speaker level as little endian
    210                                                      uint16 in item content; relative value is in promille */
    211 
    212 /* iteminfo2 for PLAY/SAVE */
    213 #define PICODATA_ITEMINFO2_CMD_TO_TOK  't'  /* CMD+PLAY/SAVE+TOKENISATION*/
    214 #define PICODATA_ITEMINFO2_CMD_TO_PR   'g'  /* CMD+PLAY/SAVE+PREPROC*/
    215 #define PICODATA_ITEMINFO2_CMD_TO_WA   'w'  /* CMD+PLAY/SAVE+WORDANA*/
    216 #define PICODATA_ITEMINFO2_CMD_TO_SA   'a'  /* CMD+PLAY/SAVE+SENTANA*/
    217 #define PICODATA_ITEMINFO2_CMD_TO_ACPH 'h'  /* CMD+PLAY/SAVE+ACCENTUATION&PHRASING*/
    218 #define PICODATA_ITEMINFO2_CMD_TO_SPHO 'p'  /* CMD+PLAY/SAVE+ACCENTUATION&PHRASING*/
    219 #define PICODATA_ITEMINFO2_CMD_TO_PAM  'q'  /* CMD+PLAY/SAVE+PHONETIC-ACOUSTIC MAPPING*/
    220 #define PICODATA_ITEMINFO2_CMD_TO_CEP  'c'  /* CMD+PLAY/SAVE+CEP_SMOOTHER*/
    221 #define PICODATA_ITEMINFO2_CMD_TO_SIG  's'  /* CMD+PLAY/SAVE+SIG_GEN */
    222 
    223 #if 0
    224 #define PICODATA_ITEMINFO2_CMD_TO_FST  'f'  /* CMD+PLAY/SAVE+FST for Syll and Phonotactic constraints*/
    225 #endif
    226 
    227 #define PICODATA_ITEMINFO2_CMD_TO_UNKNOWN 255
    228 
    229 /* iteminfo2 for start/end commands */
    230 #define PICODATA_ITEMINFO2_CMD_START  's'
    231 #define PICODATA_ITEMINFO2_CMD_END    'e'
    232 
    233 /* iteminfo2 for speed/pitch/volume commands */
    234 #define PICODATA_ITEMINFO2_CMD_ABSOLUTE 'a'
    235 #define PICODATA_ITEMINFO2_CMD_RELATIVE 'r'
    236 
    237 /* len for CMD item could be >= 0 */
    238 /* ------------------------- TOKEN item type ---------------------------- */
    239 /* iteminfo1: simple token type : */
    240 #define PICODATA_ITEMINFO1_TOKTYPE_SPACE     'W'
    241 #define PICODATA_ITEMINFO1_TOKTYPE_LETTERV   'V'
    242 #define PICODATA_ITEMINFO1_TOKTYPE_LETTER    'L'
    243 #define PICODATA_ITEMINFO1_TOKTYPE_DIGIT     'D'
    244 #define PICODATA_ITEMINFO1_TOKTYPE_SEQ       'S'
    245 #define PICODATA_ITEMINFO1_TOKTYPE_CHAR      'C'
    246 #define PICODATA_ITEMINFO1_TOKTYPE_BEGIN     'B'
    247 #define PICODATA_ITEMINFO1_TOKTYPE_END       'E'
    248 #define PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED 'U'
    249 /* iteminfo2 : token subtype */
    250 /* len for WORDTOK item is ALWAYS > 0, if len==0 an error should be raised */
    251 
    252 /**
    253  * @addtogroup picodata
    254  *
    255  * ------------------------- WORDGRAPH item type ----------------------------
    256  * - iteminfo1 : POS and multi-POS values defined in lingware
    257  * - iteminfo2 : not applicable
    258  * - len for WORDGRAPH item is ALWAYS > 0, if len==0 an error should be raised
    259  *     (currently picopr may produce empty WORDGRAPH that is eliminated by picowa)
    260  * \n------------------------- WORDINDEX item type ----------------------------
    261  * - iteminfo1 : POS and multi-POS values defined in lingware
    262  * - iteminfo2 : not applicable
    263  * - len for WORDINDEX item is ALWAYS > 0, if len==0 an error should be raised
    264  * \n------------------------- WORDPHON item type ----------------------------
    265  * - iteminfo1 : POS values defined in lingware
    266  * - iteminfo2 : Uses PICODATA_ACC0 .. ACC4
    267  *  -len WORDPHON item is ALWAYS > 0, if len==0 an error should be raised
    268  * \n------------------------- SYLLPHON item type ----------------------------
    269  * - iteminfo1 : not applicable
    270  * - iteminfo2 : Uses PICODATA_ACC0 .. ACC4
    271  * - len for SYLLPHON item is ALWAYS > 0, if len==0 an error should be raised
    272  * \n------------------------- PHONE item type (PRODUCED BY PAM)-----------------
    273  * - iteminfo1 : phonId : the phonetic identity of the phone
    274  * - iteminfo2 : n_S_P_Phone : number of states per phoneme
    275  * - len for PHON item is ALWAYS > 0, if len==0 an error should be raised
    276  * \n------------------------- FRAME_PAR item type (PRODUCED BY CEP) --------
    277  * - iteminfo1 : format (float, fixed)
    278  * - iteminfo2 : vector size
    279  * - len for FRAME_PAR item is ALWAYS > 0, if len==0 an error should be raised
    280  * \n------------------------- FRAME  item type (PRODUCED BY SIG) -----------
    281  * - iteminfo1 : number of samples per frame
    282  * - iteminfo2 : number of bytes per sample
    283  * - len for FRAME item is ALWAYS > 0, if len==0 an error should be raised
    284  *
    285  */
    286 #define PICODATA_ITEMINFO1_FRAME_PAR_DATA_FORMAT_FIXED  '\x78' /* 120 'x' fixed point */
    287 #define PICODATA_ITEMINFO1_FRAME_PAR_DATA_FORMAT_FLOAT  '\x66' /* 102 'f' floating point */
    288 
    289 /* ***************************************************************
    290  *                   items: CharBuffer functions                 *
    291  *****************************************************************/
    292 
    293 /* gets a single item (head and content) from a CharBuffer in buf;
    294    blenmax is the max length (in number of bytes) of buf; blen is
    295    set to the number of bytes gotten in buf; return values:
    296      PICO_OK                 <- one item gotten
    297      PICO_EOF                <- no item available, cb is empty
    298      PICO_EXC_BUF_UNDERFLOW  <- cb not empty, but no valid item
    299      PICO_EXC_BUF_OVERFLOW   <- buf not large enough
    300 */
    301 pico_status_t picodata_cbGetItem(register picodata_CharBuffer this,
    302         picoos_uint8 *buf, const picoos_uint16 blenmax,
    303         picoos_uint16 *blen);
    304 
    305 /* gets the speech data (without item head) from a CharBuffer in buf;
    306    blenmax is the max length (in number of bytes) of buf; blen is
    307    set to the number of bytes gotten in buf; return values:
    308      PICO_OK                 <- speech data of one item gotten
    309      PICO_EOF                <- no item available, cb is empty
    310      PICO_EXC_BUF_UNDERFLOW  <- cb not empty, but no valid item
    311      PICO_EXC_BUF_OVERFLOW   <- buf not large enough
    312 */
    313 pico_status_t picodata_cbGetSpeechData(register picodata_CharBuffer this,
    314         picoos_uint8 *buf, const picoos_uint16 blenmax,
    315         picoos_uint16 *blen);
    316 
    317 /* puts a single item (head and content) to a CharBuffer; clenmax is
    318    the max length (in number of bytes) accessible in content; clen is
    319    set to the number of bytes put from content; return values:
    320      PICO_OK                 <- one item put
    321      PICO_EXC_BUF_UNDERFLOW  <- no valid item in buf
    322      PICO_EXC_BUF_OVERFLOW   <- cb not large enough
    323 */
    324 pico_status_t picodata_cbPutItem(register picodata_CharBuffer this,
    325         const picoos_uint8 *buf, const picoos_uint16 blenmax,
    326         picoos_uint16 *blen);
    327 
    328 /* unsafe, just for measuring purposes */
    329 picoos_uint8 picodata_cbGetFrontItemType(register picodata_CharBuffer this);
    330 
    331 /* ***************************************************************
    332  *                   items: support function                     *
    333  *****************************************************************/
    334 
    335 /* checks, whether item of type 'ch' is a valid item type */
    336 picoos_uint8 is_valid_itemtype(const picoos_uint8 ch);
    337 
    338 /* gets from buf a single item, values in head set and item content
    339    copied to content; blenmax and clenmax are the max lengths (in
    340    number of bytes) accessible in buf and content; clen is set to the
    341    number of bytes gotten in content; return values:
    342      PICO_OK                 <- all ok
    343      PICO_EXC_BUF_UNDERFLOW  <- blenmax problem, or no valid item
    344      PICO_EXC_BUF_OVERFLOW   <- overflow in content
    345 */
    346 pico_status_t picodata_get_itemparts_nowarn(
    347         const picoos_uint8 *buf, const picoos_uint16 blenmax,
    348         picodata_itemhead_t *head, picoos_uint8 *content,
    349         const picoos_uint16 clenmax, picoos_uint16 *clen);
    350 
    351 /* gets from buf a single item, values in head set and item content
    352    copied to content; blenmax and clenmax are the max lengths (in
    353    number of bytes) accessible in buf and content; clen is set to the
    354    number of bytes gotten in content; return values:
    355      PICO_OK                 <- all ok
    356      PICO_EXC_BUF_UNDERFLOW  <- blenmax problem, or no valid item
    357      PICO_EXC_BUF_OVERFLOW   <- overflow in content
    358 */
    359 pico_status_t picodata_get_itemparts(
    360         const picoos_uint8 *buf, const picoos_uint16 blenmax,
    361         picodata_itemhead_t *head, picoos_uint8 *content,
    362         const picoos_uint16 clenmax, picoos_uint16 *clen);
    363 
    364 /* puts a single item to buf; values in head and content copied to
    365    buf; clenmax is the max length (in number of bytes) accessible in
    366    content; blenmax is the max length (bytes) accessible in buf; blen
    367    is set to the number of bytes put to buf; return values:
    368      PICO_OK                 <- all ok
    369      PICO_EXC_BUF_UNDERFLOW  <- clenmax problem, or no valid item
    370      PICO_EXC_BUF_OVERFLOW   <- overflow in buf
    371 */
    372 pico_status_t picodata_put_itemparts(const picodata_itemhead_t *head,
    373         const picoos_uint8 *content, const picoos_uint16 clenmax,
    374         picoos_uint8 *buf, const picoos_uint16 blenmax, picoos_uint16 *blen);
    375 
    376 /* gets from buf info of a single item, values in head are set and
    377    content is set to the start of content in buf (not copied!);
    378    content is set to NULL if the content length is 0; blenmax is the
    379    max lengths (in number of bytes) accessible in buf; return values:
    380      PICO_OK                 <- all ok
    381      PICO_EXC_BUF_UNDERFLOW  <- blenmax problem, or no valid item
    382 */
    383 pico_status_t picodata_get_iteminfo(
    384         picoos_uint8 *buf, const picoos_uint16 blenmax,
    385         picodata_itemhead_t *head, picoos_uint8 **content);
    386 
    387 /* copies the item in inbuf to outbuf after first checking if there is
    388    a valid item in inbuf; inlenmax and outlenmax are the max length
    389    (in number of byte) accessible in the buffers); in *numb the total
    390    number of bytes copied to outbuf (incl. header) is returned; return
    391    values:
    392    PICO_OK                 <- item copied
    393    PICO_EXC_BUF_OVERFLOW   <- overflow in outbuf
    394    PICO_ERR_OTHER          <- no valid item in inbuf
    395 */
    396 pico_status_t picodata_copy_item(const picoos_uint8 *inbuf,
    397         const picoos_uint16 inlenmax, picoos_uint8 *outbuf,
    398         const picoos_uint16 outlenmax, picoos_uint16 *numb);
    399 
    400 /* sets the info1 field in the header contained in the item in buf;
    401    return values:
    402    PICO_OK                 <- all ok
    403    PICO_EXC_BUF_UNDERFLOW  <- underflow in buf
    404 */
    405 pico_status_t picodata_set_iteminfo1(picoos_uint8 *buf,
    406         const picoos_uint16 blenmax, const picoos_uint8 info);
    407 
    408 /* sets the info2 field in the header contained in the item in buf;
    409    return values:
    410    PICO_OK                 <- all ok
    411    PICO_EXC_BUF_UNDERFLOW  <- underflow in buf
    412 */
    413 pico_status_t picodata_set_iteminfo2(picoos_uint8 *buf,
    414         const picoos_uint16 blenmax, const picoos_uint8 info);
    415 
    416 /* sets the len field in the header contained in the item in buf;
    417    return values:
    418    PICO_OK                 <- all ok
    419    PICO_EXC_BUF_UNDERFLOW  <- underflow in buf
    420 */
    421 pico_status_t picodata_set_itemlen(picoos_uint8 *buf,
    422         const picoos_uint16 blenmax, const picoos_uint8 len);
    423 
    424 /* check item validity and return TRUE if valid; return FALSE if
    425    invalid; ilenmax is the max index to be used in item
    426 */
    427 picoos_uint8 picodata_is_valid_item(const picoos_uint8 *item,
    428         const picoos_uint16 ilenmax);
    429 
    430 /* return TRUE if head is a valid item head, FALSE otherwise */
    431 picoos_uint8 picodata_is_valid_itemhead(const picodata_itemhead_t *head);
    432 
    433 
    434 /* ***************************************************************
    435  *                   ProcessingUnit                              *
    436  *****************************************************************/
    437 /* public */
    438 
    439 #define PICODATA_MAX_ITEMSIZE (picoos_uint16) (PICODATA_ITEM_HEADSIZE + 256)
    440 
    441 /* different buffer sizes per processing unit */
    442 #define PICODATA_BUFSIZE_DEFAULT (picoos_uint16) PICODATA_MAX_ITEMSIZE
    443 #define PICODATA_BUFSIZE_TEXT    (picoos_uint16)  1 * PICODATA_BUFSIZE_DEFAULT
    444 #define PICODATA_BUFSIZE_TOK     (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
    445 #define PICODATA_BUFSIZE_PR      (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
    446 #define PICODATA_BUFSIZE_WA      (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
    447 #define PICODATA_BUFSIZE_SA      (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
    448 #define PICODATA_BUFSIZE_ACPH    (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
    449 #define PICODATA_BUFSIZE_SPHO    (picoos_uint16)  4 * PICODATA_BUFSIZE_DEFAULT
    450 #define PICODATA_BUFSIZE_PAM     (picoos_uint16)  4 * PICODATA_BUFSIZE_DEFAULT
    451 #define PICODATA_BUFSIZE_CEP     (picoos_uint16) 16 * PICODATA_BUFSIZE_DEFAULT
    452 #define PICODATA_BUFSIZE_SIG     (picoos_uint16) 16 * PICODATA_BUFSIZE_DEFAULT
    453 #define PICODATA_BUFSIZE_SINK     (picoos_uint16) 1 * PICODATA_BUFSIZE_DEFAULT
    454 
    455 /* different types of processing units */
    456 typedef enum picodata_putype {
    457     PICODATA_PUTYPE_TEXT,   /* text */
    458     PICODATA_PUTYPE_TOK,    /* tokenizer output */
    459     PICODATA_PUTYPE_PR,     /* preprocessor output */
    460     PICODATA_PUTYPE_WA,     /* word analysis */
    461     PICODATA_PUTYPE_SA,     /* sentence analysis */
    462     PICODATA_PUTYPE_ACPH,     /* accentuation and phrasing */
    463     PICODATA_PUTYPE_SPHO,   /* sentence phonology (textana postproc) */
    464     PICODATA_PUTYPE_PAM,    /* phonetics to acoustics mapper processing unit */
    465     PICODATA_PUTYPE_CEP,    /* cepstral smoothing processing unit */
    466     PICODATA_PUTYPE_SIG,     /* signal generation processing unit*/
    467     PICODATA_PUTYPE_SINK     /* item sink unit*/
    468 } picodata_putype_t;
    469 
    470 picoos_uint16 picodata_get_default_buf_size (picodata_putype_t puType);
    471 
    472 /* result values returned from the pu->puStep() methode */
    473 typedef enum picodata_step_result {
    474     PICODATA_PU_ERROR,
    475     /* PICODATA_PU_EMPTY, *//* reserved (no internal data to be processed) */
    476     PICODATA_PU_IDLE, /* need more input to process internal data */
    477     PICODATA_PU_BUSY, /* processing internal data */
    478     PICODATA_PU_ATOMIC, /* same as pu_busy, but wants to get next time slot (while in an "atomar" operation) */
    479     PICODATA_PU_OUT_FULL /* can't proceed because output is full. (next time slot to be assigned to pu's output's consumer) */
    480 } picodata_step_result_t;
    481 
    482 typedef struct picodata_processing_unit * picodata_ProcessingUnit;
    483 
    484 picodata_ProcessingUnit picodata_newProcessingUnit(
    485         picoos_MemoryManager mm,
    486         picoos_Common common,
    487         picodata_CharBuffer cbIn,
    488         picodata_CharBuffer cbOut,
    489         picorsrc_Voice voice);
    490 
    491 void picodata_disposeProcessingUnit(
    492         picoos_MemoryManager mm,
    493         picodata_ProcessingUnit * this);
    494 
    495 picodata_CharBuffer picodata_getCbIn(picodata_ProcessingUnit this);
    496 picodata_CharBuffer picodata_getCbOut(picodata_ProcessingUnit this);
    497 pico_status_t picodata_setCbIn(picodata_ProcessingUnit this, picodata_CharBuffer cbIn);
    498 pico_status_t picodata_setCbOut(picodata_ProcessingUnit this, picodata_CharBuffer cbOut);
    499 
    500 /* protected */
    501 typedef pico_status_t (* picodata_puInitializeMethod) (register picodata_ProcessingUnit this, picoos_int32 mode);
    502 typedef pico_status_t (* picodata_puTerminateMethod) (register picodata_ProcessingUnit this);
    503 typedef picodata_step_result_t (* picodata_puStepMethod) (register picodata_ProcessingUnit this, picoos_int16 mode, picoos_uint16 * numBytesOutput);
    504 typedef pico_status_t (* picodata_puSubDeallocateMethod) (register picodata_ProcessingUnit this, picoos_MemoryManager mm);
    505 
    506 typedef struct picodata_processing_unit
    507 {
    508     /* public */
    509     picodata_puInitializeMethod initialize;
    510     picodata_puStepMethod       step;
    511     picodata_puTerminateMethod  terminate;
    512     picorsrc_Voice              voice;
    513 
    514     /* protected */
    515     picoos_Common                  common;
    516     picodata_CharBuffer            cbIn, cbOut;
    517     picodata_puSubDeallocateMethod subDeallocate;
    518     void * subObj;
    519 
    520 } picodata_processing_unit_t;
    521 
    522 /* currently, only wav input and output is supported */
    523 #define PICODATA_PUTYPE_TEXT_OUTPUT_EXTENSION   (picoos_uchar*)".txt"
    524 #define PICODATA_PUTYPE_TOK_INPUT_EXTENSION     PICODATA_PUTYPE_TEXT_OUTPUT_EXTENSION
    525 #define PICODATA_PUTYPE_TOK_OUTPUT_EXTENSION    (picoos_uchar*)".tok"
    526 #define PICODATA_PUTYPE_PR_INPUT_EXTENSION      PICODATA_PUTYPE_TOK_OUTPUT_EXTENSION
    527 #define PICODATA_PUTYPE_PR_OUTPUT_EXTENSION     (picoos_uchar*)".pr"
    528 #define PICODATA_PUTYPE_WA_INPUT_EXTENSION      PICODATA_PUTYPE_PR_OUTPUT_EXTENSION
    529 #define PICODATA_PUTYPE_WA_OUTPUT_EXTENSION     (picoos_uchar*)".wa"
    530 #define PICODATA_PUTYPE_SA_INPUT_EXTENSION      PICODATA_PUTYPE_WA_OUTPUT_EXTENSION
    531 #define PICODATA_PUTYPE_SA_OUTPUT_EXTENSION     (picoos_uchar*)".sa"
    532 #define PICODATA_PUTYPE_ACPH_INPUT_EXTENSION    PICODATA_PUTYPE_SA_OUTPUT_EXTENSION
    533 #define PICODATA_PUTYPE_ACPH_OUTPUT_EXTENSION   (picoos_uchar*)".acph"
    534 #define PICODATA_PUTYPE_SPHO_INPUT_EXTENSION    PICODATA_PUTYPE_ACPH_OUTPUT_EXTENSION
    535 #define PICODATA_PUTYPE_SPHO_OUTPUT_EXTENSION   (picoos_uchar*)".spho"
    536 #define PICODATA_PUTYPE_PAM_INPUT_EXTENSION     PICODATA_PUTYPE_SPHO_OUTPUT_EXTENSION
    537 #define PICODATA_PUTYPE_PAM_OUTPUT_EXTENSION    (picoos_uchar*)".pam"
    538 #define PICODATA_PUTYPE_CEP_INPUT_EXTENSION     PICODATA_PUTYPE_PAM_OUTPUT_EXTENSION
    539 #define PICODATA_PUTYPE_CEP_OUTPUT_EXTENSION    (picoos_uchar*)".cep"
    540 #define PICODATA_PUTYPE_SIG_INPUT_EXTENSION     PICODATA_PUTYPE_CEP_OUTPUT_EXTENSION   /*PP 11.7.08*/
    541 #define PICODATA_PUTYPE_SIG_OUTPUT_EXTENSION    (picoos_uchar*)".sig"
    542 #define PICODATA_PUTYPE_SINK_INPUT_EXTENSION    PICODATA_PUTYPE_SIG_OUTPUT_EXTENSION
    543 
    544 /*wav input is for play wav files in sig */
    545 #define PICODATA_PUTYPE_WAV_INPUT_EXTENSION    (picoos_uchar*)".wav"                    /*PP 11.7.08*/
    546 
    547 /*wav output is for saving wav (binary) files in sig*/
    548 #define PICODATA_PUTYPE_WAV_OUTPUT_EXTENSION    (picoos_uchar*)".wav"                    /*PP 14.7.08*/
    549 
    550 /* ***************************************************************
    551  *                   auxiliary routines                          *
    552  *****************************************************************/
    553 
    554 picoos_uint8 picodata_getPuTypeFromExtension(picoos_uchar * filename, picoos_bool input);
    555 
    556 #define PICODATA_XSAMPA (picoos_uchar *)"xsampa"
    557 #define PICODATA_SAMPA (picoos_uchar *)"sampa"
    558 #define PICODATA_SVOXPA (picoos_uchar *)"svoxpa"
    559 
    560 /*----------------------------------------------------------*/
    561 /** @brief   maps an input phone string to its internal representation
    562  *
    563  * @param transducer initialized SimpleTransducer
    564  * @param xsampa_parser fst converting xsampa char input to xsampa ids
    565  * @param svoxpa_parser
    566  * @param xsampa2svoxpa_mapper
    567  * @param inputPhones input phone string in alphabet 'alphabet'
    568  * @param alphabet input alphabet
    569  * @retval outputPhoneIds output phone string in internal representation
    570  * @param maxOutputPhoneIds
    571  * @return PICO_OK=mapping done, PICO_ERR_OTHER:unknown alphabet, unknown phones
    572  */
    573 /*---------------------------------------------------------*/
    574 pico_status_t picodata_mapPAStrToPAIds(
    575         picotrns_SimpleTransducer transducer,
    576         picoos_Common common,
    577         picokfst_FST xsampa_parser,
    578         picokfst_FST svoxpa_parser,
    579         picokfst_FST xsampa2svoxpa_mapper,
    580         picoos_uchar * inputPhones,
    581         picoos_uchar * alphabet,
    582         picoos_uint8 * outputPhoneIds,
    583         picoos_int32 maxOutputPhoneIds);
    584 
    585 /* number of binary digits after the comma for fixed-point calculation */
    586 #define PICODATA_PRECISION 10
    587 /* constant 0.5 in PICODATA_PRECISION */
    588 #define PICODATA_PREC_HALF 512
    589 
    590 void picodata_transformDurations(
    591         picoos_uint8 frame_duration_exp,
    592         picoos_int8 array_length,
    593         picoos_uint8 * inout,
    594         const picoos_uint16 * weight,  /* integer weights */
    595         picoos_int16 mintarget, /* minimum target duration in ms */
    596         picoos_int16 maxtarget, /* maximum target duration in ms */
    597         picoos_int16 facttarget, /* factor to be multiplied with original length to get the target
    598                                      the factor is fixed-point with precision PRECISION, i.e.
    599                                      the factor as float would be facttarget / PRECISION_FACT
    600                                      if factor is 0, only min/max are considered */
    601         picoos_int16 * dur_rest /* in/out, rest in ms */
    602         );
    603 
    604 
    605 
    606 /* ***************************************************************
    607  *                   For Debugging only                          *
    608  *****************************************************************/
    609 
    610 #if defined (PICO_DEBUG)
    611 
    612 /* convert (pretty print) item head 'head' and put output in 'str',
    613    strsize is the maximum length of 'str' in bytes */
    614 picoos_char * picodata_head_to_string(const picodata_itemhead_t *head,
    615                                       picoos_char * str, picoos_uint16 strsize);
    616 
    617 /* put 'pref6ch' (max. 6 char prefix) and a pretty print output of
    618    'item' in 'str', strlenmax is the maximum length of 'str' in
    619    bytes */
    620 void picodata_info_item(const picoknow_KnowledgeBase kb,
    621                         const picoos_uint8 *pref6ch,
    622                         const picoos_uint8 *item,
    623                         const picoos_uint16 itemlenmax,
    624                         const picoos_char *filterfn);
    625 
    626 
    627 #define PICODATA_INFO_ITEM(kb, pref, item, itemlenmax)   \
    628     PICODBG_INFO_CTX(); \
    629     picodata_info_item(kb, pref, item, itemlenmax, (picoos_char *)__FILE__)
    630 
    631 
    632 
    633 #else
    634 
    635 #define PICODATA_INFO_ITEM(kb, pref, item, itemlenmax)
    636 
    637 #endif
    638 
    639 #ifdef __cplusplus
    640 }
    641 #endif
    642 
    643 #endif /*PICODATA_H_*/
    644