diff options
author | XANTRONIX Development | 2022-01-15 01:04:48 -0500 |
---|---|---|
committer | XANTRONIX Development | 2022-01-15 01:04:48 -0500 |
commit | 10743527b811423032adb38a7dafe00f5b69443e (patch) | |
tree | 053653220f60d6179124c84faf580e1639753ceb /src | |
parent | 031451c6287a344566c96b49274f92e9a44c6196 (diff) | |
download | xas-10743527b811423032adb38a7dafe00f5b69443e.tar.gz xas-10743527b811423032adb38a7dafe00f5b69443e.tar.bz2 xas-10743527b811423032adb38a7dafe00f5b69443e.zip |
~Getting there, sweetie.~
Diffstat (limited to 'src')
-rw-r--r-- | src/riff.c | 65 |
1 files changed, 48 insertions, 17 deletions
@@ -1,3 +1,4 @@ +#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> @@ -8,6 +9,10 @@ struct _xas_riff { int fd; size_t size; + + size_t sample_size, + sample_rate, + channels; }; static int header_write(xas_riff *riff) { @@ -30,11 +35,11 @@ static int header_write(xas_riff *riff) { }, .type = XAS_RIFF_WAVE_DEFAULT_TYPE, - .channels = 1, - .sample_rate = 44100, - .byte_rate = 176400 / 2, - .sample_size = 2, - .sample_size_bits = 16 + .channels = riff->channels, + .sample_rate = riff->sample_rate, + .byte_rate = riff->channels * riff->sample_size * riff->sample_rate, + .sample_size = riff->sample_size, + .sample_size_bits = riff->sample_size << 3 }, { @@ -43,6 +48,11 @@ static int header_write(xas_riff *riff) { } }; + printf("channels %zu sample size %zu sample rate %zu\n", + riff->channels, + riff->sample_size, + riff->sample_rate); + if (lseek(riff->fd, 0, SEEK_SET) < 0) { goto error_io; } @@ -80,6 +90,9 @@ static xas_riff *file_open(const char *path, } riff->size = 0; + riff->sample_size = sample_size; + riff->sample_rate = sample_rate; + riff->channels = channels; if (flags & (O_CREAT | O_TRUNC)) { if (header_write(riff) < 0) { @@ -99,7 +112,7 @@ error_malloc_riff: return NULL; } -static int file_close(xas_riff *riff) { +static void file_close(xas_riff *riff, xas_audio_stream *stream) { if (lseek(riff->fd, 0, SEEK_SET) < 0) { goto error_io; } @@ -110,31 +123,47 @@ static int file_close(xas_riff *riff) { (void)close(riff->fd); - return 0; - error_header_write: error_io: - return -1; + return; } 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; + size_t len = count * stream->sample_size + * stream->channels; + + ssize_t wrlen; + + if ((wrlen = write(riff->fd, samples, len)) < 0) { + goto error_write; + } + + return wrlen / stream->sample_size / stream->channels; - return write(riff->fd, samples, wrlen); +error_write: + return -1; } 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; + size_t len = count * stream->sample_size + * stream->channels; + + ssize_t rdlen; + + if ((rdlen = read(riff->fd, samples, len)) < 0) { + goto error_read; + } - return read(riff->fd, samples, len); + return rdlen / stream->sample_size / stream->channels; + +error_read: + return -1; } xas_audio_stream *xas_riff_file_open(const char *path, @@ -146,15 +175,16 @@ xas_audio_stream *xas_riff_file_open(const char *path, xas_riff *riff; if ((riff = file_open(path, - channels, sample_size, sample_rate, + channels, flags)) == NULL) { goto error_file_open; } if (flags & (O_RDWR | O_WRONLY)) { if ((stream = xas_audio_stream_new_sink((xas_audio_drain)audio_drain, + (xas_audio_cleanup)file_close, riff, sample_size, sample_rate, @@ -164,6 +194,7 @@ xas_audio_stream *xas_riff_file_open(const char *path, } } else { if ((stream = xas_audio_stream_new_source((xas_audio_fill)audio_fill, + (xas_audio_cleanup)file_close, riff, sample_size, sample_rate, @@ -176,7 +207,7 @@ xas_audio_stream *xas_riff_file_open(const char *path, return stream; error_audio_stream_new_sink: - file_close(riff); + file_close(riff, NULL); error_file_open: return NULL; |