From 1bd06fb67b9db40cb5d3cb937bcf7fba36c97d25 Mon Sep 17 00:00:00 2001 From: tth Date: Wed, 23 Oct 2019 18:46:27 +0200 Subject: [PATCH] playing a WAV file --- README.md | 16 +++++++++-- audio/Makefile | 9 ++++-- audio/ao_output.c | 41 +++++++++++++++++---------- audio/ao_output.h | 6 ++-- audio/playfile.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++ audio/playfile.h | 3 ++ audio/t.c | 22 +++++++++++---- 7 files changed, 141 insertions(+), 26 deletions(-) create mode 100644 audio/playfile.c create mode 100644 audio/playfile.h diff --git a/README.md b/README.md index 00da4d0..f7d1d52 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,21 @@ Les scratchmen utilisent des loopers en Flash 11. Il est temps qu'ils découvrent une interface ncurses -pilotée au joystick :) +pilotable au joystick ou par OSC :) ## Prérequis : -libsndfile, libao, libcurses. +libsndfile, libao, liblo, libcurses.avec les bons -dev ! + +## Compilation : + +Pour le moment, vous êtes laissé à vous-même. + +## Hacking : + +La voie est libre. + + + + diff --git a/audio/Makefile b/audio/Makefile index 09be2a3..e30f271 100644 --- a/audio/Makefile +++ b/audio/Makefile @@ -6,6 +6,11 @@ LIBS = -lao -lsndfile -lm ao_output.o: ao_output.c Makefile $(CC) ${CCOPT} -c $< -t: t.c ao_output.o Makefile - $(CC) ${CCOPT} $< ao_output.o ${LIBS} -o $@ +playfile.o: playfile.c Makefile + $(CC) ${CCOPT} -c $< + +OBJS = ao_output.o playfile.o + +t: t.c ${OBJS} Makefile + $(CC) ${CCOPT} $< ${OBJS} ${LIBS} -o $@ diff --git a/audio/ao_output.c b/audio/ao_output.c index 93dca41..ab8f4b6 100644 --- a/audio/ao_output.c +++ b/audio/ao_output.c @@ -1,5 +1,5 @@ /* - * NcLooper fonctions audio + * NcLooper fonctions audio output */ #include @@ -15,13 +15,14 @@ /* --------------------------------------------------------------------- */ -static ao_device *device; /* never alone with a singleton */ +extern int verbosity; /* --------------------------------------------------------------------- */ -int init_ao_output(int smplrate) +ao_device *init_ao_output(int smplrate) { int default_driver; ao_sample_format format; +ao_device *device; #if DEBUG_LEVEL fprintf(stderr, ">>> %s ( %d )\n", __func__, smplrate); @@ -43,33 +44,39 @@ format.byte_format = AO_FMT_LITTLE; device = ao_open_live(default_driver, &format, NULL); if (device == NULL) { fprintf(stderr, "Error opening AO device.\n"); - return -1; + return NULL; } +#if DEBUG_LEVEL +fprintf(stderr, "%s : device at %p\n", __func__, device); +#endif -return 0; +return device; } /* --------------------------------------------------------------------- */ -int close_ao_output(void) +int close_ao_output(ao_device *dev) { -ao_close(device); -ao_shutdown(); +if (NULL == dev) { + fprintf(stderr, "%s : no output to close\n", __func__); + return -1; + } -device = NULL; +ao_close(dev); +ao_shutdown(); return 0; } /* --------------------------------------------------------------------- */ -int play_some_stuff(int notused) +int play_some_stuff(ao_device *dev, int notused) { int i, sample; char *buffer; float freq = 440.0; -#define NB_SAMPLES 44100 +#define NB_SAMPLES (44100*2) -if (NULL == device) { +if (NULL == dev) { fprintf(stderr, "%s : please call 'init_ao_output' first\n", __func__); exit(1); @@ -85,7 +92,13 @@ for (i = 0; i < NB_SAMPLES; i++) { buffer[4*i] = buffer[4*i+2] = sample & 0xff; buffer[4*i+1] = buffer[4*i+3] = (sample >> 8) & 0xff; } -ao_play(device, buffer, NB_SAMPLES); +ao_play(dev, buffer, NB_SAMPLES); + +free(buffer); return 0; -} \ No newline at end of file +} +/* --------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------- */ + diff --git a/audio/ao_output.h b/audio/ao_output.h index cb49b27..440e1e5 100644 --- a/audio/ao_output.h +++ b/audio/ao_output.h @@ -1,10 +1,10 @@ /* generic output */ -int init_ao_output(int smplrate); -int close_ao_output(void); +ao_device * init_ao_output(int smplrate); +int close_ao_output(ao_device *dev); /* tests functions */ -int play_some_stuff(int notused); +int play_some_stuff(ao_device *dev, int notused); diff --git a/audio/playfile.c b/audio/playfile.c new file mode 100644 index 0000000..2ae97d8 --- /dev/null +++ b/audio/playfile.c @@ -0,0 +1,70 @@ +/* + * NcLooper fonctions audio output + */ + +#include +#include +#include +#include +#include + +#include +#include + +#include "ao_output.h" + +/* --------------------------------------------------------------------- */ + +extern int verbosity; + +#define T_BUFF_WAVES 16384 + +/* --------------------------------------------------------------------- */ + +int blast_this_file(char *fname, ao_device *dev, int loop) +{ +SNDFILE *sndf; +SF_INFO sfinfo; +int foo, lus; +short *buffer; + +#if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( '%s' %p %d )\n", __func__, fname, dev, loop); +#endif + +sndf = sf_open(fname, SFM_READ, &sfinfo); +if (NULL==sndf) + { + perror("sf_open"); + abort(); + } + +buffer = calloc(T_BUFF_WAVES, sizeof(short)*2); + +#if DEBUG_LEVEL +fprintf(stderr, "samplerate : %d\n", sfinfo.samplerate); +fprintf(stderr, "frames : %ld\n", sfinfo.frames); +fprintf(stderr, "seekable : %d\n", sfinfo.seekable); +#endif + +while ((lus = sf_read_short(sndf, buffer, T_BUFF_WAVES))) { + +#if DEBUG_LEVEL + fprintf(stderr, "%s : %d bytes read\n", fname, lus); +#endif + foo = ao_play(dev, buffer, T_BUFF_WAVES*2); +#if DEBUG_LEVEL + fprintf(stderr, "%s : %d played\n", fname, foo); +#endif + + } + +/* do some cleanup */ +free(buffer); +sf_close(sndf); + +return 0; +} + + +/* --------------------------------------------------------------------- */ diff --git a/audio/playfile.h b/audio/playfile.h new file mode 100644 index 0000000..e4ff351 --- /dev/null +++ b/audio/playfile.h @@ -0,0 +1,3 @@ + + +int blast_this_file(char *fname, ao_device *dev, int loop); diff --git a/audio/t.c b/audio/t.c index ee536e5..fa2822d 100644 --- a/audio/t.c +++ b/audio/t.c @@ -3,25 +3,37 @@ */ #include +#include + +#include #include "ao_output.h" +#include "playfile.h" /* --------------------------------------------------------------------- */ +int verbosity; + /* --------------------------------------------------------------------- */ int main(int argc, char *argv[]) { -int foo; +int foo; +ao_device *device; -foo = init_ao_output(44100); -fprintf(stderr, "AO init -> %d\n", foo); +device = init_ao_output(44100); +fprintf(stderr, "AO init -> %p\n", device); -foo = play_some_stuff(0); +foo = play_some_stuff(device, 0); fprintf(stderr, "play stuff -> %d\n", foo); -foo = close_ao_output(); +sleep(1); + +foo = blast_this_file("/home/tth/BU/vrac/1337.wav", device, 0); +fprintf(stderr, "blast file -> %d\n", foo); + +foo = close_ao_output(device); fprintf(stderr, "AO close -> %d\n", foo);