Lines 23-28
Link Here
|
23 |
//#include "config.h" |
23 |
//#include "config.h" |
24 |
#define __MPFC_OUTER__ |
24 |
#define __MPFC_OUTER__ |
25 |
#include <FLAC/all.h> |
25 |
#include <FLAC/all.h> |
|
|
26 |
|
27 |
/* FLAC 1.1.3 has FLAC_API_VERSION_CURRENT == 8 */ |
28 |
#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT < 8 |
29 |
#define LEGACY_FLAC |
30 |
#else |
31 |
#undef LEGACY_FLAC |
32 |
#endif |
33 |
|
26 |
#include <sys/soundcard.h> |
34 |
#include <sys/soundcard.h> |
27 |
#include "types.h" |
35 |
#include "types.h" |
28 |
#include "inp.h" |
36 |
#include "inp.h" |
Lines 48-54
Link Here
|
48 |
static int flac_max_bs, flac_bpp; |
56 |
static int flac_max_bs, flac_bpp; |
49 |
|
57 |
|
50 |
/* Decoder object */ |
58 |
/* Decoder object */ |
|
|
59 |
#ifdef LEGACY_FLAC |
51 |
static FLAC__FileDecoder *flac_decoder = NULL; |
60 |
static FLAC__FileDecoder *flac_decoder = NULL; |
|
|
61 |
#else |
62 |
static FLAC__StreamDecoder *flac_decoder = NULL; |
63 |
#endif |
52 |
|
64 |
|
53 |
/* Buffer for writing decoded stream */ |
65 |
/* Buffer for writing decoded stream */ |
54 |
static byte *flac_buf = NULL, *flac_buf_ptr = NULL; |
66 |
static byte *flac_buf = NULL, *flac_buf_ptr = NULL; |
Lines 71-77
Link Here
|
71 |
flac_client_data_t flac_client_data; |
83 |
flac_client_data_t flac_client_data; |
72 |
|
84 |
|
73 |
/* Write decoded data callback */ |
85 |
/* Write decoded data callback */ |
|
|
86 |
#ifdef LEGACY_FLAC |
74 |
FLAC__StreamDecoderWriteStatus flac_write_callback( const FLAC__FileDecoder *decoder, |
87 |
FLAC__StreamDecoderWriteStatus flac_write_callback( const FLAC__FileDecoder *decoder, |
|
|
88 |
#else |
89 |
FLAC__StreamDecoderWriteStatus flac_write_callback( const FLAC__StreamDecoder *decoder, |
90 |
#endif |
75 |
const FLAC__Frame *frame, const FLAC__int32 * const buf[], void *client_data ) |
91 |
const FLAC__Frame *frame, const FLAC__int32 * const buf[], void *client_data ) |
76 |
{ |
92 |
{ |
77 |
int i, j; |
93 |
int i, j; |
Lines 116-122
Link Here
|
116 |
} /* End of 'flac_write_callback' function */ |
132 |
} /* End of 'flac_write_callback' function */ |
117 |
|
133 |
|
118 |
/* Process metadata callback */ |
134 |
/* Process metadata callback */ |
|
|
135 |
#ifdef LEGACY_FLAC |
119 |
void flac_metadata_callback( const FLAC__FileDecoder *decoder, |
136 |
void flac_metadata_callback( const FLAC__FileDecoder *decoder, |
|
|
137 |
#else |
138 |
void flac_metadata_callback( const FLAC__StreamDecoder *decoder, |
139 |
#endif |
120 |
const FLAC__StreamMetadata *metadata, void *client_data ) |
140 |
const FLAC__StreamMetadata *metadata, void *client_data ) |
121 |
{ |
141 |
{ |
122 |
flac_client_data_t *cd = (flac_client_data_t *)client_data; |
142 |
flac_client_data_t *cd = (flac_client_data_t *)client_data; |
Lines 144-174
Link Here
|
144 |
} /* End of 'flac_metadata_callback' function */ |
164 |
} /* End of 'flac_metadata_callback' function */ |
145 |
|
165 |
|
146 |
/* Error callback */ |
166 |
/* Error callback */ |
|
|
167 |
#ifdef LEGACY_FLAC |
147 |
void flac_error_callback( const FLAC__FileDecoder *decoder, |
168 |
void flac_error_callback( const FLAC__FileDecoder *decoder, |
|
|
169 |
#else |
170 |
void flac_error_callback( const FLAC__StreamDecoder *decoder, |
171 |
#endif |
148 |
FLAC__StreamDecoderErrorStatus status, void *client_data ) |
172 |
FLAC__StreamDecoderErrorStatus status, void *client_data ) |
149 |
{ |
173 |
{ |
150 |
logger_error(flac_log, 0, "flac: got stream decoder error %d", status); |
174 |
logger_error(flac_log, 0, "flac: got stream decoder error %d", status); |
151 |
} /* End of 'flac_error_callback' function */ |
175 |
} /* End of 'flac_error_callback' function */ |
152 |
|
176 |
|
153 |
/* Read file metadata */ |
177 |
/* Read file metadata */ |
|
|
178 |
#ifdef LEGACY_FLAC |
154 |
FLAC__FileDecoder *flac_read_metadata( char *filename, void *client_data ) |
179 |
FLAC__FileDecoder *flac_read_metadata( char *filename, void *client_data ) |
155 |
{ |
180 |
{ |
156 |
FLAC__FileDecoderState fds; |
181 |
FLAC__FileDecoderState fds; |
157 |
int buf_size; |
182 |
int buf_size; |
158 |
FLAC__FileDecoder *decoder; |
183 |
FLAC__FileDecoder *decoder; |
|
|
184 |
#else |
185 |
FLAC__StreamDecoder *flac_read_metadata( char *filename, void *client_data ) |
186 |
{ |
187 |
FLAC__StreamDecoderState fds; |
188 |
int buf_size; |
189 |
FLAC__StreamDecoder *decoder; |
190 |
#endif |
159 |
|
191 |
|
160 |
logger_debug(flac_log, "flac: flac_read_metadata(%s)", filename); |
192 |
logger_debug(flac_log, "flac: flac_read_metadata(%s)", filename); |
161 |
|
193 |
|
162 |
/* Initialize decoder */ |
194 |
/* Initialize decoder */ |
|
|
195 |
#ifdef LEGACY_FLAC |
163 |
decoder = FLAC__file_decoder_new(); |
196 |
decoder = FLAC__file_decoder_new(); |
164 |
logger_debug(flac_log, "flac: FLAC__file_decoder_new returned %p", |
197 |
logger_debug(flac_log, "flac: FLAC__file_decoder_new returned %p", |
165 |
decoder); |
198 |
decoder); |
|
|
199 |
#else |
200 |
decoder = FLAC__stream_decoder_new(); |
201 |
logger_debug(flac_log, "flac: FLAC__stream_decoder_new returned %p", decoder); |
202 |
#endif |
166 |
if (decoder == NULL) |
203 |
if (decoder == NULL) |
167 |
{ |
204 |
{ |
168 |
logger_error(flac_log, 0, "flac: FLAC__file_decoder_new failed"); |
205 |
logger_error(flac_log, 0, "flac: FLAC__file_decoder_new failed"); |
169 |
FLAC__file_decoder_delete(decoder); |
206 |
FLAC__file_decoder_delete(decoder); |
170 |
return NULL; |
207 |
return NULL; |
171 |
} |
208 |
} |
|
|
209 |
#ifdef LEGACY_FLAC |
172 |
if (!FLAC__file_decoder_set_client_data(decoder, client_data)) |
210 |
if (!FLAC__file_decoder_set_client_data(decoder, client_data)) |
173 |
{ |
211 |
{ |
174 |
logger_error(flac_log, 0, "flac: FLAC__file_decoder_set_client_data failed"); |
212 |
logger_error(flac_log, 0, "flac: FLAC__file_decoder_set_client_data failed"); |
Lines 206-221
Link Here
|
206 |
{ |
244 |
{ |
207 |
logger_error(flac_log, 0, "flac: FLAC__file_decoder_init failed"); |
245 |
logger_error(flac_log, 0, "flac: FLAC__file_decoder_init failed"); |
208 |
FLAC__file_decoder_delete(decoder); |
246 |
FLAC__file_decoder_delete(decoder); |
|
|
247 |
#else |
248 |
fds = FLAC__stream_decoder_init_file(decoder, filename, flac_write_callback, flac_metadata_callback, flac_error_callback, client_data); |
249 |
logger_debug(flac_log, "flac: FLAC__stream_decoder_init_file returned %d", fds); |
250 |
if (fds != FLAC__STREAM_DECODER_INIT_STATUS_OK) |
251 |
{ |
252 |
logger_error(flac_log, 0, "flac: FLAC__stream_decoder_init_file failed"); |
253 |
FLAC__stream_decoder_delete(decoder); |
254 |
#endif |
209 |
return NULL; |
255 |
return NULL; |
210 |
} |
256 |
} |
211 |
|
257 |
|
212 |
/* Read metadata */ |
258 |
/* Read metadata */ |
|
|
259 |
#ifdef LEGACY_FLAC |
213 |
if (!FLAC__file_decoder_process_until_end_of_metadata(decoder)) |
260 |
if (!FLAC__file_decoder_process_until_end_of_metadata(decoder)) |
214 |
{ |
261 |
{ |
215 |
logger_error(flac_log, 0, |
262 |
logger_error(flac_log, 0, |
216 |
"flac: FLAC__file_decoder_process_until_end_of_metadata failed"); |
263 |
"flac: FLAC__file_decoder_process_until_end_of_metadata failed"); |
217 |
FLAC__file_decoder_finish(decoder); |
264 |
FLAC__file_decoder_finish(decoder); |
218 |
FLAC__file_decoder_delete(decoder); |
265 |
FLAC__file_decoder_delete(decoder); |
|
|
266 |
#else |
267 |
if (!FLAC__stream_decoder_process_until_end_of_metadata(decoder)) |
268 |
{ |
269 |
logger_error(flac_log, 0, "flac: FLAC__stream_decoder_process_until_end_of_metadata failed"); |
270 |
FLAC__stream_decoder_finish(decoder); |
271 |
FLAC__stream_decoder_delete(decoder); |
272 |
#endif |
219 |
return NULL; |
273 |
return NULL; |
220 |
} |
274 |
} |
221 |
logger_debug(flac_log, "flac: Samplerate: %d, channels: %d, " |
275 |
logger_debug(flac_log, "flac: Samplerate: %d, channels: %d, " |
Lines 227-233
Link Here
|
227 |
/* Start play function */ |
281 |
/* Start play function */ |
228 |
bool_t flac_start( char *filename ) |
282 |
bool_t flac_start( char *filename ) |
229 |
{ |
283 |
{ |
|
|
284 |
#ifdef LEGACY_FLAC |
230 |
FLAC__FileDecoderState fds; |
285 |
FLAC__FileDecoderState fds; |
|
|
286 |
#else |
287 |
FLAC__StreamDecoderState fds; |
288 |
#endif |
231 |
int buf_size; |
289 |
int buf_size; |
232 |
|
290 |
|
233 |
logger_debug(flac_log, "flac: flac_start(%s)", filename); |
291 |
logger_debug(flac_log, "flac: flac_start(%s)", filename); |
Lines 256-263
Link Here
|
256 |
if (flac_buf == NULL) |
314 |
if (flac_buf == NULL) |
257 |
{ |
315 |
{ |
258 |
logger_error(flac_log, 0, "flac: no enough memory"); |
316 |
logger_error(flac_log, 0, "flac: no enough memory"); |
|
|
317 |
#ifdef LEGACY_FLAC |
259 |
FLAC__file_decoder_finish(flac_decoder); |
318 |
FLAC__file_decoder_finish(flac_decoder); |
260 |
FLAC__file_decoder_delete(flac_decoder); |
319 |
FLAC__file_decoder_delete(flac_decoder); |
|
|
320 |
#else |
321 |
FLAC__stream_decoder_finish(flac_decoder); |
322 |
FLAC__stream_decoder_delete(flac_decoder); |
323 |
#endif |
261 |
flac_decoder = NULL; |
324 |
flac_decoder = NULL; |
262 |
return FALSE; |
325 |
return FALSE; |
263 |
} |
326 |
} |
Lines 281-288
Link Here
|
281 |
|
344 |
|
282 |
if (flac_decoder != NULL) |
345 |
if (flac_decoder != NULL) |
283 |
{ |
346 |
{ |
|
|
347 |
#ifdef LEGACY_FLAC |
284 |
FLAC__file_decoder_finish(flac_decoder); |
348 |
FLAC__file_decoder_finish(flac_decoder); |
285 |
FLAC__file_decoder_delete(flac_decoder); |
349 |
FLAC__file_decoder_delete(flac_decoder); |
|
|
350 |
#else |
351 |
FLAC__stream_decoder_finish(flac_decoder); |
352 |
FLAC__stream_decoder_delete(flac_decoder); |
353 |
#endif |
286 |
flac_decoder = NULL; |
354 |
flac_decoder = NULL; |
287 |
} |
355 |
} |
288 |
} /* End of 'flac_end' function */ |
356 |
} /* End of 'flac_end' function */ |
Lines 302-318
Link Here
|
302 |
flac_buf_ptr = flac_buf; |
370 |
flac_buf_ptr = flac_buf; |
303 |
flac_buf_size = 0; |
371 |
flac_buf_size = 0; |
304 |
|
372 |
|
|
|
373 |
#ifdef LEGACY_FLAC |
305 |
res = FLAC__file_decoder_seek_absolute(flac_decoder, |
374 |
res = FLAC__file_decoder_seek_absolute(flac_decoder, |
|
|
375 |
#else |
376 |
res = FLAC__stream_decoder_seek_absolute(flac_decoder, |
377 |
#endif |
306 |
flac_seek_pos * flac_freq); |
378 |
flac_seek_pos * flac_freq); |
|
|
379 |
#ifdef LEGACY_FLAC |
307 |
logger_debug(flac_log, "flac: FLAC__file_decoder_seek_absolute returned %d", res); |
380 |
logger_debug(flac_log, "flac: FLAC__file_decoder_seek_absolute returned %d", res); |
|
|
381 |
#else |
382 |
logger_debug(flac_log, "flac: FLAC__stream_decoder_seek_absolute returned %d", res); |
383 |
#endif |
308 |
flac_seek_pos = -1; |
384 |
flac_seek_pos = -1; |
309 |
} |
385 |
} |
310 |
|
386 |
|
311 |
/* Read data */ |
387 |
/* Read data */ |
312 |
if (flac_buf_size == 0) |
388 |
if (flac_buf_size == 0) |
313 |
{ |
389 |
{ |
|
|
390 |
#ifdef LEGACY_FLAC |
314 |
res = FLAC__file_decoder_process_single(flac_decoder); |
391 |
res = FLAC__file_decoder_process_single(flac_decoder); |
315 |
logger_debug(flac_log, "flac: FLAC__file_decoder_process_single returned %d", res); |
392 |
logger_debug(flac_log, "flac: FLAC__file_decoder_process_single returned %d", res); |
|
|
393 |
#else |
394 |
res = FLAC__stream_decoder_process_single(flac_decoder); |
395 |
logger_debug(flac_log, "flac: FLAC__stream_decoder_process_single returned %d", res); |
396 |
#endif |
316 |
} |
397 |
} |
317 |
|
398 |
|
318 |
/* Flush buffer */ |
399 |
/* Flush buffer */ |
Lines 352-358
Link Here
|
352 |
/* Get song info */ |
433 |
/* Get song info */ |
353 |
song_info_t *flac_get_info( char *file_name, int *len ) |
434 |
song_info_t *flac_get_info( char *file_name, int *len ) |
354 |
{ |
435 |
{ |
|
|
436 |
#ifdef LEGACY_FLAC |
355 |
FLAC__FileDecoder *decoder; |
437 |
FLAC__FileDecoder *decoder; |
|
|
438 |
#else |
439 |
FLAC__StreamDecoder *decoder; |
440 |
#endif |
356 |
flac_client_data_t cd; |
441 |
flac_client_data_t cd; |
357 |
|
442 |
|
358 |
(*len) = 0; |
443 |
(*len) = 0; |
Lines 367-374
Link Here
|
367 |
(*len) = cd.m_length; |
452 |
(*len) = cd.m_length; |
368 |
|
453 |
|
369 |
/* Free memory */ |
454 |
/* Free memory */ |
|
|
455 |
#ifdef LEGACY_FLAC |
370 |
FLAC__file_decoder_finish(decoder); |
456 |
FLAC__file_decoder_finish(decoder); |
371 |
FLAC__file_decoder_delete(decoder); |
457 |
FLAC__file_decoder_delete(decoder); |
|
|
458 |
#else |
459 |
FLAC__stream_decoder_finish(decoder); |
460 |
FLAC__stream_decoder_delete(decoder); |
461 |
#endif |
372 |
return NULL; |
462 |
return NULL; |
373 |
} /* End of 'flac_get_info' function */ |
463 |
} /* End of 'flac_get_info' function */ |
374 |
|
464 |
|