]> git.mxchange.org Git - flightgear.git/blobdiff - src/Sound/voice.cxx
Flight-history men usage cap.
[flightgear.git] / src / Sound / voice.cxx
index 8e317d05c91a6289ceb7680fc4afd8db0d5cfb6a..c1dec0b0ed688ba34055b67d97a48538d8b5b396 100644 (file)
 //
 // $Id$
 
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
 #include <Main/globals.hxx>
 #include <sstream>
 #include <simgear/compiler.h>
@@ -28,6 +32,7 @@
 
 #define VOICE "/sim/sound/voices"
 
+using std::string;
 
 /// MANAGER ///
 
@@ -35,7 +40,7 @@ FGVoiceMgr::FGVoiceMgr() :
        _host(fgGetString(VOICE "/host", "localhost")),
        _port(fgGetString(VOICE "/port", "1314")),
        _enabled(fgGetBool(VOICE "/enabled", false)),
-       _pausedNode(fgGetNode("/sim/sound/pause", true))
+       _pausedNode(fgGetNode("/sim/sound/working", true))
 {
 #if defined(ENABLE_THREADS)
        if (!_enabled)
@@ -52,6 +57,7 @@ FGVoiceMgr::~FGVoiceMgr()
                return;
        _thread->cancel();
        _thread->join();
+       delete _thread;
 #endif
 }
 
@@ -63,11 +69,16 @@ void FGVoiceMgr::init()
 
        SGPropertyNode *base = fgGetNode(VOICE, true);
        vector<SGPropertyNode_ptr> voices = base->getChildren("voice");
-       for (unsigned int i = 0; i < voices.size(); i++)
-               _voices.push_back(new FGVoice(this, voices[i]));
+       try {
+               for (unsigned int i = 0; i < voices.size(); i++)
+                       _voices.push_back(new FGVoice(this, voices[i]));
+       } catch (const std::string& s) {
+               SG_LOG(SG_SOUND, SG_ALERT, "VOICE: " << s);
+       }
 
 #if defined(ENABLE_THREADS)
-       _thread->start(1);
+       _thread->setProcessorAffinity(1);
+       _thread->start();
 #endif
 }
 
@@ -77,7 +88,7 @@ void FGVoiceMgr::update(double)
        if (!_enabled)
                return;
 
-       _paused = _pausedNode->getBoolValue();
+       _paused = !_pausedNode->getBoolValue();
        for (unsigned int i = 0; i < _voices.size(); i++) {
                _voices[i]->update();
 #if !defined(ENABLE_THREADS)
@@ -99,33 +110,26 @@ FGVoiceMgr::FGVoice::FGVoice(FGVoiceMgr *mgr, const SGPropertyNode_ptr node) :
        _festival(node->getBoolValue("festival", true)),
        _mgr(mgr)
 {
-       SG_LOG(SG_IO, SG_INFO, "VOICE: adding `" << node->getStringValue("desc", "<unnamed>")
+       SG_LOG(SG_SOUND, SG_INFO, "VOICE: adding `" << node->getStringValue("desc", "<unnamed>")
                        << "' voice");
        const string &host = _mgr->_host;
        const string &port = _mgr->_port;
 
        _sock = new SGSocket(host, port, "tcp");
-       _sock->set_timeout(10000);
-       _connected = _sock->open(SG_IO_OUT);
-       if (!_connected) {
-               SG_LOG(SG_IO, SG_ALERT, "VOICE: no connection to `"
-                               << host << ':' << port << '\'');
-               return;
-       }
+       _sock->set_timeout(6000);
+       if (!_sock->open(SG_IO_OUT))
+               throw string("no connection to `") + host + ':' + port + '\'';
 
        if (_festival) {
                _sock->writestring("(SayText \"\")\015\012");
                char buf[4];
                int len = _sock->read(buf, 3);
-               if (len != 3 || buf[0] != 'L' || buf[1] != 'P') {
-                       SG_LOG(SG_IO, SG_ALERT, "VOICE: something is listening to "
-                               << host << ':' << port << "', but it doesn't seem "
-                               "to be Festival");
-                       _connected = false;
-                       return;
-               }
-
-               SG_LOG(SG_IO, SG_BULK, "VOICE: connection to Festival server on `"
+               if (len != 3 || buf[0] != 'L' || buf[1] != 'P')
+                       throw string("unexpected or no response from `") + host + ':' + port
+                                       + "'. Either it's not\n       Festival listening,"
+                                       " or Festival couldn't open a sound device.";
+
+               SG_LOG(SG_SOUND, SG_INFO, "VOICE: connection to Festival server on `"
                                << host << ':' << port << "' established");
 
                setVolume(_volume = _volumeNode->getDoubleValue());
@@ -159,14 +163,11 @@ void FGVoiceMgr::FGVoice::pushMessage(string m)
 
 bool FGVoiceMgr::FGVoice::speak(void)
 {
-       if (_msg.empty()) {
-//             cerr << "<nothing to say>" << endl;
+       if (_msg.empty())
                return false;
-       }
 
        const string s = _msg.front();
        _msg.pop();
-//     cerr << "POP " << s;
        _sock->writestring(s.c_str());
        return !_msg.empty();
 }
@@ -174,7 +175,7 @@ bool FGVoiceMgr::FGVoice::speak(void)
 
 void FGVoiceMgr::FGVoice::update(void)
 {
-       if (_connected && _festival) {
+       if (_festival) {
                double d;
                d = _volumeNode->getDoubleValue();
                if (d != _volume)
@@ -245,22 +246,31 @@ void FGVoiceMgr::FGVoice::FGVoiceListener::valueChanged(SGPropertyNode *node)
                return;
 
        const string s = node->getStringValue();
-//     cerr << "PUSH " << s << endl;
+       //cerr << "\033[31;1mBEFORE [" << s << "]\033[m" << endl;
 
        string m;
        for (unsigned int i = 0; i < s.size(); i++) {
                char c = s[i];
-               if (!isprint(c))
+               if (c == '\n' || c == '\r' || c == '\t')
+                       m += ' ';
+               else if (!isprint(c))
                        continue;
-               else if (c == '"' || c == '\\')
-                       m += '\\' + c;
+               else if (c == '\\' || c == '"')
+                       m += '\\', m += c;
                else if (c == '|' || c == '_')
                        m += ' ';       // don't say "vertical bar" or "underscore"
                else if (c == '&')
                        m += " and ";
+               else if (c == '{') {
+                       while (i < s.size())
+                               if (s[++i] == '|')
+                                       break;
+               } else if (c == '}')
+                       ;
                else
                        m += c;
        }
+       //cerr << "\033[31;1mAFTER [" << m << "]\033[m" << endl;
        if (_voice->_festival)
                m = string("(SayText \"") + m + "\")";