libextractor

GNU libextractor
Log | Files | Refs | Submodules | README | LICENSE

commit 4db7e805a2c0082b95b1cd2a735e687897adcf3b
parent 560e0aa9da06367629c80b8797e0dcdaffed7037
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sat, 19 Dec 2009 12:58:07 +0000

nsf

Diffstat:
Msrc/plugins/Makefile.am | 35++++++++++++++---------------------
Asrc/plugins/nsf_extractor.c | 149+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/plugins/nsfe_extractor.c | 251+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/plugins/nsfeextractor.c | 334-------------------------------------------------------------------------------
Dsrc/plugins/nsfextractor.c | 201-------------------------------------------------------------------------------
5 files changed, 414 insertions(+), 556 deletions(-)

diff --git a/src/plugins/Makefile.am b/src/plugins/Makefile.am @@ -92,6 +92,8 @@ plugin_LTLIBRARIES = \ libextractor_mime.la \ libextractor_mp3.la \ $(mpeg) \ + libextractor_nsf.la \ + libextractor_nsfe.la \ libextractor_odf.la \ $(ogg) \ $(ole2) \ @@ -218,6 +220,16 @@ libextractor_mpeg_la_LDFLAGS = \ libextractor_mpeg_la_LIBADD = \ -lmpeg2 +libextractor_nsf_la_SOURCES = \ + nsf_extractor.c +libextractor_nsf_la_LDFLAGS = \ + $(PLUGINFLAGS) + +libextractor_nsfe_la_SOURCES = \ + nsfe_extractor.c +libextractor_nsfe_la_LDFLAGS = \ + $(PLUGINFLAGS) + libextractor_odf_la_SOURCES = \ odf_extractor.c libextractor_odf_la_LDFLAGS = \ @@ -353,12 +365,7 @@ OLD_LIBS = \ libextractor_id3v24.la \ libextractor_id3v23.la \ $(extrampeg) \ - libextractor_nsf.la \ - libextractor_nsfe.la \ - libextractor_tar.la \ - $(thumbqt) \ - libextractor_xm.la \ - libextractor_zip.la + $(thumbqt) libextractor_id3v2_la_SOURCES = \ @@ -383,20 +390,6 @@ libextractor_id3v24_la_LIBADD = \ $(top_builddir)/src/common/libextractor_common.la -libextractor_nsf_la_SOURCES = \ - nsfextractor.c -libextractor_nsf_la_LDFLAGS = \ - $(PLUGINFLAGS) -libextractor_nsf_la_LIBADD = \ - $(top_builddir)/src/main/libextractor.la - -libextractor_nsfe_la_SOURCES = \ - nsfeextractor.c -libextractor_nsfe_la_LDFLAGS = \ - $(PLUGINFLAGS) -libextractor_nsfe_la_LIBADD = \ - $(top_builddir)/src/main/libextractor.la - libextractor_thumbnailqt_la_SOURCES = \ thumbnailextractorqt.cc libextractor_thumbnailqt_la_LDFLAGS = \ @@ -409,7 +402,7 @@ libextractor_thumbnailqt_la_CPPFLAGS = \ $(QT_CFLAGS) $(QT_SVG_CFLAGS) -# Fixme: is this still working ok? Doubtful! +# FIXME: is this still working ok? Doubtful! install-exec-hook: mkdir -p $(DESTDIR)$(plugindir) &> /dev/null || true diff --git a/src/plugins/nsf_extractor.c b/src/plugins/nsf_extractor.c @@ -0,0 +1,149 @@ +/* + * This file is part of libextractor. + * (C) 2006, 2009 Toni Ruottu + * + * libextractor is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * libextractor is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libextractor; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "platform.h" +#include "extractor.h" +#include "convert.h" + + +#define HEADER_SIZE 0x80 + +/* television system flags */ + +#define PAL_FLAG 0x01 +#define DUAL_FLAG 0x02 + +/* sound chip flags */ + +#define VRCVI_FLAG 0x01 +#define VRCVII_FLAG 0x02 +#define FDS_FLAG 0x04 +#define MMC5_FLAG 0x08 +#define NAMCO_FLAG 0x10 +#define SUNSOFT_FLAG 0x20 + +#define UINT16 unsigned short + +struct header +{ + char magicid[5]; + char nsfversion; + char songs; + char firstsong; + UINT16 loadaddr; + UINT16 initaddr; + UINT16 playaddr; + char title[32]; + char artist[32]; + char copyright[32]; + UINT16 ntscspeed; + char bankswitch[8]; + UINT16 palspeed; + char tvflags; + char chipflags; +}; + +#define ADD(s,t) do { if (0 != proc (proc_cls, "nsf", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0) + + +/* "extract" keyword from a Nes Sound Format file + * + * NSF specification version 1.61 was used, + * while this piece of software was originally + * written. + * + */ +int +EXTRACTOR_nsf_extract (const unsigned char *data, + size_t size, + EXTRACTOR_MetaDataProcessor proc, + void *proc_cls, + const char *options) +{ + char album[33]; + char artist[33]; + char copyright[33]; + char songs[32]; + char startingsong[32]; + char nsfversion[32]; + const struct header *head; + + if (size < HEADER_SIZE) + return 0; + head = (const struct header *) data; + if (memcmp (head->magicid, "NESM\x1a", 5)) + return 0; + ADD ("audio/x-nsf", EXTRACTOR_METATYPE_MIMETYPE); + snprintf (nsfversion, + sizeof(nsfversion), + "%d", + head->nsfversion); + ADD (nsfversion, EXTRACTOR_METATYPE_FORMAT_VERSION); + snprintf (songs, + sizeof(songs), + "%d", + head->songs); + ADD (songs, EXTRACTOR_METATYPE_SONG_COUNT); + snprintf (startingsong, + sizeof(startingsong), + "%d", + head->firstsong); + ADD (startingsong, EXTRACTOR_METATYPE_STARTING_SONG); + + memcpy (&album, head->title, 32); + album[32] = '\0'; + ADD (album, EXTRACTOR_METATYPE_ALBUM); + + memcpy (&artist, head->artist, 32); + artist[32] = '\0'; + ADD (artist, EXTRACTOR_METATYPE_ARTIST); + + memcpy (&copyright, head->copyright, 32); + copyright[32] = '\0'; + ADD (copyright, EXTRACTOR_METATYPE_COPYRIGHT); + + if (head->tvflags & DUAL_FLAG) + { + ADD ("PAL/NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + } + else + { + if (head->tvflags & PAL_FLAG) + ADD ("PAL", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + else + ADD ("NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + } + + /* Detect Extra Sound Chips needed to play the files */ + if (head->chipflags & VRCVI_FLAG) + ADD ("VRCVI", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (head->chipflags & VRCVII_FLAG) + ADD ("VRCVII", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (head->chipflags & FDS_FLAG) + ADD ("FDS Sound", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (head->chipflags & MMC5_FLAG) + ADD ("MMC5 audio", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (head->chipflags & NAMCO_FLAG) + ADD ("Namco 106", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (head->chipflags & SUNSOFT_FLAG) + ADD ("Sunsoft FME-07", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + return 0; +} diff --git a/src/plugins/nsfe_extractor.c b/src/plugins/nsfe_extractor.c @@ -0,0 +1,251 @@ +/* + * This file is part of libextractor. + * (C) 2007, 2009 Toni Ruottu + * + * libextractor is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published + * by the Free Software Foundation; either version 2, or (at your + * option) any later version. + * + * libextractor is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with libextractor; see the file COPYING. If not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + +#include "platform.h" +#include "extractor.h" +#include "convert.h" + +#define HEADER_SIZE 0x04 + +/* television system flags */ + +#define PAL_FLAG 0x01 +#define DUAL_FLAG 0x02 + +/* sound chip flags */ + +#define VRCVI_FLAG 0x01 +#define VRCVII_FLAG 0x02 +#define FDS_FLAG 0x04 +#define MMC5_FLAG 0x08 +#define NAMCO_FLAG 0x10 +#define SUNSOFT_FLAG 0x20 + +#define UINT16 unsigned short + +struct header +{ + char magicid[4]; +}; + +struct infochunk +{ + UINT16 loadaddr; + UINT16 initaddr; + UINT16 playaddr; + char tvflags; + char chipflags; + char songs; + char firstsong; +}; + +static int +nsfeuint (const char *data) +{ + int i; + int value = 0; + + for (i = 3; i > 0; i--) + { + value += (unsigned char) data[i]; + value *= 0x100; + } + value += (unsigned char) data[0]; + return value; +} + + +static char * +nsfestring (const char *data, size_t size) +{ + char *s; + size_t length; + + length = 0; + while ( (length < size) && + (data[length] != '\0') ) + length++; + s = malloc (length + 1); + strncpy (s, data, length); + s[strlen (data)] = '\0'; + return s; +} + +#define ADD(s,t) do { if (0 != proc (proc_cls, "nsfe", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) return 1; } while (0) + +#define ADDF(s,t) do { if (0 != proc (proc_cls, "nsfe", t, EXTRACTOR_METAFORMAT_UTF8, "text/plain", s, strlen(s)+1)) { free(s); return 1; } free (s); } while (0) + +static int +libextractor_nsfe_info_extract(const char *data, + size_t size, + EXTRACTOR_MetaDataProcessor proc, + void *proc_cls) +{ + const struct infochunk *ichunk; + char songs[32]; + + if (size < 8) + return 0; + ichunk = (const struct infochunk *) data; + if (ichunk->tvflags & DUAL_FLAG) + { + ADD ("PAL/NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + } + else + { + if (ichunk->tvflags & PAL_FLAG) + ADD ("PAL", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + else + ADD ("NTSC", EXTRACTOR_METATYPE_BROADCAST_TELEVISION_SYSTEM); + } + + if (ichunk->chipflags & VRCVI_FLAG) + ADD ("VRCVI", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (ichunk->chipflags & VRCVII_FLAG) + ADD ("VRCVII", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (ichunk->chipflags & FDS_FLAG) + ADD ("FDS Sound", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (ichunk->chipflags & MMC5_FLAG) + ADD ("MMC5 audio", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (ichunk->chipflags & NAMCO_FLAG) + ADD ("Namco 106", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (ichunk->chipflags & SUNSOFT_FLAG) + ADD ("Sunsoft FME-07", EXTRACTOR_METATYPE_TARGET_ARCHITECTURE); + if (size < 9) + { + ADD ("1", EXTRACTOR_METATYPE_SONG_COUNT); + return 0; + } + snprintf (songs, + sizeof(songs), + "%d", + ichunk->songs); + ADD (songs, EXTRACTOR_METATYPE_SONG_COUNT); + return 0; +} + + +static int +libextractor_nsfe_tlbl_extract(const char *data, + size_t size, + EXTRACTOR_MetaDataProcessor proc, + void *proc_cls) + +{ + char *title; + ssize_t left; + size_t length; + + for (left = size; left > 0; left -= length) + { + title = nsfestring (&data[size - left], left); + length = strlen (title) + 1; + ADDF (title, EXTRACTOR_METATYPE_TITLE); + } + return 0; +} + +static int +libextractor_nsfe_auth_extract (const char *data, size_t size, + EXTRACTOR_MetaDataProcessor proc, + void *proc_cls) +{ + char *album; + char *artist; + char *copyright; + char *ripper; + int left = size; + + if (left < 1) + return 0; + album = nsfestring (&data[size - left], left); + left -= (strlen (album) + 1); + ADDF (album, EXTRACTOR_METATYPE_ALBUM); + if (left < 1) + return 0; + + artist = nsfestring (&data[size - left], left); + left -= (strlen (artist) + 1); + ADDF (artist, EXTRACTOR_METATYPE_ARTIST); + if (left < 1) + return 0; + + copyright = nsfestring (&data[size - left], left); + left -= (strlen (copyright) + 1); + ADDF (copyright, EXTRACTOR_METATYPE_COPYRIGHT); + if (left < 1) + return 0; + + ripper = nsfestring (&data[size - left], left); + ADDF (ripper, EXTRACTOR_METATYPE_RIPPER); + return 0; +} + + +/* "extract" keyword from an Extended Nintendo Sound Format file + * + * NSFE specification revision 2 (Sep. 3, 2003) + * was used, while this piece of software was + * originally written. + * + */ +int +EXTRACTOR_nsfe_extract (const char *data, + size_t size, + EXTRACTOR_MetaDataProcessor proc, + void *proc_cls, + const char *options) +{ + const struct header *head; + int i; + char chunkid[5] = " "; + int ret; + + if (size < HEADER_SIZE) + return 0; + head = (const struct header *) data; + if (memcmp (head->magicid, "NSFE", 4)) + return 0; + ADD ("audio/x-nsfe", EXTRACTOR_METATYPE_MIMETYPE); + i = 4; /* Jump over magic id */ + ret = 0; + while (i + 7 < size && strncmp (chunkid, "NEND", 4)) /* CHECK */ + { + unsigned int chunksize = nsfeuint (&data[i]); + + i += 4; /* Jump over chunk size */ + memcpy (&chunkid, data + i, 4); + chunkid[4] = '\0'; + + i += 4; /* Jump over chunk id */ + if (!strncmp (chunkid, "INFO", 4)) + ret = libextractor_nsfe_info_extract (data + i, chunksize, proc, proc_cls); + else if (!strncmp (chunkid, "auth", 4)) + ret = libextractor_nsfe_auth_extract (data + i, chunksize, proc, proc_cls); + else if (!strncmp (chunkid, "tlbl", 4)) + ret = libextractor_nsfe_tlbl_extract (data + i, chunksize, proc, proc_cls); + /* Ignored chunks: DATA, NEND, plst, time, fade, BANK */ + i += chunksize; + if (ret != 0) + break; + } + return ret; +} diff --git a/src/plugins/nsfeextractor.c b/src/plugins/nsfeextractor.c @@ -1,334 +0,0 @@ -/* - * This file is part of libextractor. - * (C) 2007 Toni Ruottu - * - * libextractor is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * libextractor is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with libextractor; see the file COPYING. If not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include "platform.h" -#include "extractor.h" -#include "convert.h" - -#define HEADER_SIZE 0x04 - -/* television system flags */ - -#define PAL_FLAG 0x01 -#define DUAL_FLAG 0x02 - -/* sound chip flags */ - -#define VRCVI_FLAG 0x01 -#define VRCVII_FLAG 0x02 -#define FDS_FLAG 0x04 -#define MMC5_FLAG 0x08 -#define NAMCO_FLAG 0x10 -#define SUNSOFT_FLAG 0x20 - -#define UINT16 unsigned short - -struct header -{ - char magicid[4]; -}; - -struct infochunk -{ - UINT16 loadaddr; - UINT16 initaddr; - UINT16 playaddr; - char tvflags; - char chipflags; - char songs; - char firstsong; -}; - -static int -nsfeuint (const char *data) -{ - int i, value = 0; - - for (i = 3; i > 0; i--) - { - value += (unsigned char) data[i]; - value *= 0x100; - } - - value += (unsigned char) data[0]; - - return (value); -} - -static char * -nsfestring (const char *data, int size) -{ - char *s; - int length; - - if (size < strlen (data)) - { - length = size; - } - else - { - length = strlen (data); - } - - s = malloc (length + 1); - - strncpy (s, data, length); - - s[strlen (data)] = '\0'; - - return (s); -} - -static struct EXTRACTOR_Keywords *addkword - (EXTRACTOR_KeywordList * oldhead, - const char *phrase, EXTRACTOR_KeywordType type) -{ - EXTRACTOR_KeywordList *keyword; - - keyword = malloc (sizeof (EXTRACTOR_KeywordList)); - keyword->next = oldhead; - keyword->keyword = strdup (phrase); - keyword->keywordType = type; - return (keyword); -} - -static struct EXTRACTOR_Keywords *libextractor_nsfe_info_extract - (const char *data, size_t size, struct EXTRACTOR_Keywords *prev) -{ - const struct infochunk *ichunk; - char songs[32]; - - ichunk = (const struct infochunk *) data; - - if (size < 8) - { - return (prev); - } - - - /* PAL or NTSC */ - - if (ichunk->tvflags & DUAL_FLAG) - { - prev = addkword (prev, "PAL/NTSC", EXTRACTOR_TELEVISION_SYSTEM); - } - else - { - if (ichunk->tvflags & PAL_FLAG) - { - prev = addkword (prev, "PAL", EXTRACTOR_TELEVISION_SYSTEM); - } - else - { - prev = addkword (prev, "NTSC", EXTRACTOR_TELEVISION_SYSTEM); - } - } - - - /* Detect Extra Sound Chips needed to play the files */ - - if (ichunk->chipflags & VRCVI_FLAG) - { - prev = addkword (prev, "VRCVI", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (ichunk->chipflags & VRCVII_FLAG) - { - prev = addkword (prev, "VRCVII", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (ichunk->chipflags & FDS_FLAG) - { - prev = addkword (prev, "FDS Sound", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (ichunk->chipflags & MMC5_FLAG) - { - prev = addkword (prev, "MMC5 audio", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (ichunk->chipflags & NAMCO_FLAG) - { - prev = addkword (prev, "Namco 106", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (ichunk->chipflags & SUNSOFT_FLAG) - { - prev = addkword (prev, "Sunsoft FME-07", EXTRACTOR_HARDWARE_DEPENDENCY); - } - - if (size < 9) - { - prev = addkword (prev, "1", EXTRACTOR_SONG_COUNT); - return (prev); - } - - sprintf (songs, "%d", ichunk->songs); - prev = addkword (prev, songs, EXTRACTOR_SONG_COUNT); - - - return (prev); -} - - -static struct EXTRACTOR_Keywords *libextractor_nsfe_tlbl_extract - (const char *data, size_t size, struct EXTRACTOR_Keywords *prev) -{ - char *title; - int left, length; - - - for (left = size; left > 0; left -= length) - { - title = nsfestring (&data[size - left], left); - prev = addkword (prev, title, EXTRACTOR_TITLE); - length = strlen (title) + 1; - - free (title); - } - - return (prev); -} - -static struct EXTRACTOR_Keywords *libextractor_nsfe_auth_extract - (const char *data, size_t size, struct EXTRACTOR_Keywords *prev) -{ - char *album; - char *artist; - char *copyright; - char *ripper; - int left = size; - - if (left < 1) - { - return (prev); - } - - album = nsfestring (&data[size - left], left); - prev = addkword (prev, album, EXTRACTOR_ALBUM); - - left -= (strlen (album) + 1); - free (album); - - if (left < 1) - { - return (prev); - } - - artist = nsfestring (&data[size - left], left); - prev = addkword (prev, artist, EXTRACTOR_ARTIST); - - left -= (strlen (artist) + 1); - free (artist); - - if (left < 1) - { - return (prev); - } - - copyright = nsfestring (&data[size - left], left); - prev = addkword (prev, copyright, EXTRACTOR_COPYRIGHT); - - left -= (strlen (copyright) + 1); - free (copyright); - - if (left < 1) - { - return (prev); - } - - ripper = nsfestring (&data[size - left], left); - prev = addkword (prev, ripper, EXTRACTOR_RIPPER); - free (ripper); - - return (prev); -} - - -/* "extract" keyword from an Extended Nintendo Sound Format file - * - * NSFE specification revision 2 (Sep. 3, 2003) - * was used, while this piece of software was - * originally written. - * - */ -struct EXTRACTOR_Keywords *libextractor_nsfe_extract - (const char *filename, - const char *data, size_t size, struct EXTRACTOR_Keywords *prev) -{ - const struct header *head; - int i; - char chunkid[5] = " "; - - /* Check header size */ - - if (size < HEADER_SIZE) - { - return (prev); - } - - head = (const struct header *) data; - - /* Check "magic" id bytes */ - - if (memcmp (head->magicid, "NSFE", 4)) - { - return (prev); - } - - - /* Mime-type */ - - prev = addkword (prev, "audio/x-nsfe", EXTRACTOR_MIMETYPE); - - i = 4; /* Jump over magic id */ - - while (i + 7 < size && strncmp (chunkid, "NEND", 4)) /* CHECK */ - { - - unsigned int chunksize = nsfeuint (&data[i]); - - i += 4; /* Jump over chunk size */ - - memcpy (&chunkid, data + i, 4); - chunkid[4] = '\0'; - - i += 4; /* Jump over chunk id */ - - if (!strncmp (chunkid, "INFO", 4)) - { - prev = libextractor_nsfe_info_extract (data + i, chunksize, prev); - } - - if (!strncmp (chunkid, "auth", 4)) - { - prev = libextractor_nsfe_auth_extract (data + i, chunksize, prev); - } - - if (!strncmp (chunkid, "tlbl", 4)) - { - prev = libextractor_nsfe_tlbl_extract (data + i, chunksize, prev); - } - - /* Ignored chunks: DATA, NEND, plst, time, fade, BANK */ - - i += chunksize; - - } - - return (prev); - -} diff --git a/src/plugins/nsfextractor.c b/src/plugins/nsfextractor.c @@ -1,201 +0,0 @@ -/* - * This file is part of libextractor. - * (C) 2006 Toni Ruottu - * - * libextractor is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published - * by the Free Software Foundation; either version 2, or (at your - * option) any later version. - * - * libextractor is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with libextractor; see the file COPYING. If not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include "platform.h" -#include "extractor.h" -#include "convert.h" - - -#define HEADER_SIZE 0x80 - -/* television system flags */ - -#define PAL_FLAG 0x01 -#define DUAL_FLAG 0x02 - -/* sound chip flags */ - -#define VRCVI_FLAG 0x01 -#define VRCVII_FLAG 0x02 -#define FDS_FLAG 0x04 -#define MMC5_FLAG 0x08 -#define NAMCO_FLAG 0x10 -#define SUNSOFT_FLAG 0x20 - -#define UINT16 unsigned short - -struct header -{ - char magicid[5]; - char nsfversion; - char songs; - char firstsong; - UINT16 loadaddr; - UINT16 initaddr; - UINT16 playaddr; - char title[32]; - char artist[32]; - char copyright[32]; - UINT16 ntscspeed; - char bankswitch[8]; - UINT16 palspeed; - char tvflags; - char chipflags; -}; - - -static struct EXTRACTOR_Keywords *addkword - (EXTRACTOR_KeywordList * oldhead, - const char *phrase, EXTRACTOR_KeywordType type) -{ - EXTRACTOR_KeywordList *keyword; - - keyword = malloc (sizeof (EXTRACTOR_KeywordList)); - keyword->next = oldhead; - keyword->keyword = strdup (phrase); - keyword->keywordType = type; - return (keyword); -} - - -/* "extract" keyword from a Nes Sound Format file - * - * NSF specification version 1.61 was used, - * while this piece of software was originally - * written. - * - */ -struct EXTRACTOR_Keywords *libextractor_nsf_extract - (const char *filename, - char *data, size_t size, struct EXTRACTOR_Keywords *prev) -{ - char album[33]; - char artist[33]; - char copyright[33]; - char songs[32]; - char startingsong[32]; - char nsfversion[32]; - struct header *head; - - /* Check header size */ - - if (size < HEADER_SIZE) - { - return (prev); - } - - head = (struct header *) data; - - /* Check "magic" id bytes */ - - if (memcmp (head->magicid, "NESM\x1a", 5)) - { - return (prev); - } - - - /* Mime-type */ - - prev = addkword (prev, "audio/x-nsf", EXTRACTOR_MIMETYPE); - - - /* Version of NSF format */ - - sprintf (nsfversion, "%d", head->nsfversion); - prev = addkword (prev, nsfversion, EXTRACTOR_FORMAT_VERSION); - - - /* Get song count */ - - sprintf (songs, "%d", head->songs); - prev = addkword (prev, songs, EXTRACTOR_SONG_COUNT); - - - /* Get number of the first song to be played */ - - sprintf (startingsong, "%d", head->firstsong); - prev = addkword (prev, startingsong, EXTRACTOR_STARTING_SONG); - - - /* name, artist, copyright fields */ - - memcpy (&album, head->title, 32); - memcpy (&artist, head->artist, 32); - memcpy (&copyright, head->copyright, 32); - - album[32] = '\0'; - artist[32] = '\0'; - copyright[32] = '\0'; - - prev = addkword (prev, album, EXTRACTOR_ALBUM); - prev = addkword (prev, artist, EXTRACTOR_ARTIST); - prev = addkword (prev, copyright, EXTRACTOR_COPYRIGHT); - - - /* PAL or NTSC */ - - if (head->tvflags & DUAL_FLAG) - { - prev = addkword (prev, "PAL/NTSC", EXTRACTOR_TELEVISION_SYSTEM); - } - else - { - if (head->tvflags & PAL_FLAG) - { - prev = addkword (prev, "PAL", EXTRACTOR_TELEVISION_SYSTEM); - } - else - { - prev = addkword (prev, "NTSC", EXTRACTOR_TELEVISION_SYSTEM); - } - } - - - /* Detect Extra Sound Chips needed to play the files */ - - if (head->chipflags & VRCVI_FLAG) - { - prev = addkword (prev, "VRCVI", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (head->chipflags & VRCVII_FLAG) - { - prev = addkword (prev, "VRCVII", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (head->chipflags & FDS_FLAG) - { - prev = addkword (prev, "FDS Sound", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (head->chipflags & MMC5_FLAG) - { - prev = addkword (prev, "MMC5 audio", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (head->chipflags & NAMCO_FLAG) - { - prev = addkword (prev, "Namco 106", EXTRACTOR_HARDWARE_DEPENDENCY); - } - if (head->chipflags & SUNSOFT_FLAG) - { - prev = addkword (prev, "Sunsoft FME-07", EXTRACTOR_HARDWARE_DEPENDENCY); - } - - return (prev); - -}