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