Rev 1696 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1696 | serge | 1 | |
2 | #include |
||
3 | #include |
||
4 | #include |
||
5 | |||
6 | |||
7 | #include |
||
8 | #include "sound.h" |
||
9 | #include "fplay.h" |
||
10 | |||
11 | |||
12 | |||
13 | |||
14 | |||
15 | |||
16 | |||
2349 | Serge | 17 | |
18 | |||
1696 | serge | 19 | |
20 | |||
2349 | Serge | 21 | |
1696 | serge | 22 | |
23 | |||
24 | int sample_rate; |
||
25 | |||
26 | |||
27 | { |
||
28 | int err; |
||
29 | int version =-1; |
||
30 | char *errstr; |
||
31 | |||
32 | |||
2349 | Serge | 33 | |
34 | |||
1696 | serge | 35 | { |
36 | mutex_unlock(&driver_lock); |
||
2349 | Serge | 37 | errstr = "Sound service not installed\n\r"; |
1696 | serge | 38 | goto exit_whith_error; |
39 | }; |
||
2349 | Serge | 40 | |
41 | |||
42 | |||
43 | |||
1696 | serge | 44 | |
45 | |||
46 | (SOUND_VERSION<(version >> 16))) |
||
47 | { |
||
48 | errstr = "Sound service version mismatch\n\r"; |
||
49 | goto exit_whith_error; |
||
50 | } |
||
51 | |||
52 | |||
53 | |||
54 | |||
55 | |||
56 | |||
57 | |||
58 | |||
59 | |||
60 | |||
61 | return 0; |
||
62 | }; |
||
63 | |||
64 | |||
65 | static double audio_delta; |
||
66 | |||
67 | |||
68 | { |
||
69 | double tstamp; |
||
70 | |||
71 | |||
72 | return tstamp - audio_delta; |
||
73 | }; |
||
74 | |||
75 | |||
2349 | Serge | 76 | { |
77 | AVPacket pkt; |
||
78 | AVPacket pkt_tmp; |
||
79 | |||
1696 | serge | 80 | |
2349 | Serge | 81 | int audio_size; |
82 | int len; |
||
83 | int data_size=0; |
||
84 | |||
85 | |||
86 | return 1; |
||
87 | |||
88 | |||
89 | return 0; |
||
90 | |||
91 | |||
92 | |||
93 | |||
94 | |||
95 | |||
96 | { |
||
97 | data_size = AVCODEC_MAX_AUDIO_FRAME_SIZE; |
||
98 | |||
99 | |||
100 | &data_size, &pkt_tmp); |
||
101 | |||
102 | |||
103 | { |
||
104 | pkt_tmp.data += len; |
||
105 | pkt_tmp.size -= len; |
||
106 | |||
107 | |||
108 | memcpy(astream.buffer+astream.count, decoder_buffer, data_size); |
||
109 | astream.count += data_size; |
||
110 | mutex_unlock(&astream.lock); |
||
111 | } |
||
112 | else pkt_tmp.size = 0; |
||
113 | } |
||
114 | av_free_packet(&pkt); |
||
115 | return 1; |
||
116 | }; |
||
117 | |||
118 | |||
119 | |||
120 | { |
||
1696 | serge | 121 | SND_EVENT evnt; |
122 | int buffsize; |
||
123 | int samples; |
||
124 | int err; |
||
125 | char *errstr; |
||
126 | |||
127 | |||
128 | |||
129 | { |
||
130 | errstr = "Cannot create sound buffer\n\r"; |
||
131 | goto exit_whith_error; |
||
132 | }; |
||
133 | |||
134 | |||
135 | |||
136 | |||
137 | { |
||
138 | errstr = "Cannot get buffer size\n\r"; |
||
139 | goto exit_whith_error; |
||
140 | }; |
||
141 | |||
142 | |||
143 | |||
144 | |||
145 | |||
146 | |||
147 | (status != 0) ) |
||
148 | yield(); |
||
149 | |||
150 | |||
2349 | Serge | 151 | { |
1696 | serge | 152 | SetBuffer(hBuff, astream.buffer, 0, buffsize); |
153 | astream.count -= buffsize; |
||
154 | if(astream.count) |
||
155 | memcpy(astream.buffer, astream.buffer+buffsize, astream.count); |
||
156 | mutex_unlock(&astream.lock); |
||
2349 | Serge | 157 | }; |
1696 | serge | 158 | |
159 | |||
160 | { |
||
161 | errstr = "Cannot play buffer\n\r"; |
||
162 | goto exit_whith_error; |
||
163 | }; |
||
164 | |||
165 | |||
166 | |||
167 | |||
168 | |||
169 | { |
||
170 | uint32_t offset; |
||
171 | |||
172 | |||
173 | |||
174 | |||
175 | { |
||
176 | printf("invalid event code %d\n\r", evnt.code); |
||
177 | continue; |
||
178 | } |
||
179 | |||
180 | |||
181 | { |
||
182 | printf("invalid stream %x hBuff= %x\n\r", |
||
183 | evnt.stream, hBuff); |
||
184 | continue; |
||
185 | } |
||
186 | |||
187 | |||
188 | samples_lost = audio_delta*sample_rate/1000; |
||
189 | |||
190 | |||
191 | |||
192 | |||
2349 | Serge | 193 | { |
1696 | serge | 194 | SetBuffer(hBuff, astream.buffer, offset, buffsize); |
195 | astream.count -= buffsize; |
||
196 | if(astream.count) |
||
197 | memcpy(astream.buffer, astream.buffer+buffsize, astream.count); |
||
198 | mutex_unlock(&astream.lock); |
||
2349 | Serge | 199 | }; |
1696 | serge | 200 | break; |
201 | }; |
||
202 | #endif |
||
203 | |||
204 | |||
205 | |||
206 | |||
207 | { |
||
208 | uint32_t offset; |
||
209 | double event_stamp, wait_stamp; |
||
210 | int too_late = 0; |
||
211 | |||
212 | |||
213 | |||
214 | |||
215 | { |
||
216 | printf("invalid event code %d\n\r", evnt.code); |
||
217 | continue; |
||
218 | } |
||
219 | |||
220 | |||
221 | { |
||
222 | printf("invalid stream %x hBuff= %x\n\r", |
||
223 | evnt.stream, hBuff); |
||
224 | continue; |
||
225 | }; |
||
226 | |||
227 | |||
228 | |||
229 | |||
230 | |||
231 | |||
232 | (status != 0) ) |
||
233 | { |
||
234 | yield(); |
||
235 | GetTimeStamp(hBuff, &wait_stamp); |
||
236 | if( (wait_stamp - event_stamp) > |
||
237 | samples*1500/sample_rate ) |
||
238 | { |
||
239 | samples_lost+= samples; |
||
240 | audio_delta = (double)samples_lost*1000/sample_rate; |
||
241 | // printf("audio delta %f\n", audio_delta); |
||
242 | too_late = 1; |
||
243 | break; |
||
244 | } |
||
245 | }; |
||
246 | |||
247 | |||
248 | continue; |
||
249 | |||
250 | |||
2349 | Serge | 251 | SetBuffer(hBuff, astream.buffer, offset, buffsize); |
1696 | serge | 252 | astream.count -= buffsize; |
253 | if(astream.count) |
||
254 | memcpy(astream.buffer, astream.buffer+buffsize, astream.count); |
||
255 | mutex_unlock(&astream.lock); |
||
2349 | Serge | 256 | } |
1696 | serge | 257 | |
258 | |||
2349 | Serge | 259 | DestroyBuffer(hBuff); |
260 | |||
1696 | serge | 261 | |
2349 | Serge | 262 | |
263 | |||
1696 | serge | 264 | |
265 | |||
266 | return -1; |
||
2349 | Serge | 267 | |
1696 | serge | 268 | |
269 |