diff options
-rw-r--r-- | backends/text-to-speech/linux/linux-text-to-speech.cpp | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/backends/text-to-speech/linux/linux-text-to-speech.cpp b/backends/text-to-speech/linux/linux-text-to-speech.cpp index d6195229c5..3914b0f347 100644 --- a/backends/text-to-speech/linux/linux-text-to-speech.cpp +++ b/backends/text-to-speech/linux/linux-text-to-speech.cpp @@ -28,6 +28,7 @@ #if defined(USE_LINUX_TTS) #include <speech-dispatcher/libspeechd.h> #include "backends/platform/sdl/sdl-sys.h" +//#include <iconv.h> #include "common/translation.h" #include "common/debug.h" @@ -116,9 +117,40 @@ Common::String LinuxTextToSpeechManager::strToUtf8(Common::String str, Common::S if (conv_text) { result = conv_text; SDL_free(conv_text); - } + } else if (charset != "ASCII"){ + warning("Could not convert text from %s to UTF-8, trying ASCII", charset.c_str()); + return strToUtf8(str, "ASCII"); + } else + warning("Could not convert text to UTF-8"); return result; + + // ICONV implementation (supports more charsets) + /*size_t inbytes = str.size(); + char *inStr = new char[inbytes + 1]; + char *in = inStr; + strcpy(inStr, str.c_str()); + + size_t outbytes = str.size() * 2 - 1; + char *destStr = new char[outbytes + 1]; + char *out = destStr; + iconv_t conv = iconv_open("UTF-8//IGNORE", charset.c_str()); + + if (conv == (iconv_t)-1) { + warning("Could not convert string from: %s to UTF-8", charset.c_str()); + return ""; + } + + if (iconv(conv, &in, &inbytes, &out, &outbytes) == (size_t)-1) { + warning("Could not convert string from: %s to UTF-8", charset.c_str()); + return ""; + } + + destStr[outbytes + 1] = 0; + Common::String result = destStr; + delete[] inStr; + delete[] destStr; + return result; */ #else return Common::String(); #endif @@ -135,6 +167,8 @@ bool LinuxTextToSpeechManager::say(Common::String str, Common::String charset) { charset = "ASCII"; #endif } + debug("charset: %s", charset.c_str()); + str = strToUtf8(str, charset); if (isSpeaking()) |