1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License");
5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License.
6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at
7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *     http://www.apache.org/licenses/LICENSE-2.0
9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software
11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS,
12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and
14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License.
15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picodata.c
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved.
21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History:
23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version
24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodefs.h"
28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h"
29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h"
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picorsrc.h"
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picotrns.h"
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodata.h"
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" {
36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0
38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* we output coefficients as fixed point values */
42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICOCEP_OUT_DATA_FORMAT PICODATA_ITEMINFO1_FRAME_PAR_DATA_FORMAT_FIXED
43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***************************************************************
45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *                   CharBuffer                                  *
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *****************************************************************/
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * method signatures
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef pico_status_t (* picodata_cbPutItemMethod) (register picodata_CharBuffer this,
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint8 *buf, const picoos_uint16 blenmax,
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen);
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef pico_status_t (* picodata_cbGetItemMethod) (register picodata_CharBuffer this,
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 *buf, const picoos_uint16 blenmax,
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen, const picoos_uint8 issd);
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef pico_status_t (* picodata_cbSubResetMethod) (register picodata_CharBuffer this);
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef pico_status_t (* picodata_cbSubDeallocateMethod) (register picodata_CharBuffer this, picoos_MemoryManager mm);
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picodata_char_buffer
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char *buf;
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 rear; /* next free position to write */
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 front; /* next position to read */
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 len; /* empty: len = 0, full: len = size */
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 size;
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_Common common;
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_cbGetItemMethod getItem;
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_cbPutItemMethod putItem;
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_cbSubResetMethod subReset;
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_cbSubDeallocateMethod subDeallocate;
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    void * subObj;
78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} char_buffer_t;
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t data_cbPutItem(register picodata_CharBuffer this,
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint8 *buf, const picoos_uint16 blenmax,
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen);
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t data_cbGetItem(register picodata_CharBuffer this,
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 *buf, const picoos_uint16 blenmax,
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen, const picoos_uint8 issd);
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_cbReset(register picodata_CharBuffer this)
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->rear = 0;
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->front = 0;
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->len = 0;
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this->subObj) {
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return this->subReset(this);
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* CharBuffer constructor */
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_CharBuffer picodata_newCharBuffer(picoos_MemoryManager mm,
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_Common common,
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_objsize_t size)
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_CharBuffer this;
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this = (picodata_CharBuffer) picoos_allocate(mm, sizeof(*this));
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("new character buffer, size=%i", size));
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->buf = picoos_allocate(mm, size);
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this->buf) {
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm, (void*) &this);
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->size = size;
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->common = common;
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->getItem = data_cbGetItem;
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->putItem = data_cbPutItem;
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subReset = NULL;
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subDeallocate = NULL;
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subObj = NULL;
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_cbReset(this);
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodata_disposeCharBuffer(picoos_MemoryManager mm,
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                picodata_CharBuffer *this)
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != (*this)) {
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* terminate */
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (NULL != (*this)->subObj) {
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*this)->subDeallocate(*this,mm);
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm,(void*)&(*this)->buf);
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm,(void*)this);
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_cbPutCh(register picodata_CharBuffer this,
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               picoos_char ch)
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this->len < this->size) {
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->buf[this->rear++] = ch;
150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->rear %= this->size;
151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->len++;
152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_OVERFLOW;
155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_int16 picodata_cbGetCh(register picodata_CharBuffer this)
160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char ch;
162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this->len > 0) {
163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        ch = this->buf[this->front++];
164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->front %= this->size;
165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->len--;
166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return ch;
167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EOF;
169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***************************************************************
173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *                   items: CharBuffer functions                 *
174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *****************************************************************/
175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t data_cbGetItem(register picodata_CharBuffer this,
177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 *buf, const picoos_uint16 blenmax,
178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen, const picoos_uint8 issd)
179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this->len < PICODATA_ITEM_HEADSIZE) {    /* item not in cb? */
183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen = 0;
184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (this->len == 0) {    /* is cb empty? */
185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG(("no item to get"));
186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_EOF;
187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {    /* cb not empty, but not a valid item */
188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem getting item, incomplete head, underflow"));
189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *blen = PICODATA_ITEM_HEADSIZE + (picoos_uint8)(this->buf[((this->front) +
193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                      PICODATA_ITEMIND_LEN) % this->size]);
194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* if getting speech data in item */
196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (issd) {
197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* check item type */
198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (this->buf[this->front] != PICODATA_ITEM_FRAME) {
199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("item type mismatch for speech data: %c",
200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                          this->buf[this->front]));
201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (i=0; i<*blen; i++) {
202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                this->front++;
203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                this->front %= this->size;
204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                this->len--;
205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *blen = 0;
207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_OK;
208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*blen > this->len) {    /* item in cb not complete? */
212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem getting item, incomplete content, underflow; "
213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                      "blen=%d, len=%d", *blen, this->len));
214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen = 0;
215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (blenmax < *blen) {    /* buf not large enough? */
218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem getting item, overflow"));
219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen = 0;
220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_OVERFLOW;
221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* if getting speech data in item */
224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (issd) {
225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* skip item header */
226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i = 0; i < PICODATA_ITEM_HEADSIZE; i++) {
227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->front++;
228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->front %= this->size;
229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            this->len--;
230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen -= PICODATA_ITEM_HEADSIZE;
232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* all ok, now get item (or speech data only) */
235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < *blen; i++) {
236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        buf[i] = (picoos_uint8)(this->buf[this->front++]);
237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->front %= this->size;
238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->len--;
239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG)
242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (issd) {
243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("got speech data: %d samples", *blen));
244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("got item: %c|%d|%d|%d||", buf[PICODATA_ITEMIND_TYPE],
246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       buf[PICODATA_ITEMIND_INFO1], buf[PICODATA_ITEMIND_INFO2],
247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       buf[PICODATA_ITEMIND_LEN]));
248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (i=PICODATA_ITEM_HEADSIZE; i<*blen; i++) {
249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (buf[PICODATA_ITEMIND_TYPE] == PICODATA_ITEM_WORDGRAPH) {
250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("%c", buf[i]));
251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG((" %d", buf[i]));
253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t data_cbPutItem(register picodata_CharBuffer this,
262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint8 *buf, const picoos_uint16 blenmax,
263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen)
264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (blenmax < PICODATA_ITEM_HEADSIZE) {    /* itemlen not accessible? */
268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem putting item, underflow"));
269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen = 0;
270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *blen = buf[PICODATA_ITEMIND_LEN] + PICODATA_ITEM_HEADSIZE;
273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*blen > (this->size - this->len)) {    /* cb not enough space? */
274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem putting item, overflow"));
275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen = 0;
276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_OVERFLOW;
277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*blen > blenmax) {    /* item in buf not completely accessible? */
279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem putting item, underflow"));
280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen = 0;
281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* all ok, now put complete item */
284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG)
286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("putting item: %c|%d|%d|%d||",
287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   buf[PICODATA_ITEMIND_TYPE],
288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   buf[PICODATA_ITEMIND_INFO1],
289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   buf[PICODATA_ITEMIND_INFO2],
290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                   buf[PICODATA_ITEMIND_LEN]));
291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i=PICODATA_ITEM_HEADSIZE; i<*blen; i++) {
292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (buf[PICODATA_ITEMIND_TYPE] == PICODATA_ITEM_WORDGRAPH) {
293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG(("%c", buf[i]));
294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG((" %d", buf[i]));
296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < *blen; i++) {
301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* put single byte */
302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->buf[this->rear++] = (picoos_char)buf[i];
303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->rear %= this->size;
304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->len++;
305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*----------------------------------------------------------
310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *  Names   : picodata_cbGetItem
311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            picodata_cbGetSpeechData
312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *  Function: gets one item from 'this' and writes it on 'blenmax' sized 'buf'.
313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            gets one item from 'this' and writes the speech data to
314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *              'blenmax' sized 'buf'.
315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *  Returns : PICO_OK : one item was copied
316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            PICO_EOF : 'this' is empty; no new items available
317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            PICO_BUF_UNDERFLOW : 'this' doesn't contain a full/valid item
318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            PICO_BUF_OVERFLOW : 'buf[blenmax]' too small to hold item
319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *            on return, '*blen' contains the number of bytes written to 'buf'
320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * ---------------------------------------------------------*/
321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_cbGetItem(register picodata_CharBuffer this,
322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 *buf, const picoos_uint16 blenmax,
323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen)
324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this->getItem(this, buf, blenmax, blen, FALSE);
326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_cbGetSpeechData(register picodata_CharBuffer this,
329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 *buf, const picoos_uint16 blenmax,
330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen)
331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this->getItem(this, buf, blenmax, blen, TRUE);
334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_cbPutItem(register picodata_CharBuffer this,
338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint8 *buf, const picoos_uint16 blenmax,
339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 *blen)
340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return this->putItem(this,buf,blenmax,blen);
343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* unsafe, just for measuring purposes */
346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picodata_cbGetFrontItemType(register picodata_CharBuffer this)
347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return  this->buf[this->front];
349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***************************************************************
351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *                   items: support function                     *
352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *****************************************************************/
353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 is_valid_itemtype(const picoos_uint8 ch) {
355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (ch) {
356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WSEQ_GRAPH:
357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_TOKEN:
358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WORDGRAPH:
359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WORDINDEX:
360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WORDPHON:
361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_SYLLPHON:
362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_BOUND:
363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_PUNC:
364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_CMD:
365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_PHONE:
366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_FRAME:
367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_FRAME_PAR:
368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return TRUE;
369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_OTHER:
371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_WARN(("item type problem: %c", ch));
375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picodata_is_valid_itemhead(const picodata_itemhead_t *head) {
379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((NULL != head) && is_valid_itemtype(head->type)) {
380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return TRUE;
381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("item header problem"));
383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***************************************************/
388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_get_itemparts_nowarn(
391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint8 *buf, const picoos_uint16 blenmax,
392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_itemhead_t *head, picoos_uint8 *content,
393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 clenmax, picoos_uint16 *clen)
394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (blenmax >= PICODATA_ITEM_HEADSIZE) {
396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->type = buf[PICODATA_ITEMIND_TYPE];
397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->info1 = buf[PICODATA_ITEMIND_INFO1];
398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->info2 = buf[PICODATA_ITEMIND_INFO2];
399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->len = buf[PICODATA_ITEMIND_LEN];
400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *clen = head->len;
401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (blenmax >= (*clen + PICODATA_ITEM_HEADSIZE)) {
402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (clenmax >= head->len) {
403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_uint16 i;
404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                for (i=0; i<head->len; i++) {
405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    content[i] = buf[PICODATA_ITEM_HEADSIZE+i];
406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return PICO_OK;
408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *clen = 0;
410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_EXC_BUF_OVERFLOW;
411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *clen = 0;
414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_EXC_BUF_UNDERFLOW;
415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_get_itemparts(
418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint8 *buf, const picoos_uint16 blenmax,
419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_itemhead_t *head, picoos_uint8 *content,
420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 clenmax, picoos_uint16 *clen)
421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status = picodata_get_itemparts_nowarn(buf,blenmax,head,content,clenmax,clen);
423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_EXC_BUF_OVERFLOW == status) {
424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem getting item, overflow"));
425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if  (PICO_EXC_BUF_UNDERFLOW == status) {
426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem getting item, overflow"));
427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return status;
429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_put_itemparts(const picodata_itemhead_t *head,
431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint8 *content, const picoos_uint16 clenmax,
432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 *buf, const picoos_uint16 blenmax, picoos_uint16 *blen)
433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *blen = head->len + PICODATA_ITEM_HEADSIZE;
435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (blenmax >= *blen) {
436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (clenmax >= head->len) {
437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_uint16 i;
438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            buf[PICODATA_ITEMIND_TYPE] = head->type;
439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            buf[PICODATA_ITEMIND_INFO1] = head->info1;
440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            buf[PICODATA_ITEMIND_INFO2] = head->info2;
441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            buf[PICODATA_ITEMIND_LEN] = head->len;
442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (i=0; i<head->len; i++) {
443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                buf[PICODATA_ITEM_HEADSIZE+i] = content[i];
444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_OK;
446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("problem putting item, underflow"));
448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *blen = 0;
449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_WARN(("problem putting item, overflow"));
452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *blen = 0;
453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_EXC_BUF_OVERFLOW;
454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_get_iteminfo(
457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 *buf, const picoos_uint16 blenmax,
458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_itemhead_t *head, picoos_uint8 **content) {
459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (blenmax >= PICODATA_ITEM_HEADSIZE) {
460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->type = buf[PICODATA_ITEMIND_TYPE];
461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->info1 = buf[PICODATA_ITEMIND_INFO1];
462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->info2 = buf[PICODATA_ITEMIND_INFO2];
463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head->len = buf[PICODATA_ITEMIND_LEN];
464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (head->len == 0) {
465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *content = NULL;
466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *content = &buf[PICODATA_ITEM_HEADSIZE];
468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_EXC_BUF_UNDERFLOW;
472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_copy_item(const picoos_uint8 *inbuf,
475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 inlenmax, picoos_uint8 *outbuf,
476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 outlenmax, picoos_uint16 *numb)
477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (picodata_is_valid_item(inbuf, inlenmax)) {
479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *numb = PICODATA_ITEM_HEADSIZE + inbuf[PICODATA_ITEMIND_LEN];
480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *numb = 0;
482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (*numb > 0) {
484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (outlenmax >= inlenmax) {
485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_uint16 i;
486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            for (i=0; i<*numb; i++) {
487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                outbuf[i] = inbuf[i];
488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_OK;
490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("buffer problem, out: %d > in: %d", outlenmax, inlenmax));
492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *numb = 0;
493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICO_EXC_BUF_OVERFLOW;
494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_WARN(("item problem in inbuf"));
497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_OTHER;
498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_set_iteminfo1(picoos_uint8 *buf,
502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 blenmax, const picoos_uint8 info) {
503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICODATA_ITEMIND_INFO1 < blenmax) {
504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        buf[PICODATA_ITEMIND_INFO1] = info;
505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else
507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_set_iteminfo2(picoos_uint8 *buf,
511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 blenmax, const picoos_uint8 info) {
512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICODATA_ITEMIND_INFO2 < blenmax) {
513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        buf[PICODATA_ITEMIND_INFO2] = info;
514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else
516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* sets the len field in the header contained in the item in buf;
520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   return values:
521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   PICO_OK                 <- all ok
522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   PICO_EXC_BUF_UNDERFLOW  <- underflow in buf
523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_set_itemlen(picoos_uint8 *buf,
525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 blenmax, const picoos_uint8 len) {
526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICODATA_ITEMIND_LEN < blenmax) {
527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        buf[PICODATA_ITEMIND_LEN] = len;
528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else
530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_EXC_BUF_UNDERFLOW;
531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picodata_is_valid_item(const picoos_uint8 *item,
534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 ilenmax)
535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (ilenmax >= PICODATA_ITEM_HEADSIZE) {
537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_itemhead_t head;
538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head.type = item[0];
539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head.info1 = item[1];
540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head.info2 = item[2];
541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        head.len = item[3];
542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((ilenmax >= (head.len + PICODATA_ITEM_HEADSIZE)) &&
543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picodata_is_valid_itemhead(&head))
544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        {
545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return TRUE;
546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return FALSE;
549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***************************************************************
552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *                   ProcessingUnit                              *
553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *****************************************************************/
554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint16 picodata_get_default_buf_size (picodata_putype_t puType)
555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return  (PICODATA_PUTYPE_TEXT == puType) ? PICODATA_BUFSIZE_TEXT
557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_TOK  == puType) ? PICODATA_BUFSIZE_TOK
558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_PR   == puType) ? PICODATA_BUFSIZE_PR
559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_PR   == puType) ? PICODATA_BUFSIZE_PR
560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_WA   == puType) ? PICODATA_BUFSIZE_WA
561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_SA   == puType) ? PICODATA_BUFSIZE_SA
562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_ACPH == puType) ? PICODATA_BUFSIZE_ACPH
563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_SPHO == puType) ? PICODATA_BUFSIZE_SPHO
564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_PAM  == puType) ? PICODATA_BUFSIZE_PAM
565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_CEP  == puType) ? PICODATA_BUFSIZE_CEP
566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_SIG  == puType) ? PICODATA_BUFSIZE_SIG
567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          : (PICODATA_PUTYPE_SINK  == puType) ? PICODATA_BUFSIZE_SINK
568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen          :                                    PICODATA_BUFSIZE_DEFAULT;
569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct simple_pu_data
573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picorsrc_Voice voice;
575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} simple_pu_data_t;
576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
577e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivistatic pico_status_t puSimpleInitialize (register picodata_ProcessingUnit this, picoos_int32 resetMode) {
578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t puSimpleTerminate (register picodata_ProcessingUnit this) {
582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picodata_step_result_t puSimpleStep (register picodata_ProcessingUnit this,
586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            picoos_int16 mode,
587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            picoos_uint16 * numBytesOutput) {
588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 ch;
589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int16 result = PICO_OK;
590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    mode = mode;        /*PP 13.10.08 : fix warning "var not used in this function"*/
591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *numBytesOutput = 0;
592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((result == PICO_OK) && (ch = picodata_cbGetCh(this->cbIn)) != PICO_EOF) {
593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        result = picodata_cbPutCh(this->cbOut,(picoos_char) ch);
594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*numBytesOutput)++;
595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK != result) {
597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*numBytesOutput)--;
598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (PICO_OK == result) {
600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICODATA_PU_IDLE;
601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICODATA_PU_ERROR;
603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_ProcessingUnit picodata_newProcessingUnit(
608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_MemoryManager mm,
609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_Common common,
610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_CharBuffer cbIn,
611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_CharBuffer cbOut,
612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picorsrc_Voice voice)
613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_ProcessingUnit this = (picodata_ProcessingUnit) picoos_allocate(mm, sizeof(*this));
615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this == NULL) {
616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL);
617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->common = common;
620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->cbIn = cbIn;
621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->cbOut = cbOut;
622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->voice = voice;
623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->initialize = puSimpleInitialize;
624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->terminate = puSimpleTerminate;
625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->step = puSimpleStep;
626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subDeallocate = NULL;
627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subObj = NULL;
628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodata_disposeProcessingUnit(
632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_MemoryManager mm,
633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picodata_ProcessingUnit * this)
634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != (*this)) {
636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* terminate */
637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (NULL != (*this)->subObj) {
638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*this)->subDeallocate(*this,mm);
639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm,(void *)this);
641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_CharBuffer picodata_getCbIn(picodata_ProcessingUnit this)
647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(this->common->em,PICO_ERR_NULLPTR_ACCESS,NULL,NULL);
650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return this->cbIn;
653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_CharBuffer picodata_getCbOut(picodata_ProcessingUnit this)
657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(this->common->em,PICO_ERR_NULLPTR_ACCESS,NULL,NULL);
660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return this->cbOut;
663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_setCbIn(picodata_ProcessingUnit this, picodata_CharBuffer cbIn)
667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(this->common->em,PICO_ERR_NULLPTR_ACCESS,NULL,NULL);
670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_OTHER;
671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->cbIn = cbIn;
673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_setCbOut(picodata_ProcessingUnit this, picodata_CharBuffer cbOut)
679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(this->common->em,PICO_ERR_NULLPTR_ACCESS,NULL,NULL);
682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_ERR_OTHER;
683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        this->cbOut = cbOut;
685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***************************************************************
691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *                   auxiliary functions                         *
692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *****************************************************************/
693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void transDurUniform(
695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 frame_duration_exp, /* 2's exponent of frame duration in ms, e.g. 2 for 4ms, 3 for 8ms */
696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int8 array_length,
697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 * inout,
698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 inputdur, /* input duration in ms */
699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 targetdur, /* target duration in ms */
700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 * restdur /* in/out, rest in ms */
701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        )
702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 i;
704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 fact, rest;
705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* calculate rest and factor in number of frames (in PICODATA_PICODATA_PRECISION) */
707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    rest = (*restdur) << (PICODATA_PRECISION - frame_duration_exp);
708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    fact = (targetdur << (PICODATA_PRECISION - frame_duration_exp)) / inputdur;
709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < array_length; i++) {
711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        rest += fact * inout[i];
712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* instead of rounding, we carry the rest to the next state */
713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        inout[i] = rest >> PICODATA_PRECISION;
714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        rest -= inout[i] << PICODATA_PRECISION;
715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    (*restdur) = rest >> (PICODATA_PRECISION - frame_duration_exp);
717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void transDurWeighted(
720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 frame_duration_exp, /* 2's exponent of frame duration in ms, e.g. 2 for 4ms, 3 for 8ms */
721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int8 array_length,
722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 * inout,
723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 * weight,  /* integer weights */
724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 inputdur, /* input duration in ms */
725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 targetdur, /* target duration in ms */
726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 * restdur /* in/out, rest in ms */
727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        )
728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 i;
730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 fact, rest, out, weighted_sum;
731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* calculate rest and factor in number of frames (in PICODATA_PICODATA_PRECISION) */
733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    rest = (*restdur) << (PICODATA_PRECISION - frame_duration_exp);
734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    weighted_sum = 0;
735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i=0; i < array_length; i++) {
736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        weighted_sum += inout[i] * weight[i];
737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (0 == weighted_sum) {
739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        transDurUniform(frame_duration_exp,array_length,inout,inputdur,targetdur,restdur);
740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return;
741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* get the additive change factor in PICODATA_PRECISION: */
743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (targetdur > inputdur) {
744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        fact = ((targetdur - inputdur) << (PICODATA_PRECISION-frame_duration_exp))/ weighted_sum;
745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        fact = -((inputdur - targetdur) << (PICODATA_PRECISION-frame_duration_exp))/ weighted_sum;
747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* input[i] * fact * weight[i] is the additive modification in PICODATA_PRECISION */
750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i=0; i < array_length; i++) {
751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        rest += fact * inout[i] * weight[i];
752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* instead of rounding, we carry the rest to the next state */
753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        out = inout[i] + (rest >> PICODATA_PRECISION);
754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (out < 0) {
755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            out = 0;
756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        rest -= ((out-inout[i]) << PICODATA_PRECISION);
758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        inout[i] = out;
759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   (*restdur) = rest >> (PICODATA_PRECISION - frame_duration_exp);
761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodata_transformDurations(
766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 frame_duration_exp,
767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int8 array_length,
768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 * inout,
769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        const picoos_uint16 * weight,  /* integer weights */
770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 mintarget, /* minimum target duration in ms */
771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 maxtarget, /* maximum target duration in ms */
772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 facttarget, /* factor to be multiplied with original length to get the target
773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     the factor is fixed-point with PICODATA_PRECISION PICODATA_PRECISION, i.e.
774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     the factor as float would be facttarget / PICODATA_PRECISION_FACT
775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     if factor is 0, only min/max are considered */
776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_int16 * dur_rest /* in/out, rest in ms */
777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        )
778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 inputdur, targetdur;
780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int8 i;
781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* find the original duration in ms */
783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    inputdur = 0;
784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i=0; i < array_length; i++) {
785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        inputdur += inout[i];
786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("######## transforming duration fact=%i, limits = [%i,%i] (input frames: %i)",facttarget,mintarget,maxtarget, inputdur));
789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    inputdur <<= frame_duration_exp;
791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* find the target duration */
793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (facttarget) {
794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        targetdur = (facttarget * inputdur + PICODATA_PREC_HALF) >> PICODATA_PRECISION;
795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        targetdur = inputdur;
797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* we need to modify input if there is an explicit factor or input is not in the target range */
800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (facttarget || (targetdur < mintarget) || (maxtarget < targetdur)) {
801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* make sure we are in the limits */
802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (targetdur < mintarget) {
803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            targetdur = mintarget;
804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (maxtarget < targetdur) {
805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            targetdur = maxtarget;
806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* perform modification */
808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (NULL == weight) {
809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            transDurUniform(frame_duration_exp,array_length,inout,inputdur,targetdur,dur_rest);
810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            transDurWeighted(frame_duration_exp,array_length,inout,weight,inputdur,targetdur,dur_rest);
812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern picoos_uint8 picodata_getPuTypeFromExtension(picoos_uchar * filename, picoos_bool input)
819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (input) {
821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (picoos_has_extension(filename, PICODATA_PUTYPE_TOK_INPUT_EXTENSION)) {
822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_TOK;
823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_PR_INPUT_EXTENSION)) {
825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_PR;
826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_WA_INPUT_EXTENSION)) {
828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_WA;
829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_SA_INPUT_EXTENSION)) {
831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_SA;
832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_ACPH_INPUT_EXTENSION)) {
834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_ACPH;
835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_SPHO_INPUT_EXTENSION)) {
837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_SPHO;
838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_PAM_INPUT_EXTENSION)) {
840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_PAM;
841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_CEP_INPUT_EXTENSION)) {
843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_CEP;
844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_SIG_INPUT_EXTENSION) ||
846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_has_extension(filename, PICODATA_PUTYPE_WAV_INPUT_EXTENSION)) {
847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_SIG;
848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else {
850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_UNKNOWN;
851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    else {
854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (picoos_has_extension(filename, PICODATA_PUTYPE_TOK_OUTPUT_EXTENSION)) {
855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_TOK;
856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_PR_OUTPUT_EXTENSION)) {
858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_PR;
859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_WA_OUTPUT_EXTENSION)) {
861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_WA;
862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_SA_OUTPUT_EXTENSION)) {
864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_SA;
865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_ACPH_OUTPUT_EXTENSION)) {
867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_ACPH;
868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_SPHO_OUTPUT_EXTENSION)) {
870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_SPHO;
871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_PAM_OUTPUT_EXTENSION)) {
873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_PAM;
874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_CEP_OUTPUT_EXTENSION)) {
876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_CEP;
877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else if (picoos_has_extension(filename, PICODATA_PUTYPE_SIG_OUTPUT_EXTENSION) ||
879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_has_extension(filename, PICODATA_PUTYPE_WAV_OUTPUT_EXTENSION)) {
880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_SIG;
881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        else {
883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return PICODATA_ITEMINFO2_CMD_TO_UNKNOWN;
884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICODATA_ITEMINFO2_CMD_TO_UNKNOWN;
887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param transducer
895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param common
896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param xsampa_parser
897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param svoxpa_parser
898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param xsampa2svoxpa_mapper
899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param inputPhones
900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param alphabet
901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param outputPhoneIds
902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @param maxOutputPhoneIds
903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @return
904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picodata_mapPAStrToPAIds(picotrns_SimpleTransducer transducer,
906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_Common common, picokfst_FST xsampa_parser,
907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picokfst_FST svoxpa_parser, picokfst_FST xsampa2svoxpa_mapper,
908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uchar * inputPhones, picoos_uchar * alphabet,
909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 * outputPhoneIds, picoos_int32 maxOutputPhoneIds)
910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t status = PICO_OK;
912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (picoos_strcmp(alphabet, PICODATA_XSAMPA) == 0) {
913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((NULL != xsampa_parser) && (NULL != xsampa2svoxpa_mapper)) {
914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picotrns_stInitialize(transducer);
915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = picotrns_stAddWithPlane(transducer, inputPhones,
916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICOKFST_PLANE_ASCII);
917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (PICO_OK != status) {
918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_emRaiseWarning(common->em, status, NULL,
919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        (picoos_char *) "phoneme sequence too long (%s)",
920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        inputPhones);
921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = picotrns_stTransduce(transducer, xsampa_parser);
923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (PICO_OK != status) {
924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    picoos_emRaiseWarning(common->em, status, NULL,
925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            (picoos_char *) "not recognized as xsampa (%s)",
926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            inputPhones);
927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else {
928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    status = picotrns_stTransduce(transducer, xsampa2svoxpa_mapper);
929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (PICO_OK != status) {
930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        picoos_emRaiseWarning(common->em, status, NULL,
931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                (picoos_char *) "illeagal phoneme sequence (%s)",
932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                inputPhones);
933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    } else {
934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        status = picotrns_stGetSymSequence(transducer, outputPhoneIds,
935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                maxOutputPhoneIds);
936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return status;
940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (picoos_strcmp(alphabet, PICODATA_SVOXPA) == 0) {
942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((NULL != svoxpa_parser)) {
943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picotrns_stInitialize(transducer);
944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            status = picotrns_stAddWithPlane(transducer, inputPhones,
945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICOKFST_PLANE_ASCII);
946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (PICO_OK == status) {
947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = picotrns_stTransduce(transducer, svoxpa_parser);
948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (PICO_OK == status) {
950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                status = picotrns_stGetSymSequence(transducer, outputPhoneIds,
951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        maxOutputPhoneIds);
952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return status;
954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_strlcpy(outputPhoneIds, (picoos_char *) "", maxOutputPhoneIds);
957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_emRaiseWarning(common->em, PICO_EXC_NAME_ILLEGAL, NULL,
958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (picoos_char *) "alphabet not supported (%s)", alphabet);
959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_EXC_NAME_ILLEGAL;
960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined (PICO_DEBUG)
964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***************************************************************
965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *                   For Debugging only                          *
966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *****************************************************************/
967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* put string representation of 'itemtype' into 'str' (allocated size 'strsize')
970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * return 'str' */
971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_char * data_itemtype_to_string(const picoos_uint8 itemtype,
972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_char * str, picoos_uint16 strsize)
973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_char * tmpstr;
975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (itemtype) {
976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_BOUND:
977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"BOUND";
978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_FRAME_PAR:
980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"FRAME_PAR";
981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_PHONE:
983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"PHONE";
984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_CMD:
986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"CMD";
987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_ERR:
989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"ERR";
990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_FRAME:
992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"FRAME";
993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_OTHER:
995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"OTHER";
996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_PUNC:
998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"PUNC";
999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_SYLLPHON:
1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"SYLLPHON";
1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WORDGRAPH:
1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"WORDGRAPH";
1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WORDINDEX:
1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"WORDINDEX";
1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WORDPHON:
1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"WORDPHON";
1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEM_WSEQ_GRAPH:
1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"WSEQ_GRAPH";
1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr = (picoos_char *)"UNKNOWN";
1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picopal_slprintf((picopal_char *) str, strsize, (picopal_char *)"%s",
1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            tmpstr);
1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return str;
1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_char * picodata_head_to_string(const picodata_itemhead_t *head,
1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_char * str, picoos_uint16 strsize)
1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 typelen;
1029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == head) {
1031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_strlcpy(str,(picoos_char *)"[head is NULL]",strsize);
1032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        data_itemtype_to_string(head->type, str, strsize);
1034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        typelen = picoos_strlen(str);
1035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picopal_slprintf((picopal_char *) str+typelen, strsize-typelen,
1036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (picopal_char *)"|%c|%c|%i", head->info1, head->info2,
1037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                head->len);
1038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return str;
1041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picodata_info_item(const picoknow_KnowledgeBase kb,
1044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        const picoos_uint8 *pref6ch,
1045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        const picoos_uint8 *item,
1046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        const picoos_uint16 itemlenmax,
1047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        const picoos_char *filterfn)
1048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
1049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SA_USE_PHST 1
1050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
1051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 ch;
1052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((itemlenmax < 4) || (item == NULL)) {
1054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_INFO_MSG(("invalid item\n"));
1055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* first 6 char used for prefix */
1058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_INFO_MSG_F(filterfn, ("%6s(", pref6ch));
1059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* type */
1061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    ch = item[0];
1062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((32 <= ch) && (ch < 127)) {
1063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_INFO_MSG_F(filterfn, ("'%c',", ch));
1064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
1065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_INFO_MSG_F(filterfn, ("%3d,", ch));
1066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* info1 */
1068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    ch = item[1];
1069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((32 <= ch) && (ch < 127))
1070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (item[0]) {
1071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_PUNC:
1072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_BOUND:
1073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_CMD:
1074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_TOKEN:
1075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_FRAME_PAR:
1076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_INFO_MSG_F(filterfn, ("'%c',", ch));
1077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            default:
1079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_INFO_MSG_F(filterfn, ("%3d,", ch));
1080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    else
1082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_INFO_MSG_F(filterfn, ("%3d,", ch));
1083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* info2 */
1085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    ch = item[2];
1086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((32 <= ch) && (ch < 127))
1087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (item[0]) {
1088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_PUNC:
1089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_BOUND:
1090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_CMD:
1091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_WORDPHON:
1092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEM_SYLLPHON:
1093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_INFO_MSG_F(filterfn, ("'%c',", ch));
1094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            default:
1096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_INFO_MSG_F(filterfn, ("%3d,", ch));
1097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    else
1099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_INFO_MSG_F(filterfn, ("%3d,", ch));
1100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* len */
1102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    ch = item[3];
1103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_INFO_MSG_F(filterfn, ("%3d)", ch));
1104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < ch; i++) {
1106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((item[0] == PICODATA_ITEM_WSEQ_GRAPH) ||
1107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (item[0] == PICODATA_ITEM_TOKEN) ||
1108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (item[0] == PICODATA_ITEM_WORDGRAPH) ||
1109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            ((item[0] == PICODATA_ITEM_CMD) && !((item[1] == PICODATA_ITEMINFO1_CMD_SPEED) ||
1110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                 (item[1] == PICODATA_ITEMINFO1_CMD_PITCH) ||
1111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                 (item[1] == PICODATA_ITEMINFO1_CMD_VOLUME) ||
1112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                 (item[1] == PICODATA_ITEMINFO1_CMD_SPELL) ||
1113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                 (item[1] == PICODATA_ITEMINFO1_CMD_SIL)))) {
1114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_INFO_MSG_F(filterfn, ("%c", item[4 + i]));
1115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
1116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_INFO_MSG_F(filterfn, ("%4d", item[4 + i]));
1117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined (SA_USE_PHST)
1121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    {
1122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdbg.h"
1123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint8 j;
1124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picokdbg_Dbg kdbg;
1125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        kdbg = picokdbg_getDbg(kb);
1126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((item[0] == PICODATA_ITEM_WORDPHON) ||
1128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (item[0] == PICODATA_ITEM_SYLLPHON) ||
1129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                ((item[0] == PICODATA_ITEM_CMD) && (item[1] == PICODATA_ITEMINFO1_CMD_PHONEME))) {
1130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picokdbg_getPhoneSym(kdbg, item[4])) {
1131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_INFO_MSG_F(filterfn, ("  "));
1132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                for (j = 0; j < item[3]; j++) {
1133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_INFO_MSG_F(filterfn, ("%s",
1134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            picokdbg_getPhoneSym(kdbg, item[4 + j])));
1135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
1138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_INFO_MSG_F(filterfn, ("\n"));
1142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif   /* PICO_DEBUG */
1146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
1148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* picodata.c end */
1153