summaryrefslogtreecommitdiff
blob: ddf10dcd11bb3d183f3bc0936912a78c0b55a29f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
--- a/src/libcuecue/flac.c
+++ b/src/libcuecue/flac.c
@@ -27,6 +27,12 @@
 #include "cuecue.h"
 #include "cuecue_internal.h"
 
+#if !defined(FLAC_API_VERSION_CURRENT) || FLAC_API_VERSION_CURRENT <= 7
+#define LEGACY_FLAC
+#else
+#undef LEGACY_FLAC
+#endif
+
 typedef struct Internal
 {
 	FILE *dst;
@@ -38,7 +44,11 @@
 } Internal;
 
 
+#ifdef LEGACY_FLAC
 void error(const FLAC__FileDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
+#else
+void error(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data)
+#endif
 {
 	Internal *internal = client_data;
 	switch (status) {
@@ -52,11 +62,21 @@
 			strcpy(cuecue_error,"CRC Mismatch: FLAC file corrupted");
 			internal->error=1;
 			break;
+#ifndef LEGACY_FLAC
+		case FLAC__STREAM_DECODER_ERROR_STATUS_UNPARSEABLE_STREAM:
+			strcpy(cuecue_error,"Unparseable stream");
+			internal->error=1;
+			break;
+#endif
 	}
 }
 
 
+#ifdef LEGACY_FLAC
 void metadata(const FLAC__FileDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
+#else
+void metadata(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data)
+#endif
 {
 	if(metadata->type == FLAC__METADATA_TYPE_STREAMINFO) {
 		/* get size of the file, for progress callback */
@@ -66,7 +86,11 @@
 }
 
 
+#ifdef LEGACY_FLAC
 FLAC__StreamDecoderWriteStatus write(const FLAC__FileDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
+#else
+FLAC__StreamDecoderWriteStatus write(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data)
+#endif
 {
 	Internal *internal = client_data;
 	unsigned int samples = frame->header.blocksize;
@@ -126,7 +150,11 @@
 {
 	FILE *dst;
 	Internal internal;
+#ifdef LEGACY_FLAC
 	FLAC__FileDecoder *decoder;
+#else
+	FLAC__StreamDecoder *decoder;
+#endif
 
 	dst = fopen(file_destination, "wb");
 
@@ -141,7 +169,11 @@
 	internal.error=0;
 	internal.dst=dst;
 
+#ifdef LEGACY_FLAC
 	decoder = FLAC__file_decoder_new();
+#else
+	decoder = FLAC__stream_decoder_new();
+#endif
 
 	if (decoder==NULL) {
 		snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot create FLAC decoder! memory error ?");
@@ -150,6 +182,7 @@
 
 	internal.buffer = malloc(BUFFER_SIZE);
 
+#ifdef LEGACY_FLAC
 	FLAC__file_decoder_set_md5_checking(decoder, true);
 	FLAC__file_decoder_set_filename(decoder, file_source);
 
@@ -162,8 +195,20 @@
 		snprintf(cuecue_error,1024,"Cannot open '%s'",file_source);
 		internal.error=1;
 	}
+#else
+	FLAC__stream_decoder_set_md5_checking(decoder, true);
+	if(FLAC__stream_decoder_init_file(decoder, file_source, write, metadata, error, &internal) != FLAC__STREAM_DECODER_INIT_STATUS_OK) {
+		snprintf(cuecue_error,1024,"Cannot open '%s'",file_source);
+		internal.error=1;
+	}
+#endif
 
-	if(!FLAC__file_decoder_process_until_end_of_file(decoder)) {
+#ifdef LEGACY_FLAC
+	if(!FLAC__file_decoder_process_until_end_of_file(decoder))
+#else
+	if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))
+#endif
+	{
 		if (!internal.error) {
 			/* early error, not even the time to decode metadata :) */
 			snprintf(cuecue_error,CUECUE_ERROR_LENGTH,"Cannot open '%s'",file_source);
@@ -171,8 +216,13 @@
 		internal.error=1;
 	}
 
+#ifdef LEGACY_FLAC
 	FLAC__file_decoder_finish(decoder);
 	FLAC__file_decoder_delete(decoder);
+#else
+	FLAC__stream_decoder_finish(decoder);
+	FLAC__stream_decoder_delete(decoder);
+#endif
 
 	fclose(dst);
 	free(internal.buffer);