From 572c28992641c1fc82a3d3218ece737a078390a0 Mon Sep 17 00:00:00 2001 Message-Id: <572c28992641c1fc82a3d3218ece737a078390a0.1715394011.git.mdw@distorted.org.uk> From: Mark Wooding Date: Fri, 28 Sep 2007 18:21:31 +0100 Subject: [PATCH] ogg decoding in disorder-decode Organization: Straylight/Edgeware From: rjk@greenend.org.uk <> --- plugins/Makefile.am | 2 +- server/Makefile.am | 2 +- server/decode.c | 38 +++++++++++++++++++++++++++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/plugins/Makefile.am b/plugins/Makefile.am index 6afc433..0f6ca75 100644 --- a/plugins/Makefile.am +++ b/plugins/Makefile.am @@ -27,7 +27,7 @@ notify_la_LDFLAGS=-module tracklength_la_SOURCES=tracklength.c mad.c madshim.h tracklength_la_LDFLAGS=-module -tracklength_la_LIBADD=@LIBVORBISFILE@ @LIBMAD@ +tracklength_la_LIBADD=$(LIBVORBISFILE) $(LIBMAD) fs_la_SOURCES=fs.c fs_la_LDFLAGS=-module diff --git a/server/Makefile.am b/server/Makefile.am index 548ac2a..fef174e 100644 --- a/server/Makefile.am +++ b/server/Makefile.am @@ -54,7 +54,7 @@ disorder_speaker_DEPENDENCIES=../lib/libdisorder.a disorder_decode_SOURCES=decode.c disorder_decode_LDADD=$(LIBOBJS) ../lib/libdisorder.a \ - $(LIBMAD) + $(LIBMAD) $(LIBVORBISFILE) disorder_decode_DEPENDENCIES=../lib/libdisorder.a disorder_normalize_SOURCES=normalize.c diff --git a/server/decode.c b/server/decode.c index c63ca20..f462f58 100644 --- a/server/decode.c +++ b/server/decode.c @@ -33,6 +33,7 @@ #include #include #include +#include #include "log.h" #include "syscalls.h" @@ -57,7 +58,7 @@ static FILE *outputfp; static const char *path; /** @brief Input buffer */ -static unsigned char buffer[1048576]; +static char buffer[1048576]; /** @brief Open the input file */ static void open_input(void) { @@ -205,10 +206,10 @@ static enum mad_flow mp3_output(void attribute((unused)) *data, static enum mad_flow mp3_input(void attribute((unused)) *data, struct mad_stream *stream) { const size_t n = fill(); - fprintf(stderr, "n=%zu\n", n); + if(!n) return MAD_FLOW_STOP; - mad_stream_buffer(stream, buffer, n); + mad_stream_buffer(stream, (unsigned char *)buffer, n); return MAD_FLOW_CONTINUE; } @@ -236,10 +237,41 @@ static void decode_mp3(void) { mad_decoder_finish(mad); } +/** @brief OGG decoder */ +static void decode_ogg(void) { + FILE *fp; + OggVorbis_File vf[1]; + int err; + long n; + int bitstream; + vorbis_info *vi; + + if(!(fp = fopen(path, "rb"))) + fatal(errno, "cannot open %s", path); + /* There doesn't seem to be any standard function for mapping the error codes + * to strings l-( */ + if((err = ov_open(fp, vf, 0/*initial*/, 0/*ibytes*/))) + fatal(0, "ov_fopen %s: %d", path, err); + if(!(vi = ov_info(vf, 0/*link*/))) + fatal(0, "ov_info %s: failed", path); + while((n = ov_read(vf, buffer, sizeof buffer, 1/*bigendianp*/, + 2/*bytes/word*/, 1/*signed*/, &bitstream))) { + if(n < 0) + fatal(0, "ov_read %s: %ld", path, n); + if(bitstream > 0) + fatal(0, "only single-bitstream ogg files are supported"); + output_header(vi->rate, vi->channels, 16/*bits*/, n); + if(fwrite(buffer, 1, n, outputfp) < (size_t)n) + fatal(errno, "decoding %s: writing sample data", path); + } +} + /** @brief Lookup table of decoders */ static const struct decoder decoders[] = { { "*.mp3", decode_mp3 }, { "*.MP3", decode_mp3 }, + { "*.ogg", decode_ogg }, + { "*.OGG", decode_ogg }, { 0, 0 } }; -- [mdw]