139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi/* 239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * 439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License"); 539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * you may not use this file except in compliance with the License. 639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * You may obtain a copy of the License at 739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * 839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * http://www.apache.org/licenses/LICENSE-2.0 939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * 1039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software 1139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS, 1239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * See the License for the specific language governing permissions and 1439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * limitations under the License. 1539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi * 164bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi*/ 1739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 1839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#include "svox_ssml_parser.h" 1939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#include <utils/Log.h> 2039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#include <cutils/jstring.h> 2139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#include <string.h> 224bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi#include <utils/String16.h> 2339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 2439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_PITCH_XLOW "50" 2539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_PITCH_LOW "75" 2639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_PITCH_MEDIUM "100" 2739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_PITCH_HIGH "150" 2839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_PITCH_XHIGH "200" 2939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_RATE_XSLOW "30" 3039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_RATE_SLOW "60" 3139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_RATE_MEDIUM "100" 3239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_RATE_FAST "250" 3339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_RATE_XFAST "500" 3439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_VOLUME_SILENT "0" 35474a319cfd410d4bbc5c76d0b382348181f499b8Charles Chen#define SSML_VOLUME_XLOW "25" 36474a319cfd410d4bbc5c76d0b382348181f499b8Charles Chen#define SSML_VOLUME_LOW "70" 370e684c35978ae1db311baee6e343f71faa2dbbfaJean-Michel Trivi#define SSML_VOLUME_MEDIUM "120" 380e684c35978ae1db311baee6e343f71faa2dbbfaJean-Michel Trivi#define SSML_VOLUME_LOUD "300" 390e684c35978ae1db311baee6e343f71faa2dbbfaJean-Michel Trivi#define SSML_VOLUME_XLOUD "450" 4039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_BREAK_NONE "0ms" 4139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_BREAK_XWEAK "100ms" 4239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_BREAK_WEAK "300ms" 4339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_BREAK_MEDIUM "600ms" 4439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_BREAK_STRONG "1s" 4539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi#define SSML_BREAK_XSTRONG "3s" 4639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Triviextern int cnvIpaToXsampa(const char16_t* ipaString, size_t ipaStringSize, char** outXsampaString); 484bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Triviextern char * createPhonemeString( const char * xsampa, int length ); 4939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 5039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel TriviSvoxSsmlParser::SvoxSsmlParser() : m_isInBreak(0), m_appendix(NULL), m_docLanguage(NULL) 5139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 524bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi mParser = XML_ParserCreate("UTF-8"); 534bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (mParser) 5439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 554bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi XML_SetElementHandler(mParser, starttagHandler, endtagHandler); 564bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi XML_SetCharacterDataHandler(mParser, textHandler); 574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi XML_SetUserData(mParser, (void*)this); 584bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_datasize = 512; 594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_data = new char[m_datasize]; 604bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_data[0] = '\0'; 6139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 6339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 6439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel TriviSvoxSsmlParser::~SvoxSsmlParser() 6539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 664bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (mParser) 674bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi XML_ParserFree(mParser); 684bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (m_data) 694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] m_data; 704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (m_appendix) 714bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] m_appendix; 724bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (m_docLanguage) 734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] m_docLanguage; 7439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 7539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 7639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Triviint SvoxSsmlParser::initSuccessful() 7739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 784bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return (mParser && m_data); 7939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 8039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 8139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Triviint SvoxSsmlParser::parseDocument(const char* ssmldoc, int isFinal) 8239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 834bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi int doclen = (int)strlen(ssmldoc) + 1; 844bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi int status = XML_Parse(mParser, ssmldoc, doclen, isFinal); 854bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (status == XML_STATUS_ERROR) 8639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 874bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi /* Note: for some reason Expat almost always complains about invalid tokens, even when document is well formed */ 88659851c7b5a2d0023266bf34634179ff8d08e3baSteve Block ALOGI("Parser error at line %d: %s\n", (int)XML_GetCurrentLineNumber(mParser), XML_ErrorString(XML_GetErrorCode(mParser))); 8939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 904bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return status; 9139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 9239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 9339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivichar* SvoxSsmlParser::getParsedDocument() 9439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 954bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return m_data; 9639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 9739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 9839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivichar* SvoxSsmlParser::getParsedDocumentLanguage() 9939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 1004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return m_docLanguage; 10139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 10239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 10339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivivoid SvoxSsmlParser::starttagHandler(void* data, const XML_Char* element, const XML_Char** attributes) 10439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 1054bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi ((SvoxSsmlParser*)data)->startElement(element, attributes); 10639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 10739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 10839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivivoid SvoxSsmlParser::startElement(const XML_Char* element, const XML_Char** attributes) 10939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 1104bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(element, "speak") == 0) 11139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1124bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) > 0) 11339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1144bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi /* we have old data, get rid of it and reallocate memory */ 1154bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete m_data; 1164bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_data = NULL; 1174bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_datasize = 512; 1184bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_data = new char[m_datasize]; 1194bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!m_data) 1204bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 12131a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 1224bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 1234bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 12439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 12539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 1264bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi /* the only attribute supported in the speak tag is xml:lang, all others are ignored */ 1274bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi for (int i = 0; attributes[i]; i += 2) 12839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1294bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(attributes[i], "xml:lang") == 0) 1304bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 1314bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!m_docLanguage) 1324bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 1334bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_docLanguage = new char[strlen(attributes[i+1])+1]; 1344bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 1354bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(m_docLanguage, attributes[i+1]); 1364bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi break; 1374bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 13839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 13939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 1404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "p") == 0) /* currently no attributes are supported for <p> */ 14139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1424bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 4 > (size_t)m_datasize) 14339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1444bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 1454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 14631a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 1474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 1484bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 14939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 1504bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "<p>"); 15139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 1524bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "s") == 0) /* currently no attributes are supported for <s> */ 15339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1544bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 4 > (size_t)m_datasize) 15539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1564bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 1574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 15831a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 1594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 1604bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 16139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 1624bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "<s>"); 16339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 1644bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "phoneme") == 0) /* only ipa and xsampa alphabets are supported */ 16539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1664bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi int alpha = 1; /* set to 1 if alphabet is ipa */ 1674bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi int tagComplete = 0; /* set to 1 if phoneme tag has already been added */ 1684bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char16_t* ph = NULL; 1694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* xsampastr = NULL; 1704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi size_t phsize = 0; 1714bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi size_t xsampasize = 0; 17239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 1734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi for (int i = 0; attributes[i]; i += 2) 17439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1754bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(attributes[i], "alphabet") == 0) 1764bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 1774bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(attributes[i+1], "xsampa") == 0) 1784bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 1794bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi alpha = 0; 1804bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 1814bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 1824bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(attributes[i], "ph") == 0) 1834bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 1844bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi ph = new char16_t[strlen8to16(attributes[i+1]) + 1]; 1854bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi ph = strdup8to16(attributes[i+1], &phsize); 1864bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 18739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 1884bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!ph) 18939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1904bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi /* error, no phonetic string */ 19131a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: bad SSML syntax, ph attribute not supplied."); 1924bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 19339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 19439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 1954bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (alpha) 19639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 1974bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi /* need to convert phoneme string to xsampa */ 1984bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi xsampasize = cnvIpaToXsampa(ph, phsize, &xsampastr); 1994bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] ph; 2004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!xsampastr) 2014bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 20231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for IPA string conversion"); 2034bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 2044bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 20539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 2064bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else 20739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2084bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi xsampastr = strndup16to8(ph, phsize); 2094bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi xsampasize = strlen(xsampastr); 2104bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] ph; 21139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 21239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 2134bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi /* split XSAMPA string into multiple phonemes if needed */ 2144bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strstr(xsampastr, " ") || strstr(xsampastr, "#")) /* check again to see if we have multiple words */ 2154bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 2164bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* phonstr = createPhonemeString(xsampastr, strlen(xsampastr) + 1); 2174bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi free(xsampastr); 2184bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi xsampastr = NULL; 2194bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi xsampastr = (char*)malloc(strlen(phonstr) + 1); 2204bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(xsampastr, phonstr); 2214bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi free(phonstr); 2224bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi phonstr = NULL; 2234bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi tagComplete = 1; 22439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 2254bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi 2264bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (tagComplete) 22739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2284bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(xsampastr) + 1 > (size_t)m_datasize) 2294bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 2304bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 2314bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 23231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!"); 2334bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi free(xsampastr); 2344bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 2354bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 2364bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 23739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 2384bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else 23939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(xsampastr) + 17 > (size_t)m_datasize) 2414bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 2424bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 2434bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 24431a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!"); 2454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi free(xsampastr); 2464bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 2474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 2484bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 2494bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "<phoneme ph='"); 25039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 2514bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi 2524bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, xsampastr); 2534bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi free(xsampastr); 2544bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi 2554bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!tagComplete) 2564bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 2574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 4 > (size_t)m_datasize) 2584bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 2594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 2604bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 26131a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 2624bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 2634bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 2644bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 2654bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "'/>"); 2664bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 2674bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi 2684bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_isInBreak = 1; /* set flag to indicate any text between open and close tag is to be discarded */ 26939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 2704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "break") == 0) 27139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2724bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 17 > (size_t)m_datasize) 27339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2744bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 27539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 27631a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 2774bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 27839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 27939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 2804bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "<break time='"); 2814bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* time = NULL; 2824bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi 2834bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi for (int i = 0; attributes[i]; i += 2) 28439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2854bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(attributes[i], "time") == 0) 28639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2874bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi time = new char[strlen(attributes[i+1]) + 1]; 2884bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!time) 2894bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 29031a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 2914bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 2924bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 2934bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(time, attributes[i+1]); 29439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 2954bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(attributes[i], "strength") == 0 && !time) 29639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 2974bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi time = convertBreakStrengthToTime(attributes[i+1]); 29839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 29939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 3004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!time) 30139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 3024bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi time = new char[6]; 3034bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!time) 30439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 30531a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3064bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 30739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 3084bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(time, SSML_BREAK_WEAK); /* if no time or strength attributes are specified, default to weak break */ 30939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 3104bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(time) + 4 > (size_t)m_datasize) 31139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 3124bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 31339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 31431a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3154bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 31639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 31739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 3184bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, time); 3194bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "'/>"); 3204bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_isInBreak = 1; /* set flag to indicate any text between open and close tag is to be discarded */ 3214bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3224bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "prosody") == 0) /* only pitch, rate and volume attributes are supported */ 3234bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 3244bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi for (int i = 0; attributes[i]; i += 2) 32539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 3264bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(attributes[i], "pitch") == 0) 32739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 3284bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* svoxpitch = convertToSvoxPitch(attributes[i+1]); 3294bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!svoxpitch) 3304bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 33131a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3324bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 3334bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3344bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!svoxpitch) 3354bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 3364bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi svoxpitch = new char[4]; 3374bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!svoxpitch) 3384bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 33931a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 3414bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3424bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(svoxpitch, "100"); 3434bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3444bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* pitch = new char[17 + strlen(svoxpitch)]; 3454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!pitch) 3464bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 34731a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3484bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 3494bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3504bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi sprintf(pitch, "<pitch level='%s'>", svoxpitch); 3514bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(pitch) + 1 > (size_t)m_datasize) 3524bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 3534bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 3544bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 35531a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3564bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 3574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3584bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, pitch); 3604bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!m_appendix) 3614bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 3624bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_appendix = new char[30]; 3634bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_appendix[0] = '\0'; 3644bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3654bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_appendix, "</pitch>"); 3664bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] svoxpitch; 3674bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] pitch; 36839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 3694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(attributes[i], "rate") == 0) 37039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 3714bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* svoxrate = convertToSvoxRate(attributes[i+1]); 3724bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!svoxrate) 3734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 3744bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi svoxrate = new char[4]; 3754bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!svoxrate) 3764bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 37731a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3784bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 3794bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3804bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(svoxrate, "100"); 3814bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3824bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* rate = new char[17 + strlen(svoxrate)]; 3834bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!rate) 3844bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 38531a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3864bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 3874bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3884bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi sprintf(rate, "<speed level='%s'>", svoxrate); 3894bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(rate) + 1 > (size_t)m_datasize) 3904bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 3914bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 3924bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 39331a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 3944bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 3954bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3964bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 3974bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, rate); 3984bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!m_appendix) 3994bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 4004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_appendix = new char[30]; 4014bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!m_appendix) 4024bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 40331a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 4044bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 4054bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4064bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_appendix[0] = '\0'; 4074bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4084bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_appendix, "</speed>"); 4094bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] svoxrate; 4104bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] rate; 4114bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4124bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(attributes[i], "volume") == 0) 4134bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 4144bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* svoxvol = convertToSvoxVolume(attributes[i+1]); 4154bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!svoxvol) 4164bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 4174bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi svoxvol = new char[4]; 4184bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!svoxvol) 4194bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 42031a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 4214bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 4224bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4234bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(svoxvol, "100"); 4244bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4254bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* volume = new char[18 + strlen(svoxvol)]; 4264bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!volume) 4274bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 42831a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 4294bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 4304bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4314bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi sprintf(volume, "<volume level='%s'>", svoxvol); 4324bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(volume) + 1 > (size_t)m_datasize) 4334bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 4344bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 4354bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 43631a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 4374bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 4384bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4394bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, volume); 4414bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!m_appendix) 4424bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 4434bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_appendix = new char[30]; 4444bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_appendix[0] = '\0'; 4454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4464bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_appendix, "</volume>"); 4474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] svoxvol; 4484bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] volume; 44939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 45039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 45139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 4524bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "audio") == 0) /* only 16kHz 16bit wav files are supported as src */ 45339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 4544bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 17 > (size_t)m_datasize) 45539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 4564bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 4574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 45831a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 4594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 4604bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 46139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 4624bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "<usesig file='"); 46339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 4644bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi for (int i = 0; attributes[i]; i += 2) 46539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 4664bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(attributes[i], "src") == 0) 46739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 4684bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(attributes[i+1]) + 1 > (size_t)m_datasize) 4694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 4704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 4714bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 47231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 4734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 4744bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4754bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 4764bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, attributes[i+1]); 47739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 47839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 4794bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "'>"); 48039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 48139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 48239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 48339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivivoid SvoxSsmlParser::endtagHandler(void* data, const XML_Char* element) 48439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 4854bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi ((SvoxSsmlParser*)data)->endElement(element); 48639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 48739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 48839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivivoid SvoxSsmlParser::endElement(const XML_Char* element) 48939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 4904bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(element, "speak") == 0) 49139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 4924bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi /* do nothing */ 49339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 4944bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "p") == 0) 49539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 4964bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 5 > (size_t)m_datasize) 49739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 4984bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 4994bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 50031a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 5014bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 5024bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 50339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5044bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "</p>"); 50539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5064bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "s") == 0) 50739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5084bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 5 > (size_t)m_datasize) 50939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5104bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 5114bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 51231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 5134bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 5144bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 51539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5164bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "</s>"); 51739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5184bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "phoneme") == 0) 51939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5204bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_isInBreak = 0; /* indicate we are no longer in phoneme tag */ 52139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5224bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "break") == 0) 52339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5244bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_isInBreak = 0; /* indicate we are no longer in break tag */ 52539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5264bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "prosody") == 0) 52739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5284bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (m_appendix) 52939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5304bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(m_appendix) + 1 > (size_t)m_datasize) 5314bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 5324bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 5334bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 53431a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 5354bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 5364bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 5374bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 5384bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, m_appendix); 5394bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] m_appendix; 5404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_appendix = NULL; 54139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 54239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5434bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(element, "audio") == 0) 54439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + 10 > (size_t)m_datasize) 54639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 5484bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 54931a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 5504bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 5514bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 55239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5534bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, "</usesig>"); 55439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 55539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 55639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 55739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivivoid SvoxSsmlParser::textHandler(void* data, const XML_Char* text, int length) 55839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 5594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi ((SvoxSsmlParser*)data)->textElement(text, length); 56039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 56139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 56239358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivivoid SvoxSsmlParser::textElement(const XML_Char* text, int length) 56339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 5644bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (m_isInBreak) 56539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5664bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; /* handles the case when someone has added text inside the break or phoneme tag - this text is thrown away */ 56739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 56839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 5694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* content = new char[length + 1]; 5704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!content) 57139358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 57231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 5734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 57439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5754bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strncpy(content, text, length); 5764bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi content[length] = '\0'; 57739358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 5784bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strlen(m_data) + strlen(content) + 1 > (size_t)m_datasize) 57939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5804bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!growDataSize(100)) 5814bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 58231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 5834bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return; 5844bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 58539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 5864bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcat(m_data, content); 5874bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] content; 58839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 58939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 59039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi/** 5914bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TriviconvertToSvoxPitch 5924bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TriviConverts SSML pitch labels to SVOX pitch levels 59339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi*/ 59439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivichar* SvoxSsmlParser::convertToSvoxPitch(const char* value) 59539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 5964bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* converted = NULL; 5974bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(value, "x-low") == 0) 59839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 5994bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6014bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 60231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6034bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6044bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6054bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_PITCH_XLOW); 60639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6074bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "low") == 0) 60839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6094bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6104bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6114bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 61231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6134bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6144bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6154bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_PITCH_LOW); 61639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6174bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "medium") == 0) 61839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6194bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6204bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6214bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 62231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6234bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6244bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6254bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_PITCH_MEDIUM); 62639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6274bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "default") == 0) 62839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6294bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6304bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6314bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 63231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6334bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6344bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6354bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_PITCH_MEDIUM); 63639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6374bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "high") == 0) 63839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6394bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6414bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 64231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6434bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6444bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_PITCH_HIGH); 64639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "x-high") == 0) 64839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6494bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6504bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6514bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 65231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6534bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6544bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6554bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_PITCH_XHIGH); 65639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return converted; 65839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 65939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 66039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi/** 6614bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi convertToSvoxRate 6624bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi Converts SSML rate labels to SVOX speed levels 66339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi*/ 66439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivichar* SvoxSsmlParser::convertToSvoxRate(const char* value) 66539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 6664bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* converted = NULL; 6674bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(value, "x-slow") == 0) 66839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6714bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 67231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6744bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6754bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_RATE_XSLOW); 67639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6774bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "slow") == 0) 67839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6794bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6804bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6814bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 68231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6834bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6844bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6854bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_RATE_SLOW); 68639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6874bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "medium") == 0) 68839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6894bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 6904bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 6914bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 69231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 6934bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 6944bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 6954bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_RATE_MEDIUM); 69639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 6974bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "default") == 0) 69839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 6994bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7014bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 70231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7034bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7044bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7054bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_RATE_MEDIUM); 70639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7074bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "fast") == 0) 70839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7094bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7104bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7114bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 71231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7134bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7144bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7154bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_RATE_FAST); 71639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7174bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "x-fast") == 0) 71839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7194bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7204bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7214bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 72231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7234bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7244bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7254bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_RATE_XFAST); 72639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7274bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return converted; 72839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 72939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 73039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi/** 7314bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TriviconvertToSvoxVolume 7324bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TriviConverts SSML volume labels to SVOX volume levels 73339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi*/ 73439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivichar* SvoxSsmlParser::convertToSvoxVolume(const char* value) 73539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 7364bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* converted = NULL; 7374bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(value, "silent") == 0) 73839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7394bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7414bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 74231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7434bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7444bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_VOLUME_SILENT); 74639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "x-low") == 0) 74839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7494bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7504bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7514bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 75231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7534bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7544bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7554bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_VOLUME_XLOW); 75639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "low") == 0) 75839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7604bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7614bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 76231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7634bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7644bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7654bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_VOLUME_LOW); 76639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7674bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "medium") == 0) 76839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7714bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 77231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7744bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7754bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_VOLUME_MEDIUM); 77639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7774bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "default") == 0) 77839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7794bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7804bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7814bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 78231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7834bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7844bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7854bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_VOLUME_MEDIUM); 78639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7874bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "loud") == 0) 78839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7894bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 7904bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 7914bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 79231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 7934bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 7944bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 7954bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_VOLUME_LOUD); 79639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 7974bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "x-loud") == 0) 79839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 7994bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[4]; 8004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 8014bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 80231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 8034bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 8044bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8054bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_VOLUME_XLOUD); 80639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 8074bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return converted; 80839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 80939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 81039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi/** 8114bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TriviconvertBreakStrengthToTime 8124bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TriviConverts SSML break strength labels to SVOX break time 81339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi*/ 81439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivichar* SvoxSsmlParser::convertBreakStrengthToTime(const char* value) 81539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 8164bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* converted = NULL; 8174bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (strcmp(value, "none") == 0) 81839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 8194bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[6]; 8204bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 8214bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 82231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 8234bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 8244bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8254bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_BREAK_NONE); 82639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 8274bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "x-weak") == 0) 82839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 8294bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[6]; 8304bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 8314bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 83231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 8334bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 8344bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8354bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_BREAK_XWEAK); 83639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 8374bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "weak") == 0) 83839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 8394bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[6]; 8404bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 8414bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 84231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 8434bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 8444bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8454bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_BREAK_WEAK); 84639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 8474bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "medium") == 0) 84839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 8494bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[6]; 8504bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 8514bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 85231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 8534bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 8544bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8554bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_BREAK_MEDIUM); 85639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 8574bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "strong") == 0) 85839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 8594bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[6]; 8604bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 8614bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 86231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 8634bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 8644bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8654bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_BREAK_STRONG); 86639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 8674bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi else if (strcmp(value, "x-strong") == 0) 86839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi { 8694bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi converted = new char[6]; 8704bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!converted) 8714bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 87231a809cefabaafd5b82574df08615855f1019a43Steve Block ALOGE("Error: failed to allocate memory for string!\n"); 8734bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return NULL; 8744bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8754bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(converted, SSML_BREAK_XSTRONG); 87639358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi } 8774bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return converted; 87839358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 87939358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi 88039358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi/** 8814bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TrivigrowDataSize 8824bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel TriviIncreases the size of the internal text storage member 88339358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi*/ 88439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Triviint SvoxSsmlParser::growDataSize(int sizeToGrow) 88539358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi{ 8864bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi char* tmp = new char[m_datasize]; 8874bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!tmp) 8884bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return 0; 8894bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi 8904bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(tmp, m_data); 8914bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] m_data; 8924bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_data = NULL; 8934bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_data = new char[m_datasize + sizeToGrow]; 8944bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi if (!m_data) 8954bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi { 8964bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_data = tmp; 8974bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return 0; 8984bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi } 8994bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi m_datasize += sizeToGrow; 9004bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi strcpy(m_data, tmp); 9014bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi delete [] tmp; 9024bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi tmp = NULL; 9034bbdb2d4013fa7deb73da0189e9a0e4819e69da9Jean-Michel Trivi return 1; 90439358f0dacad8cece6c2d3ef1055030f57090c79Jean-Michel Trivi} 905