3 #include <hildon/hildon.h>
4 #include <hildon-cp-plugin/hildon-cp-plugin-interface.h>
6 #define ESPEAK_BIN "espeak"
8 /* TODO: read these from disk */
10 static const struct voice {
16 { "en-us", "English (American)" },
17 { "en-sc", "English (Scottish)" },
18 { "af", "Afrikaans" },
24 { "eo", "Esperanto" },
26 { "es-la", "Spanish (Latin America)" },
30 { "hu", "Hungarian" },
35 { "pt", "Portuguese (Brazil)" },
36 { "pt-pt", "Portuguese (European)" },
44 { "zh", "Mandarin Chinese" },
46 static const int num_voices = sizeof(voices) / sizeof(voices[0]);
48 static const struct effect {
67 { "klatt2", "Klatt 2" },
68 { "klatt3", "Klatt 3" },
69 { "whisper", "Whisper" },
71 static const int num_effects = sizeof(effects) / sizeof(effects[0]);
73 struct espeaktime_settings {
80 gboolean ignore_silent;
83 static void do_test(struct espeaktime_settings *cfg)
85 gchar astr[16], pstr[16], sstr[16];
96 g_snprintf(astr, sizeof(astr), "%d", cfg->amplitude);
97 g_snprintf(pstr, sizeof(pstr), "%d", cfg->pitch);
98 g_snprintf(sstr, sizeof(sstr), "%d", cfg->speed);
99 g_snprintf(vstr, sizeof(vstr), "%s%s%s", cfg->voice,
100 (*cfg->effect) ? "+" : "", cfg->effect);
101 strftime(text, sizeof(text), cfg->text, tm);
110 g_print("execlp: -a '%s' -p '%s' -s '%s' -v '%s' '%s'\n",
111 astr, pstr, sstr, vstr, text);
112 res = execlp(ESPEAK_BIN, ESPEAK_BIN,
113 "-a", astr, "-p", pstr, "-s", sstr, "-v", vstr,
115 g_print("execlp: %d\n", res);
119 static void add_scale(GtkVBox *vbox, GtkSizeGroup *size_group, const char *caption, GtkAdjustment *adjustment)
121 GtkWidget *scale = gtk_hscale_new(adjustment);
122 gtk_scale_set_digits(GTK_SCALE(scale), 0);
123 gtk_box_pack_start(GTK_BOX(vbox),
124 hildon_caption_new(size_group, caption, scale, NULL, HILDON_CAPTION_MANDATORY),
128 osso_return_t execute(osso_context_t *osso, gpointer data, gboolean user_activated)
130 struct espeaktime_settings cfg = {
136 .ignore_silent = TRUE,
140 dialog = gtk_dialog_new_with_buttons(
141 "eSpeakTime Settings",
143 GTK_DIALOG_MODAL | GTK_DIALOG_NO_SEPARATOR,
145 GTK_STOCK_SAVE, GTK_RESPONSE_OK,
146 GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
149 int k, voice_sel = 0, effect_sel = 0;
150 GtkVBox *vbox = GTK_VBOX(gtk_vbox_new(FALSE, 0));
151 GtkSizeGroup *title_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
152 GtkSizeGroup *value_group = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
155 HildonTouchSelector *voice_selector = HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
156 for (k = 0; k < num_voices; k++) {
157 hildon_touch_selector_append_text(voice_selector, voices[k].name);
158 if (!strcmp(voices[k].id, cfg.voice))
162 HildonTouchSelector *effect_selector = HILDON_TOUCH_SELECTOR(hildon_touch_selector_new_text());
163 for (k = 0; k < num_effects; k++) {
164 hildon_touch_selector_append_text(effect_selector, effects[k].name);
165 if (!strcmp(effects[k].id, cfg.effect))
169 HildonPickerButton *voice = HILDON_PICKER_BUTTON(hildon_picker_button_new(HILDON_SIZE_FINGER_HEIGHT, HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
170 hildon_button_set_title(HILDON_BUTTON(voice), "Voice");
171 hildon_picker_button_set_selector(voice, voice_selector);
172 hildon_picker_button_set_active(voice, voice_sel);
173 hildon_button_add_size_groups(HILDON_BUTTON(voice), title_group, value_group, NULL);
174 gtk_button_set_alignment(GTK_BUTTON(voice), 0.0, 0.5);
175 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(voice), FALSE, FALSE, 0);
177 HildonPickerButton *effect = HILDON_PICKER_BUTTON(hildon_picker_button_new(HILDON_SIZE_FINGER_HEIGHT, HILDON_BUTTON_ARRANGEMENT_HORIZONTAL));
178 hildon_button_set_title(HILDON_BUTTON(effect), "Effect");
179 hildon_picker_button_set_selector(effect, effect_selector);
180 hildon_picker_button_set_active(effect, effect_sel);
181 hildon_button_add_size_groups(HILDON_BUTTON(effect), title_group, value_group, NULL);
182 gtk_button_set_alignment(GTK_BUTTON(effect), 0.0, 0.5);
183 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(effect), FALSE, FALSE, 0);
185 HildonEntry *text = HILDON_ENTRY(hildon_entry_new(HILDON_SIZE_AUTO));
186 gtk_entry_set_text(GTK_ENTRY(text), "%H:%M");
187 gtk_box_pack_start(GTK_BOX(vbox),
188 hildon_caption_new(title_group, "Speech string", GTK_WIDGET(text), NULL, HILDON_CAPTION_MANDATORY),
191 GtkAdjustment *amplitude_adj = GTK_ADJUSTMENT(gtk_adjustment_new(cfg.amplitude, 0, 200, 1, 10, 0));
192 add_scale(vbox, title_group, "Amplitude", amplitude_adj);
194 GtkAdjustment *pitch_adj = GTK_ADJUSTMENT(gtk_adjustment_new(cfg.pitch, 00, 99, 1, 10, 0));
195 add_scale(vbox, title_group, "Pitch", pitch_adj);
197 GtkAdjustment *speed_adj = GTK_ADJUSTMENT(gtk_adjustment_new(cfg.speed, 80, 390, 1, 10, 0));
198 add_scale(vbox, title_group, "Words per minute", speed_adj);
200 HildonCheckButton *ignore_silent = HILDON_CHECK_BUTTON(hildon_check_button_new(HILDON_SIZE_FINGER_HEIGHT));
201 hildon_check_button_set_active(ignore_silent, cfg.ignore_silent);
202 gtk_button_set_label(GTK_BUTTON(ignore_silent), "Ignore silent profile");
203 gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(ignore_silent), FALSE, FALSE, 0);
205 GtkWidget *panarea = hildon_pannable_area_new();
206 gtk_widget_set_size_request(panarea, -1, 800);
207 hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(panarea), GTK_WIDGET(vbox));
209 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), panarea);
210 gtk_widget_show_all(dialog);
212 int result = gtk_dialog_run(GTK_DIALOG(dialog));
216 g_print("Test button\n");
217 cfg.voice = voices[hildon_picker_button_get_active(voice)].id;
218 cfg.effect = effects[hildon_picker_button_get_active(effect)].id;
219 cfg.text = gtk_entry_get_text(GTK_ENTRY(text));
220 cfg.amplitude = gtk_adjustment_get_value(amplitude_adj);
221 cfg.pitch = gtk_adjustment_get_value(pitch_adj);
222 cfg.speed = gtk_adjustment_get_value(speed_adj);
223 cfg.ignore_silent = hildon_check_button_get_active(ignore_silent);
226 case GTK_RESPONSE_OK:
232 gtk_widget_destroy(GTK_WIDGET(dialog));
237 osso_return_t save_state(osso_context_t *osso, gpointer data)
239 g_print("save_state called\n");
244 int main(int argc, char *argv[])
246 gtk_init(&argc, &argv);
247 return execute(NULL, NULL, 0);