Added toggle buttons for switching speak engine, update PO files
[mstardict] / src / tts.cpp
index 85b7147..3648448 100644 (file)
@@ -51,6 +51,12 @@ enum {
 };
 
 enum {
+    ENGINE_NONE = 0,
+    ENGINE_ESPEAK,
+    ENGINE_REALPEOPLE
+};
+
+enum {
     GENDER_NONE = 0,
     GENDER_MALE,
     GENDER_FEMALE
@@ -79,7 +85,7 @@ static TtsVoice voices[] = {
     {"french",                 N_("French")},
     {"french (Belgium)",       N_("French (Belgium)")},
     {"greek-ancient",          N_("Greek (Ancient)")},
-    {"hindi-test",             N_("Hindi")},
+    {"hindi",                  N_("Hindi")},
     {"croatian",               N_("Croatian")},
     {"hungarian",              N_("Hungarian")},
     {"armenian",               N_("Armenian")},
@@ -107,11 +113,32 @@ static TtsVoice voices[] = {
     {"swahihi-test",           N_("Swahihi")},
     {"tamil",                  N_("Tamil")},
     {"turkish",                        N_("Turkish")},
-    {"vietnam-test",           N_("Vietnam")},
+    {"vietnam",                        N_("Vietnamese")},
     {"Mandarin",               N_("Chinese (Mandarin)")},
-    {"cantonese-test",                 N_("Chinese (Cantonese)")},
+    {"cantonese",              N_("Chinese (Cantonese)")},
+    {"akan-test",              N_("Akam")},
+    {"amharic-test",           N_("Amharic")},
+    {"azerbaijani-test",       N_("Azerbaijani")},
+    {"bulgarian-test",         N_("Bulgarian")},
+    {"dari-test",              N_("Dari")},
+    {"divehi-test",            N_("Divehi")},
+    {"georgian-test",          N_("Georgian")},
+    {"haitian",                        N_("Haitian")},
+    {"kannada",                        N_("Kannada")},
+    {"kinyarwanda-test",       N_("Kinyarwanda")},
+    {"malayalam",              N_("Mlayalam")},
+    {"nahuatl - clasical",     N_("Nahuatl (Clasical)")},
+    {"nepali-test",            N_("Nepali")},
+    {"northern-sotho",         N_("Northern Sotho")},
+    {"punjabi-test",           N_("Punjabi")},
+    {"setswana-test",          N_("Setswana")},
+    {"sinhala",                        N_("Sinhala")},
+    {"slovenian-test",         N_("Slovenian")},
+    {"swahili-test",           N_("Swahili")},
+    {"telugu",                 N_("Telugu")},
+    {"urdu-test",              N_("Urdu")},
+    {"wolof-test",             N_("Wolof")},
     {"default",                N_("Default")},
-    {"WyabdcRealPeopleTTS",    N_("WyabdcRealPeopleTTS")},
     {NULL,                     NULL}
 };
 
@@ -120,6 +147,7 @@ Tts::Tts(MStarDict *mStarDict)
 {
     int rate = 0;
     bool tts_enabled = false;
+    int engine = ENGINE_NONE;
     gchar *language = NULL;
     int gender = GENDER_NONE;
 
@@ -135,6 +163,11 @@ Tts::Tts(MStarDict *mStarDict)
     }
     Enable(tts_enabled);
 
+    /* read configured engine */
+    if (!oStarDict->oConf->GetInt("/apps/maemo/mstardict/tts_engine", &engine)) {
+       engine = ENGINE_ESPEAK;
+    }
+
     /* read configured language */
     if (!oStarDict->oConf->GetString("/apps/maemo/mstardict/tts_language", &language)) {
        language = g_strdup("english");
@@ -144,7 +177,7 @@ Tts::Tts(MStarDict *mStarDict)
     if (!oStarDict->oConf->GetInt("/apps/maemo/mstardict/tts_gender", &gender)) {
        gender = GENDER_MALE;
     }
-    SetVoice(language, gender);
+    SetVoice(engine, language, gender);
 
     if (language) {
        g_free(language);
@@ -170,12 +203,9 @@ Tts::IsEnabled()
 }
 
 void
-Tts::SetVoice(const gchar *language, int gender)
+Tts::SetVoice(int engine, const gchar *language, int gender)
 {
-    if (g_strcmp0(language, "WyabdcRealPeopleTTS") == 0)
-        RealPeople = true;
-    else
-        RealPeople = false;
+    Engine = engine;
 
     espeak_VOICE voice;
 
@@ -189,19 +219,25 @@ Tts::SetVoice(const gchar *language, int gender)
 void
 Tts::SayText(const gchar *sText)
 {
-    if (!RealPeople) {
+    if (Engine == ENGINE_ESPEAK) {
         espeak_Synth(sText, strlen(sText) + 1, 0, POS_CHARACTER, 0, espeakCHARS_UTF8, NULL, NULL);
         return;
+    } else if (Engine == ENGINE_REALPEOPLE) {
+       gchar *lower = g_utf8_strdown(sText, -1);
+       if (!lower)
+           return;
+       
+       gchar *cmd = g_strdup_printf("paplay /home/user/MyDocs/mstardict/WyabdcRealPeopleTTS/%c/%s.wav", lower[0], lower);
+       if (!cmd)
+           return;
+       
+       system(cmd);
+       
+       g_free(lower);
+       g_free(cmd);
+    } else {
+       /* unknown engine */
     }
-
-    gchar *lower = g_utf8_strdown(sText, -1);
-    gchar *cmd = g_strdup_printf("paplay /home/user/MyDocs/mstardict/WyabdcRealPeopleTTS/%c/%s.wav", lower[0], lower);
-    g_free(lower);
-
-    system(cmd);
-
-    g_free(cmd);
-
 }
 
 GtkListStore *
@@ -248,14 +284,55 @@ Tts::onTtsEnableButtonClicked(GtkButton *button,
                              Tts *oTts)
 {
     if (hildon_check_button_get_active(HILDON_CHECK_BUTTON(button))) {
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->engine_espeak_button), TRUE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->engine_realpeople_button), TRUE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_male_button), TRUE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_female_button), TRUE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->language_button), TRUE);
+    } else {
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->engine_espeak_button), FALSE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->engine_realpeople_button), FALSE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_male_button), FALSE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_female_button), FALSE);
+       gtk_widget_set_sensitive(GTK_WIDGET(oTts->language_button), FALSE);
+    }
+    return true;
+}
+
+gboolean
+Tts::onTtsEngineButtonClicked(GtkWidget *button,
+                             Tts *oTts)
+{
+    GtkWidget *button2;
+
+    if (button != oTts->engine_realpeople_button)
+       button2 = oTts->engine_realpeople_button;
+    else
+       button2 = oTts->engine_espeak_button;
+
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2), FALSE);
+    else
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button2), TRUE);
+    
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(oTts->engine_espeak_button))) {
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(oTts->engine_realpeople_button), FALSE);
        gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_male_button), TRUE);
        gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_female_button), TRUE);
        gtk_widget_set_sensitive(GTK_WIDGET(oTts->language_button), TRUE);
     } else {
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(oTts->engine_realpeople_button), TRUE);
        gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_male_button), FALSE);
        gtk_widget_set_sensitive(GTK_WIDGET(oTts->gender_female_button), FALSE);
        gtk_widget_set_sensitive(GTK_WIDGET(oTts->language_button), FALSE);
     }
+
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(oTts->engine_realpeople_button))) {
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(oTts->engine_espeak_button), FALSE);
+    } else {
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(oTts->engine_espeak_button), TRUE);
+    }
+    
     return true;
 }
 
@@ -273,7 +350,7 @@ Tts::onTtsGenderButtonClicked(GtkToggleButton *button1,
 GtkWidget *
 Tts::CreateTtsConfWidget()
 {
-    GtkWidget *frame, *vbox, *hbox;
+    GtkWidget *frame, *vbox, *engine_hbox, *gender_hbox;
     GtkWidget *selector;
     HildonTouchSelectorColumn *column;
     GtkListStore *voices_list;
@@ -288,17 +365,29 @@ Tts::CreateTtsConfWidget()
     gtk_button_set_label(GTK_BUTTON(enable_button), _("Enable"));
     gtk_box_pack_start(GTK_BOX(vbox), enable_button, TRUE, TRUE, 0);
 
+    /* engine selection */
+    engine_hbox = gtk_hbox_new(TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), engine_hbox, TRUE, TRUE, 0);
+
+    engine_espeak_button = hildon_gtk_toggle_button_new(HILDON_SIZE_FINGER_HEIGHT);
+    gtk_button_set_label(GTK_BUTTON(engine_espeak_button), _("eSpeak"));
+    gtk_box_pack_start(GTK_BOX(engine_hbox), engine_espeak_button, TRUE, TRUE, 0);
+
+    engine_realpeople_button = hildon_gtk_toggle_button_new(HILDON_SIZE_FINGER_HEIGHT);
+    gtk_button_set_label(GTK_BUTTON(engine_realpeople_button), _("Real People"));
+    gtk_box_pack_start(GTK_BOX(engine_hbox), engine_realpeople_button, TRUE, TRUE, 0);
+
     /* gender selection */
-    hbox = gtk_hbox_new(TRUE, 0);
-    gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+    gender_hbox = gtk_hbox_new(TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), gender_hbox, TRUE, TRUE, 0);
 
     gender_male_button = hildon_gtk_toggle_button_new(HILDON_SIZE_FINGER_HEIGHT);
     gtk_button_set_label(GTK_BUTTON(gender_male_button), _("Male"));
-    gtk_box_pack_start(GTK_BOX(hbox), gender_male_button, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(gender_hbox), gender_male_button, TRUE, TRUE, 0);
 
     gender_female_button = hildon_gtk_toggle_button_new(HILDON_SIZE_FINGER_HEIGHT);
     gtk_button_set_label(GTK_BUTTON(gender_female_button), _("Female"));
-    gtk_box_pack_start(GTK_BOX(hbox), gender_female_button, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(gender_hbox), gender_female_button, TRUE, TRUE, 0);
 
     /* language picker button */
     language_button = hildon_picker_button_new(HILDON_SIZE_FINGER_HEIGHT,
@@ -325,6 +414,8 @@ Tts::CreateTtsConfWidget()
                                      HILDON_TOUCH_SELECTOR(selector));
 
     g_signal_connect(enable_button, "clicked", G_CALLBACK(onTtsEnableButtonClicked), this);
+    g_signal_connect(engine_espeak_button, "clicked", G_CALLBACK(onTtsEngineButtonClicked), this);
+    g_signal_connect(engine_realpeople_button, "clicked", G_CALLBACK(onTtsEngineButtonClicked), this);
     g_signal_connect(gender_male_button, "clicked", G_CALLBACK(onTtsGenderButtonClicked), gender_female_button);
     g_signal_connect(gender_female_button, "clicked", G_CALLBACK(onTtsGenderButtonClicked), gender_male_button);
 
@@ -336,6 +427,7 @@ Tts::TtsConfWidgetLoadConf()
 {
     HildonTouchSelector *selector;
     GtkTreeIter iter;
+    int engine = ENGINE_NONE;
     int gender = GENDER_NONE;
     gchar *language = NULL;
     GtkTreeModel *model;
@@ -349,6 +441,15 @@ Tts::TtsConfWidgetLoadConf()
        gtk_widget_set_sensitive(language_button, FALSE);
     }
 
+    if (oStarDict->oConf->GetInt("/apps/maemo/mstardict/tts_engine", &engine)) {
+       if (engine == ENGINE_ESPEAK)
+           gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(engine_espeak_button), TRUE);
+       else
+           gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(engine_realpeople_button), TRUE);
+    } else {
+           gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(engine_espeak_button), TRUE);
+    }
+
     if (oStarDict->oConf->GetInt("/apps/maemo/mstardict/tts_gender", &gender)) {
        if (gender == GENDER_MALE)
            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gender_male_button), TRUE);
@@ -383,19 +484,29 @@ Tts::TtsConfWidgetSaveConf()
     bool enabled = false;
     HildonTouchSelector *selector;
     GtkTreeIter iter;
+    int engine = ENGINE_NONE;
     int gender = GENDER_NONE;
-    const gchar *language;
+    const gchar *language = NULL;
 
     enabled = hildon_check_button_get_active(HILDON_CHECK_BUTTON(enable_button));
     if (oStarDict->oConf->SetBool("/apps/maemo/mstardict/tts_enabled", enabled))
        Enable(enabled);
 
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(engine_espeak_button)))
+       engine = ENGINE_ESPEAK;
+    else
+       engine = ENGINE_REALPEOPLE;
+    oStarDict->oConf->SetInt("/apps/maemo/mstardict/tts_engine", engine);
+
     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gender_male_button)))
        gender = GENDER_MALE;
     else
        gender = GENDER_FEMALE;
     oStarDict->oConf->SetInt("/apps/maemo/mstardict/tts_gender", gender);
 
+    if (engine)
+       Engine = engine;
+
     if (hildon_picker_button_get_active(HILDON_PICKER_BUTTON(language_button)) > -1) {
        selector = hildon_picker_button_get_selector(HILDON_PICKER_BUTTON(language_button));
        if (hildon_touch_selector_get_selected(selector, DISPNAME_COLUMN, &iter)) {
@@ -403,7 +514,7 @@ Tts::TtsConfWidgetSaveConf()
 
            /* fixme convert back disp_name */
            if (oStarDict->oConf->SetString("/apps/maemo/mstardict/tts_language", language))
-               SetVoice(language, gender);
+               SetVoice(engine, language, gender);
        }
     }
 }