Commit e31d9eb0 authored by Josh Coalson's avatar Josh Coalson

remove id3 support from the plugins

parent 47297ce8
......@@ -31,7 +31,7 @@ Other major contributors and their contributions:
* AIFF file support, PPC assembly versions of libFLAC routines
"Daisuke Shimamura" <Daisuke_Shimamura@nifty.com>
* id3 v1/v2 and i18n support in the XMMS plugin
* i18n support in the XMMS plugin
"X-Fixer" <x-fixer@narod.ru>
* Configuration system, tag editing, and file info in the Winamp2 plugin
......
......@@ -133,7 +133,6 @@ $HOME/.xmms/Plugins, instead of the global XMMS plugin area
(usually /usr/lib/xmms/Input).
--with-ogg=
--with-id3lib=
--with-xmms-prefix=
--with-libiconv-prefix=
Use these if you have these packages but configure can't find them.
......
......@@ -11,7 +11,7 @@
# - libtool 1.5.6
#
# You may need to specify -I /SOME_PATH/share/aclocal if the packages
# FLAC relies on (autotools, libogg, libiconv, libid3) are installed in
# FLAC relies on (autotools, libogg, libiconv) are installed in
# non-standard places.
#
# If you don't have XMMS installed at all, you should comment out
......
......@@ -25,117 +25,6 @@ AM_INIT_AUTOMAKE(flac, 1.1.1)
# explicitly requested. Eases autobuilding -mdz
AM_MAINTAINER_MODE
# Function to configure paths for id3lib; search for 'meat' to get to the end.
# adapted from ogg.m4
# This is here until id3lib comes with an equivalent.
# It is inline with configure.in instead of a separate file as a courtesy to users unaware of the -I flag to aclocal
dnl LOCAL__PATH_ID3LIB([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Test for libid3, and define ID3LIB_CFLAGS and ID3LIB_LIBS
dnl
AC_DEFUN([LOCAL__PATH_ID3LIB],
[dnl
dnl Get the cflags and libraries
dnl
AC_ARG_WITH(id3lib,[ --with-id3lib=PFX Prefix where libid3 is installed (optional)], id3lib_prefix="$withval", id3lib_prefix="")
AC_ARG_WITH(id3lib-libraries,[ --with-id3lib-libraries=DIR Directory where libid3 library is installed (optional)], id3lib_libraries="$withval", id3lib_libraries="")
AC_ARG_WITH(id3lib-includes,[ --with-id3lib-includes=DIR Directory where libid3 header files are installed (optional)], id3lib_includes="$withval", id3lib_includes="")
AC_ARG_ENABLE(id3libtest, [ --disable-id3libtest Do not try to compile and run a test id3lib program],, enable_id3libtest=yes)
if test "x$id3lib_libraries" != "x" ; then
ID3LIB_LIBS="-L$id3lib_libraries"
elif test "x$id3lib_prefix" != "x" ; then
ID3LIB_LIBS="-L$id3lib_prefix/lib"
elif test "x$prefix" != "xNONE" ; then
ID3LIB_LIBS="-L$libdir"
fi
ID3LIB_LIBS="$ID3LIB_LIBS -lid3"
if test "x$id3lib_includes" != "x" ; then
ID3LIB_CFLAGS="-I$id3lib_includes"
elif test "x$id3lib_prefix" != "x" ; then
ID3LIB_CFLAGS="-I$id3lib_prefix/include"
elif test "$prefix" != "xNONE"; then
ID3LIB_CFLAGS="-I$prefix/include"
fi
AC_MSG_CHECKING(for id3lib)
if test "x$enable_id3libtest" = "xyes" ; then
id3lib_found=""
else
id3lib_found="yes"
fi
dnl There is some confusion over what libraries libid3 needs
dnl so we must be pessimistic and try all permutations:
dnl "-lid3" "-lid3 -lstdc++" "-lid3 -lz" "-lid3 -lz -lstdc++"
for xtra_stdcpp in "" " -lstdc++" ; do
for xtra_z in "" " -lz" ; do
if test "x$id3lib_found" = "x" ; then
ac_save_CFLAGS="$CFLAGS"
ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $ID3LIB_CFLAGS"
LIBS="$LIBS $ID3LIB_LIBS$xtra_stdcpp$xtra_z"
rm -f conf.id3libtest
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <id3.h>
int main () { system("touch conf.id3libtest"); return 0; }
], id3lib_found=yes,,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
if test "x$id3lib_found" = "xyes" ; then
ID3LIB_LIBS="$ID3LIB_LIBS$xtra_stdcpp$xtra_z"
fi
done
done
if test "x$id3lib_found" = "xyes" ; then
AC_MSG_RESULT(yes)
ifelse([$1], , :, [$1])
else
AC_MSG_RESULT(no)
if test -f conf.id3libtest ; then
:
else
echo "*** Could not run id3lib test program, checking why..."
CFLAGS="$CFLAGS $ID3LIB_CFLAGS"
LIBS="$LIBS $ID3LIB_LIBS"
AC_TRY_LINK([
#include <stdio.h>
#include <id3.h>
], [ return 0; ],
[ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding id3lib or finding the wrong"
echo "*** version of id3lib. If it is not finding id3lib, you'll need to set your"
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
echo "*** to the installed location Also, make sure you have run ldconfig if that"
echo "*** is required on your system"
echo "***"
echo "*** If you have an old version installed, it is best to remove it, although"
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
[ echo "*** The test program failed to compile or link. See the file config.log for the"
echo "*** exact error that occured. This usually means id3lib was incorrectly installed"
echo "*** or that you have moved id3lib since it was installed." ])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
ID3LIB_CFLAGS=""
ID3LIB_LIBS=""
ifelse([$2], , :, [$2])
fi
AC_SUBST(ID3LIB_CFLAGS)
AC_SUBST(ID3LIB_LIBS)
rm -f conf.id3libtest
])
dnl Now the meat of configure.in:
# We need two libtools, one that builds both shared and static, and
# one that builds only static. This is because the resulting libtool
# does not allow us to choose which to build at runtime.
......@@ -274,43 +163,6 @@ dnl check for i18n(internationalization); these are from libiconv/gettext
AM_ICONV
AM_LANGINFO_CODESET
dnl check for id3lib library
dnl LOCAL__PATH_ID3LIB is defined by us, and will be until such time as id3lib supplies one
LOCAL__PATH_ID3LIB(have_id3lib=yes, AC_MSG_WARN([*** id3lib not found - id3v2 support will not be built]))
AM_CONDITIONAL(FLaC__HAS_ID3LIB, [test x$have_id3lib = xyes])
if test x$have_id3lib = xyes ; then
AC_DEFINE(FLAC__HAS_ID3LIB)
dnl expected id3lib version for cross compiling
ID3LIB_MAJOR=3
ID3LIB_MINOR=8
ID3LIB_PATCH=0
CFLAGS_save_blah_blah_blah=$CFLAGS
CFLAGS="$ID3LIB_CFLAGS $CFLAGS"
LIBS_save_blah_blah_blah=$LIBS
LIBS="$ID3LIB_LIBS $LIBS"
AC_MSG_CHECKING(for id3lib version)
AC_TRY_RUN([
#include <id3.h>
#include <stdio.h>
int
main ()
{
FILE *output;
output=fopen("conftest.id3","w");
fprintf(output,"ID3LIB_MAJOR=%d\nID3LIB_MINOR=%d\nID3LIB_PATCH=%d\n",ID3LIB_MAJOR_VERSION,ID3LIB_MINOR_VERSION,ID3LIB_PATCH_VERSION);
fclose(output);
exit(0);
}
], . ./conftest.id3; echo "${ID3LIB_MAJOR}.${ID3LIB_MINOR}.${ID3LIB_PATCH}", AC_MSG_WARN(could not determine id3lib version),[echo $ac_n "cross compiling; assuming ${ID3LIB_MAJOR}.${ID3LIB_MINOR}.${ID3LIB_PATCH} $ac_c"])
AC_DEFINE_UNQUOTED(ID3LIB_MAJOR, $ID3LIB_MAJOR)
AC_DEFINE_UNQUOTED(ID3LIB_MINOR, $ID3LIB_MINOR)
AC_DEFINE_UNQUOTED(ID3LIB_PATCH, $ID3LIB_PATCH)
CFLAGS=$CFLAGS_save_blah_blah_blah
LIBS=$LIBS_save_blah_blah_blah
fi
AC_CHECK_PROGS(DOXYGEN, doxygen)
AM_CONDITIONAL(FLaC__HAS_DOXYGEN, test -n "$DOXYGEN")
if test -n "$DOXYGEN" ; then
......@@ -350,16 +202,12 @@ AH_TEMPLATE(FLAC__EXHAUSTIVE_TESTS, [define to run even more tests])
AH_TEMPLATE(FLAC__VALGRIND_TESTING, [define to enable use of Valgrind in testers])
AH_TEMPLATE(FLAC__HAS_DOXYGEN, [define if you have Doxygen])
AH_TEMPLATE(FLAC__HAS_DOCBOOK_TO_MAN, [define if you have docbook-to-man or docbook2man])
AH_TEMPLATE(FLAC__HAS_ID3LIB, [define if you have the id3lib library])
AH_TEMPLATE(FLAC__HAS_NASM, [define if you have the NASM assembler])
AH_TEMPLATE(FLAC__HAS_OGG, [define if you have the ogg library])
AH_TEMPLATE(FLAC__NO_ASM, [define to disable use of assembly code])
AH_TEMPLATE(FLAC__SSE_OS, [define if your operating system supports SSE instructions])
AH_TEMPLATE(FLAC__USE_3DNOW, [define to enable use of 3Dnow! instructions])
AH_TEMPLATE(FLAC__USE_ALTIVEC, [define to enable use of Altivec instructions])
AH_TEMPLATE(ID3LIB_MAJOR, [define to major version number of id3lib])
AH_TEMPLATE(ID3LIB_MINOR, [define to minor version number of id3lib])
AH_TEMPLATE(ID3LIB_PATCH, [define to patch level of id3lib])
AC_OUTPUT( \
Makefile \
......
......@@ -160,6 +160,7 @@
<LI>Speed optimization in ReplayGain synthesis.</LI>
<LI>Speed optimization in XMMS playback.</LI>
<LI>Support for big-endian architectures in XMMS plugin.</LI>
<LI>Removed support for ID3 tags.</LI>
<LI>Bug fix: make hard limiter default to off in XMMS plugin.</LI>
<LI>Bug fix: stream length calculation bug in XMMS plugin, debian bug #200435; <A HREF="http://sourceforge.net/mailarchive/forum.php?thread_id=2733072&forum_id=6312">see also</A>.</LI>
<LI>Bug fix: small memory leak in XMMS plugin.</LI>
......
......@@ -189,7 +189,7 @@
<B>MISCELLANEOUS</B>
</P>
<P>
In order to support come common types of metadata, the reference decoder knows how to skip <A HREF="http://www.id3.org/">ID3v1 and ID3v2 tags</A>. Note however that the FLAC specification does not require compliant implementations to support ID3 in any form. The XMMS and Winamp plugins support them out of convenience but other applications need not.
As a convenience, the reference decoder knows how to skip <A HREF="http://www.id3.org/">ID3v1 and ID3v2 tags</A>. Note however that the FLAC specification does not require compliant implementations to support ID3 in any form and their use is discouraged.
</P>
<P>
<B><TT>flac</TT></B> has a verify option <TT>-V</TT> that verifies the output while encoding. With this option, a decoder is run in parallel to the encoder and its output is compared against the original input. If a difference is found <B><TT>flac</TT></B> will stop with an error.
......
......@@ -211,7 +211,7 @@
FLAC has it's own native tagging system which is identical to that of Vorbis. They are called alternately "FLAC tags" and "Vorbis comments". It is the only tagging system required and guaranteed to be supported by FLAC implementations.
</P>
<P>
Out of convenience, some plugins and implementations allow and also read other kinds of tags. For example, the official FLAC Winamp and XMMS plugins can also read ID3 v1 and v2 tags in addition to FLAC tags. The reference decoder knows how to skip ID3 tags so that they don't interfere with decoding. But you should not expect any tags beside FLAC tags to be supported in all applications; some implementations may not even be able to decode a FLAC file with ID3 tags.
Out of convenience, the reference decoder knows how to skip ID3 tags so that they don't interfere with decoding. But you should not expect any tags beside FLAC tags to be supported in applications; some implementations may not even be able to decode a FLAC file with ID3 tags.
</P>
<P>
<A NAME="general__software"><B>What software support FLAC?</B></A>
......
......@@ -311,9 +311,6 @@
<P>
All numbers used in a FLAC bitstream are integers; there are no floating-point representations. All numbers are big-endian coded. All numbers are unsigned unless otherwise specified.
</P>
<P>
A FLAC bitstream may be appended with ID3V1 data or prepended with ID3V2 data. FLAC has no knowledge of such data, but the reference decoder knows how to skip an ID3 tag.</A>
</P>
<P>
Before the formal description of the stream, an overview might be helpful.
</P>
......
......@@ -2,7 +2,7 @@
AUTOMAKE_OPTIONS = foreign
INCLUDES = -I$(top_srcdir)/include @ID3LIB_CFLAGS@
INCLUDES = -I$(top_srcdir)/include
noinst_LTLIBRARIES = libplugin_common.la
......@@ -12,8 +12,6 @@ noinst_HEADERS = \
charset.h \
defs.h \
dither.h \
id3v1.h \
id3v2.h \
locale_hack.h \
vorbiscomment.h
......@@ -21,8 +19,6 @@ libplugin_common_la_SOURCES = \
canonical_tag.c \
charset.c \
dither.c \
id3v1.c \
id3v2.c \
vorbiscomment.c
EXTRA_DIST = \
......
......@@ -6,14 +6,12 @@ topdir = ../..
LIB_NAME = libplugin_common
INCLUDES = -I$(topdir)/include -I$(HOME)/local/include
DEFINES = -DFLAC__HAS_ID3LIB -DID3LIB_MAJOR=3 -DID3LIB_MINOR=8 -DID3LIB_PATCH=0
DEFINES =
SRCS_C = \
canonical_tag.c \
charset.c \
dither.c \
id3v1.c \
id3v2.c \
vorbiscomment.c
include $(topdir)/build/lib.mk
......
......@@ -22,8 +22,6 @@
#include "canonical_tag.h"
#include "charset.h"
#include "dither.h"
#include "id3v1.h"
#include "id3v2.h"
#include "locale_hack.h"
#include "vorbiscomment.h"
......
......@@ -22,9 +22,9 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h> /* for strlen() and memcpy() */
#include "canonical_tag.h"
#include "id3v2.h"
#include "vorbiscomment.h"
#include "FLAC/assert.h"
#include "FLAC/metadata.h"
......@@ -151,38 +151,6 @@ weak_alias (__wcscasecmp, wcscasecmp)
#endif
#endif
#ifndef _MSC_VER
/* @@@ cheesy and does base 10 only */
wchar_t *local__itow(int value, wchar_t *string)
{
if (value == 0) {
string[0] = (wchar_t)'0';
string[1] = (wchar_t)0;
}
else {
/* convert backwards, then reverse string */
wchar_t *start = string, *s;
if (value < 0) {
*start++ = (wchar_t)'-';
value = -value; /* @@@ overflow at INT_MIN */
}
s = start;
while (value > 0) {
*s++ = (wchar_t)((value % 10) + '0');
value /= 10;
}
*s-- = (wchar_t)0;
while (s > start) {
wchar_t tmp = *s;
*s-- = *start;
*start++ = tmp;
}
}
return string;
}
#endif
/*
* helpers
*/
......@@ -611,133 +579,7 @@ void FLAC_plugin__canonical_tag_merge(FLAC_Plugin__CanonicalTag *dest, const FLA
}
}
static wchar_t *local__copy_field(const char *src, unsigned n)
{
const char *p = src + n;
wchar_t *dest;
FLAC__ASSERT(n > 0);
while (p>src && *(--p)==' ');
n = p - src + 1;
if (!n) return NULL;
if ((dest = malloc((n+1)*sizeof(wchar_t))) != 0)
{
mbstowcs(dest, src, n);
dest[n] = 0;
}
return dest;
}
static void local__add_id3_field(FLAC_Plugin__CanonicalTag *object, const char *value, size_t length, const wchar_t *new_name)
{
wchar_t *tmp;
if (0 != value && length > 0) {
tmp = local__copy_field(value, length);
if (tmp)
FLAC_plugin__canonical_add_tail(object, wcsdup(new_name), tmp);
}
}
void FLAC_plugin__canonical_tag_convert_from_id3v1(FLAC_Plugin__CanonicalTag *object, const FLAC_Plugin__Id3v1_Tag *id3v1_tag)
{
wchar_t *tmp;
FLAC_plugin__canonical_tag_clear(object);
local__add_id3_field(object, id3v1_tag->title, 30, L"TITLE");
local__add_id3_field(object, id3v1_tag->artist, 30, L"ARTIST");
local__add_id3_field(object, id3v1_tag->album, 30, L"ALBUM");
local__add_id3_field(object, id3v1_tag->year, 4, L"YEAR");
/* check for v1.1 tags */
if (id3v1_tag->zero == 0)
{
if (id3v1_tag->track && (tmp=(wchar_t*)malloc(sizeof(id3v1_tag->track)*4*sizeof(wchar_t)))!=0)
{
#ifdef _MSC_VER
_itow(id3v1_tag->track, tmp, 10);
#else
local__itow(id3v1_tag->track, tmp);
#endif
FLAC_plugin__canonical_add_tail(object, wcsdup(L"TRACKNUMBER"), tmp);
}
local__add_id3_field(object, id3v1_tag->comment, 28, L"DESCRIPTION");
}
else
{
local__add_id3_field(object, id3v1_tag->comment, 30, L"DESCRIPTION");
}
tmp = FLAC_plugin__convert_ansi_to_wide(FLAC_plugin__id3v1_tag_get_genre_as_string(id3v1_tag->genre));
if (tmp) FLAC_plugin__canonical_add_tail(object, wcsdup(L"GENRE"), tmp);
}
void FLAC_plugin__canonical_tag_convert_from_id3v2(FLAC_Plugin__CanonicalTag *object, const FLAC_Plugin__Id3v2_Tag *id3v2_tag)
{
FLAC_plugin__canonical_tag_clear(object);
local__add_id3_field(object, id3v2_tag->title , strlen(id3v2_tag->title) , L"TITLE");
local__add_id3_field(object, id3v2_tag->composer , strlen(id3v2_tag->composer) , L"ARTIST");
local__add_id3_field(object, id3v2_tag->performer , strlen(id3v2_tag->performer) , L"PERFORMER");
local__add_id3_field(object, id3v2_tag->album , strlen(id3v2_tag->album) , L"ALBUM");
local__add_id3_field(object, id3v2_tag->year_recorded , strlen(id3v2_tag->year_recorded) , L"YEAR_RECORDED");
local__add_id3_field(object, id3v2_tag->year_performed , strlen(id3v2_tag->year_performed) , L"YEAR_PERFORMED");
local__add_id3_field(object, id3v2_tag->track_number , strlen(id3v2_tag->track_number) , L"TRACKNUMBER");
local__add_id3_field(object, id3v2_tag->tracks_in_album, strlen(id3v2_tag->tracks_in_album), L"TRACKS_IN_ALBUM");
local__add_id3_field(object, id3v2_tag->genre , strlen(id3v2_tag->genre) , L"GENRE");
local__add_id3_field(object, id3v2_tag->comment , strlen(id3v2_tag->comment) , L"DESCRIPTION");
}
static FLAC__bool local__get_id3v1_tag_as_canonical(const char *filename, FLAC_Plugin__CanonicalTag *tag)
{
FLAC_Plugin__Id3v1_Tag id3v1_tag;
if (FLAC_plugin__id3v1_tag_get(filename, &id3v1_tag))
{
FLAC_plugin__canonical_tag_convert_from_id3v1(tag, &id3v1_tag);
return true;
}
return false;
}
static FLAC__bool local__get_id3v2_tag_as_canonical(const char *filename, FLAC_Plugin__CanonicalTag *tag)
{
FLAC_Plugin__Id3v2_Tag id3v2_tag;
if (FLAC_plugin__id3v2_tag_get(filename, &id3v2_tag))
{
FLAC_plugin__canonical_tag_convert_from_id3v2(tag, &id3v2_tag);
return true;
}
return false;
}
void FLAC_plugin__canonical_tag_add_id3v1(const char *filename, FLAC_Plugin__CanonicalTag *tag)
{
FLAC_Plugin__CanonicalTag id3v1_tag;
FLAC_plugin__canonical_tag_init(&id3v1_tag);
(void)local__get_id3v1_tag_as_canonical(filename, &id3v1_tag);
FLAC_plugin__canonical_tag_merge(tag, &id3v1_tag);
FLAC_plugin__canonical_tag_clear(&id3v1_tag);
}
void FLAC_plugin__canonical_tag_add_id3v2(const char *filename, FLAC_Plugin__CanonicalTag *tag)
{
FLAC_Plugin__CanonicalTag id3v2_tag;
FLAC_plugin__canonical_tag_init(&id3v2_tag);
(void)local__get_id3v2_tag_as_canonical(filename, &id3v2_tag);
FLAC_plugin__canonical_tag_merge(tag, &id3v2_tag);
FLAC_plugin__canonical_tag_clear(&id3v2_tag);
}
void FLAC_plugin__canonical_tag_get_combined(const char *filename, FLAC_Plugin__CanonicalTag *tag, const char *sep)
{
FLAC_plugin__vorbiscomment_get(filename, tag, sep);
FLAC_plugin__canonical_tag_add_id3v2(filename, tag);
FLAC_plugin__canonical_tag_add_id3v1(filename, tag);
}
......@@ -19,8 +19,7 @@
#ifndef FLAC__PLUGIN_COMMON__CANONICAL_TAG_H
#define FLAC__PLUGIN_COMMON__CANONICAL_TAG_H
#include "id3v1.h"
#include "id3v2.h"
#include "FLAC/ordinals.h"
/* TODO: splay tree? */
typedef struct tagFLAC__tag_entry FLAC__tag_entry;
......@@ -80,20 +79,6 @@ wchar_t *FLAC_plugin__canonical_get_value(FLAC__tag_iterator it);
char *FLAC_plugin__canonical_get_formatted(FLAC__tag_iterator it);
void FLAC_plugin__canonical_tag_merge(FLAC_Plugin__CanonicalTag *dest, const FLAC_Plugin__CanonicalTag *src);
void FLAC_plugin__canonical_tag_convert_from_id3v1(FLAC_Plugin__CanonicalTag *, const FLAC_Plugin__Id3v1_Tag *);
void FLAC_plugin__canonical_tag_convert_from_id3v2(FLAC_Plugin__CanonicalTag *, const FLAC_Plugin__Id3v2_Tag *);
void FLAC_plugin__canonical_tag_add_id3v1(const char *filename, FLAC_Plugin__CanonicalTag *tag);
void FLAC_plugin__canonical_tag_add_id3v2(const char *filename, FLAC_Plugin__CanonicalTag *tag);
/* Returns a merged tag based on any Vorbis comments, id3v2 tag, and id3v1.
* In case of overlaps the preceding precedence applies.
*
* sep - separator to use when merging fields with same name (in VorbisComment).
* should be in UTF-8. if sep==NULL, no merging occurs, so multiple fields
* with the same name can exist.
*/
void FLAC_plugin__canonical_tag_get_combined(const char *filename, FLAC_Plugin__CanonicalTag *tag, const char *sep);
/* helpers */
wchar_t *FLAC_plugin__convert_ansi_to_wide(const char *src);
......
/* plugin_common - Routines common to several plugins
* Copyright (C) 2002,2003,2004 Josh Coalson
*
* This program 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
* of the License, or (at your option) any later version.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <stdio.h>
#include "FLAC/assert.h"
#include "id3v1.h"
#include "locale_hack.h"
/*
* Do not sort genres!!
* Last Update: 2000/04/30
*/
static const char * const FLAC_plugin__id3v1_tag_genre_table[] =
{
"Blues", /* 0 */
"Classic Rock",
"Country",
"Dance",
"Disco",
"Funk", /* 5 */
"Grunge",
"Hip-Hop",
"Jazz",
"Metal",
"New Age", /* 10 */
"Oldies",
"Other",
"Pop",
"R&B",
"Rap", /* 15 */
"Reggae",
"Rock",
"Techno",
"Industrial",
"Alternative", /* 20 */
"Ska",
"Death Metal",
"Pranks",
"Soundtrack",
"Euro-Techno", /* 25 */
"Ambient",
"Trip-Hop",
"Vocal",
"Jazz+Funk",
"Fusion", /* 30 */
"Trance",
"Classical",
"Instrumental",
"Acid",
"House", /* 35 */
"Game",
"Sound Clip",
"Gospel",
"Noise",
"Altern Rock", /* 40 */
"Bass",
"Soul",
"Punk",
"Space",
"Meditative", /* 45 */
"Instrumental Pop",
"Instrumental Rock",
"Ethnic",
"Gothic",
"Darkwave", /* 50 */
"Techno-Industrial",
"Electronic",
"Pop-Folk",
"Eurodance",
"Dream", /* 55 */
"Southern Rock",
"Comedy",
"Cult",
"Gangsta",
"Top 40", /* 60 */
"Christian Rap",
"Pop/Funk",
"Jungle",
"Native American",
"Cabaret", /* 65 */
"New Wave",
"Psychadelic",
"Rave",
"Showtunes",
"Trailer", /* 70 */
"Lo-Fi",
"Tribal",
"Acid Punk",
"Acid Jazz",
"Polka", /* 75 */
"Retro",
"Musical",
"Rock & Roll",
"Hard Rock",
"Folk", /* 80 */
"Folk/Rock",