comparison libao2/ao_dxr2.c @ 6069:8e88e92fe331

Initial support for dxr2. Based on patch from Tobias Diedrich <ranma@gmx.at>.
author albeu
date Mon, 13 May 2002 13:15:40 +0000
parents
children 10a30eebafaf
comparison
equal deleted inserted replaced
6068:2090547cb015 6069:8e88e92fe331
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/ioctl.h>
4 #include <inttypes.h>
5
6 #include "../config.h"
7 #include "mp_msg.h"
8 #include "bswap.h"
9
10 #include "audio_out.h"
11 #include "audio_out_internal.h"
12
13 #include "afmt.h"
14
15
16 static ao_info_t info =
17 {
18 "DXR2 audio output",
19 "dxr2",
20 "Tobias Diedrich <ranma@gmx.at>",
21 ""
22 };
23
24 LIBAO_EXTERN(dxr2)
25
26 // to set/get/query special features/parameters
27 static int control(int cmd,int arg){
28 return CONTROL_UNKNOWN;
29 }
30
31 static int freq=0;
32 static int freq_id=0;
33
34 // open & setup audio device
35 // return: 1=success 0=fail
36 static int init(int rate,int channels,int format,int flags){
37
38 ao_data.outburst=2048;
39 ao_data.samplerate=rate;
40 ao_data.channels=channels;
41 ao_data.buffersize=2048;
42 ao_data.bps=rate*4;
43 ao_data.format=format;
44 freq=rate;
45
46 switch(rate){
47 case 48000:
48 freq_id=0;
49 break;
50 case 96000:
51 freq_id=1;
52 break;
53 case 44100:
54 freq_id=2;
55 break;
56 case 32000:
57 freq_id=3;
58 break;
59 case 22050:
60 freq_id=4;
61 break;
62 #if 0
63 case 24000:
64 freq_id=5;
65 break;
66 case 64000:
67 freq_id=6;
68 break;
69 case 88200:
70 freq_id=7;
71 break;
72 #endif
73 default:
74 mp_msg(MSGT_AO,MSGL_ERR,"[AO] dxr2: %d Hz not supported, try \"-aop list=resample\"\n",rate);
75 return 0;
76 }
77
78 return 1;
79 }
80
81 // close audio device
82 static void uninit(){
83
84 }
85
86 // stop playing and empty buffers (for seeking/pause)
87 static void reset(){
88
89 }
90
91 // stop playing, keep buffers (for pause)
92 static void audio_pause()
93 {
94 // for now, just call reset();
95 reset();
96 }
97
98 // resume playing, after audio_pause()
99 static void audio_resume()
100 {
101 }
102
103 extern void dxr2_send_packet(unsigned char* data,int len,int id,int timestamp);
104 extern void dxr2_send_lpcm_packet(unsigned char* data,int len,int id,int timestamp,int freq_id);
105 extern int vo_pts;
106 static int preload = 1;
107 // return: how many bytes can be played without blocking
108 static int get_space(){
109 float x=(float)(vo_pts-ao_data.pts)/90000.0;
110 int y;
111 if(x<=0) return 0;
112 y=freq*4*x;y/=ao_data.outburst;y*=ao_data.outburst;
113 if(y>32768) y=32768;
114 return y;
115 }
116
117 // plays 'len' bytes of 'data'
118 // it should round it down to outburst*n
119 // return: number of bytes played
120 static int play(void* data,int len,int flags){
121 // MPEG and AC3 don't work :-(
122 if(ao_data.format==AFMT_MPEG)
123 dxr2_send_packet(data,len,0xC0,ao_data.pts);
124 else if(ao_data.format==AFMT_AC3)
125 dxr2_send_packet(data,len,0x80,ao_data.pts);
126 else {
127 int i;
128 //unsigned short *s=data;
129 uint16_t *s=data;
130 #ifndef WORDS_BIGENDIAN
131 for(i=0;i<len/2;i++) s[i] = bswap_16(s[i]); // (s[i]>>8)|(s[i]<<8); // le<->be bswap_16(s[i]);
132 #endif
133 dxr2_send_lpcm_packet(data,len,0xA0,ao_data.pts-10000,freq_id);
134 }
135 return len;
136 }
137
138 // return: delay in seconds between first and last sample in buffer
139 static float get_delay(){
140
141 return 0.0;
142 }
143