diff options
Diffstat (limited to 'libao2')
-rw-r--r-- | libao2/Makefile | 2 | ||||
-rw-r--r-- | libao2/ao_mpegpes.c | 98 | ||||
-rw-r--r-- | libao2/audio_out.c | 3 | ||||
-rw-r--r-- | libao2/audio_out.h | 1 |
4 files changed, 103 insertions, 1 deletions
diff --git a/libao2/Makefile b/libao2/Makefile index 07196ddbef..eaec3216e0 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 ao_pcm.c $(OPTIONAL_SRCS) +SRCS=audio_out.c ao_mpegpes.c ao_null.c ao_pcm.c $(OPTIONAL_SRCS) OBJS=$(SRCS:.c=.o) CFLAGS = $(OPTFLAGS) -I. -I.. $(SDL_INC) $(EXTRA_INC) diff --git a/libao2/ao_mpegpes.c b/libao2/ao_mpegpes.c new file mode 100644 index 0000000000..a26811a018 --- /dev/null +++ b/libao2/ao_mpegpes.c @@ -0,0 +1,98 @@ +#include <stdio.h> +#include <stdlib.h> + +#include "audio_out.h" +#include "audio_out_internal.h" + +#include "afmt.h" + +static ao_info_t info = +{ + "mpeg-pes audio output", + "mpegpes", + "A'rpi", + "" +}; + +LIBAO_EXTERN(mpegpes) + +// there are some globals: +// ao_samplerate +// ao_channels +// ao_format +// ao_bps +// ao_outburst +// ao_buffersize + +// 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){ + + ao_outburst=2000; + ao_format=format; + + return 1; +} + +// close audio device +static void uninit(){ + +} + +// 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() +{ +} + +void send_pes_packet(unsigned char* data,int len,int id,int timestamp); +void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp); +extern int vo_pts; + +// return: how many bytes can be played without blocking +static int get_space(){ + float x=(float)(vo_pts-ao_pts)/90000.0-0.5; + int y; + if(x<=0) return 0; + y=48000*4*x;y/=ao_outburst;y*=ao_outburst; +// printf("diff: %5.3f -> %d \n",x,y); + return y; +} + +// 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){ + if(ao_format==AFMT_MPEG) + send_pes_packet(data,len,0x1C0,ao_pts); + else { + int i; + unsigned short *s=data; + for(i=0;i<len/2;i++) s[i]=(s[i]>>8)|(s[i]<<8); // le<->be + send_lpcm_packet(data,len,0xA0,ao_pts); + } + 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 67ccc61936..075445488e 100644 --- a/libao2/audio_out.c +++ b/libao2/audio_out.c @@ -12,6 +12,7 @@ int ao_format=0; int ao_bps=0; int ao_outburst=OUTBURST; // config.h default int ao_buffersize=-1; +int ao_pts=0; char *ao_subdevice = NULL; #ifdef USE_OSS_AUDIO @@ -41,6 +42,7 @@ extern ao_functions_t audio_out_sgi; extern ao_functions_t audio_out_dxr3; #endif extern ao_functions_t audio_out_pcm; +extern ao_functions_t audio_out_mpegpes; extern ao_functions_t audio_out_pss; ao_functions_t* audio_out_drivers[] = @@ -71,6 +73,7 @@ ao_functions_t* audio_out_drivers[] = &audio_out_dxr3, #endif &audio_out_pcm, + &audio_out_mpegpes, // &audio_out_pss, NULL }; diff --git a/libao2/audio_out.h b/libao2/audio_out.h index 2b9e4c2eb5..61d2966c56 100644 --- a/libao2/audio_out.h +++ b/libao2/audio_out.h @@ -36,6 +36,7 @@ extern int ao_format; extern int ao_bps; extern int ao_outburst; extern int ao_buffersize; +extern int ao_pts; extern char *ao_subdevice; #define CONTROL_OK 1 |