Mercurial > mplayer.hg
changeset 2708:b24661a9924e
ao_mpegpes
author | arpi |
---|---|
date | Mon, 05 Nov 2001 03:01:11 +0000 |
parents | 97efb75dceb8 |
children | 73838acce666 |
files | libao2/Makefile libao2/ao_mpegpes.c libao2/audio_out.c libao2/audio_out.h |
diffstat | 4 files changed, 103 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libao2/Makefile Mon Nov 05 02:58:47 2001 +0000 +++ b/libao2/Makefile Mon Nov 05 03:01:11 2001 +0000 @@ -4,7 +4,7 @@ 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)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libao2/ao_mpegpes.c Mon Nov 05 03:01:11 2001 +0000 @@ -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; +} +
--- a/libao2/audio_out.c Mon Nov 05 02:58:47 2001 +0000 +++ b/libao2/audio_out.c Mon Nov 05 03:01:11 2001 +0000 @@ -12,6 +12,7 @@ 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_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 @@ &audio_out_dxr3, #endif &audio_out_pcm, + &audio_out_mpegpes, // &audio_out_pss, NULL };