summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/xas/vox.h13
-rw-r--r--src/vox.c90
2 files changed, 101 insertions, 2 deletions
diff --git a/include/xas/vox.h b/include/xas/vox.h
index c3bae65..7aa43e4 100644
--- a/include/xas/vox.h
+++ b/include/xas/vox.h
@@ -7,7 +7,8 @@
#include <xas/audio.h>
-#define XAS_VOX_SETTINGS_PATHLEN 64
+#define XAS_VOX_SETTINGS_TMP_PATH "/tmp/xas-vox.XXXXXX"
+#define XAS_VOX_SETTINGS_TMP_PATHLEN 64
enum xas_vox_state {
XAS_VOX_IDLE,
@@ -28,7 +29,9 @@ typedef struct _xas_vox {
stdin,
stdout;
- char tmpfile[XAS_VOX_SETTINGS_PATHLEN];
+ char tmpfile[XAS_VOX_SETTINGS_TMP_PATHLEN];
+ int tmpfd;
+ FILE *tmpfh;
FILE *in;
} xas_vox;
@@ -45,6 +48,12 @@ xas_vox *xas_vox_new(xas_audio_format format,
void xas_vox_destroy(xas_vox *vox);
+int xas_vox_set_voice(xas_vox *vox, const char *voice);
+
+int xas_vox_set_parameter(xas_vox *vox,
+ const char *name,
+ const char *value);
+
int xas_vox_stop(xas_vox *vox);
int xas_vox_active(xas_vox *vox);
diff --git a/src/vox.c b/src/vox.c
index bf2968b..bcfab5d 100644
--- a/src/vox.c
+++ b/src/vox.c
@@ -208,6 +208,45 @@ error_read:
return -1;
}
+static int tmpfile_open(xas_vox *vox) {
+ if (vox->tmpfile[0] && vox->tmpfd > 0) {
+ return 0;
+ }
+
+ memset(vox->tmpfile, '\0', sizeof(vox->tmpfile));
+
+ memcpy(vox->tmpfile,
+ XAS_VOX_SETTINGS_TMP_PATH,
+ strlen(XAS_VOX_SETTINGS_TMP_PATH));
+
+ if ((vox->tmpfd = mkstemp(vox->tmpfile)) < 0) {
+ goto error_mkstemp;
+ }
+
+ if ((vox->tmpfh = fdopen(vox->tmpfd, "w")) == NULL) {
+ goto error_fdopen;
+ }
+
+ return 0;
+
+error_fdopen:
+ close(vox->tmpfd);
+ unlink(vox->tmpfile);
+
+error_mkstemp:
+ return -1;
+}
+
+static void tmpfile_close(xas_vox *vox) {
+ fclose(vox->tmpfh);
+ (void)close(vox->tmpfd);
+ unlink(vox->tmpfile);
+
+ memset(vox->tmpfile, '\0', sizeof(vox->tmpfile));
+ vox->tmpfd = -1;
+ vox->tmpfh = NULL;
+}
+
xas_vox *xas_vox_new_args(xas_audio_format format,
size_t buffer_size,
const char *text2wave_path,
@@ -236,6 +275,7 @@ xas_vox *xas_vox_new_args(xas_audio_format format,
vox->args = args;
memset(vox->tmpfile, '\0', sizeof(vox->tmpfile));
+ vox->tmpfd = -1;
return vox;
@@ -243,10 +283,60 @@ error_malloc_vox:
return NULL;
}
+xas_vox *xas_vox_new(xas_audio_format format,
+ size_t buffer_size,
+ const char *text2wave_path) {
+ return xas_vox_new_args(format,
+ buffer_size,
+ text2wave_path,
+ 0,
+ NULL);
+}
+
void xas_vox_destroy(xas_vox *vox) {
+ if (vox->tmpfile[0] && vox->tmpfd > 0) {
+ tmpfile_close(vox);
+ }
+
free(vox);
}
+int xas_vox_set_voice(xas_vox *vox, const char *voice) {
+ if (tmpfile_open(vox) < 0) {
+ goto error_tmpfile_open;
+ }
+
+ if (fprintf(vox->tmpfh, "(%s)\n", voice) < 0) {
+ goto error_fprintf;
+ }
+
+ return 0;
+
+error_fprintf:
+error_tmpfile_open:
+ return -1;
+}
+
+int xas_vox_set_parameter(xas_vox *vox,
+ const char *name,
+ const char *value) {
+ if (tmpfile_open(vox) < 0) {
+ goto error_tmpfile_open;
+ }
+
+ if (fprintf(vox->tmpfh, "(Parameter.set '%s %s)\n",
+ name,
+ value) < 0) {
+ goto error_fprintf;
+ }
+
+ return 0;
+
+error_fprintf:
+error_tmpfile_open:
+ return -1;
+}
+
int xas_vox_stop(xas_vox *vox) {
if (vox->state == XAS_VOX_ACTIVE) {
return vox_stop(vox);