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