diff options
| -rw-r--r-- | include/xas/vox.h | 31 | ||||
| -rw-r--r-- | src/Makefile | 4 | ||||
| -rw-r--r-- | src/vox.c | 72 | 
3 files changed, 105 insertions, 2 deletions
| diff --git a/include/xas/vox.h b/include/xas/vox.h new file mode 100644 index 0000000..6b73ae9 --- /dev/null +++ b/include/xas/vox.h @@ -0,0 +1,31 @@ +#ifndef _XAS_VOX_H +#define _XAS_VOX_H + +#include <sys/types.h> + +#include <xas/audio.h> + +#define XAS_VOX_VOICE_IDLE    0 +#define XAS_VOX_VOICE_ACTIVE (1 << 0) + +typedef struct _xas_vox_voice { +    const char *text2wave_path; + +    size_t sample_size, +           sample_rate; + +    void *ctx; + +    int flags; + +    int pid, +        stdout; +} xas_vox_voice; + +xas_audio_stream *xas_vox_new(const char *text2wave_path, +                                  size_t sample_size, +                                  size_t sample_rate, +                                  size_t buffer_size, +                                  void *ctx); + +#endif /* _XAS_VOX_H */ diff --git a/src/Makefile b/src/Makefile index a8853be..d5ddc43 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,9 +7,9 @@ CC		 = $(CROSS)cc  CFLAGS		+= -I$(INCLUDE_PATH)  LDFLAGS		+= -HEADERS		= audio.h mixer.h synth.h riff.h +HEADERS		= audio.h riff.h mixer.h synth.h vox.h -OBJS		= audio.o mixer.o synth.o riff.o +OBJS		= audio.o riff.o mixer.o synth.o vox.o  VERSION_MAJOR	= 0  VERSION_MINOR	= 0.1 diff --git a/src/vox.c b/src/vox.c new file mode 100644 index 0000000..502d79b --- /dev/null +++ b/src/vox.c @@ -0,0 +1,72 @@ +#include <stdlib.h> +#include <unistd.h> +#include <sys/wait.h> + +#include <xas/vox.h> + +static void voice_cleanup(xas_vox_voice *voice, xas_audio_stream *stream) { +    int status; + +    if (voice->flags & XAS_VOX_VOICE_ACTIVE) { +        if (voice->pid >= 0) { +            (void)waitpid(voice->pid, &status, 0); +        } + +        if (voice->stdout >= 0) { +            (void)close(voice->stdout); +        } +    } +} + +static ssize_t voice_fill(xas_vox_voice *voice, +                          int16_t *samples, +                          size_t count, +                          xas_audio_stream *stream) { +    size_t i; + +    for (i=0; i<count; i++) { +        samples[i] = 0; +    } + +    return i; +} + +xas_audio_stream *xas_vox_new(const char *text2wave_path, +                                  size_t sample_size, +                                  size_t sample_rate, +                                  size_t buffer_size, +                                  void *ctx) { +    xas_audio_stream *stream; +    xas_vox_voice *voice; + +    if ((voice = malloc(sizeof(*voice))) == NULL) { +        goto error_malloc_voice; +    } + +    voice->text2wave_path = text2wave_path; +    voice->sample_size    = sample_size; +    voice->sample_rate    = sample_rate; +    voice->ctx            = ctx; +    voice->flags          = XAS_VOX_VOICE_IDLE; + +    voice->pid    = -1; +    voice->stdout = -1; + +    if ((stream = xas_audio_stream_new_source((xas_audio_fill)voice_fill, +                                                (xas_audio_cleanup)voice_cleanup, +                                                voice, +                                                sample_size, +                                                sample_rate, +                                                XAS_AUDIO_STREAM_MONO, +                                                buffer_size)) == NULL) { +        goto error_audio_stream_new_source; +    } + +    return stream; + +error_audio_stream_new_source: +    free(voice); + +error_malloc_voice: +    return NULL; +} | 
 
    