summaryrefslogtreecommitdiffstats
path: root/kttsd/libkttsd/pluginconf.h
diff options
context:
space:
mode:
Diffstat (limited to 'kttsd/libkttsd/pluginconf.h')
-rw-r--r--kttsd/libkttsd/pluginconf.h378
1 files changed, 378 insertions, 0 deletions
diff --git a/kttsd/libkttsd/pluginconf.h b/kttsd/libkttsd/pluginconf.h
new file mode 100644
index 0000000..4c4647c
--- /dev/null
+++ b/kttsd/libkttsd/pluginconf.h
@@ -0,0 +1,378 @@
+/***************************************************** vim:set ts=4 sw=4 sts=4:
+ This file is the template for the configuration plug ins.
+ -------------------
+ Copyright : (C) 2002-2003 by José Pablo Ezequiel "Pupeno" Fernández
+ -------------------
+ Original author: José Pablo Ezequiel "Pupeno" Fernández <pupeno@kde.org>
+ Current Maintainer: Gary Cramblitt <garycramblitt@comcast.net>
+ ******************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; version 2 of the License. *
+ * *
+ ***************************************************************************/
+
+#ifndef _PLUGINCONF_H_
+#define _PLUGINCONF_H_
+
+// Qt includes.
+#include <qwidget.h>
+
+// KDE includes.
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kdemacros.h>
+#include "kdeexportfix.h"
+
+// KTTS includes.
+#include "testplayer.h"
+
+/**
+* @interface PlugInConf
+*
+* pluginconf - the KDE Text-to-Speech Deamon Plugin Configuration API.
+*
+* @version 1.0 Draft 2
+*
+* This class defines the interface that plugins to KTTSMGR must implement.
+*
+* @warning The pluginconf interface is still being developed and is likely
+* to change in the future.
+*
+* A KTTSD Plugin interfaces between KTTSD and a speech engine.
+* A PlugInConf provides an on-screen widget for configuring the plugin for use
+* with KTTSD.
+*
+* @section guidelines General Guidelines
+*
+* - The configuration widget should be no larger than TODO pixels.
+* - Do not supply Load, Save, Cancel, or OK buttons. Those are provided by KTTSMGR.
+* - Try to supply a Test button so that users can test the configuration before
+* saving it.
+* - Your configuration widget will be running inside a KPart.
+* - Whenever the user changes something in your on-screen widget, emit the
+* @ref changed signal.
+* - If a plugin can automatically configure itself, i.e., locate voice files,
+* set default values, etc., it should do so when it is first added to KTTSMGR.
+*
+* @section multiinstance Multiple Instances
+*
+* If it is possible to run multiple simultaneous instances of your synthesis engine,
+* return True from the @ref supportsMultiInstance method. The user will be able to
+* configure multiple instances of your plugin, each with a different set of
+* talker attributes.
+*
+* If you cannot run multiple simultaneous instances of your synthesis engine,
+* or your plugin has a fixed set of talker attributes (only one language, voice,
+* gender, volume, and speed), return False from @ref supportsMultiInstance.
+*
+* @section language Language Support
+*
+* Some plugins support only one language. For them, return the appropriate language
+* code when @ref getSupportedLanguages is called.
+*
+* If your plugin can support multiple languages, your task is a little more
+* complicated. The best way to handle this is to install a @e voices file with
+* your plugin that lists all the supported languages, voice files, genders, etc.
+* that are possible. When your plugin is added to KTTSMGR,
+* @ref getSupportedLanguages will be called. Return a list of all the possible
+* languages supported, even if the user hasn't yet picked a voice file in your
+* configuration, or even told your where the voice files are.
+*
+* There are three ways that users and applications pick a language code for your
+* plugin:
+* - The user picks a code from among the languages you returned in
+* @ref getSupportedLanguages, or
+* - The user picks your plugin and uses your configuration widget to pick a voice
+* file or other configuration option that determines the language, or
+* - An application requests a plugin with specific language support.
+*
+* If possible, avoid making the user pick a language code in your plugin.
+*
+* In the first and third cases, the chosen language code will be passed to your
+* plugin when @ref setDesiredLanguage is called. If you can satisfy this
+* language code, good, but it is possible that once the user has begun
+* configuring your plugin, you find that you cannot support the desired
+* language. Perhaps a needed voice file is missing. That is OK.
+* You'll inform KTTSMGR of the actual language code when KTTSMGR
+* calls @ref getTalkerCode (see below). Note that you should not limit the
+* users choices based on the @ref setDesiredLanguage. A user might start
+* out configuring your plugin for one language, and then change his or her
+* mind to a different language.
+*
+* Also note that language codes may also include an appended country code.
+* For example, "en_GB" for British English. When @ref getSupportedLanguages is
+* called, you should return as specific a list as possible. For example,
+* if your plugin supports both American and British English, your returned
+* list would include "en_GB" and "en_US". When @ref setDesiredLanguage is
+* called, a country code may or may not be included. If included and your
+* plugin supports the language, but not the specific country variant,
+* your plugin should nevertheless attempt to satisfy the request, returning
+* the actual supported language and country when @ref getTalkerCode is called.
+*
+* @section talkercodes Talker Codes
+*
+* Review the section on Talkers in kspeech.h.
+*
+* When your plugin is added to the KTTSMGR, @ref getSupportedLanguages
+* will be called followed by @ref setDesiredLanguage and @ref load.
+* Note that the configuration file will most likely be empty when
+* @ref load is called.
+
+* Next, @ref getTalkerCode
+* will be called. If your plugin can automatically configure itself to the desired
+* language, it should do so and return a fully-specified talker code. If your
+* plugin is not yet ready and requires user help, return QString::null. Note that
+* @ref setDesiredLanguage may be Null, in which case, you should allow the
+* user to configure your plugin to any of your supported languages.
+*
+* When your plugin has been configured enough to begin synthesis, return a
+* fully-specified talker code in @ref getTalkerCode().
+*
+* Here is guidance for what you should return for each of the talker attributes
+* when @ref getTalkerCode is called:
+*
+* - @e lang. If user has completed configuring your plugin, i.e., it is
+* ready to begin synthesizing, return the ISO 639-1 language code
+* for the language it can synthesize. If your plugin is not yet
+* fully configured, you should return QString::null for the entire
+* talker code. If your plugin supports a specific national version
+* of a language, that should also be included using the ISO 3166
+* country code separated from the language code by underscore (_).
+* For example, if your plugin synthesizes American English, you would
+* return "en_US". If British English, "en_BR". And if
+* non-specific English, just "en".
+* - @e synthesizer. The name of your plugin. Keep short, but long enough to
+* distinquish different implementations. For example,
+* Festival Int, Flite, Hadifix. Use only letters, numbers
+* spaces, and underscores (_) in your plugin name.
+* - @e gender. May be "male", "female", or "neutral".
+* - @e name. The voice code. If your plugin does not support voices,
+* return "fixed".
+* - @e volume. May be "medium", "loud", or "soft". If your plugin does not support
+* configurable volume, return "medium".
+* - @e rate. May be "medium", "fast", or "slow". If your plugin does not support
+* configurable speed, return "medium".
+*
+* The order of the attributes you return does not matter. Here is an example of
+* a fully-specified talker code.
+*
+* lang="en" name="Kal" gender="male" volume="soft" rate="fast"
+* synthesizer="Festival Interactive"
+*
+* Do not return translated values for the Talker Code attributes. All English.
+*
+* Each time your plugin emits the @ref changed signal, @ref getTalkerCode will be called.
+* The configuration dialog OK button will be disabled until you return a non-null
+* Talker Code.
+*
+* It is possible that your plugin does not know the language supported. The generic
+* Command plugin is example of such a case, since the user enters an arbitrary command.
+* In this case, return the value from the @ref setDesiredLanguage call. It is possible
+* that @ref setDesiredLanguage is Null. That is OK. In this case, KTTSMGR will prompt
+* the user for the language code.
+*
+* @section loadandsavemethods Load and Save Methods
+*
+* The @ref load and @ref save methods are called by KTTSMGR so that your plugin
+* can load and save configuration options from the configuration file.
+* These methods have two parameters, a @e config object and a @e configGroup string.
+*
+* Plugins that do not support multiple instances (return False from
+* @ref supportsMultiInstance), should simply call config->setGroup(configGroup)
+* before loading or saving their configuration.
+*
+* If your plugin supports multiple instances, it is slightly more complicated.
+* Typically, there will be configuration options that apply to all instances
+* of the plugin and there will be options that apply only to the specific
+* configured instance of the plugin. To load or save the instance-specific
+* options, call config->setGroup(configGroup). For options that apply
+* to all instances of the plugin, call config->setGroup() with a group name
+* that contains your plugin's name. For example,
+* config->setGroup("Festival Defaults").
+*
+* For example, when first added to KTTSMGR, the Festival plugin needs to know the path to
+* the directory containing all the installed voice files. It is best for a plugin
+* to try to locate these resources automatically, but if it can't find them,
+* when the user has told it where they are, it is a good idea to save this information
+* in the all-instances group. In this way, the next time the plugin
+* is added to KTTSMGR, or another instance is added, it will be able to find them
+* automatically.
+*
+* @ref setDesiredLanguage is always called just prior to @ref load, therefore
+* it is not necessary to save the language code, unless your plugin needs it in
+* order to synthesize speech.
+*/
+
+class KDE_EXPORT PlugInConf : public QWidget{
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor
+ */
+ PlugInConf( QWidget *parent = 0, const char *name = 0);
+
+ /**
+ * Destructor
+ */
+ virtual ~PlugInConf();
+
+ /**
+ * This method is invoked whenever the module should read its
+ * configuration (most of the times from a config file) and update the
+ * user interface. This happens when the user clicks the "Reset" button in
+ * the control center, to undo all of his changes and restore the currently
+ * valid settings. Note that KTTSMGR calls this when the plugin is
+ * loaded, so it not necessary to call it in your constructor.
+ * The plugin should read its configuration from the specified group
+ * in the specified config file.
+ * @param config Pointer to a KConfig object.
+ * @param configGroup Call config->setGroup with this argument before
+ * loading your configuration.
+ *
+ * When a plugin is first added to KTTSMGR, @e load will be called with
+ * a Null @e configGroup. In this case, the plugin will not have
+ * any instance-specific parameters to load, but it may still wish
+ * to load parameters that apply to all instances of the plugin.
+ *
+ * @see loadandsavemethods
+ */
+ virtual void load(KConfig *config, const QString &configGroup);
+
+ /**
+ * This function gets called when the user wants to save the settings in
+ * the user interface, updating the config files or wherever the
+ * configuration is stored. The method is called when the user clicks "Apply"
+ * or "Ok". The plugin should save its configuration in the specified
+ * group of the specified config file.
+ * @param config Pointer to a KConfig object.
+ * @param configGroup Call config->setGroup with this argument before
+ * saving your configuration.
+ *
+ * @ref setDesiredLanguage is always called just prior to @ref load, therefore
+ * it is not necessary to save the language code, unless your plugin needs it in
+ * order to synthesize speech.
+ */
+ virtual void save(KConfig *config, const QString &configGroup);
+
+ /**
+ * This function is called to set the settings in the module to sensible
+ * default values. It gets called when hitting the "Default" button. The
+ * default values should probably be the same as the ones the application
+ * uses when started without a config file. Note that defaults should
+ * be applied to the on-screen widgets; not to the config file.
+ */
+ virtual void defaults();
+
+ /**
+ * Indicates whether the plugin supports multiple instances. Return
+ * False if only one instance of the plugin can run at a time, or
+ * if your plugin is limited to a single language, voice, gender, volume,
+ * and speed.
+ * @return True if multiple instances are possible.
+ */
+ virtual bool supportsMultiInstance();
+
+ /**
+ * This function informs the plugin of the desired language to be spoken
+ * by the plugin. The plugin should attempt to adapt itself to the
+ * specified language code, choosing sensible defaults if necessary.
+ * If the passed-in code is QString::null, no specific language has
+ * been chosen.
+ * @param lang The desired language code or Null if none.
+ *
+ * If the plugin is unable to support the desired language, that is OK.
+ * Language codes are given by ISO 639-1 and are in lowercase.
+ * The code may also include an ISO 3166 country code in uppercase
+ * separated from the language code by underscore (_). For
+ * example, en_GB. If your plugin supports the given language, but
+ * not the given country, treat it as though the country
+ * code were not specified, i.e., adapt to the given language.
+ */
+ virtual void setDesiredLanguage(const QString &lang);
+
+ /**
+ * Return fully-specified talker code for the configured plugin. This code
+ * uniquely identifies the configured instance of the plugin and distinquishes
+ * one instance from another. If the plugin has not been fully configured,
+ * i.e., cannot yet synthesize, return QString::null.
+ * @return Fully-specified talker code.
+ */
+ virtual QString getTalkerCode();
+
+ /**
+ * Return a list of all the languages possibly supported by the plugin.
+ * If your plugin can support any language, return Null.
+ * @return A QStringList of supported language and optional country
+ * codes, or Null if any.
+ *
+ * The languge codes are given in ISO 639-1. Lowercase should be used.
+ * If your plugin supports various national forms of a language, ISO 3166
+ * country codes should also be include in upperase and separated from
+ * the language code with underscore (_). Examples:
+ * en
+ * en_US
+ * en_GB
+ * es
+ * es_CL
+ * The list you return should be as specific as practicable.
+ */
+ virtual QStringList getSupportedLanguages();
+
+ /**
+ * Player object that can be used by the plugin for testing playback of synthed files.
+ */
+ void setPlayer(TestPlayer* player);
+ TestPlayer* getPlayer();
+
+ static QString realFilePath(const QString &filename);
+
+ static QString testMessage(const QString& languageCode);
+
+ public slots:
+ /**
+ * This slot is used internally when the configuration is changed. It is
+ * typically connected to signals from the widgets of the configuration
+ * and should emit the @ref changed signal.
+ */
+ void configChanged(){
+ kdDebug() << "PlugInConf::configChanged: Running"<< endl;
+ emit changed(true);
+ };
+
+ signals:
+ /**
+ * This signal indicates that the configuration has been changed.
+ * It should be emitted whenever user changes something in the configuration widget.
+ */
+ void changed(bool);
+
+ protected:
+ /**
+ * Searches the $PATH variable for any file. If that file exists in the PATH, or
+ * is contained in any directory in the PATH, it returns the full path to it.
+ * @param name The name of the file to search for.
+ * @returns The path to the file on success, a blank QString
+ * if its not found.
+ */
+ QString getLocation(const QString &name);
+
+ /**
+ * Breaks a language code into the language code and country code (if any).
+ * @param languageCode Language code.
+ * @return countryCode Just the country code part (if any).
+ * @return Just the language code part.
+ */
+ QString splitLanguageCode(const QString& languageCode, QString& countryCode);
+
+ /// The system path in a QStringList.
+ QStringList m_path;
+
+ TestPlayer* m_player;
+};
+
+#endif //_PLUGINCONF_H_