comparison libao2/ao_mpegpes.c @ 2708:b24661a9924e

ao_mpegpes
author arpi
date Mon, 05 Nov 2001 03:01:11 +0000
parents
children 981a9e5118ce
comparison
equal deleted inserted replaced
2707:97efb75dceb8 2708:b24661a9924e
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include "audio_out.h"
5 #include "audio_out_internal.h"
6
7 #include "afmt.h"
8
9 static ao_info_t info =
10 {
11 "mpeg-pes audio output",
12 "mpegpes",
13 "A'rpi",
14 ""
15 };
16
17 LIBAO_EXTERN(mpegpes)
18
19 // there are some globals:
20 // ao_samplerate
21 // ao_channels
22 // ao_format
23 // ao_bps
24 // ao_outburst
25 // ao_buffersize
26
27 // to set/get/query special features/parameters
28 static int control(int cmd,int arg){
29 return -1;
30 }
31
32 // open & setup audio device
33 // return: 1=success 0=fail
34 static int init(int rate,int channels,int format,int flags){
35
36 ao_outburst=2000;
37 ao_format=format;
38
39 return 1;
40 }
41
42 // close audio device
43 static void uninit(){
44
45 }
46
47 // stop playing and empty buffers (for seeking/pause)
48 static void reset(){
49
50 }
51
52 // stop playing, keep buffers (for pause)
53 static void audio_pause()
54 {
55 // for now, just call reset();
56 reset();
57 }
58
59 // resume playing, after audio_pause()
60 static void audio_resume()
61 {
62 }
63
64 void send_pes_packet(unsigned char* data,int len,int id,int timestamp);
65 void send_lpcm_packet(unsigned char* data,int len,int id,int timestamp);
66 extern int vo_pts;
67
68 // return: how many bytes can be played without blocking
69 static int get_space(){
70 float x=(float)(vo_pts-ao_pts)/90000.0-0.5;
71 int y;
72 if(x<=0) return 0;
73 y=48000*4*x;y/=ao_outburst;y*=ao_outburst;
74 // printf("diff: %5.3f -> %d \n",x,y);
75 return y;
76 }
77
78 // plays 'len' bytes of 'data'
79 // it should round it down to outburst*n
80 // return: number of bytes played
81 static int play(void* data,int len,int flags){
82 if(ao_format==AFMT_MPEG)
83 send_pes_packet(data,len,0x1C0,ao_pts);
84 else {
85 int i;
86 unsigned short *s=data;
87 for(i=0;i<len/2;i++) s[i]=(s[i]>>8)|(s[i]<<8); // le<->be
88 send_lpcm_packet(data,len,0xA0,ao_pts);
89 }
90 return len;
91 }
92
93 // return: how many unplayed bytes are in the buffer
94 static int get_delay(){
95
96 return 0;
97 }
98