aboutsummaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/Makefile.am14
-rw-r--r--src/plugins/sid_extractor.c (renamed from src/plugins/sidextractor.c)149
2 files changed, 59 insertions, 104 deletions
diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am
index 05f77dd..9666b6c 100644
--- a/src/plugins/Makefile.am
+++ b/src/plugins/Makefile.am
@@ -93,6 +93,7 @@ plugin_LTLIBRARIES = \
93 libextractor_real.la \ 93 libextractor_real.la \
94 libextractor_riff.la \ 94 libextractor_riff.la \
95 $(rpm) \ 95 $(rpm) \
96 libextractor_sid.la \
96 libextractor_tar.la \ 97 libextractor_tar.la \
97 $(thumbgtk) \ 98 $(thumbgtk) \
98 libextractor_tiff.la \ 99 libextractor_tiff.la \
@@ -280,6 +281,11 @@ libextractor_rpm_la_LDFLAGS = \
280libextractor_rpm_la_LIBADD = \ 281libextractor_rpm_la_LIBADD = \
281 -lrpm 282 -lrpm
282 283
284libextractor_sid_la_SOURCES = \
285 sid_extractor.c
286libextractor_sid_la_LDFLAGS = \
287 $(PLUGINFLAGS)
288
283libextractor_tar_la_SOURCES = \ 289libextractor_tar_la_SOURCES = \
284 tar_extractor.c 290 tar_extractor.c
285libextractor_tar_la_LDFLAGS = \ 291libextractor_tar_la_LDFLAGS = \
@@ -335,7 +341,6 @@ OLD_LIBS = \
335 libextractor_nsf.la \ 341 libextractor_nsf.la \
336 libextractor_nsfe.la \ 342 libextractor_nsfe.la \
337 libextractor_s3m.la \ 343 libextractor_s3m.la \
338 libextractor_sid.la \
339 libextractor_tar.la \ 344 libextractor_tar.la \
340 $(thumbqt) \ 345 $(thumbqt) \
341 libextractor_xm.la \ 346 libextractor_xm.la \
@@ -364,13 +369,6 @@ libextractor_id3v24_la_LIBADD = \
364 $(top_builddir)/src/common/libextractor_common.la 369 $(top_builddir)/src/common/libextractor_common.la
365 370
366 371
367libextractor_sid_la_SOURCES = \
368 sidextractor.c
369libextractor_sid_la_LDFLAGS = \
370 $(PLUGINFLAGS)
371libextractor_sid_la_LIBADD = \
372 $(top_builddir)/src/main/libextractor.la
373
374libextractor_nsf_la_SOURCES = \ 372libextractor_nsf_la_SOURCES = \
375 nsfextractor.c 373 nsfextractor.c
376libextractor_nsf_la_LDFLAGS = \ 374libextractor_nsf_la_LDFLAGS = \
diff --git a/src/plugins/sidextractor.c b/src/plugins/sid_extractor.c
index 5c9c6b4..2465982 100644
--- a/src/plugins/sidextractor.c
+++ b/src/plugins/sid_extractor.c
@@ -18,10 +18,8 @@
18 * Boston, MA 02111-1307, USA. 18 * Boston, MA 02111-1307, USA.
19 * 19 *
20 */ 20 */
21
22#include "platform.h" 21#include "platform.h"
23#include "extractor.h" 22#include "extractor.h"
24#include "convert.h"
25 23
26 24
27#define SID1_HEADER_SIZE 0x76 25#define SID1_HEADER_SIZE 0x76
@@ -59,37 +57,28 @@ struct header
59 sidwrd reserved; 57 sidwrd reserved;
60}; 58};
61 59
62int 60static int
63sidword (sidwrd data) 61sidword (const sidwrd data)
64{ 62{
65 int value = (unsigned char) data[0] * 0x100 + (unsigned char) data[1]; 63 int value = (unsigned char) data[0] * 0x100 + (unsigned char) data[1];
64 return value;
66 65
67 return (value);
68
69}
70
71static struct EXTRACTOR_Keywords *addkword
72 (EXTRACTOR_KeywordList * oldhead,
73 const char *phrase, EXTRACTOR_KeywordType type)
74{
75 EXTRACTOR_KeywordList *keyword;
76
77 keyword = malloc (sizeof (EXTRACTOR_KeywordList));
78 keyword->next = oldhead;
79 keyword->keyword = strdup (phrase);
80 keyword->keywordType = type;
81 return (keyword);
82} 66}
83 67
68#define ADD(s,t) do { if (0 != proc (proc_cls, "sid", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0)
84 69
85/* "extract" keyword from a SID file 70/* "extract" keyword from a SID file
86 * 71 *
87 * This plugin is based on the nsf extractor 72 * This plugin is based on the nsf extractor
88 * 73 *
89 */ 74 */
90struct EXTRACTOR_Keywords *libextractor_sid_extract 75
91 (const char *filename, 76int
92 char *data, size_t size, struct EXTRACTOR_Keywords *prev) 77EXTRACTOR_sid_extract (const char *data,
78 size_t size,
79 EXTRACTOR_MetaDataProcessor proc,
80 void *proc_cls,
81 const char *options)
93{ 82{
94 unsigned int flags; 83 unsigned int flags;
95 int version; 84 int version;
@@ -99,92 +88,74 @@ struct EXTRACTOR_Keywords *libextractor_sid_extract
99 char songs[32]; 88 char songs[32];
100 char startingsong[32]; 89 char startingsong[32];
101 char sidversion[32]; 90 char sidversion[32];
102 struct header *head; 91 const struct header *head;
103 92
104 /* Check header size */ 93 /* Check header size */
105 94
106 if (size < SID1_HEADER_SIZE) 95 if (size < SID1_HEADER_SIZE)
107 { 96 return 0;
108 return (prev); 97 head = (const struct header *) data;
109 }
110
111 head = (struct header *) data;
112 98
113 /* Check "magic" id bytes */ 99 /* Check "magic" id bytes */
114 100 if (memcmp (head->magicid, "PSID", 4) &&
115 if (memcmp (head->magicid, "PSID", 4) && memcmp (head->magicid, "RSID", 4)) 101 memcmp (head->magicid, "RSID", 4))
116 { 102 return 0;
117 return (prev);
118 }
119
120 103
121 /* Mime-type */ 104 /* Mime-type */
122 105 ADD ("audio/prs.sid", EXTRACTOR_METATYPE_MIMETYPE);
123 prev = addkword (prev, "audio/prs.sid", EXTRACTOR_MIMETYPE);
124
125 106
126 /* Version of SID format */ 107 /* Version of SID format */
127
128 version = sidword (head->sidversion); 108 version = sidword (head->sidversion);
129 sprintf (sidversion, "%d", version); 109 snprintf (sidversion,
130 prev = addkword (prev, sidversion, EXTRACTOR_FORMAT_VERSION); 110 sizeof(sidversion),
131 111 "%d",
112 version);
113 ADD (sidversion, EXTRACTOR_METATYPE_FORMAT_VERSION);
132 114
133 /* Get song count */ 115 /* Get song count */
134 116 snprintf (songs,
135 sprintf (songs, "%d", sidword (head->songs)); 117 sizeof(songs),
136 prev = addkword (prev, songs, EXTRACTOR_SONG_COUNT); 118 "%d", sidword (head->songs));
137 119 ADD (songs, EXTRACTOR_METATYPE_SONG_COUNT);
138 120
139 /* Get number of the first song to be played */ 121 /* Get number of the first song to be played */
140 122 snprintf (startingsong,
141 sprintf (startingsong, "%d", sidword (head->firstsong)); 123 sizeof(startingsong),
142 prev = addkword (prev, startingsong, EXTRACTOR_STARTING_SONG); 124 "%d",
125 sidword (head->firstsong));
126 ADD (startingsong, EXTRACTOR_METATYPE_STARTING_SONG);
143 127
144 128
145 /* name, artist, copyright fields */ 129 /* name, artist, copyright fields */
146
147 memcpy (&album, head->title, 32); 130 memcpy (&album, head->title, 32);
131 album[32] = '\0';
132 ADD (album, EXTRACTOR_METATYPE_ALBUM);
133
148 memcpy (&artist, head->artist, 32); 134 memcpy (&artist, head->artist, 32);
135 artist[32] = '\0';
136 ADD (artist, EXTRACTOR_METATYPE_ARTIST);
137
149 memcpy (&copyright, head->copyright, 32); 138 memcpy (&copyright, head->copyright, 32);
150
151 album[32] = '\0';
152 artist[32] = '\0';
153 copyright[32] = '\0'; 139 copyright[32] = '\0';
140 ADD (copyright, EXTRACTOR_METATYPE_COPYRIGHT);
154 141
155 prev = addkword (prev, album, EXTRACTOR_ALBUM);
156 prev = addkword (prev, artist, EXTRACTOR_ARTIST);
157 prev = addkword (prev, copyright, EXTRACTOR_COPYRIGHT);
158 142
159 143 if ( (version < 2) || (size < SID2_HEADER_SIZE))
160 if (version < 2 || size < SID2_HEADER_SIZE) 144 return 0;
161 {
162 return (prev);
163 }
164 145
165 /* Version 2 specific options follow 146 /* Version 2 specific options follow
166 * 147 *
167 * Note: Had some troubles understanding specification 148 * Note: Had some troubles understanding specification
168 * on the flags in version 2. I hope this is correct. 149 * on the flags in version 2. I hope this is correct.
169 *
170 */ 150 */
171
172 flags = sidword (head->flags); 151 flags = sidword (head->flags);
173
174
175 /* MUS data */ 152 /* MUS data */
176 153 if (flags & MUSPLAYER_FLAG)
177 if (flags & MUSPLAYER_FLAG) 154 ADD ("Compute!'s Sidplayer", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE);
178 {
179 prev = addkword (prev, "Compute!'s Sidplayer", EXTRACTOR_DEPENDENCY);
180 }
181 155
182 /* PlaySID data */ 156 /* PlaySID data */
183 157 if (flags & PLAYSID_FLAG)
184 if (flags & PLAYSID_FLAG) 158 ADD ("PlaySID", EXTRACTOR_METATYPE_CREATED_BY_SOFTWARE);
185 {
186 prev = addkword (prev, "PlaySID", EXTRACTOR_DEPENDENCY);
187 }
188 159
189 160
190 /* PAL or NTSC */ 161 /* PAL or NTSC */
@@ -192,43 +163,29 @@ struct EXTRACTOR_Keywords *libextractor_sid_extract
192 if (flags & PAL_FLAG) 163 if (flags & PAL_FLAG)
193 { 164 {
194 if (flags & NTSC_FLAG) 165 if (flags & NTSC_FLAG)
195 { 166 ADD ("PAL/NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM);
196 prev = addkword (prev, "PAL/NTSC", EXTRACTOR_TELEVISION_SYSTEM); 167 else
197 } 168 ADD ("PAL", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM);
198 else
199 {
200 prev = addkword (prev, "PAL", EXTRACTOR_TELEVISION_SYSTEM);
201 }
202 } 169 }
203 else 170 else
204 { 171 {
205 if (flags & NTSC_FLAG) 172 if (flags & NTSC_FLAG)
206 { 173 ADD ("NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM);
207 prev = addkword (prev, "NTSC", EXTRACTOR_TELEVISION_SYSTEM);
208 }
209 } 174 }
210 175
211 /* Detect SID Chips suitable for play the files */ 176 /* Detect SID Chips suitable for play the files */
212
213 if (flags & MOS6581_FLAG) 177 if (flags & MOS6581_FLAG)
214 { 178 {
215 if (flags & MOS8580_FLAG) 179 if (flags & MOS8580_FLAG)
216 { 180 ADD ("MOS6581/MOS8580", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
217 prev =
218 addkword (prev, "MOS6581/MOS8580", EXTRACTOR_HARDWARE_DEPENDENCY);
219 }
220 else 181 else
221 { 182 ADD ("MOS6581", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
222 prev = addkword (prev, "MOS6581", EXTRACTOR_HARDWARE_DEPENDENCY);
223 }
224 } 183 }
225 else 184 else
226 { 185 {
227 if (flags & MOS8580_FLAG) 186 if (flags & MOS8580_FLAG)
228 { 187 ADD ("MOS8580", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE);
229 prev = addkword (prev, "MOS8580", EXTRACTOR_HARDWARE_DEPENDENCY);
230 }
231 } 188 }
232 189
233 return (prev); 190 return 0;
234} 191}