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
36extern "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 *****************************************************************/
77typedef struct picodata_char_buffer * picodata_CharBuffer;
78
79picodata_CharBuffer picodata_newCharBuffer(picoos_MemoryManager mm,
80        picoos_Common common, picoos_objsize_t size);
81
82void picodata_disposeCharBuffer(picoos_MemoryManager mm,
83                                picodata_CharBuffer * this);
84
85/* should not be used for PUs but only for feeding the initial cb */
86pico_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) */
89picoos_int16 picodata_cbGetCh(register picodata_CharBuffer this);
90
91/* reset cb (as if after newCharBuffer) */
92pico_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
103typedef 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*/
301pico_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*/
313pico_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*/
324pico_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 */
329picoos_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 */
336picoos_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*/
346pico_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*/
359pico_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*/
372pico_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*/
383pico_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*/
396pico_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*/
405pico_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*/
413pico_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*/
421pico_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*/
427picoos_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 */
431picoos_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 */
456typedef 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
470picoos_uint16 picodata_get_default_buf_size (picodata_putype_t puType);
471
472/* result values returned from the pu->puStep() methode */
473typedef 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
482typedef struct picodata_processing_unit * picodata_ProcessingUnit;
483
484picodata_ProcessingUnit picodata_newProcessingUnit(
485        picoos_MemoryManager mm,
486        picoos_Common common,
487        picodata_CharBuffer cbIn,
488        picodata_CharBuffer cbOut,
489        picorsrc_Voice voice);
490
491void picodata_disposeProcessingUnit(
492        picoos_MemoryManager mm,
493        picodata_ProcessingUnit * this);
494
495picodata_CharBuffer picodata_getCbIn(picodata_ProcessingUnit this);
496picodata_CharBuffer picodata_getCbOut(picodata_ProcessingUnit this);
497pico_status_t picodata_setCbIn(picodata_ProcessingUnit this, picodata_CharBuffer cbIn);
498pico_status_t picodata_setCbOut(picodata_ProcessingUnit this, picodata_CharBuffer cbOut);
499
500/* protected */
501typedef pico_status_t (* picodata_puInitializeMethod) (register picodata_ProcessingUnit this, picoos_int32 mode);
502typedef pico_status_t (* picodata_puTerminateMethod) (register picodata_ProcessingUnit this);
503typedef picodata_step_result_t (* picodata_puStepMethod) (register picodata_ProcessingUnit this, picoos_int16 mode, picoos_uint16 * numBytesOutput);
504typedef pico_status_t (* picodata_puSubDeallocateMethod) (register picodata_ProcessingUnit this, picoos_MemoryManager mm);
505
506typedef 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
554picoos_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/*---------------------------------------------------------*/
574pico_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
590void 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 */
614picoos_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 */
620void 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