_ A GPLed French language synth is available at
      http://www.cam.org/~nico/cicero
      
_ Possible bug. "<" characters not being properly stored in the .xml file?

_ DBUS Interface
    _ Refactor so that each job is an object and emits signals from
      object path /org/kde/KSpeechJob_NN.  Apps can receive these signals
      using
      
          QDBus::sessionBus().connect("org.kde.kttsd", QString(),
          "org.kde.KSpeechJob", "signalname", this, SLOT(slotName()));
        
      Thiago tells me that the QString() for object path name will
      filter on all objects with interface org.kde.KSpeechJob.
      This is because QtDBus receives all signals.
      
      <thiago> right now, I gave it only two rules: "all signals"
      and "everything whose destination is me"
      
      and then filters on what the connect specifies.
      Once in place, the only signals emitted by KSpeech will be
      kttsdStarted and kttsdExiting.  Everything else will come
      from the jobs.  In theory, this means that apps that aren't
      interesting in tracking jobs don't need to receive those events,
      but OTOH, if an app is receiving any events, then it
      chances are it is interested in most/all of the events.
      The only real advantage to this change is that apps that are
      interesting in tracking only a single job can receive those
      signals and don't have to check the appId (assuming they
      created the job in the first place).  Is this advantage
      worth the pain of refactoring kttsd?  Thoughts:
          _ I want to make everything (text, messages, warnings, and SR)
            jobs so that KttsJobMgr can track all speech.
          _ There's already an mlTextJob structure, so converting that
            to an object won't be that hard.
      
    _ Add setFriendlyName(QString &name) to interface and
      QString getFriendlyName(QString &appId) so that friendly names
      can be displayed in KttsJobMgr.  
      
      <thiago> hint: connect to the nameOwnerChange signal from
      QDBus::sessionBus().busService() to find out when the application
      :1.120 goes away, so that you can release the resource
        
KDE4 above this line
-------------------------------------------------------------------------
_ Filters:
    _ XHTMLtoSSML stylesheet needs work to provide better mappings for most web pages.
    _ Add KNewStuff capability for folks to upload/download filter configs.
    _ There should be a default set of filters configured when user first runs KTTSMgr.
      If user presses Default button, it should ask user whether to replace all existing
      filters with the standard set.  The standard set should probably include
      the Qt to Plain Text and Fix Festival Unspeakable Characters filters, but I'm not
      sure about the latter when desktop is not ISO 8859-1.
    _ The SBD Filter configuration dialog can be shrunk smaller than the widgets on it.
      This apparently due to a bug in the QLabel widget when it contains RichText.  If
      forced to plain text, the problem won't happen (I am told).  However, the WARNING
      in the dialog needs to be bolded.  What to do?
_ Handbook:
    _ Mention that "Root element is" and "DOCTYPE" are case sensitive.  "html" is not
      the same as "HTML".  It should stay this way, BTW.  Proper xhtml requires lowercase
      tags.
_ Audio Plugins:
    _ At least one user experiences a freeze-up using ALSA plugin.  Speak a web page,
      pause the page, cause a knotify to speak, kttsd freezes.  This appears to be an
      ALSA device contention problem?  In this situation, there are two alsaplayer objects;
      one in pause state, and one attempting to speak notify.
    _ akodelib does not stop instantly when pause() or stop() is called.  See bug:107135.
    _ Popping noise at the end of each utterance when using ALSA audio plugin.
    _ Why must Player constructor take a 3rd "args" argument, while PluginProc constructor
      does not.  They are essentially the same. ??
    _ Add option to automatically turn down music player volume while speaking (via dcop).
_ Festival Interactive plugin:
    _ Need someone who can read czech to try integrating this into KTTS: 
      http://www.freebsoft.org/festival-czech
_ Command plugin:
    _ Command plugin encodes text on command line using %t in user's chosen encoding, but
      if this differs from user's desktop default encoding, doesn't work.  K3Process always
      encodes command line stuff using user's default encoding.  There is no point, therefore,
      in attempting to encode it differently, just mangles the text even more.  Short of modifying
      K3Process, I see no way around this.  But perhaps a warning to user advising to use %f instead?
    _ Command plugin crashes when using command 'flite -t "%t"' and flite can't get write access to /dev/dsp*.
_ Hadifix plugin:
    _ When stopText() is called, and Hadifix process is killed, the temporary wav file is not deleted,
      despite QFile::remove call.  Possibly still locked by exiting mbrola process?  This only seems
      to happen in the configuration dialog when canceling Tests.
_ KTTSMgr:
    _ Speech is paused when showing tooltip when mouse cursor is placed over tray icon.
    _ Give Talkers a Talker Name entered by user.  Show this name in Jobs tab, Change Talker screen,
      and in systray menu.
    _ Change the Current Sentence panel to show the current sentence of the selected job?  If selected
      job is not the currently speaking job, won't show currently-speaking text anymore.  However, would
      be helpful when using advance/rewind buttons.  Perhaps to be effective, if the currently-selected
      job IS the currently speaking job, and that job finishes, would automatically select the next
      speaking job?  But that could become confusing for users with selection jumping around.
    _ Add ability to quickly pick default Talker in systray menu.
    _ KCMultiDialog has a bug that won't allow sizing the screen narrower than 640.
    _ Overall Audio Speed should be a realtime setting, i.e., not necessary to click Apply.
    _ Disable Audio Speed control if sox not installed (configure.in.in but runtime check would be better).
    _ Add drag N drop for the Talkers so it is easier to change the ordering.
    _ It is possible to configure multiple instances of Talkers with the exact same configuration.
    _ In kcmkttsmgr, use setHelp() to set help anchor based on current tab.
    _ Add playback controls to kttsmgr.  Volume, pause.  Maybe rewind?
_ KTTSD:
    _ I am told that when kttsd crashes, it can take knotify down with it.  See about
      "disconnecting" knotify from kttsd (using post to Qt event queue).
    _ Strange msg being produced by KIO::move, but it works fine. ??
        kio (KIOJob): stat file:///home/kde-devel/.kde/share/apps/kttsd/audio/kttsd-5-1.wav
        kio (KIOJob): error 11 /home/kde-devel/.kde/share/apps/kttsd/audio/kttsd-5-1.wav
        kio (KIOJob): This seems to be a suitable case for trying to rename before stat+[list+]copy+del
    _ While kttsd currently configures a Talker automatically, would be nice if it could
      autoconfigure talkers for each requested language, if one has not already been configured.
    _ Add support for speech markers.
    _ Implement error signal handling in KTTSD.
    _ Add support for JSML and other Speech Markup languages.
    _ Add method for apps to play a sound file, including in the middle of a job.
      Could be done with SSML or with special Talker Code = "sound".
_ Other/General:
    _ Save buttons should confirm if user chooses an existing file.  KFileDialog doesn't seem to
      offer this option, but shouldn't it?
    _ .desktop files must have a Type keyword, but what to use for kcmkttsd_testmessage.desktop?
    _ Add option to kill plugin process when no longer needed so that memory can be recovered.
      Or maybe some sort of "nice" setting so that process will be swapped out when no longer needed.
    _ Convert to KConfig XT.
    _ Add a plugin for TuxTalk, http://tuxtalk.sourceforge.net/.  Since it only supports
      English (at the moment) and is alpha, don't think it is worth it now.
    _ Add a plugin for dhvani, an Indian and Hindi TTS engine, http://dhvani.sourceforge.net/
      Currently written in c, but it looks like future versions will require Java VM.
      Main problem at the moment is that dhvani sends audio directly to /dev/dsp with no option
      to send to a wav file.
    _ Investigate what is involved in getting Gnopernicus screen reader to use KTTSD.
    _ IBM ViaVoice plugin?
    _ Add KTTS plugin to aKregator.
