diff --git a/libao2/Makefile b/libao2/Makefile index 433962639b..ead357c881 100644 --- a/libao2/Makefile +++ b/libao2/Makefile @@ -4,7 +4,7 @@ include config.mak LIBNAME = libao2.a # TODO: moveout ao_sdl.c so it's only used when SDL is detected -SRCS=audio_out.c ao_null.c $(OPTIONAL_SRCS) +SRCS=audio_out.c ao_null.c ao_pcm.c $(OPTIONAL_SRCS) OBJS=$(SRCS:.c=.o) CFLAGS = $(OPTFLAGS) -I. -I.. $(SDL_INC) diff --git a/libao2/ao_pcm.c b/libao2/ao_pcm.c new file mode 100644 index 0000000000..165b2acba4 --- /dev/null +++ b/libao2/ao_pcm.c @@ -0,0 +1,97 @@ +#include +#include + +#include "audio_out.h" +#include "audio_out_internal.h" + +static ao_info_t info = +{ + "PCM writer audio output", + "pcm", + "Atmosfear", + "" +}; + +LIBAO_EXTERN(pcm) + +// there are some globals: +// ao_samplerate +// ao_channels +// ao_format +// ao_bps +// ao_outburst +// ao_buffersize + +static FILE *fp = NULL; + +// to set/get/query special features/parameters +static int control(int cmd,int arg){ + return -1; +} + +// open & setup audio device +// return: 1=success 0=fail +static int init(int rate,int channels,int format,int flags){ + + printf("PCM: File: audiodump.pcm Samplerate: %iHz Channels: %s Format %s\n", rate, (channels > 1) ? "Stereo" : "Mono", audio_out_format_name(format)); + printf("PCM: Info - fastest dumping is achieved with -vo null -hardframedrop.\n"); + fp = fopen("audiodump.pcm", "wb"); + + ao_outburst = 4096; + + + if(fp) return 1; + printf("PCM: Failed to open audiodump.pcm for writing!\n"); + return 0; +} + +// close audio device +static void uninit(){ + fclose(fp); +} + +// stop playing and empty buffers (for seeking/pause) +static void reset(){ + +} + +// stop playing, keep buffers (for pause) +static void audio_pause() +{ + // for now, just call reset(); + reset(); +} + +// resume playing, after audio_pause() +static void audio_resume() +{ +} + +// return: how many bytes can be played without blocking +static int get_space(){ + + return ao_outburst; +} + +// plays 'len' bytes of 'data' +// it should round it down to outburst*n +// return: number of bytes played +static int play(void* data,int len,int flags){ + + //printf("PCM: Writing chunk!\n"); + fwrite(data,len,1,fp); + + return len; +} + +// return: how many unplayed bytes are in the buffer +static int get_delay(){ + + return 0; +} + + + + + + diff --git a/libao2/audio_out.c b/libao2/audio_out.c index cc03b01bd3..064840b06c 100644 --- a/libao2/audio_out.c +++ b/libao2/audio_out.c @@ -33,6 +33,7 @@ extern ao_functions_t audio_out_sdl; #ifdef USE_SUN_AUDIO extern ao_functions_t audio_out_sun; #endif +extern ao_functions_t audio_out_pcm; ao_functions_t* audio_out_drivers[] = { @@ -55,6 +56,7 @@ ao_functions_t* audio_out_drivers[] = #ifdef USE_SUN_AUDIO &audio_out_sun, #endif + &audio_out_pcm, NULL };