bool speech_play(char *text) { if(Speech_init == false) return true; if(text == NULL) return false; #ifdef _WIN32 int len = strlen(text); unsigned short Conversion_buffer[MAX_SPEECH_CHAR_LEN]; if(len > (MAX_SPEECH_CHAR_LEN - 1)) { len = MAX_SPEECH_CHAR_LEN - 1; } int count = 0; for(int i = 0; i < len; i++) { if(text[i] == '$') { i++; continue; } Conversion_buffer[count] = (unsigned short) text[i]; count++; } Conversion_buffer[count] = '\0'; speech_stop(); return SUCCEEDED(Voice_device->Speak(Conversion_buffer, SPF_ASYNC, NULL)); #else int len = strlen(text); char Conversion_buffer[MAX_SPEECH_CHAR_LEN]; if(len > (MAX_SPEECH_CHAR_LEN - 1)) { len = MAX_SPEECH_CHAR_LEN - 1; } int count = 0; for(int i = 0; i < len; i++) { if(text[i] == '$') { i++; continue; } Conversion_buffer[count] = text[i]; count++; } Conversion_buffer[count] = '\0'; if ( write(speech_dev, Conversion_buffer, count) == -1 ) return false; // if (fwrite(Conversion_buffer, count, 1, speech_dev)) // fflush(speech_dev); // else // return false; return true; #endif //_WIN32 }
bool speech_play(const char *text) { nprintf(("Speech", "Attempting to play speech string %s...\n", text)); if(Speech_init == false) return true; if (text == NULL) { nprintf(("Speech", "Not playing speech because passed text is null.\n")); return false; } #ifdef _WIN32 SCP_string work_buffer; bool saw_dollar = false; for (auto ch : unicode::codepoint_range(text)) { if (ch == UNICODE_CHAR('$')) { // Skip $ escape sequences which appear in briefing text saw_dollar = true; continue; } else if (saw_dollar) { saw_dollar = false; continue; } unicode::encode(ch, std::back_inserter(work_buffer)); } // Determine the needed amount of data auto num_chars = MultiByteToWideChar(CP_UTF8, 0, work_buffer.c_str(), (int) work_buffer.size(), nullptr, 0); if (num_chars <= 0) { // Error return false; } std::wstring wide_string; wide_string.resize(num_chars); auto err = MultiByteToWideChar(CP_UTF8, 0, work_buffer.c_str(), (int)work_buffer.size(), &wide_string[0], num_chars); if (err <= 0) { return false; } speech_stop(); return SUCCEEDED(Voice_device->Speak(wide_string.c_str(), SPF_ASYNC, NULL)); #else int len = strlen(text); char Conversion_buffer[MAX_SPEECH_CHAR_LEN]; if(len > (MAX_SPEECH_CHAR_LEN - 1)) { len = MAX_SPEECH_CHAR_LEN - 1; } int count = 0; for(int i = 0; i < len; i++) { if(text[i] == '$') { i++; continue; } Conversion_buffer[count] = text[i]; count++; } Conversion_buffer[count] = '\0'; if ( write(speech_dev, Conversion_buffer, count) == -1 ) return false; // if (fwrite(Conversion_buffer, count, 1, speech_dev)) // fflush(speech_dev); // else // return false; return true; #endif //_WIN32 }