aboutsummaryrefslogtreecommitdiffhomepage
path: root/libao2
diff options
context:
space:
mode:
Diffstat (limited to 'libao2')
-rw-r--r--libao2/Makefile2
-rw-r--r--libao2/ao_mpegpes.c98
-rw-r--r--libao2/audio_out.c3
-rw-r--r--libao2/audio_out.h1
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