summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/xas/vox.h12
-rw-r--r--src/vox.c58
2 files changed, 65 insertions, 5 deletions
diff --git a/include/xas/vox.h b/include/xas/vox.h
index 7aa43e4..5a1cacf 100644
--- a/include/xas/vox.h
+++ b/include/xas/vox.h
@@ -54,6 +54,18 @@ int xas_vox_set_parameter(xas_vox *vox,
const char *name,
const char *value);
+int xas_vox_set_parameter_str(xas_vox *vox,
+ const char *name,
+ const char *value);
+
+int xas_vox_set_parameter_float(xas_vox *vox,
+ const char *name,
+ float value);
+
+int xas_vox_set_parameter_int(xas_vox *vox,
+ const char *name,
+ int 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 bcfab5d..475300d 100644
--- a/src/vox.c
+++ b/src/vox.c
@@ -1,3 +1,4 @@
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -87,6 +88,12 @@ static int vox_start(xas_vox *vox) {
(void)vox_stop(vox);
}
+ if (vox->tmpfh) {
+ if (fflush(vox->tmpfh) < 0) {
+ goto error_fflush;
+ }
+ }
+
if (pipe(pipe_stdin) < 0) {
goto error_pipe_stdin;
}
@@ -168,6 +175,7 @@ error_pipe_stdout:
(void)close(pipe_stdin[0]);
error_pipe_stdin:
+error_fflush:
return -1;
}
@@ -276,6 +284,7 @@ xas_vox *xas_vox_new_args(xas_audio_format format,
memset(vox->tmpfile, '\0', sizeof(vox->tmpfile));
vox->tmpfd = -1;
+ vox->tmpfh = NULL;
return vox;
@@ -317,26 +326,65 @@ error_tmpfile_open:
return -1;
}
-int xas_vox_set_parameter(xas_vox *vox,
+static int set_parameter_va(xas_vox *vox,
const char *name,
- const char *value) {
+ const char *format,
+ ...) {
+ va_list args;
+
if (tmpfile_open(vox) < 0) {
goto error_tmpfile_open;
}
- if (fprintf(vox->tmpfh, "(Parameter.set '%s %s)\n",
- name,
- value) < 0) {
+ va_start(args, format);
+
+ if (fprintf(vox->tmpfh, "(Parameter.set '%s ", name) < 0) {
+ goto error_fprintf;
+ }
+
+ if (vfprintf(vox->tmpfh, format, args) < 0) {
+ goto error_fprintf;
+ }
+
+ if (fprintf(vox->tmpfh, ")\n") < 0) {
goto error_fprintf;
}
+ va_end(args);
+
return 0;
error_fprintf:
+ va_end(args);
+
error_tmpfile_open:
return -1;
}
+int xas_vox_set_parameter(xas_vox *vox,
+ const char *name,
+ const char *value) {
+ return set_parameter_va(vox, name, "%s", value);
+}
+
+int xas_vox_set_parameter_str(xas_vox *vox,
+ const char *name,
+ const char *value) {
+ return set_parameter_va(vox, name, "\"%s\"", value);
+}
+
+int xas_vox_set_parameter_float(xas_vox *vox,
+ const char *name,
+ float value) {
+ return set_parameter_va(vox, name, "%f", value);
+}
+
+int xas_vox_set_parameter_int(xas_vox *vox,
+ const char *name,
+ int value) {
+ return set_parameter_va(vox, name, "%d", value);
+}
+
int xas_vox_stop(xas_vox *vox) {
if (vox->state == XAS_VOX_ACTIVE) {
return vox_stop(vox);