summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/xas/vox.h6
-rw-r--r--src/vox.c22
2 files changed, 26 insertions, 2 deletions
diff --git a/include/xas/vox.h b/include/xas/vox.h
index 9d63bba..b3ea0ed 100644
--- a/include/xas/vox.h
+++ b/include/xas/vox.h
@@ -8,6 +8,8 @@
#include <xas/object.h>
#include <xas/audio.h>
+#define XAS_VOX_DEFAULT_GAIN 1.0f
+
#define XAS_VOX_SETTINGS_TMP_PATH "/tmp/xas-vox.XXXXXX"
#define XAS_VOX_SETTINGS_TMP_PATHLEN 64
@@ -22,6 +24,8 @@ typedef struct _xas_vox {
xas_audio_format format;
size_t buffer_size;
+ float gain;
+
const char *text2wave_path;
int argn;
char **args;
@@ -51,6 +55,8 @@ xas_vox *xas_vox_new(xas_audio_format format,
void xas_vox_destroy(xas_vox *vox);
+void xas_vox_set_gain(xas_vox *vox, float gain);
+
int xas_vox_set_voice(xas_vox *vox, const char *voice);
int xas_vox_set_parameter(xas_vox *vox,
diff --git a/src/vox.c b/src/vox.c
index cd31aa0..9f6382e 100644
--- a/src/vox.c
+++ b/src/vox.c
@@ -213,6 +213,12 @@ static ssize_t vox_fill(xas_vox *vox,
if (readlen == 0) {
vox_stop(vox);
+ } else if (vox->gain != 1.0f) {
+ xas_audio_apply_gain(vox->format,
+ samples,
+ vox->gain,
+ 0,
+ readlen);
}
readcount = readlen / vox->format.sample_size;
@@ -264,6 +270,12 @@ static void tmpfile_close(xas_vox *vox) {
vox->tmpfh = NULL;
}
+static int set_gain(xas_vox *vox, float gain) {
+ xas_vox_set_gain(vox, gain);
+
+ return 0;
+}
+
xas_vox *xas_vox_new_args(xas_audio_format format,
size_t buffer_size,
const char *text2wave_path,
@@ -275,8 +287,9 @@ xas_vox *xas_vox_new_args(xas_audio_format format,
goto error_malloc_vox;
}
- vox->obj.start = (xas_object_start_callback)xas_vox_generate;
- vox->obj.stop = (xas_object_stop_callback)xas_vox_stop;
+ vox->obj.start = (xas_object_start_callback)xas_vox_generate;
+ vox->obj.stop = (xas_object_stop_callback)xas_vox_stop;
+ vox->obj.set_gain = (xas_object_set_gain_callback)set_gain;
vox->text2wave_path = text2wave_path;
@@ -285,6 +298,7 @@ xas_vox *xas_vox_new_args(xas_audio_format format,
vox->format.sample_rate = format.sample_rate;
vox->buffer_size = buffer_size;
+ vox->gain = XAS_VOX_DEFAULT_GAIN;
vox->state = XAS_VOX_IDLE;
vox->pid = -1;
vox->stdin = -1;
@@ -322,6 +336,10 @@ void xas_vox_destroy(xas_vox *vox) {
free(vox);
}
+void xas_vox_set_gain(xas_vox *vox, float gain) {
+ vox->gain = gain;
+}
+
int xas_vox_set_voice(xas_vox *vox, const char *voice) {
if (tmpfile_open(vox) < 0) {
goto error_tmpfile_open;