Lines 27-32
Link Here
|
27 |
#include "cuecue.h" |
27 |
#include "cuecue.h" |
28 |
#include "cuecue_internal.h" |
28 |
#include "cuecue_internal.h" |
29 |
|
29 |
|
|
|
30 |
#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT < 8 |
31 |
#define LEGACY_FLAC |
32 |
#else |
33 |
#undef LEGACY_FLAC |
34 |
#endif |
35 |
|
30 |
typedef struct Internal |
36 |
typedef struct Internal |
31 |
{ |
37 |
{ |
32 |
FILE *dst; |
38 |
FILE *dst; |
Lines 38-44
Link Here
|
38 |
} Internal; |
44 |
} Internal; |
39 |
|
45 |
|
40 |
|
46 |
|
|
|
47 |
#ifdef LEGACY_FLAC |
41 |
void error(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) |
48 |
void error(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) |
|
|
49 |
#else |
50 |
void error(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) |
51 |
#endif |
42 |
{ |
52 |
{ |
43 |
Internal *internal = client_data; |
53 |
Internal *internal = client_data; |
44 |
switch (status) { |
54 |
switch (status) { |
Lines 52-62
Link Here
|
52 |
strcpy(cuecue_error,"CRC Mismatch: FLAC file corrupted"); |
62 |
strcpy(cuecue_error,"CRC Mismatch: FLAC file corrupted"); |
53 |
internal->error=1; |
63 |
internal->error=1; |
54 |
break; |
64 |
break; |
|
|
65 |
case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM: |
66 |
strcpy(cuecue_error,"Unparseable stream"); |
67 |
internal->error=1; |
68 |
break; |
55 |
} |
69 |
} |
56 |
} |
70 |
} |
57 |
|
71 |
|
58 |
|
72 |
|
|
|
73 |
#ifdef LEGACY_FLAC |
59 |
void metadata(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) |
74 |
void metadata(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) |
|
|
75 |
#else |
76 |
void metadata(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) |
77 |
#endif |
60 |
{ |
78 |
{ |
61 |
if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { |
79 |
if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) { |
62 |
/* get size of the file, for progress callback */ |
80 |
/* get size of the file, for progress callback */ |
Lines 66-72
Link Here
|
66 |
} |
84 |
} |
67 |
|
85 |
|
68 |
|
86 |
|
|
|
87 |
#ifdef LEGACY_FLAC |
69 |
FLAC__StreamDecoderWriteStatus write(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) |
88 |
FLAC__StreamDecoderWriteStatus write(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) |
|
|
89 |
#else |
90 |
FLAC__StreamDecoderWriteStatus write(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data) |
91 |
#endif |
70 |
{ |
92 |
{ |
71 |
Internal *internal = client_data; |
93 |
Internal *internal = client_data; |
72 |
unsigned int samples = frame->header.blocksize; |
94 |
unsigned int samples = frame->header.blocksize; |
Lines 126-132
Link Here
|
126 |
{ |
148 |
{ |
127 |
FILE *dst; |
149 |
FILE *dst; |
128 |
Internal internal; |
150 |
Internal internal; |
|
|
151 |
#ifdef LEGACY_FLAC |
129 |
FLAC__FileDecoder *decoder; |
152 |
FLAC__FileDecoder *decoder; |
|
|
153 |
#else |
154 |
FLAC__StreamDecoder *decoder; |
155 |
#endif |
130 |
|
156 |
|
131 |
dst = fopen(file_destination, "wb"); |
157 |
dst = fopen(file_destination, "wb"); |
132 |
|
158 |
|
Lines 141-147
Link Here
|
141 |
internal.error=0; |
167 |
internal.error=0; |
142 |
internal.dst=dst; |
168 |
internal.dst=dst; |
143 |
|
169 |
|
|
|
170 |
#ifdef LEGACY_FLAC |
144 |
decoder = FLAC__file_decoder_new(); |
171 |
decoder = FLAC__file_decoder_new(); |
|
|
172 |
#else |
173 |
decoder = FLAC__stream_decoder_new(); |
174 |
#endif |
145 |
|
175 |
|
146 |
if (decoder==NULL) { |
176 |
if (decoder==NULL) { |
147 |
snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot create FLAC decoder! memory error ?"); |
177 |
snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot create FLAC decoder! memory error ?"); |
Lines 150-155
Link Here
|
150 |
|
180 |
|
151 |
internal.buffer = malloc(BUFFER_SIZE); |
181 |
internal.buffer = malloc(BUFFER_SIZE); |
152 |
|
182 |
|
|
|
183 |
#ifdef LEGACY_FLAC |
153 |
FLAC__file_decoder_set_md5_checking(decoder, true); |
184 |
FLAC__file_decoder_set_md5_checking(decoder, true); |
154 |
FLAC__file_decoder_set_filename(decoder, file_source); |
185 |
FLAC__file_decoder_set_filename(decoder, file_source); |
155 |
|
186 |
|
Lines 162-169
Link Here
|
162 |
snprintf(cuecue_error,1024,"Cannot open '%s'",file_source); |
193 |
snprintf(cuecue_error,1024,"Cannot open '%s'",file_source); |
163 |
internal.error=1; |
194 |
internal.error=1; |
164 |
} |
195 |
} |
|
|
196 |
#else |
197 |
FLAC__stream_decoder_set_md5_checking(decoder, true); |
198 |
if(FLAC__stream_decoder_init_file(decoder, file_source, write, metadata, error, &internal) != FLAC__STREAM_DECODER_INIT_STATUS_OK) { |
199 |
snprintf(cuecue_error,1024,"Cannot open '%s'",file_source); |
200 |
internal.error=1; |
201 |
} |
202 |
#endif |
165 |
|
203 |
|
166 |
if(!FLAC__file_decoder_process_until_end_of_file(decoder)) { |
204 |
#ifdef LEGACY_FLAC |
|
|
205 |
if(!FLAC__file_decoder_process_until_end_of_file(decoder)) |
206 |
#else |
207 |
if(!FLAC__stream_decoder_process_until_end_of_stream(decoder)) |
208 |
#endif |
209 |
{ |
167 |
if (!internal.error) { |
210 |
if (!internal.error) { |
168 |
/* early error, not even the time to decode metadata :) */ |
211 |
/* early error, not even the time to decode metadata :) */ |
169 |
snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot open '%s'",file_source); |
212 |
snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot open '%s'",file_source); |
Lines 171-178
Link Here
|
171 |
internal.error=1; |
214 |
internal.error=1; |
172 |
} |
215 |
} |
173 |
|
216 |
|
|
|
217 |
#ifdef LEGACY_FLAC |
174 |
FLAC__file_decoder_finish(decoder); |
218 |
FLAC__file_decoder_finish(decoder); |
175 |
FLAC__file_decoder_delete(decoder); |
219 |
FLAC__file_decoder_delete(decoder); |
|
|
220 |
#else |
221 |
FLAC__stream_decoder_finish(decoder); |
222 |
FLAC__stream_decoder_delete(decoder); |
223 |
#endif |
176 |
|
224 |
|
177 |
fclose(dst); |
225 |
fclose(dst); |
178 |
free(internal.buffer); |
226 |
free(internal.buffer); |