daemon: read settings from gconf
[espeaktime] / src / config.c
1 #include "config.h"
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <errno.h>
5
6 #define ESPEAKTIME_BIN "espeaktime-now.sh"
7 #define GCONF_KEY "/apps/Maemo/espeaktime"
8
9 void cfg_read(GConfClient *client, struct espeaktime_settings *cfg)
10 {
11         cfg->voice = gconf_client_get_string(client, GCONF_KEY "/voice", NULL);
12         cfg->effect = gconf_client_get_string(client, GCONF_KEY "/effect", NULL);
13         cfg->text = gconf_client_get_string(client, GCONF_KEY "/text", NULL);
14         cfg->amplitude = gconf_client_get_int(client, GCONF_KEY "/amplitude", NULL);
15         cfg->pitch = gconf_client_get_int(client, GCONF_KEY "/pitch", NULL);
16         cfg->speed = gconf_client_get_int(client, GCONF_KEY "/speed", NULL);
17         cfg->ignore_silent = gconf_client_get_bool(client, GCONF_KEY "/ignore_silent", NULL);
18         if (!cfg->voice)
19                 cfg->voice = g_strdup("en-us");
20         if (!cfg->effect)
21                 cfg->effect = g_strdup("");
22         if (!cfg->text)
23                 cfg->text = g_strdup("%H:%M");
24         if (!cfg->amplitude)
25                 cfg->amplitude = 100;
26         if (!cfg->pitch)
27                 cfg->pitch = 50;
28         if (!cfg->speed)
29                 cfg->speed = 170;
30         /* TODO: default ignore_silent to TRUE */
31 }
32
33 void cfg_write(GConfClient *client, struct espeaktime_settings *cfg)
34 {
35         gconf_client_add_dir(client, GCONF_KEY, GCONF_CLIENT_PRELOAD_NONE, NULL);
36         gconf_client_set_string(client, GCONF_KEY "/voice", cfg->voice, NULL);
37         gconf_client_set_string(client, GCONF_KEY "/effect", cfg->effect, NULL);
38         gconf_client_set_string(client, GCONF_KEY "/text", cfg->text, NULL);
39         gconf_client_set_int(client, GCONF_KEY "/amplitude", cfg->amplitude, NULL);
40         gconf_client_set_int(client, GCONF_KEY "/pitch", cfg->pitch, NULL);
41         gconf_client_set_int(client, GCONF_KEY "/speed", cfg->speed, NULL);
42         gconf_client_set_bool(client, GCONF_KEY "/ignore_silent", cfg->ignore_silent, NULL);
43 }
44
45 void cfg_free(struct espeaktime_settings *cfg)
46 {
47         g_free(cfg->voice);
48         g_free(cfg->effect);
49         g_free(cfg->text);
50 }
51
52 void cfg_speak(struct espeaktime_settings *cfg, gboolean test_mode)
53 {
54         gchar astr[16], pstr[16], sstr[16];
55         gchar vstr[64];
56         gchar text[4096];
57         time_t t;
58         struct tm *tm;
59         int res;
60         pid_t pid;
61
62         time(&t);
63         tm = localtime(&t);
64
65         g_snprintf(astr, sizeof(astr), "%d", cfg->amplitude);
66         g_snprintf(pstr, sizeof(pstr), "%d", cfg->pitch);
67         g_snprintf(sstr, sizeof(sstr), "%d", cfg->speed);
68         g_snprintf(vstr, sizeof(vstr), "%s%s%s", cfg->voice,
69                 (*cfg->effect) ? "+" : "", cfg->effect);
70         strftime(text, sizeof(text), cfg->text, tm);
71
72         setenv("EST_TESTMODE", test_mode ? "1" : "0", 1);
73         setenv("EST_IGN_SILENT", cfg->ignore_silent ? "1" : "0", 1);
74
75         pid = fork();
76         if (pid < 0) {
77                 perror("fork");
78                 return;
79         }
80         if (pid)
81                 return;
82         g_print("execlp: -a '%s' -p '%s' -s '%s' -v '%s' '%s'\n",
83                 astr, pstr, sstr, vstr, text);
84         res = execlp(ESPEAKTIME_BIN, ESPEAKTIME_BIN,
85                 "-a", astr, "-p", pstr, "-s", sstr, "-v", vstr,
86                 text, NULL);
87         g_print("execlp: %d (%s)\n", res, g_strerror(errno));
88         exit(res);
89 }