diff options
author | XANTRONIX Development | 2022-01-14 15:28:39 -0500 |
---|---|---|
committer | XANTRONIX Development | 2022-01-14 15:28:39 -0500 |
commit | 031451c6287a344566c96b49274f92e9a44c6196 (patch) | |
tree | 798bcd096c5d72638110a6d13b9e538bf2c611c7 /src | |
parent | c89de2271389dffcf30c79c24dfe0f965b4e504f (diff) | |
download | xas-031451c6287a344566c96b49274f92e9a44c6196.tar.gz xas-031451c6287a344566c96b49274f92e9a44c6196.tar.bz2 xas-031451c6287a344566c96b49274f92e9a44c6196.zip |
it...compiles
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile | 4 | ||||
-rw-r--r-- | src/riff.c | 90 |
2 files changed, 78 insertions, 16 deletions
diff --git a/src/Makefile b/src/Makefile index c00ccc0..3046c70 100644 --- a/src/Makefile +++ b/src/Makefile @@ -7,9 +7,9 @@ CC = $(CROSS)cc CFLAGS += -I$(INCLUDE_PATH) LDFLAGS += -HEADERS = riff.h audio.h +HEADERS = audio.h riff.h -OBJS = riff.o +OBJS = audio.o riff.o VERSION_MAJOR = 0 VERSION_MINOR = 0.1 @@ -2,8 +2,14 @@ #include <fcntl.h> #include <unistd.h> +#include <xas/audio.h> #include <xas/riff.h> +struct _xas_riff { + int fd; + size_t size; +}; + static int header_write(xas_riff *riff) { xas_riff_wave_header header = { .riff = { @@ -23,7 +29,7 @@ static int header_write(xas_riff *riff) { .size = 16 }, - .type = 1, + .type = XAS_RIFF_WAVE_DEFAULT_TYPE, .channels = 1, .sample_rate = 44100, .byte_rate = 176400 / 2, @@ -55,7 +61,11 @@ error_io: return -1; } -xas_riff *xas_riff_open_file(const char *path, int flags) { +static xas_riff *file_open(const char *path, + size_t sample_size, + size_t sample_rate, + size_t channels, + int flags) { xas_riff *riff; if ((riff = malloc(sizeof(*riff))) == NULL) { @@ -71,14 +81,16 @@ xas_riff *xas_riff_open_file(const char *path, int flags) { riff->size = 0; - if (header_write(riff) < 0) { - goto error_header_write; + if (flags & (O_CREAT | O_TRUNC)) { + if (header_write(riff) < 0) { + goto error_header_write; + } } return riff; error_header_write: - (void)close(riff->fd); + close(riff->fd); error_open: free(riff); @@ -87,7 +99,7 @@ error_malloc_riff: return NULL; } -int xas_riff_close(xas_riff *riff) { +static int file_close(xas_riff *riff) { if (lseek(riff->fd, 0, SEEK_SET) < 0) { goto error_io; } @@ -105,17 +117,67 @@ error_io: return -1; } -ssize_t xas_riff_write(xas_riff *riff, void *data, size_t len) { - ssize_t wrlen; +static int audio_drain(xas_riff *riff, + void *samples, + size_t count, + xas_audio_stream *stream) { + size_t wrlen = count * stream->sample_size + * stream->channels; + + return write(riff->fd, samples, wrlen); +} + +static ssize_t audio_fill(xas_riff *riff, + void *samples, + size_t count, + xas_audio_stream *stream) { + ssize_t len = count * stream->sample_size + * stream->channels; + + return read(riff->fd, samples, len); +} + +xas_audio_stream *xas_riff_file_open(const char *path, + size_t sample_size, + size_t sample_rate, + size_t channels, + int flags) { + xas_audio_stream *stream; + xas_riff *riff; - if ((wrlen = write(riff->fd, data, len)) < 0) { - goto error_write; + if ((riff = file_open(path, + channels, + sample_size, + sample_rate, + flags)) == NULL) { + goto error_file_open; } - riff->size += wrlen; + if (flags & (O_RDWR | O_WRONLY)) { + if ((stream = xas_audio_stream_new_sink((xas_audio_drain)audio_drain, + riff, + sample_size, + sample_rate, + channels, + 4096)) == NULL) { + goto error_audio_stream_new_sink; + } + } else { + if ((stream = xas_audio_stream_new_source((xas_audio_fill)audio_fill, + riff, + sample_size, + sample_rate, + channels, + 4096)) == NULL) { + goto error_audio_stream_new_sink; + } + } - return wrlen; + return stream; -error_write: - return -1; +error_audio_stream_new_sink: + file_close(riff); + +error_file_open: + return NULL; } |