From d9f7040b519d6b6a00f651db32411e1fc8e48b28 Mon Sep 17 00:00:00 2001 From: thor Date: Sun, 6 Sep 2015 12:56:49 +0000 Subject: [PATCH] Update WAV-writing examples to use libout123. git-svn-id: svn://scm.orgis.org/mpg123/trunk@3810 35dc7657-300d-0410-a2e5-dc2837fedb53 --- doc/doxy_examples.c | 4 +- doc/examples/Makefile | 10 ++- doc/examples/mpg123_to_wav.c | 106 ++++++++++++++--------- doc/examples/mpg123_to_wav_replaced_io.c | 54 ++++++------ 4 files changed, 100 insertions(+), 74 deletions(-) diff --git a/doc/doxy_examples.c b/doc/doxy_examples.c index 6fc851be..466ba2d0 100644 --- a/doc/doxy_examples.c +++ b/doc/doxy_examples.c @@ -1,7 +1,7 @@ -/** \defgroup mpg123_examples example programs using libmpg123 +/** \defgroup mpg123_examples example programs using libmpg123 and libout123 @{ */ -/** \file mpg123_to_wav.c A simple MPEG audio to WAV converter using libmpg123 (read) and libsndfile (write). +/** \file mpg123_to_wav.c A simple MPEG audio to WAV converter using libmpg123 (read) and libout123 (write). ...an excersize on two simple APIs. */ /** \file mpglib.c Example program mimicking the old mpglib test program. diff --git a/doc/examples/Makefile b/doc/examples/Makefile index 52f1b07a..90aaf8b1 100644 --- a/doc/examples/Makefile +++ b/doc/examples/Makefile @@ -9,22 +9,24 @@ all: $(targets) ifeq ($(MPG123_PREFIX),) MPG123_CFLAGS := $(shell pkg-config --cflags libmpg123) MPG123_LDFLAGS := $(shell pkg-config --libs libmpg123) + OUT123_CFLAGS := $(shell pkg-config --cflags libout123) + OUT123_LDFLAGS := $(shell pkg-config --libs libout123) else # Yeah, that's with GNU/Linux in mind, at least GNU ld ... MPG123_CFLAGS := -I$(MPG123_PREFIX)/include MPG123_LDFLAGS := -L$(MPG123_PREFIX)/lib -Wl,-rpath $(MPG123_PREFIX)/lib -lmpg123 + OUT123_CFLAGS := -I$(MPG123_PREFIX)/include + OUT123_LDFLAGS := -L$(MPG123_PREFIX)/lib -Wl,-rpath $(MPG123_PREFIX)/lib -lout123 endif -SND_CFLAGS := $(shell pkg-config --cflags sndfile) -SND_LDFLAGS := $(shell pkg-config --libs sndfile) # Oder of libs not that important here... compile = $(CC) $(CPPFLAGS) $(CFLAGS) $(MPG123_CFLAGS) linkflags = $(MPG123_LDFLAGS) $(LDFLAGS) mpg123_to_wav: mpg123_to_wav.c - $(compile) -o mpg123_to_wav mpg123_to_wav.c $(SND_CFLAGS) $(SND_LDFLAGS) $(linkflags) + $(compile) -o mpg123_to_wav mpg123_to_wav.c $(OUT123_CFLAGS) $(OUT123_LDFLAGS) $(linkflags) mpg123_to_wav_replaced_io: mpg123_to_wav_replaced_io.c - $(compile) -o $@ $< $(SND_CFLAGS) $(SND_LDFLAGS) $(linkflags) + $(compile) -o $@ $< $(OUT123_CFLAGS) $(OUT123_LDFLAGS) $(linkflags) feedseek: feedseek.c $(compile) -o feedseek feedseek.c $(linkflags) diff --git a/doc/examples/mpg123_to_wav.c b/doc/examples/mpg123_to_wav.c index 91938750..713b17eb 100644 --- a/doc/examples/mpg123_to_wav.c +++ b/doc/examples/mpg123_to_wav.c @@ -1,25 +1,25 @@ /* mpg123_to_wav.c - copyright 2007 by the mpg123 project - free software under the terms of the LGPL 2.1 + copyright 2007-2015 by the mpg123 project - free software under the terms of the LGPL 2.1 see COPYING and AUTHORS files in distribution or http://mpg123.org initially written by Nicholas Humfrey */ +#include +#include #include #include -#include -#include - -void usage() +void usage(const char *cmd) { - printf("Usage: mpg123_to_wav [s16|f32 [ ]]\n"); + printf("Usage: %s [ [ ]]\n", cmd); exit(99); } -void cleanup(mpg123_handle *mh) +void cleanup(mpg123_handle *mh, out123_handle *ao) { + out123_del(ao); /* It's really to late for error checks here;-) */ mpg123_close(mh); mpg123_delete(mh); @@ -28,18 +28,19 @@ void cleanup(mpg123_handle *mh) int main(int argc, char *argv[]) { - SNDFILE* sndfile = NULL; - SF_INFO sfinfo; mpg123_handle *mh = NULL; + out123_handle *ao = NULL; unsigned char* buffer = NULL; size_t buffer_size = 0; size_t done = 0; - int channels = 0, encoding = 0; + int channels = 0; + int encoding = 0; + int framesize = 1; long rate = 0; int err = MPG123_OK; off_t samples = 0; - if (argc<3) usage(); + if (argc<3) usage(argv[0]); printf( "Input file: %s\n", argv[1]); printf( "Output file: %s\n", argv[2]); @@ -47,12 +48,30 @@ int main(int argc, char *argv[]) if(err != MPG123_OK || (mh = mpg123_new(NULL, &err)) == NULL) { fprintf(stderr, "Basic setup goes wrong: %s", mpg123_plain_strerror(err)); - cleanup(mh); + cleanup(mh, ao); + return -1; + } + ao = out123_new(); + if(!ao) + { + fprintf(stderr, "Cannot create output handle.\n"); + cleanup(mh, ao); return -1; } - /* Simple hack to enable floating point output. */ - if(argc >= 4 && !strcmp(argv[3], "f32")) mpg123_param(mh, MPG123_ADD_FLAGS, MPG123_FORCE_FLOAT, 0.); + if(argc >= 4) + { /* Make mpg123 support the desired encoding only for all rates. */ + const long *rates; + size_t rate_count; + size_t i; + int enc; + /* If that is zero, you'll get the error soon enough from mpg123. */ + enc = out123_enc_byname(argv[3]); + mpg123_format_none(mh); + mpg123_rates(&rates, &rate_count); + for(i=0; i #include #include -#include +#include #include #include #include #include -void usage() +void usage(const char *cmd) { - printf("Usage: mpg123_to_wav \n"); + printf("Usage: %s \n", cmd); exit(99); } -void cleanup(mpg123_handle *mh) +void cleanup(mpg123_handle *mh, out123_handle *ao) { + out123_del(ao); /* It's really to late for error checks here;-) */ mpg123_close(mh); mpg123_delete(mh); @@ -83,9 +84,8 @@ void cleanup_cb(void *handle) int main(int argc, char *argv[]) { - SNDFILE* sndfile = NULL; - SF_INFO sfinfo; mpg123_handle *mh = NULL; + out123_handle *ao = NULL; unsigned char* buffer = NULL; size_t buffer_size = 0; size_t done = 0; @@ -95,7 +95,7 @@ int main(int argc, char *argv[]) off_t samples = 0; struct ioh *iohandle; - if (argc!=3) usage(); + if (argc!=3) usage(argv[0]); printf( "Input file: %s\n", argv[1]); printf( "Output file: %s\n", argv[2]); @@ -119,14 +119,14 @@ int main(int argc, char *argv[]) { fprintf( stderr, "Trouble with mpg123: %s\n", mh==NULL ? mpg123_plain_strerror(err) : mpg123_strerror(mh) ); - cleanup(mh); + cleanup(mh, ao); return -1; } if(encoding != MPG123_ENC_SIGNED_16) { /* Signed 16 is the default output format anyways; it would actually by only different if we forced it. So this check is here just for this explanation. */ - cleanup(mh); + cleanup(mh, ao); fprintf(stderr, "Bad encoding: 0x%x!\n", encoding); return -2; } @@ -134,38 +134,42 @@ int main(int argc, char *argv[]) mpg123_format_none(mh); mpg123_format(mh, rate, channels, encoding); + printf("Creating 16bit WAV with %i channels and %liHz.\n", channels, rate); + if( + !(ao = out123_new()) + || out123_open(ao, "wav", argv[2]) + || out123_start(ao, rate, channels, encoding) + ) + { + fprintf(stderr, "Cannot create / start output: %s\n" + , out123_strerror(ao)); + cleanup(mh, ao); + return -1; + } + /* Buffer could be almost any size here, mpg123_outblock() is just some recommendation. Important, especially for sndfile writing, is that the size is a multiple of sample size. */ buffer_size = mpg123_outblock( mh ); buffer = malloc( buffer_size ); - bzero(&sfinfo, sizeof(sfinfo) ); - sfinfo.samplerate = rate; - sfinfo.channels = channels; - sfinfo.format = SF_FORMAT_WAV|SF_FORMAT_PCM_16; - printf("Creating 16bit WAV with %i channels and %liHz.\n", channels, rate); - - sndfile = sf_open(argv[2], SFM_WRITE, &sfinfo); - if(sndfile == NULL){ fprintf(stderr, "Cannot open output file!\n"); cleanup(mh); return -2; } - do { err = mpg123_read( mh, buffer, buffer_size, &done ); - sf_write_short( sndfile, (short*)buffer, done/sizeof(short) ); + out123_play(ao, buffer, done); samples += done/sizeof(short); /* We are not in feeder mode, so MPG123_OK, MPG123_ERR and MPG123_NEW_FORMAT are the only possibilities. We do not handle a new format, MPG123_DONE is the end... so abort on anything not MPG123_OK. */ - } while (err==MPG123_OK); + } while (done && err==MPG123_OK); + + free(buffer); if(err != MPG123_DONE) fprintf( stderr, "Warning: Decoding ended prematurely because: %s\n", err == MPG123_ERR ? mpg123_strerror(mh) : mpg123_plain_strerror(err) ); - sf_close( sndfile ); - samples /= channels; printf("%li samples written.\n", (long)samples); - cleanup(mh); + cleanup(mh, ao); free(iohandle); return 0; }