summaryrefslogtreecommitdiffstats
path: root/pico/lib/picodata.h
blob: 210505146fe68156789ffa125fbddb4ac3d5b517 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
/*
 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file picodata.h
 *
 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
 * All rights reserved.
 *
 * History:
 * - 2009-04-20 -- initial version
 *
 */
#ifndef PICODATA_H_
#define PICODATA_H_

#include "picodefs.h"
#include "picoos.h"
#include "picotrns.h"
#include "picokfst.h"
#include "picorsrc.h"

#ifdef __cplusplus
extern "C" {
#endif
#if 0
}
#endif


/* ***************************************************************
 *                   Constants                                   *
 *****************************************************************/

#define PICODATA_MAX_ITEMS_PER_PHRASE 30

/**
 * @addtogroup picodata
 * <b> Pico Data : Item Format </b>\n
 *
  The item header is identical for all item types and PUs. Item types
 that are not handled by a PU are copied.

 Item Header structure\n
 ---------------------
   - Byte     Content
   - 0x00     item type
   - 0x01     item info 1
   - 0x02     item info 2
   - 0x03     item length in bytes (not including the header)

 depending on the item type/info, a specific subheader may follow
 (included in length)
*/

/* item header fields (tmp.: use item functions below to acces header fields */
#define PICODATA_ITEMIND_TYPE  0
#define PICODATA_ITEMIND_INFO1 1
#define PICODATA_ITEMIND_INFO2 2
#define PICODATA_ITEMIND_LEN   3

/* ***************************************************************
 *                   CharBuffer                                  *
 *****************************************************************/
typedef struct picodata_char_buffer * picodata_CharBuffer;

picodata_CharBuffer picodata_newCharBuffer(picoos_MemoryManager mm,
        picoos_Common common, picoos_objsize_t size);

void picodata_disposeCharBuffer(picoos_MemoryManager mm,
                                picodata_CharBuffer * this);

/* should not be used for PUs but only for feeding the initial cb */
pico_status_t picodata_cbPutCh(register picodata_CharBuffer this, picoos_char ch);

/* should not be used for PUs other than first PU in the chain (picotok) */
picoos_int16 picodata_cbGetCh(register picodata_CharBuffer this);

/* reset cb (as if after newCharBuffer) */
pico_status_t picodata_cbReset (register picodata_CharBuffer this);

/* ** CharBuffer item functions, cf. below in items section ****/

/* ***************************************************************
 *                   items                                       *
 *****************************************************************/

/* item header size */
#define PICODATA_ITEM_HEADSIZE 4

typedef struct picodata_itemhead
{
    picoos_uint8 type;
    picoos_uint8 info1;
    picoos_uint8 info2;
    picoos_uint8 len;
} picodata_itemhead_t;


/* -------------- System wide defines referred to by items -------- */
/* ---- These maybe better stored in a knowledge module/resoruce*/
#define PICODATA_ACC0  '\x30' /*  48  '0' */
#define PICODATA_ACC1  '\x31' /*  49  '1' */
#define PICODATA_ACC2  '\x32' /*  50  '2' */
#define PICODATA_ACC3  '\x33' /*  51  '3' */
#define PICODATA_ACC4  '\x34' /*  52  '4' */

/* reserved for future use:
 * user-imposed Part-Of-Speech ids for user lexica and phoneme tags
 * These values should be applied BEFORE POS-disambiguation. The POS lingware either assigns the same
 * ids to corresponding internal unique or composed POS or else the POS-D will consider these values
 * "default" */
#define PICODATA_POS_XNPR 20
#define PICODATA_POS_XN   21
#define PICODATA_POS_XV   22
#define PICODATA_POS_XA   23
#define PICODATA_POS_XADV 24
#define PICODATA_POS_XX   25

/* ------------------------- item types ---------------------------- */
/* new item types, info1, info2 to be defined during PU development  */
/* make sure this stays in sync with "is_valid_itemtype" function    */
#define PICODATA_ITEM_WSEQ_GRAPH '\x73'  /* 115, 's' */
#define PICODATA_ITEM_TOKEN      '\x74'  /* 116  't' */
#define PICODATA_ITEM_WORDGRAPH  '\x67'  /* 103  'g' */
#define PICODATA_ITEM_WORDINDEX  '\x69'  /* 105  'i' */
#define PICODATA_ITEM_WORDPHON   '\x77'  /* 119  'w' */
#define PICODATA_ITEM_SYLLPHON   '\x79'  /* 121  'y' */
#define PICODATA_ITEM_BOUND      '\x62'  /*  98  'b' */
/* #define PICODATA_ITEM_BOUND_DUR  '\x64' */ /* 100  'd' */ /* duration-constrained bound */
#define PICODATA_ITEM_PUNC       '\x70'  /* 112  'p' */
#define PICODATA_ITEM_CMD        '\x63'  /*  99  'c' */
#define PICODATA_ITEM_PHONE      '\x68'  /* 104  'h' */ /*reserved for PAM*/
#define PICODATA_ITEM_FRAME_PAR  '\x6b'  /* 107  'k' */ /*reserved for CEP*/
#define PICODATA_ITEM_FRAME      '\x66'  /* 102  'f' */ /*reserved for SIG*/
#define PICODATA_ITEM_OTHER      '\x6f'  /* 111  'o' */
#define PICODATA_ITEM_ERR        '\x00'  /*   0 '^@' */

/* generic iteminfo1 */
#define PICODATA_ITEMINFO1_ERR   '\x00'  /*   0 '^@' */  /* error state */
#define PICODATA_ITEMINFO1_NA    '\x01'  /*   1 '^A' */  /* not applicable */

/* generic iteminfo2 */
#define PICODATA_ITEMINFO2_ERR   '\x00'  /*   0 '^@' */ /* error state */
#define PICODATA_ITEMINFO2_NA    '\x01'  /*   1 '^A' */ /* not applicable */

/* ------------------------- PUNC item type ---------------------------- */
/* iteminfo1 */
#define PICODATA_ITEMINFO1_PUNC_SENTEND       '\x73'  /* 115  's' */
#define PICODATA_ITEMINFO1_PUNC_PHRASEEND     '\x70'  /* 112  'p' */
#define PICODATA_ITEMINFO1_PUNC_FLUSH         '\x66'  /* 102  'f' */
/* iteminfo2 */
#define PICODATA_ITEMINFO2_PUNC_SENT_T        '\x74'  /* 116  't' */
#define PICODATA_ITEMINFO2_PUNC_SENT_Q        '\x71'  /* 113  'q' */
#define PICODATA_ITEMINFO2_PUNC_SENT_E        '\x65'  /* 101  'e' */
#define PICODATA_ITEMINFO2_PUNC_PHRASE        '\x70'  /* 112  'p' */
#define PICODATA_ITEMINFO2_PUNC_PHRASE_FORCED '\x66'  /* 102  'f' */
/* len for PUNC item is ALWAYS = 0 */
/* ------------------------- BOUND item type ---------------------------- */
/* iteminfo1 : phrase strength*/
#define PICODATA_ITEMINFO1_BOUND_SBEG  '\x62'  /*  98 'b', at sentence begin */
#define PICODATA_ITEMINFO1_BOUND_SEND  '\x73'  /* 115 's', at sentence end */
#define PICODATA_ITEMINFO1_BOUND_TERM  '\x74'  /* 116 't', replaces a flush */
#define PICODATA_ITEMINFO1_BOUND_PHR0  '\x30'  /*  48 '0', no break, no item */
#define PICODATA_ITEMINFO1_BOUND_PHR1  '\x31'  /*  49 '1', pri. phrase bound. */
#define PICODATA_ITEMINFO1_BOUND_PHR2  '\x32'  /*  50 '2', short break */
#define PICODATA_ITEMINFO1_BOUND_PHR3  '\x33'  /*  51 '3', sec. phr. bound., no break*/
/* iteminfo2 : phrase type*/
#define PICODATA_ITEMINFO2_BOUNDTYPE_P '\x50'  /*  80 'P' */
#define PICODATA_ITEMINFO2_BOUNDTYPE_T '\x54'  /*  84 'T' */
#define PICODATA_ITEMINFO2_BOUNDTYPE_Q '\x51'  /*  81 'Q' */
#define PICODATA_ITEMINFO2_BOUNDTYPE_E '\x45'  /*  69 'E' */
/* len for BOUND item is ALWAYS = 0 */
/* ------------------------- CMD item type ---------------------------- */
/* iteminfo1 */
#define PICODATA_ITEMINFO1_CMD_FLUSH          'f' /* 102 flush command (all PUs)*/
#define PICODATA_ITEMINFO1_CMD_PLAY           'p' /* 112 play command : PU in info 2 will read items from file-->Filename in item content.*/
#define PICODATA_ITEMINFO1_CMD_SAVE           's' /* 115 save command : PU in info 2 will save items to file-->Filename in item content.*/
#define PICODATA_ITEMINFO1_CMD_UNSAVE         'u' /* 117 save command : PU in info 2 will stop saving items to file*/
#define PICODATA_ITEMINFO1_CMD_PROSDOMAIN     'd' /* 100 prosody domain : domain type in info 2, domain name in item content */
#define PICODATA_ITEMINFO1_CMD_SPELL          'e' /* 101 spell command : info 2 contains start/stop info,
                                                    spell type/pause len as little endian uint16 in item content */
#define PICODATA_ITEMINFO1_CMD_IGNSIG         'i' /* ignore signal command : info 2 contains start/stop info */
#define PICODATA_ITEMINFO1_CMD_PHONEME        'o' /* phoneme command : info 2 contains start/stop info, phonemes in item content */
#define PICODATA_ITEMINFO1_CMD_IGNORE         'I' /* ignore text command : info 2 contains start/stop info */
#define PICODATA_ITEMINFO1_CMD_SIL            'z' /* silence command : info 2 contains type of silence;
                                                     silence duration as little endian uint16 in item content */
#define PICODATA_ITEMINFO1_CMD_CONTEXT        'c' /* context command : context name in item content */
#define PICODATA_ITEMINFO1_CMD_VOICE          'v' /* context command : voice name in item content */
#define PICODATA_ITEMINFO1_CMD_MARKER         'm' /* marker command : marker name in item content */
#define PICODATA_ITEMINFO1_CMD_PITCH          'P' /* 80 pitch command : abs/rel info in info 2; pitch level as little endian
                                                     uint16 in item content; relative value is in promille */
#define PICODATA_ITEMINFO1_CMD_SPEED          'R' /* 82 speed command : abs/rel info in info 2, speed level as little endian
                                                     uint16 in item content; elative value is in promille */
#define PICODATA_ITEMINFO1_CMD_VOLUME         'V' /* 86 volume command : abs/rel info in info 2, volume level as little endian
                                                     uint16 in item content; relative value is in promille */
#define PICODATA_ITEMINFO1_CMD_SPEAKER        'S' /* 83 speaker command : abs/rel info in info 2, speaker level as little endian
                                                     uint16 in item content; relative value is in promille */

/* iteminfo2 for PLAY/SAVE */
#define PICODATA_ITEMINFO2_CMD_TO_TOK  't'  /* CMD+PLAY/SAVE+TOKENISATION*/
#define PICODATA_ITEMINFO2_CMD_TO_PR   'g'  /* CMD+PLAY/SAVE+PREPROC*/
#define PICODATA_ITEMINFO2_CMD_TO_WA   'w'  /* CMD+PLAY/SAVE+WORDANA*/
#define PICODATA_ITEMINFO2_CMD_TO_SA   'a'  /* CMD+PLAY/SAVE+SENTANA*/
#define PICODATA_ITEMINFO2_CMD_TO_ACPH 'h'  /* CMD+PLAY/SAVE+ACCENTUATION&PHRASING*/
#define PICODATA_ITEMINFO2_CMD_TO_SPHO 'p'  /* CMD+PLAY/SAVE+ACCENTUATION&PHRASING*/
#define PICODATA_ITEMINFO2_CMD_TO_PAM  'q'  /* CMD+PLAY/SAVE+PHONETIC-ACOUSTIC MAPPING*/
#define PICODATA_ITEMINFO2_CMD_TO_CEP  'c'  /* CMD+PLAY/SAVE+CEP_SMOOTHER*/
#define PICODATA_ITEMINFO2_CMD_TO_SIG  's'  /* CMD+PLAY/SAVE+SIG_GEN */

#if 0
#define PICODATA_ITEMINFO2_CMD_TO_FST  'f'  /* CMD+PLAY/SAVE+FST for Syll and Phonotactic constraints*/
#endif

#define PICODATA_ITEMINFO2_CMD_TO_UNKNOWN 255

/* iteminfo2 for start/end commands */
#define PICODATA_ITEMINFO2_CMD_START  's'
#define PICODATA_ITEMINFO2_CMD_END    'e'

/* iteminfo2 for speed/pitch/volume commands */
#define PICODATA_ITEMINFO2_CMD_ABSOLUTE 'a'
#define PICODATA_ITEMINFO2_CMD_RELATIVE 'r'

/* len for CMD item could be >= 0 */
/* ------------------------- TOKEN item type ---------------------------- */
/* iteminfo1: simple token type : */
#define PICODATA_ITEMINFO1_TOKTYPE_SPACE     'W'
#define PICODATA_ITEMINFO1_TOKTYPE_LETTERV   'V'
#define PICODATA_ITEMINFO1_TOKTYPE_LETTER    'L'
#define PICODATA_ITEMINFO1_TOKTYPE_DIGIT     'D'
#define PICODATA_ITEMINFO1_TOKTYPE_SEQ       'S'
#define PICODATA_ITEMINFO1_TOKTYPE_CHAR      'C'
#define PICODATA_ITEMINFO1_TOKTYPE_BEGIN     'B'
#define PICODATA_ITEMINFO1_TOKTYPE_END       'E'
#define PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED 'U'
/* iteminfo2 : token subtype */
/* len for WORDTOK item is ALWAYS > 0, if len==0 an error should be raised */

/**
 * @addtogroup picodata
 *
 * ------------------------- WORDGRAPH item type ----------------------------
 * - iteminfo1 : POS and multi-POS values defined in lingware
 * - iteminfo2 : not applicable
 * - len for WORDGRAPH item is ALWAYS > 0, if len==0 an error should be raised
 *     (currently picopr may produce empty WORDGRAPH that is eliminated by picowa)
 * \n------------------------- WORDINDEX item type ----------------------------
 * - iteminfo1 : POS and multi-POS values defined in lingware
 * - iteminfo2 : not applicable
 * - len for WORDINDEX item is ALWAYS > 0, if len==0 an error should be raised
 * \n------------------------- WORDPHON item type ----------------------------
 * - iteminfo1 : POS values defined in lingware
 * - iteminfo2 : Uses PICODATA_ACC0 .. ACC4
 *  -len WORDPHON item is ALWAYS > 0, if len==0 an error should be raised
 * \n------------------------- SYLLPHON item type ----------------------------
 * - iteminfo1 : not applicable
 * - iteminfo2 : Uses PICODATA_ACC0 .. ACC4
 * - len for SYLLPHON item is ALWAYS > 0, if len==0 an error should be raised
 * \n------------------------- PHONE item type (PRODUCED BY PAM)-----------------
 * - iteminfo1 : phonId : the phonetic identity of the phone
 * - iteminfo2 : n_S_P_Phone : number of states per phoneme
 * - len for PHON item is ALWAYS > 0, if len==0 an error should be raised
 * \n------------------------- FRAME_PAR item type (PRODUCED BY CEP) --------
 * - iteminfo1 : format (float, fixed)
 * - iteminfo2 : vector size
 * - len for FRAME_PAR item is ALWAYS > 0, if len==0 an error should be raised
 * \n------------------------- FRAME  item type (PRODUCED BY SIG) -----------
 * - iteminfo1 : number of samples per frame
 * - iteminfo2 : number of bytes per sample
 * - len for FRAME item is ALWAYS > 0, if len==0 an error should be raised
 *
 */
#define PICODATA_ITEMINFO1_FRAME_PAR_DATA_FORMAT_FIXED  '\x78' /* 120 'x' fixed point */
#define PICODATA_ITEMINFO1_FRAME_PAR_DATA_FORMAT_FLOAT  '\x66' /* 102 'f' floating point */

/* ***************************************************************
 *                   items: CharBuffer functions                 *
 *****************************************************************/

/* gets a single item (head and content) from a CharBuffer in buf;
   blenmax is the max length (in number of bytes) of buf; blen is
   set to the number of bytes gotten in buf; return values:
     PICO_OK                 <- one item gotten
     PICO_EOF                <- no item available, cb is empty
     PICO_EXC_BUF_UNDERFLOW  <- cb not empty, but no valid item
     PICO_EXC_BUF_OVERFLOW   <- buf not large enough
*/
pico_status_t picodata_cbGetItem(register picodata_CharBuffer this,
        picoos_uint8 *buf, const picoos_uint16 blenmax,
        picoos_uint16 *blen);

/* gets the speech data (without item head) from a CharBuffer in buf;
   blenmax is the max length (in number of bytes) of buf; blen is
   set to the number of bytes gotten in buf; return values:
     PICO_OK                 <- speech data of one item gotten
     PICO_EOF                <- no item available, cb is empty
     PICO_EXC_BUF_UNDERFLOW  <- cb not empty, but no valid item
     PICO_EXC_BUF_OVERFLOW   <- buf not large enough
*/
pico_status_t picodata_cbGetSpeechData(register picodata_CharBuffer this,
        picoos_uint8 *buf, const picoos_uint16 blenmax,
        picoos_uint16 *blen);

/* puts a single item (head and content) to a CharBuffer; clenmax is
   the max length (in number of bytes) accessible in content; clen is
   set to the number of bytes put from content; return values:
     PICO_OK                 <- one item put
     PICO_EXC_BUF_UNDERFLOW  <- no valid item in buf
     PICO_EXC_BUF_OVERFLOW   <- cb not large enough
*/
pico_status_t picodata_cbPutItem(register picodata_CharBuffer this,
        const picoos_uint8 *buf, const picoos_uint16 blenmax,
        picoos_uint16 *blen);

/* unsafe, just for measuring purposes */
picoos_uint8 picodata_cbGetFrontItemType(register picodata_CharBuffer this);

/* ***************************************************************
 *                   items: support function                     *
 *****************************************************************/

/* checks, whether item of type 'ch' is a valid item type */
picoos_uint8 is_valid_itemtype(const picoos_uint8 ch);

/* gets from buf a single item, values in head set and item content
   copied to content; blenmax and clenmax are the max lengths (in
   number of bytes) accessible in buf and content; clen is set to the
   number of bytes gotten in content; return values:
     PICO_OK                 <- all ok
     PICO_EXC_BUF_UNDERFLOW  <- blenmax problem, or no valid item
     PICO_EXC_BUF_OVERFLOW   <- overflow in content
*/
pico_status_t picodata_get_itemparts_nowarn(
        const picoos_uint8 *buf, const picoos_uint16 blenmax,
        picodata_itemhead_t *head, picoos_uint8 *content,
        const picoos_uint16 clenmax, picoos_uint16 *clen);

/* gets from buf a single item, values in head set and item content
   copied to content; blenmax and clenmax are the max lengths (in
   number of bytes) accessible in buf and content; clen is set to the
   number of bytes gotten in content; return values:
     PICO_OK                 <- all ok
     PICO_EXC_BUF_UNDERFLOW  <- blenmax problem, or no valid item
     PICO_EXC_BUF_OVERFLOW   <- overflow in content
*/
pico_status_t picodata_get_itemparts(
        const picoos_uint8 *buf, const picoos_uint16 blenmax,
        picodata_itemhead_t *head, picoos_uint8 *content,
        const picoos_uint16 clenmax, picoos_uint16 *clen);

/* puts a single item to buf; values in head and content copied to
   buf; clenmax is the max length (in number of bytes) accessible in
   content; blenmax is the max length (bytes) accessible in buf; blen
   is set to the number of bytes put to buf; return values:
     PICO_OK                 <- all ok
     PICO_EXC_BUF_UNDERFLOW  <- clenmax problem, or no valid item
     PICO_EXC_BUF_OVERFLOW   <- overflow in buf
*/
pico_status_t picodata_put_itemparts(const picodata_itemhead_t *head,
        const picoos_uint8 *content, const picoos_uint16 clenmax,
        picoos_uint8 *buf, const picoos_uint16 blenmax, picoos_uint16 *blen);

/* gets from buf info of a single item, values in head are set and
   content is set to the start of content in buf (not copied!);
   content is set to NULL if the content length is 0; blenmax is the
   max lengths (in number of bytes) accessible in buf; return values:
     PICO_OK                 <- all ok
     PICO_EXC_BUF_UNDERFLOW  <- blenmax problem, or no valid item
*/
pico_status_t picodata_get_iteminfo(
        picoos_uint8 *buf, const picoos_uint16 blenmax,
        picodata_itemhead_t *head, picoos_uint8 **content);

/* copies the item in inbuf to outbuf after first checking if there is
   a valid item in inbuf; inlenmax and outlenmax are the max length
   (in number of byte) accessible in the buffers); in *numb the total
   number of bytes copied to outbuf (incl. header) is returned; return
   values:
   PICO_OK                 <- item copied
   PICO_EXC_BUF_OVERFLOW   <- overflow in outbuf
   PICO_ERR_OTHER          <- no valid item in inbuf
*/
pico_status_t picodata_copy_item(const picoos_uint8 *inbuf,
        const picoos_uint16 inlenmax, picoos_uint8 *outbuf,
        const picoos_uint16 outlenmax, picoos_uint16 *numb);

/* sets the info1 field in the header contained in the item in buf;
   return values:
   PICO_OK                 <- all ok
   PICO_EXC_BUF_UNDERFLOW  <- underflow in buf
*/
pico_status_t picodata_set_iteminfo1(picoos_uint8 *buf,
        const picoos_uint16 blenmax, const picoos_uint8 info);

/* sets the info2 field in the header contained in the item in buf;
   return values:
   PICO_OK                 <- all ok
   PICO_EXC_BUF_UNDERFLOW  <- underflow in buf
*/
pico_status_t picodata_set_iteminfo2(picoos_uint8 *buf,
        const picoos_uint16 blenmax, const picoos_uint8 info);

/* sets the len field in the header contained in the item in buf;
   return values:
   PICO_OK                 <- all ok
   PICO_EXC_BUF_UNDERFLOW  <- underflow in buf
*/
pico_status_t picodata_set_itemlen(picoos_uint8 *buf,
        const picoos_uint16 blenmax, const picoos_uint8 len);

/* check item validity and return TRUE if valid; return FALSE if
   invalid; ilenmax is the max index to be used in item
*/
picoos_uint8 picodata_is_valid_item(const picoos_uint8 *item,
        const picoos_uint16 ilenmax);

/* return TRUE if head is a valid item head, FALSE otherwise */
picoos_uint8 picodata_is_valid_itemhead(const picodata_itemhead_t *head);


/* ***************************************************************
 *                   ProcessingUnit                              *
 *****************************************************************/
/* public */

#define PICODATA_MAX_ITEMSIZE (picoos_uint16) (PICODATA_ITEM_HEADSIZE + 256)

/* different buffer sizes per processing unit */
#define PICODATA_BUFSIZE_DEFAULT (picoos_uint16) PICODATA_MAX_ITEMSIZE
#define PICODATA_BUFSIZE_TEXT    (picoos_uint16)  1 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_TOK     (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_PR      (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_WA      (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_SA      (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_ACPH    (picoos_uint16)  2 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_SPHO    (picoos_uint16)  4 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_PAM     (picoos_uint16)  4 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_CEP     (picoos_uint16) 16 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_SIG     (picoos_uint16) 16 * PICODATA_BUFSIZE_DEFAULT
#define PICODATA_BUFSIZE_SINK     (picoos_uint16) 1 * PICODATA_BUFSIZE_DEFAULT

/* different types of processing units */
typedef enum picodata_putype {
    PICODATA_PUTYPE_TEXT,   /* text */
    PICODATA_PUTYPE_TOK,    /* tokenizer output */
    PICODATA_PUTYPE_PR,     /* preprocessor output */
    PICODATA_PUTYPE_WA,     /* word analysis */
    PICODATA_PUTYPE_SA,     /* sentence analysis */
    PICODATA_PUTYPE_ACPH,     /* accentuation and phrasing */
    PICODATA_PUTYPE_SPHO,   /* sentence phonology (textana postproc) */
    PICODATA_PUTYPE_PAM,    /* phonetics to acoustics mapper processing unit */
    PICODATA_PUTYPE_CEP,    /* cepstral smoothing processing unit */
    PICODATA_PUTYPE_SIG,     /* signal generation processing unit*/
    PICODATA_PUTYPE_SINK     /* item sink unit*/
} picodata_putype_t;

picoos_uint16 picodata_get_default_buf_size (picodata_putype_t puType);

/* result values returned from the pu->puStep() methode */
typedef enum picodata_step_result {
    PICODATA_PU_ERROR,
    /* PICODATA_PU_EMPTY, *//* reserved (no internal data to be processed) */
    PICODATA_PU_IDLE, /* need more input to process internal data */
    PICODATA_PU_BUSY, /* processing internal data */
    PICODATA_PU_ATOMIC, /* same as pu_busy, but wants to get next time slot (while in an "atomar" operation) */
    PICODATA_PU_OUT_FULL /* can't proceed because output is full. (next time slot to be assigned to pu's output's consumer) */
} picodata_step_result_t;

typedef struct picodata_processing_unit * picodata_ProcessingUnit;

picodata_ProcessingUnit picodata_newProcessingUnit(
        picoos_MemoryManager mm,
        picoos_Common common,
        picodata_CharBuffer cbIn,
        picodata_CharBuffer cbOut,
        picorsrc_Voice voice);

void picodata_disposeProcessingUnit(
        picoos_MemoryManager mm,
        picodata_ProcessingUnit * this);

picodata_CharBuffer picodata_getCbIn(picodata_ProcessingUnit this);
picodata_CharBuffer picodata_getCbOut(picodata_ProcessingUnit this);
pico_status_t picodata_setCbIn(picodata_ProcessingUnit this, picodata_CharBuffer cbIn);
pico_status_t picodata_setCbOut(picodata_ProcessingUnit this, picodata_CharBuffer cbOut);

/* protected */
typedef pico_status_t (* picodata_puInitializeMethod) (register picodata_ProcessingUnit this, picoos_int32 mode);
typedef pico_status_t (* picodata_puTerminateMethod) (register picodata_ProcessingUnit this);
typedef picodata_step_result_t (* picodata_puStepMethod) (register picodata_ProcessingUnit this, picoos_int16 mode, picoos_uint16 * numBytesOutput);
typedef pico_status_t (* picodata_puSubDeallocateMethod) (register picodata_ProcessingUnit this, picoos_MemoryManager mm);

typedef struct picodata_processing_unit
{
    /* public */
    picodata_puInitializeMethod initialize;
    picodata_puStepMethod       step;
    picodata_puTerminateMethod  terminate;
    picorsrc_Voice              voice;

    /* protected */
    picoos_Common                  common;
    picodata_CharBuffer            cbIn, cbOut;
    picodata_puSubDeallocateMethod subDeallocate;
    void * subObj;

} picodata_processing_unit_t;

/* currently, only wav input and output is supported */
#define PICODATA_PUTYPE_TEXT_OUTPUT_EXTENSION   (picoos_uchar*)".txt"
#define PICODATA_PUTYPE_TOK_INPUT_EXTENSION     PICODATA_PUTYPE_TEXT_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_TOK_OUTPUT_EXTENSION    (picoos_uchar*)".tok"
#define PICODATA_PUTYPE_PR_INPUT_EXTENSION      PICODATA_PUTYPE_TOK_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_PR_OUTPUT_EXTENSION     (picoos_uchar*)".pr"
#define PICODATA_PUTYPE_WA_INPUT_EXTENSION      PICODATA_PUTYPE_PR_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_WA_OUTPUT_EXTENSION     (picoos_uchar*)".wa"
#define PICODATA_PUTYPE_SA_INPUT_EXTENSION      PICODATA_PUTYPE_WA_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_SA_OUTPUT_EXTENSION     (picoos_uchar*)".sa"
#define PICODATA_PUTYPE_ACPH_INPUT_EXTENSION    PICODATA_PUTYPE_SA_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_ACPH_OUTPUT_EXTENSION   (picoos_uchar*)".acph"
#define PICODATA_PUTYPE_SPHO_INPUT_EXTENSION    PICODATA_PUTYPE_ACPH_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_SPHO_OUTPUT_EXTENSION   (picoos_uchar*)".spho"
#define PICODATA_PUTYPE_PAM_INPUT_EXTENSION     PICODATA_PUTYPE_SPHO_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_PAM_OUTPUT_EXTENSION    (picoos_uchar*)".pam"
#define PICODATA_PUTYPE_CEP_INPUT_EXTENSION     PICODATA_PUTYPE_PAM_OUTPUT_EXTENSION
#define PICODATA_PUTYPE_CEP_OUTPUT_EXTENSION    (picoos_uchar*)".cep"
#define PICODATA_PUTYPE_SIG_INPUT_EXTENSION     PICODATA_PUTYPE_CEP_OUTPUT_EXTENSION   /*PP 11.7.08*/
#define PICODATA_PUTYPE_SIG_OUTPUT_EXTENSION    (picoos_uchar*)".sig"
#define PICODATA_PUTYPE_SINK_INPUT_EXTENSION    PICODATA_PUTYPE_SIG_OUTPUT_EXTENSION

/*wav input is for play wav files in sig */
#define PICODATA_PUTYPE_WAV_INPUT_EXTENSION    (picoos_uchar*)".wav"                    /*PP 11.7.08*/

/*wav output is for saving wav (binary) files in sig*/
#define PICODATA_PUTYPE_WAV_OUTPUT_EXTENSION    (picoos_uchar*)".wav"                    /*PP 14.7.08*/

/* ***************************************************************
 *                   auxiliary routines                          *
 *****************************************************************/

picoos_uint8 picodata_getPuTypeFromExtension(picoos_uchar * filename, picoos_bool input);

#define PICODATA_XSAMPA (picoos_uchar *)"xsampa"
#define PICODATA_SAMPA (picoos_uchar *)"sampa"
#define PICODATA_SVOXPA (picoos_uchar *)"svoxpa"

/*----------------------------------------------------------*/
/** @brief   maps an input phone string to its internal representation
 *
 * @param transducer initialized SimpleTransducer
 * @param xsampa_parser fst converting xsampa char input to xsampa ids
 * @param svoxpa_parser
 * @param xsampa2svoxpa_mapper
 * @param inputPhones input phone string in alphabet 'alphabet'
 * @param alphabet input alphabet
 * @retval outputPhoneIds output phone string in internal representation
 * @param maxOutputPhoneIds
 * @return PICO_OK=mapping done, PICO_ERR_OTHER:unknown alphabet, unknown phones
 */
/*---------------------------------------------------------*/
pico_status_t picodata_mapPAStrToPAIds(
        picotrns_SimpleTransducer transducer,
        picoos_Common common,
        picokfst_FST xsampa_parser,
        picokfst_FST svoxpa_parser,
        picokfst_FST xsampa2svoxpa_mapper,
        picoos_uchar * inputPhones,
        picoos_uchar * alphabet,
        picoos_uint8 * outputPhoneIds,
        picoos_int32 maxOutputPhoneIds);

/* number of binary digits after the comma for fixed-point calculation */
#define PICODATA_PRECISION 10
/* constant 0.5 in PICODATA_PRECISION */
#define PICODATA_PREC_HALF 512

void picodata_transformDurations(
        picoos_uint8 frame_duration_exp,
        picoos_int8 array_length,
        picoos_uint8 * inout,
        const picoos_uint16 * weight,  /* integer weights */
        picoos_int16 mintarget, /* minimum target duration in ms */
        picoos_int16 maxtarget, /* maximum target duration in ms */
        picoos_int16 facttarget, /* factor to be multiplied with original length to get the target
                                     the factor is fixed-point with precision PRECISION, i.e.
                                     the factor as float would be facttarget / PRECISION_FACT
                                     if factor is 0, only min/max are considered */
        picoos_int16 * dur_rest /* in/out, rest in ms */
        );



/* ***************************************************************
 *                   For Debugging only                          *
 *****************************************************************/

#if defined (PICO_DEBUG)

/* convert (pretty print) item head 'head' and put output in 'str',
   strsize is the maximum length of 'str' in bytes */
picoos_char * picodata_head_to_string(const picodata_itemhead_t *head,
                                      picoos_char * str, picoos_uint16 strsize);

/* put 'pref6ch' (max. 6 char prefix) and a pretty print output of
   'item' in 'str', strlenmax is the maximum length of 'str' in
   bytes */
void picodata_info_item(const picoknow_KnowledgeBase kb,
                        const picoos_uint8 *pref6ch,
                        const picoos_uint8 *item,
                        const picoos_uint16 itemlenmax,
                        const picoos_char *filterfn);


#define PICODATA_INFO_ITEM(kb, pref, item, itemlenmax)   \
    PICODBG_INFO_CTX(); \
    picodata_info_item(kb, pref, item, itemlenmax, (picoos_char *)__FILE__)



#else

#define PICODATA_INFO_ITEM(kb, pref, item, itemlenmax)

#endif

#ifdef __cplusplus
}
#endif

#endif /*PICODATA_H_*/