Added MAD-based Mp3 decoder.

CQTexperiment
vspader 2006-06-19 00:39:41 +00:00
parent a1be08c901
commit 31eac8cb06
159 changed files with 119353 additions and 121 deletions

View File

@ -67,7 +67,7 @@
<key>Type</key>
<string>NSNumber&lt;Double&gt;</string>
</dict>
<key>bitRate</key>
<key>bitrate</key>
<dict>
<key>AppleEventCode</key>
<string>CoBi</string>

View File

@ -55,12 +55,12 @@
<key>Name</key>
<string>length</string>
</dict>
<key>bitRate</key>
<key>bitrate</key>
<dict>
<key>Description</key>
<string>This is the... whatever.</string>
<key>Name</key>
<string>bitRate</string>
<string>bitrate</string>
</dict>
<key>title</key>
<dict>

View File

@ -14,8 +14,13 @@
8E0AD92B0A338CFF00215AEF /* Shorten.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EA9172F0A336CC30087CDE2 /* Shorten.framework */; };
8E1296DA0A2BA9CE00443124 /* PlaylistHeaderView.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E1296D80A2BA9CE00443124 /* PlaylistHeaderView.h */; };
8E1296DB0A2BA9CE00443124 /* PlaylistHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E1296D90A2BA9CE00443124 /* PlaylistHeaderView.m */; };
8E1849C50A43DB5C0084C69D /* MAD.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E1849C40A43DB5C0084C69D /* MAD.framework */; };
8E1849C80A43DB730084C69D /* MADFile.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E1849C60A43DB730084C69D /* MADFile.h */; };
8E1849C90A43DB730084C69D /* MADFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E1849C70A43DB730084C69D /* MADFile.m */; };
8E4C7F090A0509FC003BE25F /* DragScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E4C7F070A0509FC003BE25F /* DragScrollView.m */; };
8E4CAB5B0A32251B00214C1D /* ShnFile.mm in Sources */ = {isa = PBXBuildFile; fileRef = 8E4CAB5A0A32251B00214C1D /* ShnFile.mm */; };
8E53E8610A44C11B007E5BCE /* ID3Tag.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E53E8600A44C11B007E5BCE /* ID3Tag.framework */; };
8E53E8690A44C121007E5BCE /* ID3Tag.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E53E8600A44C11B007E5BCE /* ID3Tag.framework */; };
8E6A8E2C0A0D8A68002ABE9C /* CoreAudioFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E6A8E280A0D8A68002ABE9C /* CoreAudioFile.m */; };
8E6A8E380A0D8AD8002ABE9C /* CoreAudioUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E6A8E360A0D8AD8002ABE9C /* CoreAudioUtils.m */; };
8E75756909F31D5A0080F1EE /* AppController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E75751909F31D5A0080F1EE /* AppController.m */; };
@ -100,23 +105,9 @@
8E757C7D09F32F070080F1EE /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E757C7B09F32F070080F1EE /* AudioUnit.framework */; };
8EA917300A336CC30087CDE2 /* Shorten.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EA9172F0A336CC30087CDE2 /* Shorten.framework */; };
8EB450080A2BB8B300AA711F /* Cog Help in Resources */ = {isa = PBXBuildFile; fileRef = 8EB44FF90A2BB8B300AA711F /* Cog Help */; };
8EB971790A44B74A009803E3 /* MAD.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E1849C40A43DB5C0084C69D /* MAD.framework */; };
/* End PBXBuildFile section */
/* Begin PBXBuildStyle section */
4A9504CCFFE6A4B311CA0CBA /* Debug */ = {
isa = PBXBuildStyle;
buildSettings = {
};
name = Debug;
};
4A9504CDFFE6A4B311CA0CBA /* Release */ = {
isa = PBXBuildStyle;
buildSettings = {
};
name = Release;
};
/* End PBXBuildStyle section */
/* Begin PBXCopyFilesBuildPhase section */
8E757AEC09F3265E0080F1EE /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
@ -124,6 +115,8 @@
dstPath = "";
dstSubfolderSpec = 10;
files = (
8E53E8690A44C121007E5BCE /* ID3Tag.framework in CopyFiles */,
8EB971790A44B74A009803E3 /* MAD.framework in CopyFiles */,
8E0AD92B0A338CFF00215AEF /* Shorten.framework in CopyFiles */,
8E757B4F09F326710080F1EE /* WavPack.framework in CopyFiles */,
8E757B5009F326710080F1EE /* Vorbis.framework in CopyFiles */,
@ -134,6 +127,7 @@
8E757B5609F326710080F1EE /* FLAC.framework in CopyFiles */,
8E757B5709F326710080F1EE /* OggFLAC.framework in CopyFiles */,
8E1296DA0A2BA9CE00443124 /* PlaylistHeaderView.h in CopyFiles */,
8E1849C80A43DB730084C69D /* MADFile.h in CopyFiles */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -161,9 +155,13 @@
8D1107320486CEB800E47090 /* Cog.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cog.app; sourceTree = BUILT_PRODUCTS_DIR; };
8E1296D80A2BA9CE00443124 /* PlaylistHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PlaylistHeaderView.h; sourceTree = "<group>"; };
8E1296D90A2BA9CE00443124 /* PlaylistHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PlaylistHeaderView.m; sourceTree = "<group>"; };
8E1849C40A43DB5C0084C69D /* MAD.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MAD.framework; path = Libraries/MAD/build/Release/MAD.framework; sourceTree = "<group>"; };
8E1849C60A43DB730084C69D /* MADFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MADFile.h; sourceTree = "<group>"; };
8E1849C70A43DB730084C69D /* MADFile.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MADFile.m; sourceTree = "<group>"; };
8E4C7F060A0509FC003BE25F /* DragScrollView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DragScrollView.h; sourceTree = "<group>"; };
8E4C7F070A0509FC003BE25F /* DragScrollView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = DragScrollView.m; sourceTree = "<group>"; };
8E4CAB5A0A32251B00214C1D /* ShnFile.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = ShnFile.mm; sourceTree = "<group>"; };
8E53E8600A44C11B007E5BCE /* ID3Tag.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ID3Tag.framework; path = Libraries/ID3Tag/build/Release/ID3Tag.framework; sourceTree = "<group>"; };
8E643DF20A2B585600844A28 /* GameFile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameFile.h; sourceTree = "<group>"; };
8E643DF30A2B585600844A28 /* GameFile.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GameFile.mm; sourceTree = "<group>"; };
8E6A8E270A0D8A68002ABE9C /* CoreAudioFile.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = CoreAudioFile.h; sourceTree = "<group>"; };
@ -304,6 +302,8 @@
8E757C7C09F32F070080F1EE /* AudioToolbox.framework in Frameworks */,
8E757C7D09F32F070080F1EE /* AudioUnit.framework in Frameworks */,
8EA917300A336CC30087CDE2 /* Shorten.framework in Frameworks */,
8E1849C50A43DB5C0084C69D /* MAD.framework in Frameworks */,
8E53E8610A44C11B007E5BCE /* ID3Tag.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -505,6 +505,8 @@
8E75755809F31D5A0080F1EE /* WavPackFile.m */,
8E643DF20A2B585600844A28 /* GameFile.h */,
8E643DF30A2B585600844A28 /* GameFile.mm */,
8E1849C60A43DB730084C69D /* MADFile.h */,
8E1849C70A43DB730084C69D /* MADFile.m */,
);
path = SoundFile;
sourceTree = "<group>";
@ -566,6 +568,8 @@
8E757C0A09F32EDC0080F1EE /* Codec Frameworks */ = {
isa = PBXGroup;
children = (
8E53E8600A44C11B007E5BCE /* ID3Tag.framework */,
8E1849C40A43DB5C0084C69D /* MAD.framework */,
8EA9172F0A336CC30087CDE2 /* Shorten.framework */,
8E75775309F31F750080F1EE /* WavPack.framework */,
8E75775009F31F6B0080F1EE /* Vorbis.framework */,
@ -594,8 +598,6 @@
);
buildRules = (
);
buildSettings = {
};
dependencies = (
);
name = Cog;
@ -610,12 +612,6 @@
29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject;
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "Cog" */;
buildSettings = {
};
buildStyles = (
4A9504CCFFE6A4B311CA0CBA /* Debug */,
4A9504CDFFE6A4B311CA0CBA /* Release */,
);
hasScannedForEncodings = 1;
mainGroup = 29B97314FDCFA39411CA2CEA /* Cog */;
projectDirPath = "";
@ -711,6 +707,7 @@
8E6A8E380A0D8AD8002ABE9C /* CoreAudioUtils.m in Sources */,
8E1296DB0A2BA9CE00443124 /* PlaylistHeaderView.m in Sources */,
8E4CAB5B0A32251B00214C1D /* ShnFile.mm in Sources */,
8E1849C90A43DB730084C69D /* MADFile.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -764,7 +761,11 @@
"$(SRCROOT)/Libraries/WavPack/build/Release",
"$(SRCROOT)/Libraries/SndFile/build/Release",
"$(SRCROOT)/Libraries/GME/build/Release",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)",
);
FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/Libraries/MAD/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)/Libraries/ID3Tag/build/Release\"";
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
@ -802,7 +803,11 @@
"$(SRCROOT)/Libraries/WavPack/build/Release",
"$(SRCROOT)/Libraries/SndFile/build/Release",
"$(SRCROOT)/Libraries/GME/build/Release",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_2)",
);
FRAMEWORK_SEARCH_PATHS_QUOTED_1 = "\"$(SRCROOT)/Libraries/MAD/build/Release\"";
FRAMEWORK_SEARCH_PATHS_QUOTED_2 = "\"$(SRCROOT)/Libraries/ID3Tag/build/Release\"";
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
INFOPLIST_FILE = Info.plist;

View File

@ -95,7 +95,17 @@
},
{CLASS = PlaylistEntry; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {shufflePlaylist = id; sortByPath = id; };
ACTIONS = {
shufflePlaylist = id;
sortByPath = id;
takeBoolForAlbum = id;
takeBoolForArtist = id;
takeBoolForGenre = id;
takeBoolForLength = id;
takeBoolForTitle = id;
takeBoolForTrack = id;
takeBoolForYear = id;
};
CLASS = PlaylistView;
LANGUAGE = ObjC;
OUTLETS = {

View File

@ -9,14 +9,14 @@
<key>1063</key>
<string>0 228 136 49 0 0 1024 746 </string>
<key>29</key>
<string>98 651 409 44 0 0 1024 746 </string>
<string>72 679 409 44 0 0 1024 746 </string>
<key>463</key>
<string>358 426 308 187 0 0 1024 746 </string>
<key>513</key>
<string>639 190 125 137 0 0 1024 746 </string>
</dict>
<key>IBFramework Version</key>
<string>443.0</string>
<string>446.1</string>
<key>IBLockedObjects</key>
<array>
<integer>484</integer>
@ -31,9 +31,9 @@
<key>IBOpenObjects</key>
<array>
<integer>823</integer>
<integer>21</integer>
<integer>513</integer>
<integer>29</integer>
<integer>513</integer>
<integer>21</integer>
<integer>463</integer>
<integer>1063</integer>
</array>

Binary file not shown.

View File

@ -62,21 +62,6 @@
8EBDF22D09F2884B004F2528 /* mpegAudioHeader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8EBDF1DA09F2884B004F2528 /* mpegAudioHeader.h */; };
/* End PBXBuildFile section */
/* Begin PBXBuildStyle section */
014CEA440018CDF011CA2923 /* Debug */ = {
isa = PBXBuildStyle;
buildSettings = {
};
name = Debug;
};
014CEA450018CDF011CA2923 /* Release */ = {
isa = PBXBuildStyle;
buildSettings = {
};
name = Release;
};
/* End PBXBuildStyle section */
/* Begin PBXFileReference section */
089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
@ -345,8 +330,6 @@
);
buildRules = (
);
buildSettings = {
};
dependencies = (
);
name = DecMPA;
@ -361,12 +344,6 @@
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 1DEB91B108733DA50010E9CD /* Build configuration list for PBXProject "DecMPA" */;
buildSettings = {
};
buildStyles = (
014CEA440018CDF011CA2923 /* Debug */,
014CEA450018CDF011CA2923 /* Release */,
);
hasScannedForEncodings = 1;
mainGroup = 0867D691FE84028FC02AAC07 /* DecMPA */;
productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;

Binary file not shown.

View File

@ -0,0 +1,83 @@
libid3tag - ID3 tag manipulation library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: CHANGES,v 1.11 2004/02/17 02:04:10 rob Exp $
===============================================================================
Version 0.15.1 (beta)
* Updated to autoconf 2.59, automake 1.8.2, libtool 1.5.2.
* Fixed a potential problem in file.c when writing empty ID3v2 tags.
* Added new id3_field_gettextencoding() API routine.
Version 0.15.0 (beta)
* Updated to autoconf 2.57, automake 1.7.5, libtool 1.4.3.
* Added new id3_tag_version(), id3_tag_options(), id3_tag_setlength(),
id3_frame_field(), id3_field_getlatin1(), id3_field_getfulllatin1(),
id3_genre_index(), id3_genre_number(), id3_latin1_ucs4duplicate(),
id3_utf16_ucs4duplicate(), and id3_utf8_ucs4duplicate() API routines.
* Properly exposed the id3_frame_new(), id3_frame_delete(), and
id3_field_type() API routines.
* Fixed a possible segmentation fault rendering ID3v1 tags when a tag
field exceeds the field length limit.
* Fixed a problem whereby the file interface could try to seek and read
data from a non-seekable stream, unrecoverably losing data from the
stream. (N.B. the fix does not work under Win32.)
* Fixed a problem reading ID3v2.2 frames which corrupted their frame IDs
and caused them not to be re-rendered.
* Improved rendering of the ID3v1 genre field from ID3v2 genre
names/numbers. The genre "Other" is used in place of non-translatable
genres.
* Rendering an empty ID3v1 tag now properly returns 0 length even when a
null buffer pointer is passed.
* Changed the file implementation to maintain information about present
but unparseable tags, instead of ignoring all tags and returning an
error.
* Added an external dependency on zlib (libz), which is no longer
included.
* Changed to build a shared library by default.
* Changed to use native Cygwin build by default; give --host=mingw32 to
`configure' to use MinGW (and avoid a dependency on the Cygwin DLL).
Version 0.14.2 (beta)
* Changed Cygwin builds to use MinGW; resulting Win32 executables no
longer have a dependency on Cygwin DLLs.
Version 0.14.1 (beta)
* Updated config.guess and config.sub to latest upstream versions.
* Enabled libtool versioning rather than release numbering.
* Renamed `libid3' to `libid3tag' and enabled installation as a separate
library.
* Several other small fixes.
Version 0.14.0 (beta)
* Added a new ID3 tag manipulation library (libid3). The required zlib
support is provided either by the host system or by the included static
library implementation (libz).
* Improved MSVC++ portability and added MSVC++ project files.
===============================================================================

View File

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -0,0 +1,21 @@
libid3tag - ID3 tag manipulation library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
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
If you would like to negotiate alternate licensing terms, you may do
so by contacting: Underbit Technologies, Inc. <info@underbit.com>

View File

@ -0,0 +1,28 @@
libid3tag - ID3 tag manipulation library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: CREDITS,v 1.2 2004/01/23 09:41:32 rob Exp $
===============================================================================
AUTHOR
Except where otherwise noted, all code was authored by:
Robert Leslie <rob@underbit.com>
CONTRIBUTORS
Significant contributions have been incorporated with thanks to:
Mark Malson <mark@mmalson.com>
2002/10/09: frame.c
- Reported problem reading ID3v2.2 tag frames.
Brett Paterson <brett@fmod.org>
2001/10/28: global.h
- Reported missing <assert.h> et al. under MS Embedded Visual C.
===============================================================================

View File

@ -0,0 +1,183 @@
Basic Installation
==================
These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, a file
`config.cache' that saves the results of its tests to speed up
reconfiguring, and a file `config.log' containing compiler output
(useful mainly for debugging `configure').
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If at some point `config.cache'
contains results you don't want to keep, you may remove or edit it.
The file `configure.in' is used to create `configure' by a program
called `autoconf'. You only need `configure.in' if you want to change
it or regenerate `configure' using a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using
a Bourne-compatible shell, you can do that on the command line like
this:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
Or on systems that have the `env' program, you can do it like this:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not supports the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory. After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=PATH' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on. Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
CPU-COMPANY-SYSTEM
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.
If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Operation Controls
==================
`configure' recognizes the following options to control how it
operates.
`--cache-file=FILE'
Use and save the results of the tests in FILE instead of
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`configure' also accepts some other, not widely useful, options.

View File

@ -0,0 +1,123 @@
##
## libid3tag - ID3 tag manipulation library
## Copyright (C) 2000-2004 Underbit Technologies, Inc.
##
## 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
##
## $Id: Makefile.am,v 1.26 2004/02/17 02:11:28 rob Exp $
##
## Process this file with automake to produce Makefile.in
SUBDIRS =
DIST_SUBDIRS = msvc++
lib_LTLIBRARIES = libid3tag.la
include_HEADERS = id3tag.h
## From the libtool documentation on library versioning:
##
## CURRENT
## The most recent interface number that this library implements.
##
## REVISION
## The implementation number of the CURRENT interface.
##
## AGE
## The difference between the newest and oldest interfaces that this
## library implements. In other words, the library implements all the
## interface numbers in the range from number `CURRENT - AGE' to
## `CURRENT'.
##
## If two libraries have identical CURRENT and AGE numbers, then the
## dynamic linker chooses the library with the greater REVISION number.
##
## 1. Start with version information of `0:0:0' for each libtool library.
##
## 2. Update the version information only immediately before a public
## release of your software. More frequent updates are unnecessary,
## and only guarantee that the current interface number gets larger
## faster.
##
## 3. If the library source code has changed at all since the last
## update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
##
## 4. If any interfaces have been added, removed, or changed since the
## last update, increment CURRENT, and set REVISION to 0.
##
## 5. If any interfaces have been added since the last public release,
## then increment AGE.
##
## 6. If any interfaces have been removed since the last public release,
## then set AGE to 0.
version_current = 3
version_revision = 0
version_age = 3
version_info = $(version_current):$(version_revision):$(version_age)
EXTRA_DIST = genre.dat.sed \
CHANGES COPYRIGHT CREDITS README TODO VERSION
if DEBUG
debug = debug.c debug.h
else
debug =
endif
libid3tag_la_SOURCES = version.c ucs4.c latin1.c utf16.c utf8.c \
parse.c render.c field.c frametype.c compat.c \
genre.c frame.c crc.c util.c tag.c file.c \
version.h ucs4.h latin1.h utf16.h utf8.h \
parse.h render.h field.h frametype.h compat.h \
genre.h frame.h crc.h util.h tag.h file.h \
id3tag.h global.h genre.dat $(debug)
EXTRA_libid3tag_la_SOURCES = \
frametype.gperf compat.gperf genre.dat.in \
debug.c debug.h
libid3tag_la_LDFLAGS = -version-info $(version_info)
BUILT_SOURCES = frametype.c compat.c genre.dat
$(srcdir)/frametype.c: $(srcdir)/frametype.gperf Makefile.am
cd $(srcdir) && \
gperf -tCcTonD -K id -N id3_frametype_lookup -s -3 -k '*' \
frametype.gperf | \
sed -e 's/\(struct id3_frametype\);/\1/' | \
sed -e '/\$$''Id: /s/\$$//g' >frametype.c
$(srcdir)/compat.c: $(srcdir)/compat.gperf Makefile.am
cd $(srcdir) && \
gperf -tCcTonD -K id -N id3_compat_lookup -s -3 -k '*' \
compat.gperf | \
sed -e 's/\(struct id3_compat\);/\1/' | \
sed -e '/\$$''Id: /s/\$$//g' >compat.c
$(srcdir)/genre.dat: $(srcdir)/genre.dat.in $(srcdir)/genre.dat.sed Makefile.am
cd $(srcdir) && \
sed -n -f genre.dat.sed genre.dat.in | \
sed -e '/\$$''Id: /s/\$$//g' >genre.dat
libtool: $(LIBTOOL_DEPS)
$(SHELL) ./config.status --recheck
again:
$(MAKE) clean
$(MAKE)
.PHONY: again

View File

@ -0,0 +1,797 @@
# Makefile.in generated by automake 1.8.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
SOURCES = $(libid3tag_la_SOURCES) $(EXTRA_libid3tag_la_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_triplet = @host@
DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/config.h.in $(srcdir)/libid3tag.list.in \
$(top_srcdir)/configure COPYING INSTALL TODO config.guess \
config.sub depcomp install-sh ltmain.sh missing mkinstalldirs
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno configure.status.lineno
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES = libid3tag.list
am__installdirs = $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libid3tag_la_LIBADD =
am__libid3tag_la_SOURCES_DIST = version.c ucs4.c latin1.c utf16.c \
utf8.c parse.c render.c field.c frametype.c compat.c genre.c \
frame.c crc.c util.c tag.c file.c version.h ucs4.h latin1.h \
utf16.h utf8.h parse.h render.h field.h frametype.h compat.h \
genre.h frame.h crc.h util.h tag.h file.h id3tag.h global.h \
genre.dat debug.c debug.h
@DEBUG_TRUE@am__objects_1 = debug.lo
am_libid3tag_la_OBJECTS = version.lo ucs4.lo latin1.lo utf16.lo \
utf8.lo parse.lo render.lo field.lo frametype.lo compat.lo \
genre.lo frame.lo crc.lo util.lo tag.lo file.lo \
$(am__objects_1)
libid3tag_la_OBJECTS = $(am_libid3tag_la_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/compat.Plo ./$(DEPDIR)/crc.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/debug.Plo ./$(DEPDIR)/field.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/file.Plo ./$(DEPDIR)/frame.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/frametype.Plo ./$(DEPDIR)/genre.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/latin1.Plo ./$(DEPDIR)/parse.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/render.Plo ./$(DEPDIR)/tag.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/ucs4.Plo ./$(DEPDIR)/utf16.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/utf8.Plo ./$(DEPDIR)/util.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/version.Plo
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libid3tag_la_SOURCES) $(EXTRA_libid3tag_la_SOURCES)
DIST_SOURCES = $(am__libid3tag_la_SOURCES_DIST) \
$(EXTRA_libid3tag_la_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-exec-recursive install-info-recursive \
install-recursive installcheck-recursive installdirs-recursive \
pdf-recursive ps-recursive uninstall-info-recursive \
uninstall-recursive
includeHEADERS_INSTALL = $(INSTALL_HEADER)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
{ test ! -d $(distdir) \
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -fr $(distdir); }; }
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_FALSE = @DEBUG_FALSE@
DEBUG_TRUE = @DEBUG_TRUE@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
SUBDIRS =
DIST_SUBDIRS = msvc++
lib_LTLIBRARIES = libid3tag.la
include_HEADERS = id3tag.h
version_current = 3
version_revision = 0
version_age = 3
version_info = $(version_current):$(version_revision):$(version_age)
EXTRA_DIST = genre.dat.sed \
CHANGES COPYRIGHT CREDITS README TODO VERSION
@DEBUG_FALSE@debug =
@DEBUG_TRUE@debug = debug.c debug.h
libid3tag_la_SOURCES = version.c ucs4.c latin1.c utf16.c utf8.c \
parse.c render.c field.c frametype.c compat.c \
genre.c frame.c crc.c util.c tag.c file.c \
version.h ucs4.h latin1.h utf16.h utf8.h \
parse.h render.h field.h frametype.h compat.h \
genre.h frame.h crc.h util.h tag.h file.h \
id3tag.h global.h genre.dat $(debug)
EXTRA_libid3tag_la_SOURCES = \
frametype.gperf compat.gperf genre.dat.in \
debug.c debug.h
libid3tag_la_LDFLAGS = -version-info $(version_info)
BUILT_SOURCES = frametype.c compat.c genre.dat
all: $(BUILT_SOURCES) config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
.SUFFIXES:
.SUFFIXES: .c .lo .o .obj
am--refresh:
@:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
cd $(srcdir) && $(AUTOMAKE) --foreign \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
echo ' $(SHELL) ./config.status'; \
$(SHELL) ./config.status;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(top_srcdir)/configure: $(am__configure_deps)
cd $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
config.h: stamp-h1
@if test ! -f $@; then \
rm -f stamp-h1; \
$(MAKE) stamp-h1; \
else :; fi
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@rm -f stamp-h1
cd $(top_builddir) && $(SHELL) ./config.status config.h
$(srcdir)/config.h.in: $(am__configure_deps)
cd $(top_srcdir) && $(AUTOHEADER)
rm -f stamp-h1
touch $@
distclean-hdr:
-rm -f config.h stamp-h1
libid3tag.list: $(top_builddir)/config.status $(srcdir)/libid3tag.list.in
cd $(top_builddir) && $(SHELL) ./config.status $@
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
$(mkdir_p) $(DESTDIR)$(libdir)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f"; \
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
p="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \
$(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
done
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
test "$$dir" = "$$p" && dir=.; \
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
libid3tag.la: $(libid3tag_la_OBJECTS) $(libid3tag_la_DEPENDENCIES)
$(LINK) -rpath $(libdir) $(libid3tag_la_LDFLAGS) $(libid3tag_la_OBJECTS) $(libid3tag_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compat.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/debug.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/field.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/file.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frametype.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/genre.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/latin1.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/render.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tag.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ucs4.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf16.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/util.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@
.c.o:
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
$(mkdir_p) $(DESTDIR)$(includedir)
@list='$(include_HEADERS)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(includedir)/$$f"; \
$(includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(includedir)/$$f; \
done
uninstall-includeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(include_HEADERS)'; for p in $$list; do \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " rm -f $(DESTDIR)$(includedir)/$$f"; \
rm -f $(DESTDIR)$(includedir)/$$f; \
done
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@set fnord $$MAKEFLAGS; amf=$$2; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
@set fnord $$MAKEFLAGS; amf=$$2; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
if (etags --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
else \
include_option=--include; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -f $$subdir/TAGS && \
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)$$tags$$unique" \
|| $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(am__remove_distdir)
mkdir $(distdir)
$(mkdir_p) $(distdir)/.
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| mkdir "$(distdir)/$$subdir" \
|| exit 1; \
(cd $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="../$(top_distdir)" \
distdir="../$(distdir)/$$subdir" \
distdir) \
|| exit 1; \
fi; \
done
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r $(distdir)
dist-gzip: distdir
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
dist-bzip2: distdir
$(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-tarZ: distdir
$(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z
$(am__remove_distdir)
dist-shar: distdir
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
$(am__remove_distdir)
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
$(am__remove_distdir)
dist dist-all: distdir
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\
*.tar.bz2*) \
bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\
*.shar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& cd $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
distuninstallcheck \
&& chmod -R a-w "$$dc_install_base" \
&& ({ \
(cd ../.. && $(mkdir_p) "$$dc_destdir") \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
} || { rm -rf "$$dc_destdir"; exit 1; }) \
&& rm -rf "$$dc_destdir" \
&& $(MAKE) $(AM_MAKEFLAGS) dist \
&& rm -rf $(DIST_ARCHIVES) \
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
$(am__remove_distdir)
@(echo "$(distdir) archives ready for distribution: "; \
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
distuninstallcheck:
@cd $(distuninstallcheck_dir) \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
fi ; \
$(distuninstallcheck_listfiles) ; \
exit 1; } >&2
distcleancheck: distclean
@if test '$(srcdir)' = . ; then \
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
exit 1 ; \
fi
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left in build directory after distclean:" ; \
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
check: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) check-recursive
all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h
installdirs: installdirs-recursive
installdirs-am:
$(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
install: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
clean: clean-recursive
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
mostlyclean-am
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-hdr distclean-libtool distclean-tags
dvi: dvi-recursive
dvi-am:
html: html-recursive
info: info-recursive
info-am:
install-data-am: install-includeHEADERS
install-exec-am: install-libLTLIBRARIES
install-info: install-info-recursive
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-recursive
pdf-am:
ps: ps-recursive
ps-am:
uninstall-am: uninstall-includeHEADERS uninstall-info-am \
uninstall-libLTLIBRARIES
uninstall-info: uninstall-info-recursive
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
check-am clean clean-generic clean-libLTLIBRARIES \
clean-libtool clean-recursive ctags ctags-recursive dist \
dist-all dist-bzip2 dist-gzip dist-shar dist-tarZ dist-zip \
distcheck distclean distclean-compile distclean-generic \
distclean-hdr distclean-libtool distclean-recursive \
distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-exec install-exec-am \
install-includeHEADERS install-info install-info-am \
install-libLTLIBRARIES install-man install-strip installcheck \
installcheck-am installdirs installdirs-am maintainer-clean \
maintainer-clean-generic maintainer-clean-recursive \
mostlyclean mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
tags tags-recursive uninstall uninstall-am \
uninstall-includeHEADERS uninstall-info-am \
uninstall-libLTLIBRARIES
$(srcdir)/frametype.c: $(srcdir)/frametype.gperf Makefile.am
cd $(srcdir) && \
gperf -tCcTonD -K id -N id3_frametype_lookup -s -3 -k '*' \
frametype.gperf | \
sed -e 's/\(struct id3_frametype\);/\1/' | \
sed -e '/\$$''Id: /s/\$$//g' >frametype.c
$(srcdir)/compat.c: $(srcdir)/compat.gperf Makefile.am
cd $(srcdir) && \
gperf -tCcTonD -K id -N id3_compat_lookup -s -3 -k '*' \
compat.gperf | \
sed -e 's/\(struct id3_compat\);/\1/' | \
sed -e '/\$$''Id: /s/\$$//g' >compat.c
$(srcdir)/genre.dat: $(srcdir)/genre.dat.in $(srcdir)/genre.dat.sed Makefile.am
cd $(srcdir) && \
sed -n -f genre.dat.sed genre.dat.in | \
sed -e '/\$$''Id: /s/\$$//g' >genre.dat
libtool: $(LIBTOOL_DEPS)
$(SHELL) ./config.status --recheck
again:
$(MAKE) clean
$(MAKE)
.PHONY: again
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -0,0 +1,102 @@
libid3tag - ID3 tag manipulation library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: README,v 1.5 2004/01/23 09:41:32 rob Exp $
===============================================================================
INTRODUCTION
libid3tag is a library for reading and (eventually) writing ID3 tags, both
ID3v1 and the various versions of ID3v2.
See the file `id3tag.h' for the current library interface.
This package uses GNU libtool to arrange for zlib to be linked
automatically when you link your programs with this library. If you aren't
using GNU libtool, in some cases you may need to link with zlib
explicitly:
${link_command} ... -lid3tag -lz
===============================================================================
BUILDING AND INSTALLING
Note that this library depends on zlib 1.1.4 or later. If you don't have
zlib already, you can obtain it from:
http://www.gzip.org/zlib/
You must have zlib installed before you can build this package.
Windows Platforms
libid3tag can be built under Windows using either MSVC++ or Cygwin. A
MSVC++ project file can be found under the `msvc++' subdirectory.
To build libid3tag using Cygwin, you will first need to install the Cygwin
tools:
http://www.cygwin.com/
You may then proceed with the following POSIX instructions within the
Cygwin shell.
Note that by default Cygwin will build a library that depends on the
Cygwin DLL. You can use MinGW to build a library that does not depend on
the Cygwin DLL. To do so, give the option --host=mingw32 to `configure'.
Be certain you also link with a MinGW version of zlib.
POSIX Platforms (including Cygwin)
The code is distributed with a `configure' script that will generate for
you a `Makefile' and a `config.h' for your platform. See the file
`INSTALL' for generic instructions.
The specific options you may want to give `configure' are:
--disable-debugging do not compile with debugging support, and
use more optimizations
--disable-shared do not build a shared library
By default the package will build a shared library if possible for your
platform. If you want only a static library, use --disable-shared.
If zlib is installed in an unusual place or `configure' can't find it, you
may need to indicate where it is:
./configure ... CPPFLAGS="-I${include_dir}" LDFLAGS="-L${lib_dir}"
where ${include_dir} and ${lib_dir} are the locations of the installed
header and library files, respectively.
Experimenting and Developing
Further options for `configure' that may be useful to developers and
experimenters are:
--enable-debugging enable diagnostic debugging support and
debugging symbols
--enable-profiling generate `gprof' profiling code
===============================================================================
COPYRIGHT
Please read the `COPYRIGHT' file for copyright and warranty information.
Also, the file `COPYING' contains the full text of the GNU GPL.
Send inquiries, comments, bug reports, suggestions, patches, etc. to:
Underbit Technologies, Inc. <support@underbit.com>
See also the MAD home page on the Web:
http://www.underbit.com/products/mad/
===============================================================================

View File

@ -0,0 +1,12 @@
libid3tag - ID3 tag manipulation library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: TODO,v 1.2 2004/01/23 09:41:32 rob Exp $
===============================================================================
libid3tag:
- finish file API
- fix API headers

View File

@ -0,0 +1,6 @@
0.15.1b
configure.ac:24
id3tag.h:338-341
msvc++/config.h:59,65,71
Makefile.am:63-65

6817
Libraries/ID3Tag/Files/aclocal.m4 vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,503 @@
/* C code produced by gperf version 3.0.1 */
/* Command-line: gperf -tCcTonD -K id -N id3_compat_lookup -s -3 -k '*' compat.gperf */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
/* The character set is not based on ISO-646. */
error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
#endif
#line 1 "compat.gperf"
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* Id: compat.gperf,v 1.11 2004/01/23 09:41:32 rob Exp
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include <string.h>
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include "id3tag.h"
# include "compat.h"
# include "frame.h"
# include "field.h"
# include "parse.h"
# include "ucs4.h"
# define EQ(id) #id, 0
# define OBSOLETE 0, 0
# define TX(id) #id, translate_##id
static id3_compat_func_t translate_TCON;
#define TOTAL_KEYWORDS 73
#define MIN_WORD_LENGTH 3
#define MAX_WORD_LENGTH 4
#define MIN_HASH_VALUE 6
#define MAX_HASH_VALUE 127
/* maximum key range = 122, duplicates = 0 */
#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static unsigned int
hash (str, len)
register const char *str;
register unsigned int len;
{
static const unsigned char asso_values[] =
{
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 64,
58, 20, 15, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 10, 18, 3, 6, 1,
47, 0, 128, 42, 62, 30, 31, 0, 19, 52,
10, 24, 8, 30, 5, 3, 30, 8, 25, 47,
3, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
128, 128, 128, 128, 128, 128, 128
};
register int hval = 0;
switch (len)
{
default:
hval += asso_values[(unsigned char)str[3]];
/*FALLTHROUGH*/
case 3:
hval += asso_values[(unsigned char)str[2]];
/*FALLTHROUGH*/
case 2:
hval += asso_values[(unsigned char)str[1]+1];
/*FALLTHROUGH*/
case 1:
hval += asso_values[(unsigned char)str[0]];
break;
}
return hval;
}
#ifdef __GNUC__
__inline
#endif
const struct id3_compat *
id3_compat_lookup (str, len)
register const char *str;
register unsigned int len;
{
static const struct id3_compat wordlist[] =
{
#line 97 "compat.gperf"
{"TLE", EQ(TLEN) /* Length */},
#line 68 "compat.gperf"
{"ETC", EQ(ETCO) /* Event timing codes */},
#line 126 "compat.gperf"
{"ULT", EQ(USLT) /* Unsynchronised lyric/text transcription */},
#line 123 "compat.gperf"
{"TYE", OBSOLETE /* Year [obsolete] */},
#line 92 "compat.gperf"
{"TFT", EQ(TFLT) /* File type */},
#line 84 "compat.gperf"
{"TCM", EQ(TCOM) /* Composer */},
#line 66 "compat.gperf"
{"EQU", OBSOLETE /* Equalization [obsolete] */},
#line 63 "compat.gperf"
{"COM", EQ(COMM) /* Comments */},
#line 130 "compat.gperf"
{"WCM", EQ(WCOM) /* Commercial information */},
#line 96 "compat.gperf"
{"TLA", EQ(TLAN) /* Language(s) */},
#line 88 "compat.gperf"
{"TDA", OBSOLETE /* Date [obsolete] */},
#line 124 "compat.gperf"
{"TYER", OBSOLETE /* Year [obsolete] */},
#line 83 "compat.gperf"
{"TBP", EQ(TBPM) /* BPM (beats per minute) */},
#line 87 "compat.gperf"
{"TCR", EQ(TCOP) /* Copyright message */},
#line 104 "compat.gperf"
{"TOT", EQ(TOAL) /* Original album/movie/show title */},
#line 89 "compat.gperf"
{"TDAT", OBSOLETE /* Date [obsolete] */},
#line 67 "compat.gperf"
{"EQUA", OBSOLETE /* Equalization [obsolete] */},
#line 102 "compat.gperf"
{"TOR", EQ(TDOR) /* Original release year [obsolete] */},
#line 131 "compat.gperf"
{"WCP", EQ(WCOP) /* Copyright/legal information */},
#line 99 "compat.gperf"
{"TOA", EQ(TOPE) /* Original artist(s)/performer(s) */},
#line 78 "compat.gperf"
{"RVA", OBSOLETE /* Relative volume adjustment [obsolete] */},
#line 120 "compat.gperf"
{"TT3", EQ(TIT3) /* Subtitle/description refinement */},
#line 98 "compat.gperf"
{"TMT", EQ(TMED) /* Media type */},
#line 76 "compat.gperf"
{"POP", EQ(POPM) /* Popularimeter */},
#line 74 "compat.gperf"
{"MLL", EQ(MLLT) /* MPEG location lookup table */},
#line 79 "compat.gperf"
{"RVAD", OBSOLETE /* Relative volume adjustment [obsolete] */},
#line 65 "compat.gperf"
{"CRM", OBSOLETE /* Encrypted meta frame [obsolete] */},
#line 128 "compat.gperf"
{"WAR", EQ(WOAR) /* Official artist/performer webpage */},
#line 80 "compat.gperf"
{"SLT", EQ(SYLT) /* Synchronised lyric/text */},
#line 81 "compat.gperf"
{"STC", EQ(SYTC) /* Synchronised tempo codes */},
#line 95 "compat.gperf"
{"TKE", EQ(TKEY) /* Initial key */},
#line 111 "compat.gperf"
{"TRC", EQ(TSRC) /* ISRC (international standard recording code) */},
#line 109 "compat.gperf"
{"TPA", EQ(TPOS) /* Part of a set */},
#line 117 "compat.gperf"
{"TSS", EQ(TSSE) /* Software/hardware and settings used for encoding */},
#line 112 "compat.gperf"
{"TRD", OBSOLETE /* Recording dates [obsolete] */},
#line 64 "compat.gperf"
{"CRA", EQ(AENC) /* Audio encryption */},
#line 108 "compat.gperf"
{"TP4", EQ(TPE4) /* Interpreted, remixed, or otherwise modified by */},
#line 125 "compat.gperf"
{"UFI", EQ(UFID) /* Unique file identifier */},
#line 101 "compat.gperf"
{"TOL", EQ(TOLY) /* Original lyricist(s)/text writer(s) */},
#line 110 "compat.gperf"
{"TPB", EQ(TPUB) /* Publisher */},
#line 73 "compat.gperf"
{"MCI", EQ(MCDI) /* Music CD identifier */},
#line 107 "compat.gperf"
{"TP3", EQ(TPE3) /* Conductor/performer refinement */},
#line 132 "compat.gperf"
{"WPB", EQ(WPUB) /* Publishers official webpage */},
#line 113 "compat.gperf"
{"TRDA", OBSOLETE /* Recording dates [obsolete] */},
#line 115 "compat.gperf"
{"TSI", OBSOLETE /* Size [obsolete] */},
#line 90 "compat.gperf"
{"TDY", EQ(TDLY) /* Playlist delay */},
#line 82 "compat.gperf"
{"TAL", EQ(TALB) /* Album/movie/show title */},
#line 116 "compat.gperf"
{"TSIZ", OBSOLETE /* Size [obsolete] */},
#line 129 "compat.gperf"
{"WAS", EQ(WOAS) /* Official audio source webpage */},
#line 121 "compat.gperf"
{"TXT", EQ(TEXT) /* Lyricist/text writer */},
#line 62 "compat.gperf"
{"CNT", EQ(PCNT) /* Play counter */},
#line 100 "compat.gperf"
{"TOF", EQ(TOFN) /* Original filename */},
#line 85 "compat.gperf"
{"TCO", TX(TCON) /* Content type */},
#line 114 "compat.gperf"
{"TRK", EQ(TRCK) /* Track number/position in set */},
#line 119 "compat.gperf"
{"TT2", EQ(TIT2) /* Title/songname/content description */},
#line 93 "compat.gperf"
{"TIM", OBSOLETE /* Time [obsolete] */},
#line 94 "compat.gperf"
{"TIME", OBSOLETE /* Time [obsolete] */},
#line 103 "compat.gperf"
{"TORY", EQ(TDOR) /* Original release year [obsolete] */},
#line 91 "compat.gperf"
{"TEN", EQ(TENC) /* Encoded by */},
#line 118 "compat.gperf"
{"TT1", EQ(TIT1) /* Content group description */},
#line 127 "compat.gperf"
{"WAF", EQ(WOAF) /* Official audio file webpage */},
#line 75 "compat.gperf"
{"PIC", EQ(APIC) /* Attached picture */},
#line 122 "compat.gperf"
{"TXX", EQ(TXXX) /* User defined text information frame */},
#line 133 "compat.gperf"
{"WXX", EQ(WXXX) /* User defined URL link frame */},
#line 86 "compat.gperf"
{"TCON", TX(TCON) /* Content type */},
#line 77 "compat.gperf"
{"REV", EQ(RVRB) /* Reverb */},
#line 106 "compat.gperf"
{"TP2", EQ(TPE2) /* Band/orchestra/accompaniment */},
#line 105 "compat.gperf"
{"TP1", EQ(TPE1) /* Lead performer(s)/soloist(s) */},
#line 61 "compat.gperf"
{"BUF", EQ(RBUF) /* Recommended buffer size */},
#line 70 "compat.gperf"
{"IPL", EQ(TIPL) /* Involved people list */},
#line 69 "compat.gperf"
{"GEO", EQ(GEOB) /* General encapsulated object */},
#line 72 "compat.gperf"
{"LNK", EQ(LINK) /* Linked information */},
#line 71 "compat.gperf"
{"IPLS", EQ(TIPL) /* Involved people list */}
};
static const short lookup[] =
{
-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, -1,
21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-1, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, -1, -1, 50, -1, 51, 52, -1, 53, 54, 55, 56, -1,
57, 58, 59, 60, -1, 61, -1, 62, -1, -1, 63, -1, 64, -1,
-1, 65, -1, 66, -1, -1, -1, -1, -1, 67, -1, 68, -1, 69,
-1, 70, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 71, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, 72
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
{
register int key = hash (str, len);
if (key <= MAX_HASH_VALUE && key >= 0)
{
register int index = lookup[key];
if (index >= 0)
{
register const char *s = wordlist[index].id;
if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
return &wordlist[index];
}
}
}
return 0;
}
#line 134 "compat.gperf"
static
int translate_TCON(struct id3_frame *frame, char const *oldid,
id3_byte_t const *data, id3_length_t length)
{
id3_byte_t const *end;
enum id3_field_textencoding encoding;
id3_ucs4_t *string = 0, *ptr, *endptr;
int result = 0;
/* translate old TCON syntax into multiple strings */
assert(frame->nfields == 2);
encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;
end = data + length;
if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding) == -1)
goto fail;
string = id3_parse_string(&data, end - data, encoding, 0);
if (string == 0)
goto fail;
ptr = string;
while (*ptr == '(') {
if (*++ptr == '(')
break;
endptr = ptr;
while (*endptr && *endptr != ')')
++endptr;
if (*endptr)
*endptr++ = 0;
if (id3_field_addstring(&frame->fields[1], ptr) == -1)
goto fail;
ptr = endptr;
}
if (*ptr && id3_field_addstring(&frame->fields[1], ptr) == -1)
goto fail;
if (0) {
fail:
result = -1;
}
if (string)
free(string);
return result;
}
/*
* NAME: compat->fixup()
* DESCRIPTION: finish compatibility translations
*/
int id3_compat_fixup(struct id3_tag *tag)
{
struct id3_frame *frame;
unsigned int index;
id3_ucs4_t timestamp[17] = { 0 };
int result = 0;
/* create a TDRC frame from obsolete TYER/TDAT/TIME frames */
/*
* TYE/TYER: YYYY
* TDA/TDAT: DDMM
* TIM/TIME: HHMM
*
* TDRC: yyyy-MM-ddTHH:mm
*/
index = 0;
while ((frame = id3_tag_findframe(tag, ID3_FRAME_OBSOLETE, index++))) {
char const *id;
id3_byte_t const *data, *end;
id3_length_t length;
enum id3_field_textencoding encoding;
id3_ucs4_t *string;
id = id3_field_getframeid(&frame->fields[0]);
assert(id);
if (strcmp(id, "TYER") != 0 && strcmp(id, "YTYE") != 0 &&
strcmp(id, "TDAT") != 0 && strcmp(id, "YTDA") != 0 &&
strcmp(id, "TIME") != 0 && strcmp(id, "YTIM") != 0)
continue;
data = id3_field_getbinarydata(&frame->fields[1], &length);
assert(data);
if (length < 1)
continue;
end = data + length;
encoding = id3_parse_uint(&data, 1);
string = id3_parse_string(&data, end - data, encoding, 0);
if (id3_ucs4_length(string) < 4) {
free(string);
continue;
}
if (strcmp(id, "TYER") == 0 ||
strcmp(id, "YTYE") == 0) {
timestamp[0] = string[0];
timestamp[1] = string[1];
timestamp[2] = string[2];
timestamp[3] = string[3];
}
else if (strcmp(id, "TDAT") == 0 ||
strcmp(id, "YTDA") == 0) {
timestamp[4] = '-';
timestamp[5] = string[2];
timestamp[6] = string[3];
timestamp[7] = '-';
timestamp[8] = string[0];
timestamp[9] = string[1];
}
else { /* TIME or YTIM */
timestamp[10] = 'T';
timestamp[11] = string[0];
timestamp[12] = string[1];
timestamp[13] = ':';
timestamp[14] = string[2];
timestamp[15] = string[3];
}
free(string);
}
if (timestamp[0]) {
id3_ucs4_t *strings;
frame = id3_frame_new("TDRC");
if (frame == 0)
goto fail;
strings = timestamp;
if (id3_field_settextencoding(&frame->fields[0],
ID3_FIELD_TEXTENCODING_ISO_8859_1) == -1 ||
id3_field_setstrings(&frame->fields[1], 1, &strings) == -1 ||
id3_tag_attachframe(tag, frame) == -1) {
id3_frame_delete(frame);
goto fail;
}
}
if (0) {
fail:
result = -1;
}
return result;
}

View File

@ -0,0 +1,297 @@
%{
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: compat.gperf,v 1.11 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include <string.h>
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include "id3tag.h"
# include "compat.h"
# include "frame.h"
# include "field.h"
# include "parse.h"
# include "ucs4.h"
# define EQ(id) #id, 0
# define OBSOLETE 0, 0
# define TX(id) #id, translate_##id
static id3_compat_func_t translate_TCON;
%}
struct id3_compat;
%%
#
# ID3v2.2 and ID3v2.3 frames
#
# Only obsolete frames or frames with an equivalent ID3v2.4 frame ID are
# listed here. If a frame ID is not listed, it is assumed that the same
# frame ID is itself the equivalent ID3v2.4 frame ID.
#
# This list may also include frames with new content interpretations; the
# translation function will rewrite the contents to comply with ID3v2.4.
#
BUF, EQ(RBUF) /* Recommended buffer size */
CNT, EQ(PCNT) /* Play counter */
COM, EQ(COMM) /* Comments */
CRA, EQ(AENC) /* Audio encryption */
CRM, OBSOLETE /* Encrypted meta frame [obsolete] */
EQU, OBSOLETE /* Equalization [obsolete] */
EQUA, OBSOLETE /* Equalization [obsolete] */
ETC, EQ(ETCO) /* Event timing codes */
GEO, EQ(GEOB) /* General encapsulated object */
IPL, EQ(TIPL) /* Involved people list */
IPLS, EQ(TIPL) /* Involved people list */
LNK, EQ(LINK) /* Linked information */
MCI, EQ(MCDI) /* Music CD identifier */
MLL, EQ(MLLT) /* MPEG location lookup table */
PIC, EQ(APIC) /* Attached picture */
POP, EQ(POPM) /* Popularimeter */
REV, EQ(RVRB) /* Reverb */
RVA, OBSOLETE /* Relative volume adjustment [obsolete] */
RVAD, OBSOLETE /* Relative volume adjustment [obsolete] */
SLT, EQ(SYLT) /* Synchronised lyric/text */
STC, EQ(SYTC) /* Synchronised tempo codes */
TAL, EQ(TALB) /* Album/movie/show title */
TBP, EQ(TBPM) /* BPM (beats per minute) */
TCM, EQ(TCOM) /* Composer */
TCO, TX(TCON) /* Content type */
TCON, TX(TCON) /* Content type */
TCR, EQ(TCOP) /* Copyright message */
TDA, OBSOLETE /* Date [obsolete] */
TDAT, OBSOLETE /* Date [obsolete] */
TDY, EQ(TDLY) /* Playlist delay */
TEN, EQ(TENC) /* Encoded by */
TFT, EQ(TFLT) /* File type */
TIM, OBSOLETE /* Time [obsolete] */
TIME, OBSOLETE /* Time [obsolete] */
TKE, EQ(TKEY) /* Initial key */
TLA, EQ(TLAN) /* Language(s) */
TLE, EQ(TLEN) /* Length */
TMT, EQ(TMED) /* Media type */
TOA, EQ(TOPE) /* Original artist(s)/performer(s) */
TOF, EQ(TOFN) /* Original filename */
TOL, EQ(TOLY) /* Original lyricist(s)/text writer(s) */
TOR, EQ(TDOR) /* Original release year [obsolete] */
TORY, EQ(TDOR) /* Original release year [obsolete] */
TOT, EQ(TOAL) /* Original album/movie/show title */
TP1, EQ(TPE1) /* Lead performer(s)/soloist(s) */
TP2, EQ(TPE2) /* Band/orchestra/accompaniment */
TP3, EQ(TPE3) /* Conductor/performer refinement */
TP4, EQ(TPE4) /* Interpreted, remixed, or otherwise modified by */
TPA, EQ(TPOS) /* Part of a set */
TPB, EQ(TPUB) /* Publisher */
TRC, EQ(TSRC) /* ISRC (international standard recording code) */
TRD, OBSOLETE /* Recording dates [obsolete] */
TRDA, OBSOLETE /* Recording dates [obsolete] */
TRK, EQ(TRCK) /* Track number/position in set */
TSI, OBSOLETE /* Size [obsolete] */
TSIZ, OBSOLETE /* Size [obsolete] */
TSS, EQ(TSSE) /* Software/hardware and settings used for encoding */
TT1, EQ(TIT1) /* Content group description */
TT2, EQ(TIT2) /* Title/songname/content description */
TT3, EQ(TIT3) /* Subtitle/description refinement */
TXT, EQ(TEXT) /* Lyricist/text writer */
TXX, EQ(TXXX) /* User defined text information frame */
TYE, OBSOLETE /* Year [obsolete] */
TYER, OBSOLETE /* Year [obsolete] */
UFI, EQ(UFID) /* Unique file identifier */
ULT, EQ(USLT) /* Unsynchronised lyric/text transcription */
WAF, EQ(WOAF) /* Official audio file webpage */
WAR, EQ(WOAR) /* Official artist/performer webpage */
WAS, EQ(WOAS) /* Official audio source webpage */
WCM, EQ(WCOM) /* Commercial information */
WCP, EQ(WCOP) /* Copyright/legal information */
WPB, EQ(WPUB) /* Publishers official webpage */
WXX, EQ(WXXX) /* User defined URL link frame */
%%
static
int translate_TCON(struct id3_frame *frame, char const *oldid,
id3_byte_t const *data, id3_length_t length)
{
id3_byte_t const *end;
enum id3_field_textencoding encoding;
id3_ucs4_t *string = 0, *ptr, *endptr;
int result = 0;
/* translate old TCON syntax into multiple strings */
assert(frame->nfields == 2);
encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;
end = data + length;
if (id3_field_parse(&frame->fields[0], &data, end - data, &encoding) == -1)
goto fail;
string = id3_parse_string(&data, end - data, encoding, 0);
if (string == 0)
goto fail;
ptr = string;
while (*ptr == '(') {
if (*++ptr == '(')
break;
endptr = ptr;
while (*endptr && *endptr != ')')
++endptr;
if (*endptr)
*endptr++ = 0;
if (id3_field_addstring(&frame->fields[1], ptr) == -1)
goto fail;
ptr = endptr;
}
if (*ptr && id3_field_addstring(&frame->fields[1], ptr) == -1)
goto fail;
if (0) {
fail:
result = -1;
}
if (string)
free(string);
return result;
}
/*
* NAME: compat->fixup()
* DESCRIPTION: finish compatibility translations
*/
int id3_compat_fixup(struct id3_tag *tag)
{
struct id3_frame *frame;
unsigned int index;
id3_ucs4_t timestamp[17] = { 0 };
int result = 0;
/* create a TDRC frame from obsolete TYER/TDAT/TIME frames */
/*
* TYE/TYER: YYYY
* TDA/TDAT: DDMM
* TIM/TIME: HHMM
*
* TDRC: yyyy-MM-ddTHH:mm
*/
index = 0;
while ((frame = id3_tag_findframe(tag, ID3_FRAME_OBSOLETE, index++))) {
char const *id;
id3_byte_t const *data, *end;
id3_length_t length;
enum id3_field_textencoding encoding;
id3_ucs4_t *string;
id = id3_field_getframeid(&frame->fields[0]);
assert(id);
if (strcmp(id, "TYER") != 0 && strcmp(id, "YTYE") != 0 &&
strcmp(id, "TDAT") != 0 && strcmp(id, "YTDA") != 0 &&
strcmp(id, "TIME") != 0 && strcmp(id, "YTIM") != 0)
continue;
data = id3_field_getbinarydata(&frame->fields[1], &length);
assert(data);
if (length < 1)
continue;
end = data + length;
encoding = id3_parse_uint(&data, 1);
string = id3_parse_string(&data, end - data, encoding, 0);
if (id3_ucs4_length(string) < 4) {
free(string);
continue;
}
if (strcmp(id, "TYER") == 0 ||
strcmp(id, "YTYE") == 0) {
timestamp[0] = string[0];
timestamp[1] = string[1];
timestamp[2] = string[2];
timestamp[3] = string[3];
}
else if (strcmp(id, "TDAT") == 0 ||
strcmp(id, "YTDA") == 0) {
timestamp[4] = '-';
timestamp[5] = string[2];
timestamp[6] = string[3];
timestamp[7] = '-';
timestamp[8] = string[0];
timestamp[9] = string[1];
}
else { /* TIME or YTIM */
timestamp[10] = 'T';
timestamp[11] = string[0];
timestamp[12] = string[1];
timestamp[13] = ':';
timestamp[14] = string[2];
timestamp[15] = string[3];
}
free(string);
}
if (timestamp[0]) {
id3_ucs4_t *strings;
frame = id3_frame_new("TDRC");
if (frame == 0)
goto fail;
strings = timestamp;
if (id3_field_settextencoding(&frame->fields[0],
ID3_FIELD_TEXTENCODING_ISO_8859_1) == -1 ||
id3_field_setstrings(&frame->fields[1], 1, &strings) == -1 ||
id3_tag_attachframe(tag, frame) == -1) {
id3_frame_delete(frame);
goto fail;
}
}
if (0) {
fail:
result = -1;
}
return result;
}

View File

@ -0,0 +1,41 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: compat.h,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_COMPAT_H
# define LIBID3TAG_COMPAT_H
# include "id3tag.h"
typedef int id3_compat_func_t(struct id3_frame *, char const *,
id3_byte_t const *, id3_length_t);
struct id3_compat {
char const *id;
char const *equiv;
id3_compat_func_t *translate;
};
struct id3_compat const *id3_compat_lookup(register char const *,
register unsigned int);
int id3_compat_fixup(struct id3_tag *);
# endif

1432
Libraries/ID3Tag/Files/config.guess vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,79 @@
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to enable diagnostic debugging support. */
#undef DEBUG
/* Define to 1 if you have the <assert.h> header file. */
#undef HAVE_ASSERT_H
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the `ftruncate' function. */
#undef HAVE_FTRUNCATE
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to disable debugging assertions. */
#undef NDEBUG
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Version number of package */
#undef VERSION
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif

1537
Libraries/ID3Tag/Files/config.sub vendored Executable file

File diff suppressed because it is too large Load Diff

21464
Libraries/ID3Tag/Files/configure vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,205 @@
dnl -*- m4 -*-
dnl
dnl libid3tag - ID3 tag manipulation library
dnl Copyright (C) 2000-2004 Underbit Technologies, Inc.
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
dnl
AC_REVISION([$Id: configure.ac,v 1.12 2004/01/23 23:22:46 rob Exp $])dnl
dnl Process this file with autoconf to produce a configure script.
AC_INIT([ID3 Tag], [0.15.1b], [support@underbit.com], [libid3tag])
AC_PREREQ(2.53)
AC_CONFIG_SRCDIR([id3tag.h])
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER([config.h])
dnl System type.
AC_CANONICAL_HOST
dnl Checks for programs.
AC_PROG_CC
if test "$GCC" = yes
then
case "$host" in
*-*-mingw*)
case "$build" in
*-*-cygwin*)
CPPFLAGS="$CPPFLAGS -mno-cygwin"
LDFLAGS="$LDFLAGS -mno-cygwin"
;;
esac
esac
dnl case "$host" in
dnl *-*-cygwin* | *-*-mingw*)
dnl LDFLAGS="$LDFLAGS -no-undefined -mdll"
dnl ;;
dnl esac
fi
dnl Support for libtool.
dnl AC_DISABLE_SHARED
dnl AC_LIBTOOL_WIN32_DLL
AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS)
dnl Compiler options.
arch=""
debug=""
optimize=""
profile=""
set -- $CFLAGS
CFLAGS=""
if test "$GCC" = yes
then
CFLAGS="-Wall"
fi
while test $# -gt 0
do
case "$1" in
-Wall)
if test "$GCC" = yes
then
:
else
CFLAGS="$CFLAGS $1"
fi
shift
;;
-g)
debug="-g"
shift
;;
-mno-cygwin)
shift
;;
-m*)
arch="$arch $1"
shift
;;
-fomit-frame-pointer)
shift
;;
-O*|-f*)
optimize="$1"
shift
;;
*)
CFLAGS="$CFLAGS $1"
shift
;;
esac
done
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS(assert.h unistd.h)
AC_CHECK_HEADER(zlib.h, [], [
AC_MSG_ERROR([zlib.h was not found
*** You must first install zlib (libz) before you can build this package.
*** If zlib is already installed, you may need to use the CPPFLAGS
*** environment variable to specify its installed location, e.g. -I<dir>.])
])
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_C_INLINE
dnl Checks for library functions.
AC_CHECK_FUNCS(ftruncate)
AC_CHECK_LIB(z, compress2, [], [
AC_MSG_ERROR([libz was not found
*** You must first install zlib (libz) before you can build this package.
*** If zlib is already installed, you may need to use the LDFLAGS
*** environment variable to specify its installed location, e.g. -L<dir>.])
])
dnl handle --enable and --disable options
AC_CACHE_SAVE
AC_MSG_CHECKING([whether to enable profiling])
AC_ARG_ENABLE(profiling, AC_HELP_STRING([--enable-profiling],
[generate profiling code]),
[
case "$enableval" in
yes) profile="-pg" ;;
esac
])
AC_MSG_RESULT(${enable_profiling-no})
AC_MSG_CHECKING([whether to enable debugging])
AC_ARG_ENABLE(debugging, AC_HELP_STRING([--enable-debugging],
[enable diagnostic debugging support])
AC_HELP_STRING([--disable-debugging],
[do not enable debugging and use more optimization]),
[
case "$enableval" in
yes)
AC_DEFINE(DEBUG, 1,
[Define to enable diagnostic debugging support.])
optimize=""
;;
no)
if test -n "$profile"
then
AC_MSG_ERROR(--enable-profiling and --disable-debugging are incompatible)
fi
AC_DEFINE(NDEBUG, 1,
[Define to disable debugging assertions.])
debug=""
if test "$GCC" = yes
then
optimize="$optimize -fomit-frame-pointer"
fi
;;
esac
])
AC_MSG_RESULT(${enable_debugging-default})
AM_CONDITIONAL(DEBUG, test ${enable_debugging-default} = yes)
dnl Create output files.
test -n "$arch" && CFLAGS="$CFLAGS $arch"
test -n "$debug" && CFLAGS="$CFLAGS $debug"
test -n "$optimize" && CFLAGS="$CFLAGS $optimize"
test -n "$profile" && CFLAGS="$CFLAGS $profile" LDFLAGS="$LDFLAGS $profile"
dnl LTLIBOBJS=`echo "$LIBOBJS" | sed -e 's/\.o/.lo/g'`
dnl AC_SUBST(LTLIBOBJS)
AC_CONFIG_FILES([Makefile msvc++/Makefile \
libid3tag.list])
AC_OUTPUT

View File

@ -0,0 +1,137 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: crc.c,v 1.11 2004/02/17 02:04:10 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include "id3tag.h"
# include "crc.h"
static
unsigned long const crc_table[256] = {
0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL,
0x076dc419L, 0x706af48fL, 0xe963a535L, 0x9e6495a3L,
0x0edb8832L, 0x79dcb8a4L, 0xe0d5e91eL, 0x97d2d988L,
0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L, 0x90bf1d91L,
0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L,
0x136c9856L, 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL,
0x14015c4fL, 0x63066cd9L, 0xfa0f3d63L, 0x8d080df5L,
0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L, 0xa2677172L,
0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L,
0x32d86ce3L, 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L,
0x26d930acL, 0x51de003aL, 0xc8d75180L, 0xbfd06116L,
0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L, 0xb8bda50fL,
0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL,
0x76dc4190L, 0x01db7106L, 0x98d220bcL, 0xefd5102aL,
0x71b18589L, 0x06b6b51fL, 0x9fbfe4a5L, 0xe8b8d433L,
0x7807c9a2L, 0x0f00f934L, 0x9609a88eL, 0xe10e9818L,
0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL,
0x6c0695edL, 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L,
0x65b0d9c6L, 0x12b7e950L, 0x8bbeb8eaL, 0xfcb9887cL,
0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L, 0xfbd44c65L,
0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL,
0x4369e96aL, 0x346ed9fcL, 0xad678846L, 0xda60b8d0L,
0x44042d73L, 0x33031de5L, 0xaa0a4c5fL, 0xdd0d7cc9L,
0x5005713cL, 0x270241aaL, 0xbe0b1010L, 0xc90c2086L,
0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L,
0x59b33d17L, 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL,
0xedb88320L, 0x9abfb3b6L, 0x03b6e20cL, 0x74b1d29aL,
0xead54739L, 0x9dd277afL, 0x04db2615L, 0x73dc1683L,
0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L,
0xf00f9344L, 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL,
0xf762575dL, 0x806567cbL, 0x196c3671L, 0x6e6b06e7L,
0xfed41b76L, 0x89d32be0L, 0x10da7a5aL, 0x67dd4accL,
0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L,
0xd1bb67f1L, 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL,
0xd80d2bdaL, 0xaf0a1b4cL, 0x36034af6L, 0x41047a60L,
0xdf60efc3L, 0xa867df55L, 0x316e8eefL, 0x4669be79L,
0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL,
0xc5ba3bbeL, 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L,
0xc2d7ffa7L, 0xb5d0cf31L, 0x2cd99e8bL, 0x5bdeae1dL,
0x9b64c2b0L, 0xec63f226L, 0x756aa39cL, 0x026d930aL,
0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L,
0x92d28e9bL, 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L,
0x86d3d2d4L, 0xf1d4e242L, 0x68ddb3f8L, 0x1fda836eL,
0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L, 0x18b74777L,
0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L,
0xa00ae278L, 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L,
0xa7672661L, 0xd06016f7L, 0x4969474dL, 0x3e6e77dbL,
0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L, 0x37d83bf0L,
0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L,
0xbad03605L, 0xcdd70693L, 0x54de5729L, 0x23d967bfL,
0xb3667a2eL, 0xc4614ab8L, 0x5d681b02L, 0x2a6f2b94L,
0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL, 0x2d02ef8dL
};
/*
* NAME: crc->compute()
* DESCRIPTION: calculate CRC-32 value (ISO 3309)
*/
unsigned long id3_crc_compute(id3_byte_t const *data, id3_length_t length)
{
register unsigned long crc;
for (crc = 0xffffffffL; length >= 8; length -= 8) {
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
}
switch (length) {
case 7: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
case 6: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
case 5: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
case 4: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
case 3: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
case 2: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
case 1: crc = crc_table[(crc ^ *data++) & 0xff] ^ (crc >> 8);
case 0: break;
}
return crc ^ 0xffffffffL;
}

View File

@ -0,0 +1,29 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: crc.h,v 1.8 2004/02/17 02:04:10 rob Exp $
*/
# ifndef LIBID3TAG_CRC_H
# define LIBID3TAG_CRC_H
# include "id3tag.h"
unsigned long id3_crc_compute(id3_byte_t const *, id3_length_t);
# endif

View File

@ -0,0 +1,222 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: debug.c,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# undef malloc
# undef calloc
# undef realloc
# undef free
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include "debug.h"
# if defined(DEBUG)
# define DEBUG_MAGIC 0xdeadbeefL
struct debug {
char const *file;
unsigned int line;
size_t size;
struct debug *next;
struct debug *prev;
long int magic;
};
static struct debug *allocated;
static int registered;
static
void check(void)
{
struct debug *debug;
for (debug = allocated; debug; debug = debug->next) {
if (debug->magic != DEBUG_MAGIC) {
fprintf(stderr, "memory corruption\n");
break;
}
fprintf(stderr, "%s:%u: leaked %lu bytes\n",
debug->file, debug->line, debug->size);
}
}
void *id3_debug_malloc(size_t size, char const *file, unsigned int line)
{
struct debug *debug;
if (!registered) {
atexit(check);
registered = 1;
}
if (size == 0)
fprintf(stderr, "%s:%u: malloc(0)\n", file, line);
debug = malloc(sizeof(*debug) + size);
if (debug == 0) {
fprintf(stderr, "%s:%u: malloc(%lu) failed\n", file, line, size);
return 0;
}
debug->magic = DEBUG_MAGIC;
debug->file = file;
debug->line = line;
debug->size = size;
debug->next = allocated;
debug->prev = 0;
if (allocated)
allocated->prev = debug;
allocated = debug;
return ++debug;
}
void *id3_debug_calloc(size_t nmemb, size_t size,
char const *file, unsigned int line)
{
void *ptr;
ptr = id3_debug_malloc(nmemb * size, file, line);
if (ptr)
memset(ptr, 0, nmemb * size);
return ptr;
}
void *id3_debug_realloc(void *ptr, size_t size,
char const *file, unsigned int line)
{
struct debug *debug, *new;
if (size == 0) {
id3_debug_free(ptr, file, line);
return 0;
}
if (ptr == 0)
return id3_debug_malloc(size, file, line);
debug = ptr;
--debug;
if (debug->magic != DEBUG_MAGIC) {
fprintf(stderr, "%s:%u: realloc(%p, %lu) memory not allocated\n",
file, line, ptr, size);
return 0;
}
new = realloc(debug, sizeof(*debug) + size);
if (new == 0) {
fprintf(stderr, "%s:%u: realloc(%p, %lu) failed\n", file, line, ptr, size);
return 0;
}
if (allocated == debug)
allocated = new;
debug = new;
debug->file = file;
debug->line = line;
debug->size = size;
if (debug->next)
debug->next->prev = debug;
if (debug->prev)
debug->prev->next = debug;
return ++debug;
}
void id3_debug_free(void *ptr, char const *file, unsigned int line)
{
struct debug *debug;
if (ptr == 0) {
fprintf(stderr, "%s:%u: free(0)\n", file, line);
return;
}
debug = ptr;
--debug;
if (debug->magic != DEBUG_MAGIC) {
fprintf(stderr, "%s:%u: free(%p) memory not allocated\n", file, line, ptr);
return;
}
debug->magic = 0;
if (debug->next)
debug->next->prev = debug->prev;
if (debug->prev)
debug->prev->next = debug->next;
if (allocated == debug)
allocated = debug->next;
free(debug);
}
void *id3_debug_release(void *ptr, char const *file, unsigned int line)
{
struct debug *debug;
if (ptr == 0)
return 0;
debug = ptr;
--debug;
if (debug->magic != DEBUG_MAGIC) {
fprintf(stderr, "%s:%u: release(%p) memory not allocated\n",
file, line, ptr);
return ptr;
}
if (debug->next)
debug->next->prev = debug->prev;
if (debug->prev)
debug->prev->next = debug->next;
if (allocated == debug)
allocated = debug->next;
memmove(debug, debug + 1, debug->size);
return debug;
}
# endif

View File

@ -0,0 +1,34 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: debug.h,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_DEBUG_H
# define LIBID3TAG_DEBUG_H
# include <stdlib.h>
void *id3_debug_malloc(size_t, char const *, unsigned int);
void *id3_debug_calloc(size_t, size_t, char const *, unsigned int);
void *id3_debug_realloc(void *, size_t, char const *, unsigned int);
void id3_debug_free(void *, char const *, unsigned int);
void *id3_debug_release(void *, char const *, unsigned int);
# endif

464
Libraries/ID3Tag/Files/depcomp Executable file
View File

@ -0,0 +1,464 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
# Copyright 1999, 2000 Free Software Foundation, Inc.
# 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, 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.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
echo "depcomp: Variables source, object and depmode must be set" 1>&2
exit 1
fi
# `libtool' can also be set to `yes' or `no'.
if test -z "$depfile"; then
base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
dir=`echo "$object" | sed 's,/.*$,/,'`
if test "$dir" = "$object"; then
dir=
fi
# FIXME: should be _deps on DOS.
depfile="$dir.deps/$base"
fi
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
rm -f "$tmpdepfile"
# Some modes work just like other modes, but use different flags. We
# parameterize here, but still list the modes in the big case below,
# to make depend.m4 easier to write. Note that we *cannot* use a case
# here, because this file can only contain one case statement.
if test "$depmode" = hp; then
# HP compiler uses -M and no extra arg.
gccflag=-M
depmode=gcc
fi
if test "$depmode" = dashXmstdout; then
# This is just like dashmstdout with a different argument.
dashmflag=-xM
depmode=dashmstdout
fi
case "$depmode" in
gcc3)
## gcc 3 implements dependency tracking that does exactly what
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
## it if -MD -MP comes after the -MF stuff. Hmm.
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
mv "$tmpdepfile" "$depfile"
;;
gcc)
## There are various ways to get dependency output from gcc. Here's
## why we pick this rather obscure method:
## - Don't want to use -MD because we'd like the dependencies to end
## up in a subdir. Having to rename by hand is ugly.
## (We might end up doing this anyway to support other compilers.)
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
## -MM, not -M (despite what the docs say).
## - Using -M directly means running the compiler twice (even worse
## than renaming).
if test -z "$gccflag"; then
gccflag=-MD,
fi
"$@" -Wp,"$gccflag$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
## The second -e expression handles DOS-style file names with drive letters.
sed -e 's/^[^:]*: / /' \
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
## This next piece of magic avoids the `deleted header file' problem.
## The problem is that when a header file which appears in a .P file
## is deleted, the dependency causes make to die (because there is
## typically no way to rebuild the header). We avoid this by adding
## dummy dependencies for each header file. Too bad gcc doesn't do
## this for us directly.
tr ' ' '
' < "$tmpdepfile" |
## Some versions of gcc put a space before the `:'. On the theory
## that the space means something, we add a space to the output as
## well.
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
hp)
# This case exists only to let depend.m4 do its work. It works by
# looking at the text of this script. This case will never be run,
# since it is checked for above.
exit 1
;;
sgi)
if test "$libtool" = yes; then
"$@" "-Wp,-MDupdate,$tmpdepfile"
else
"$@" -MDupdate "$tmpdepfile"
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
echo "$object : \\" > "$depfile"
# Clip off the initial element (the dependent). Don't try to be
# clever and replace this with sed code, as IRIX sed won't handle
# lines with more than a fixed number of characters (4096 in
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
# the IRIX cc adds comments like `#:fec' to the end of the
# dependency line.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
tr '
' ' ' >> $depfile
echo >> $depfile
# The second pass generates a dummy entry for each header file.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
>> $depfile
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
aix)
# The C for AIX Compiler uses -M and outputs the dependencies
# in a .u file. This file always lives in the current directory.
# Also, the AIX compiler puts `$object:' at the start of each line;
# $object doesn't have directory information.
stripped=`echo "$object" | sed -e 's,^.*/,,' -e 's/\(.*\)\..*$/\1/'`
tmpdepfile="$stripped.u"
outname="$stripped.o"
if test "$libtool" = yes; then
"$@" -Wc,-M
else
"$@" -M
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
if test -f "$tmpdepfile"; then
# Each line is of the form `foo.o: dependent.h'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
icc)
# Must come before tru64.
# Intel's C compiler understands `-MD -MF file'. However
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
# will fill foo.d with something like
# foo.o: sub/foo.c
# foo.o: sub/foo.h
# which is wrong. We want:
# sub/foo.o: sub/foo.c
# sub/foo.o: sub/foo.h
# sub/foo.c:
# sub/foo.h:
"$@" -MD -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
# Each line is of the form `foo.o: dependent.h'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed -e "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
sed -e "s,^[^:]*: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
rm -f "$tmpdepfile"
;;
tru64)
# The Tru64 compiler uses -MD to generate dependencies as a side
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
# dependencies in `foo.d' instead, so we check for that too.
# Subdirectories are respected.
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
test "x$dir" = "x$object" && dir=
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
if test "$libtool" = yes; then
tmpdepfile1="$dir.libs/$base.lo.d"
tmpdepfile2="$dir.libs/$base.d"
"$@" -Wc,-MD
else
tmpdepfile1="$dir$base.o.d"
tmpdepfile2="$dir$base.d"
"$@" -MD
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile1" "$tmpdepfile2"
exit $stat
fi
if test -f "$tmpdepfile1"; then
tmpdepfile="$tmpdepfile1"
else
tmpdepfile="$tmpdepfile2"
fi
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
# That's a space and a tab in the [].
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
else
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
#nosideeffect)
# This comment above is used by automake to tell side-effect
# dependency tracking mechanisms from slower ones.
dashmstdout)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
done
test -z "$dashmflag" && dashmflag=-M
# Require at least two characters before searching for `:'
# in the target name. This is to cope with DOS-style filenames:
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
"$@" $dashmflag |
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
tr ' ' '
' < "$tmpdepfile" | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
dashXmstdout)
# This case only exists to satisfy depend.m4. It is never actually
# run, as this mode is specially recognized in the preamble.
exit 1
;;
makedepend)
"$@" || exit $?
# Remove any Libtool call
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# X makedepend
shift
cleared=no
for arg in "$@"; do
case $cleared in
no)
set ""; shift
cleared=yes ;;
esac
case "$arg" in
-D*|-I*)
set fnord "$@" "$arg"; shift ;;
# Strip any option that makedepend may not understand. Remove
# the object too, otherwise makedepend will parse it as a source file.
-*|$object)
;;
*)
set fnord "$@" "$arg"; shift ;;
esac
done
obj_suffix="`echo $object | sed 's/^.*\././'`"
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
sed '1,2d' "$tmpdepfile" | tr ' ' '
' | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile" "$tmpdepfile".bak
;;
cpp)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
done
"$@" -E |
sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
sed '$ s: \\$::' > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
cat < "$tmpdepfile" >> "$depfile"
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
msvisualcpp)
# Important note: in order to support this mode, a compiler *must*
# always write the proprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
"$@" || exit $?
IFS=" "
for arg
do
case "$arg" in
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
set fnord "$@"
shift
shift
;;
*)
set fnord "$@" "$arg"
shift
shift
;;
esac
done
"$@" -E |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
echo " " >> "$depfile"
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
rm -f "$tmpdepfile"
;;
none)
exec "$@"
;;
*)
echo "Unknown depmode $depmode" 1>&2
exit 1
;;
esac
exit 0

View File

@ -0,0 +1,890 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: field.c,v 1.16 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include <string.h>
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include "id3tag.h"
# include "field.h"
# include "frame.h"
# include "render.h"
# include "ucs4.h"
# include "latin1.h"
# include "parse.h"
/*
* NAME: field->init()
* DESCRIPTION: initialize a field to a default value for the given type
*/
void id3_field_init(union id3_field *field, enum id3_field_type type)
{
assert(field);
switch (field->type = type) {
case ID3_FIELD_TYPE_TEXTENCODING:
case ID3_FIELD_TYPE_INT8:
case ID3_FIELD_TYPE_INT16:
case ID3_FIELD_TYPE_INT24:
case ID3_FIELD_TYPE_INT32:
field->number.value = 0;
break;
case ID3_FIELD_TYPE_LATIN1:
case ID3_FIELD_TYPE_LATIN1FULL:
field->latin1.ptr = 0;
break;
case ID3_FIELD_TYPE_LATIN1LIST:
field->latin1list.nstrings = 0;
field->latin1list.strings = 0;
case ID3_FIELD_TYPE_STRING:
case ID3_FIELD_TYPE_STRINGFULL:
field->string.ptr = 0;
break;
case ID3_FIELD_TYPE_STRINGLIST:
field->stringlist.nstrings = 0;
field->stringlist.strings = 0;
break;
case ID3_FIELD_TYPE_LANGUAGE:
strcpy(field->immediate.value, "XXX");
break;
case ID3_FIELD_TYPE_FRAMEID:
strcpy(field->immediate.value, "XXXX");
break;
case ID3_FIELD_TYPE_DATE:
memset(field->immediate.value, 0, sizeof(field->immediate.value));
break;
case ID3_FIELD_TYPE_INT32PLUS:
case ID3_FIELD_TYPE_BINARYDATA:
field->binary.data = 0;
field->binary.length = 0;
break;
}
}
/*
* NAME: field->finish()
* DESCRIPTION: reset a field, deallocating memory if necessary
*/
void id3_field_finish(union id3_field *field)
{
unsigned int i;
assert(field);
switch (field->type) {
case ID3_FIELD_TYPE_TEXTENCODING:
case ID3_FIELD_TYPE_INT8:
case ID3_FIELD_TYPE_INT16:
case ID3_FIELD_TYPE_INT24:
case ID3_FIELD_TYPE_INT32:
case ID3_FIELD_TYPE_LANGUAGE:
case ID3_FIELD_TYPE_FRAMEID:
case ID3_FIELD_TYPE_DATE:
break;
case ID3_FIELD_TYPE_LATIN1:
case ID3_FIELD_TYPE_LATIN1FULL:
if (field->latin1.ptr)
free(field->latin1.ptr);
break;
case ID3_FIELD_TYPE_LATIN1LIST:
for (i = 0; i < field->latin1list.nstrings; ++i)
free(field->latin1list.strings[i]);
if (field->latin1list.strings)
free(field->latin1list.strings);
break;
case ID3_FIELD_TYPE_STRING:
case ID3_FIELD_TYPE_STRINGFULL:
if (field->string.ptr)
free(field->string.ptr);
break;
case ID3_FIELD_TYPE_STRINGLIST:
for (i = 0; i < field->stringlist.nstrings; ++i)
free(field->stringlist.strings[i]);
if (field->stringlist.strings)
free(field->stringlist.strings);
break;
case ID3_FIELD_TYPE_INT32PLUS:
case ID3_FIELD_TYPE_BINARYDATA:
if (field->binary.data)
free(field->binary.data);
break;
}
id3_field_init(field, field->type);
}
/*
* NAME: field->type()
* DESCRIPTION: return the value type of a field
*/
enum id3_field_type id3_field_type(union id3_field const *field)
{
assert(field);
return field->type;
}
/*
* NAME: field->parse()
* DESCRIPTION: parse a field value
*/
int id3_field_parse(union id3_field *field, id3_byte_t const **ptr,
id3_length_t length, enum id3_field_textencoding *encoding)
{
assert(field);
id3_field_finish(field);
switch (field->type) {
case ID3_FIELD_TYPE_INT32:
if (length < 4)
goto fail;
field->number.value = id3_parse_uint(ptr, 4);
break;
case ID3_FIELD_TYPE_INT24:
if (length < 3)
goto fail;
field->number.value = id3_parse_uint(ptr, 3);
break;
case ID3_FIELD_TYPE_INT16:
if (length < 2)
goto fail;
field->number.value = id3_parse_uint(ptr, 2);
break;
case ID3_FIELD_TYPE_INT8:
case ID3_FIELD_TYPE_TEXTENCODING:
if (length < 1)
goto fail;
field->number.value = id3_parse_uint(ptr, 1);
if (field->type == ID3_FIELD_TYPE_TEXTENCODING)
*encoding = field->number.value;
break;
case ID3_FIELD_TYPE_LANGUAGE:
if (length < 3)
goto fail;
id3_parse_immediate(ptr, 3, field->immediate.value);
break;
case ID3_FIELD_TYPE_FRAMEID:
if (length < 4)
goto fail;
id3_parse_immediate(ptr, 4, field->immediate.value);
break;
case ID3_FIELD_TYPE_DATE:
if (length < 8)
goto fail;
id3_parse_immediate(ptr, 8, field->immediate.value);
break;
case ID3_FIELD_TYPE_LATIN1:
case ID3_FIELD_TYPE_LATIN1FULL:
{
id3_latin1_t *latin1;
latin1 = id3_parse_latin1(ptr, length,
field->type == ID3_FIELD_TYPE_LATIN1FULL);
if (latin1 == 0)
goto fail;
field->latin1.ptr = latin1;
}
break;
case ID3_FIELD_TYPE_LATIN1LIST:
{
id3_byte_t const *end;
id3_latin1_t *latin1, **strings;
end = *ptr + length;
while (end - *ptr > 0) {
latin1 = id3_parse_latin1(ptr, end - *ptr, 0);
if (latin1 == 0)
goto fail;
strings = realloc(field->latin1list.strings,
(field->latin1list.nstrings + 1) * sizeof(*strings));
if (strings == 0) {
free(latin1);
goto fail;
}
field->latin1list.strings = strings;
field->latin1list.strings[field->latin1list.nstrings++] = latin1;
}
}
break;
case ID3_FIELD_TYPE_STRING:
case ID3_FIELD_TYPE_STRINGFULL:
{
id3_ucs4_t *ucs4;
ucs4 = id3_parse_string(ptr, length, *encoding,
field->type == ID3_FIELD_TYPE_STRINGFULL);
if (ucs4 == 0)
goto fail;
field->string.ptr = ucs4;
}
break;
case ID3_FIELD_TYPE_STRINGLIST:
{
id3_byte_t const *end;
id3_ucs4_t *ucs4, **strings;
end = *ptr + length;
while (end - *ptr > 0) {
ucs4 = id3_parse_string(ptr, end - *ptr, *encoding, 0);
if (ucs4 == 0)
goto fail;
strings = realloc(field->stringlist.strings,
(field->stringlist.nstrings + 1) * sizeof(*strings));
if (strings == 0) {
free(ucs4);
goto fail;
}
field->stringlist.strings = strings;
field->stringlist.strings[field->stringlist.nstrings++] = ucs4;
}
}
break;
case ID3_FIELD_TYPE_INT32PLUS:
case ID3_FIELD_TYPE_BINARYDATA:
{
id3_byte_t *data;
data = id3_parse_binary(ptr, length);
if (data == 0)
goto fail;
field->binary.data = data;
field->binary.length = length;
}
break;
}
return 0;
fail:
return -1;
}
/*
* NAME: field->render()
* DESCRIPTION: render a field value
*/
id3_length_t id3_field_render(union id3_field const *field, id3_byte_t **ptr,
enum id3_field_textencoding *encoding,
int terminate)
{
id3_length_t size;
unsigned int i;
assert(field && encoding);
switch (field->type) {
case ID3_FIELD_TYPE_INT32:
return id3_render_int(ptr, field->number.value, 4);
case ID3_FIELD_TYPE_INT24:
return id3_render_int(ptr, field->number.value, 3);
case ID3_FIELD_TYPE_INT16:
return id3_render_int(ptr, field->number.value, 2);
case ID3_FIELD_TYPE_TEXTENCODING:
*encoding = field->number.value;
case ID3_FIELD_TYPE_INT8:
return id3_render_int(ptr, field->number.value, 1);
case ID3_FIELD_TYPE_LATIN1:
case ID3_FIELD_TYPE_LATIN1FULL:
return id3_render_latin1(ptr, field->latin1.ptr, terminate);
case ID3_FIELD_TYPE_LATIN1LIST:
size = 0;
for (i = 0; i < field->latin1list.nstrings; ++i) {
size += id3_render_latin1(ptr, field->latin1list.strings[i],
(i < field->latin1list.nstrings - 1) ||
terminate);
}
return size;
case ID3_FIELD_TYPE_STRING:
case ID3_FIELD_TYPE_STRINGFULL:
return id3_render_string(ptr, field->string.ptr, *encoding, terminate);
case ID3_FIELD_TYPE_STRINGLIST:
size = 0;
for (i = 0; i < field->stringlist.nstrings; ++i) {
size += id3_render_string(ptr, field->stringlist.strings[i], *encoding,
(i < field->stringlist.nstrings - 1) ||
terminate);
}
return size;
case ID3_FIELD_TYPE_LANGUAGE:
return id3_render_immediate(ptr, field->immediate.value, 3);
case ID3_FIELD_TYPE_FRAMEID:
return id3_render_immediate(ptr, field->immediate.value, 4);
case ID3_FIELD_TYPE_DATE:
return id3_render_immediate(ptr, field->immediate.value, 8);
case ID3_FIELD_TYPE_INT32PLUS:
case ID3_FIELD_TYPE_BINARYDATA:
return id3_render_binary(ptr, field->binary.data, field->binary.length);
}
return 0;
}
/*
* NAME: field->setint()
* DESCRIPTION: set the value of an int field
*/
int id3_field_setint(union id3_field *field, signed long number)
{
assert(field);
switch (field->type) {
case ID3_FIELD_TYPE_INT8:
if (number > 0x7f || number < -0x80)
return -1;
break;
case ID3_FIELD_TYPE_INT16:
if (number > 0x7fff || number < -0x8000)
return -1;
break;
case ID3_FIELD_TYPE_INT24:
if (number > 0x7fffffL || number < -0x800000L)
return -1;
break;
case ID3_FIELD_TYPE_INT32:
if (number > 0x7fffffffL || number < -0x80000000L)
return -1;
break;
default:
return -1;
}
id3_field_finish(field);
field->number.value = number;
return 0;
}
/*
* NAME: field->settextencoding()
* DESCRIPTION: set the value of a textencoding field
*/
int id3_field_settextencoding(union id3_field *field,
enum id3_field_textencoding encoding)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_TEXTENCODING)
return -1;
id3_field_finish(field);
field->number.value = encoding;
return 0;
}
static
int set_latin1(union id3_field *field, id3_latin1_t const *latin1)
{
id3_latin1_t *data;
if (latin1 == 0 || *latin1 == 0)
data = 0;
else {
data = id3_latin1_duplicate(latin1);
if (data == 0)
return -1;
}
field->latin1.ptr = data;
return 0;
}
/*
* NAME: field->setlatin1()
* DESCRIPTION: set the value of a latin1 field
*/
int id3_field_setlatin1(union id3_field *field, id3_latin1_t const *latin1)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1)
return -1;
id3_field_finish(field);
if (latin1) {
id3_latin1_t const *ptr;
for (ptr = latin1; *ptr; ++ptr) {
if (*ptr == '\n')
return -1;
}
}
return set_latin1(field, latin1);
}
/*
* NAME: field->setfulllatin1()
* DESCRIPTION: set the value of a full latin1 field
*/
int id3_field_setfulllatin1(union id3_field *field, id3_latin1_t const *latin1)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1FULL)
return -1;
id3_field_finish(field);
return set_latin1(field, latin1);
}
static
int set_string(union id3_field *field, id3_ucs4_t const *string)
{
id3_ucs4_t *data;
if (string == 0 || *string == 0)
data = 0;
else {
data = id3_ucs4_duplicate(string);
if (data == 0)
return -1;
}
field->string.ptr = data;
return 0;
}
/*
* NAME: field->setstring()
* DESCRIPTION: set the value of a string field
*/
int id3_field_setstring(union id3_field *field, id3_ucs4_t const *string)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRING)
return -1;
id3_field_finish(field);
if (string) {
id3_ucs4_t const *ptr;
for (ptr = string; *ptr; ++ptr) {
if (*ptr == '\n')
return -1;
}
}
return set_string(field, string);
}
/*
* NAME: field->setfullstring()
* DESCRIPTION: set the value of a full string field
*/
int id3_field_setfullstring(union id3_field *field, id3_ucs4_t const *string)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGFULL)
return -1;
id3_field_finish(field);
return set_string(field, string);
}
/*
* NAME: field->setstrings()
* DESCRIPTION: set the value of a stringlist field
*/
int id3_field_setstrings(union id3_field *field,
unsigned int length, id3_ucs4_t **ptrs)
{
id3_ucs4_t **strings;
unsigned int i;
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST)
return -1;
id3_field_finish(field);
if (length == 0)
return 0;
strings = malloc(length * sizeof(*strings));
if (strings == 0)
return -1;
for (i = 0; i < length; ++i) {
strings[i] = id3_ucs4_duplicate(ptrs[i]);
if (strings[i] == 0) {
while (i--)
free(strings[i]);
free(strings);
return -1;
}
}
field->stringlist.strings = strings;
field->stringlist.nstrings = length;
return 0;
}
/*
* NAME: field->addstring()
* DESCRIPTION: add a string to a stringlist field
*/
int id3_field_addstring(union id3_field *field, id3_ucs4_t const *string)
{
id3_ucs4_t *new, **strings;
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST)
return -1;
if (string == 0)
string = id3_ucs4_empty;
new = id3_ucs4_duplicate(string);
if (new == 0)
return -1;
strings = realloc(field->stringlist.strings,
(field->stringlist.nstrings + 1) * sizeof(*strings));
if (strings == 0) {
free(new);
return -1;
}
field->stringlist.strings = strings;
field->stringlist.strings[field->stringlist.nstrings++] = new;
return 0;
}
/*
* NAME: field->setlanguage()
* DESCRIPTION: set the value of a language field
*/
int id3_field_setlanguage(union id3_field *field, char const *language)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LANGUAGE)
return -1;
id3_field_finish(field);
if (language) {
if (strlen(language) != 3)
return -1;
strcpy(field->immediate.value, language);
}
return 0;
}
/*
* NAME: field->setframeid()
* DESCRIPTION: set the value of a frameid field
*/
int id3_field_setframeid(union id3_field *field, char const *id)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_FRAMEID ||
!id3_frame_validid(id))
return -1;
id3_field_finish(field);
field->immediate.value[0] = id[0];
field->immediate.value[1] = id[1];
field->immediate.value[2] = id[2];
field->immediate.value[3] = id[3];
field->immediate.value[4] = 0;
return 0;
}
/*
* NAME: field->setbinarydata()
* DESCRIPTION: set the value of a binarydata field
*/
int id3_field_setbinarydata(union id3_field *field,
id3_byte_t const *data, id3_length_t length)
{
id3_byte_t *mem;
assert(field);
if (field->type != ID3_FIELD_TYPE_BINARYDATA)
return -1;
id3_field_finish(field);
if (length == 0)
mem = 0;
else {
mem = malloc(length);
if (mem == 0)
return -1;
assert(data);
memcpy(mem, data, length);
}
field->binary.data = mem;
field->binary.length = length;
return 0;
}
/*
* NAME: field->getint()
* DESCRIPTION: return the value of an integer field
*/
signed long id3_field_getint(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_INT8 &&
field->type != ID3_FIELD_TYPE_INT16 &&
field->type != ID3_FIELD_TYPE_INT24 &&
field->type != ID3_FIELD_TYPE_INT32)
return -1;
return field->number.value;
}
/*
* NAME: field->gettextencoding()
* DESCRIPTION: return the value of a text encoding field
*/
enum id3_field_textencoding
id3_field_gettextencoding(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_TEXTENCODING)
return -1;
return field->number.value;
}
/*
* NAME: field->getlatin1()
* DESCRIPTION: return the value of a latin1 field
*/
id3_latin1_t const *id3_field_getlatin1(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1)
return 0;
return field->latin1.ptr ? field->latin1.ptr : (id3_latin1_t const *) "";
}
/*
* NAME: field->getfulllatin1()
* DESCRIPTION: return the value of a full latin1 field
*/
id3_latin1_t const *id3_field_getfulllatin1(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_LATIN1FULL)
return 0;
return field->latin1.ptr ? field->latin1.ptr : (id3_latin1_t const *) "";
}
/*
* NAME: field->getstring()
* DESCRIPTION: return the value of a string field
*/
id3_ucs4_t const *id3_field_getstring(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRING)
return 0;
return field->string.ptr ? field->string.ptr : id3_ucs4_empty;
}
/*
* NAME: field->getfullstring()
* DESCRIPTION: return the value of a fullstring field
*/
id3_ucs4_t const *id3_field_getfullstring(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGFULL)
return 0;
return field->string.ptr ? field->string.ptr : id3_ucs4_empty;
}
/*
* NAME: field->getnstrings()
* DESCRIPTION: return the number of strings in a stringlist field
*/
unsigned int id3_field_getnstrings(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST)
return 0;
return field->stringlist.nstrings;
}
/*
* NAME: field->getstrings()
* DESCRIPTION: return one value of a stringlist field
*/
id3_ucs4_t const *id3_field_getstrings(union id3_field const *field,
unsigned int index)
{
id3_ucs4_t const *string;
assert(field);
if (field->type != ID3_FIELD_TYPE_STRINGLIST ||
index >= field->stringlist.nstrings)
return 0;
string = field->stringlist.strings[index];
return string ? string : id3_ucs4_empty;
}
/*
* NAME: field->getframeid()
* DESCRIPTION: return the value of a frameid field
*/
char const *id3_field_getframeid(union id3_field const *field)
{
assert(field);
if (field->type != ID3_FIELD_TYPE_FRAMEID)
return 0;
return field->immediate.value;
}
/*
* NAME: field->getbinarydata()
* DESCRIPTION: return the value of a binarydata field
*/
id3_byte_t const *id3_field_getbinarydata(union id3_field const *field,
id3_length_t *length)
{
static id3_byte_t const empty;
assert(field && length);
if (field->type != ID3_FIELD_TYPE_BINARYDATA)
return 0;
assert(field->binary.length == 0 || field->binary.data);
*length = field->binary.length;
return field->binary.data ? field->binary.data : &empty;
}

View File

@ -0,0 +1,36 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: field.h,v 1.9 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_FIELD_H
# define LIBID3TAG_FIELD_H
# include "id3tag.h"
void id3_field_init(union id3_field *, enum id3_field_type);
void id3_field_finish(union id3_field *);
int id3_field_parse(union id3_field *, id3_byte_t const **,
id3_length_t, enum id3_field_textencoding *);
id3_length_t id3_field_render(union id3_field const *, id3_byte_t **,
enum id3_field_textencoding *, int);
# endif

View File

@ -0,0 +1,674 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: file.c,v 1.21 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# ifdef HAVE_UNISTD_H
# include <unistd.h>
# endif
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include "id3tag.h"
# include "file.h"
# include "tag.h"
# include "field.h"
struct filetag {
struct id3_tag *tag;
unsigned long location;
id3_length_t length;
};
struct id3_file {
FILE *iofile;
enum id3_file_mode mode;
char *path;
int flags;
struct id3_tag *primary;
unsigned int ntags;
struct filetag *tags;
};
enum {
ID3_FILE_FLAG_ID3V1 = 0x0001
};
/*
* NAME: query_tag()
* DESCRIPTION: check for a tag at a file's current position
*/
static
signed long query_tag(FILE *iofile)
{
fpos_t save_position;
id3_byte_t query[ID3_TAG_QUERYSIZE];
signed long size;
if (fgetpos(iofile, &save_position) == -1)
return 0;
size = id3_tag_query(query, fread(query, 1, sizeof(query), iofile));
if (fsetpos(iofile, &save_position) == -1)
return 0;
return size;
}
/*
* NAME: read_tag()
* DESCRIPTION: read and parse a tag at a file's current position
*/
static
struct id3_tag *read_tag(FILE *iofile, id3_length_t size)
{
id3_byte_t *data;
struct id3_tag *tag = 0;
data = malloc(size);
if (data) {
if (fread(data, size, 1, iofile) == 1)
tag = id3_tag_parse(data, size);
free(data);
}
return tag;
}
/*
* NAME: update_primary()
* DESCRIPTION: update the primary tag with data from a new tag
*/
static
int update_primary(struct id3_tag *tag, struct id3_tag const *new)
{
unsigned int i;
struct id3_frame *frame;
if (new) {
if (!(new->extendedflags & ID3_TAG_EXTENDEDFLAG_TAGISANUPDATE))
id3_tag_clearframes(tag);
i = 0;
while ((frame = id3_tag_findframe(new, 0, i++))) {
if (id3_tag_attachframe(tag, frame) == -1)
return -1;
}
}
return 0;
}
/*
* NAME: tag_compare()
* DESCRIPTION: tag sort function for qsort()
*/
static
int tag_compare(const void *a, const void *b)
{
struct filetag const *tag1 = a, *tag2 = b;
if (tag1->location < tag2->location)
return -1;
else if (tag1->location > tag2->location)
return +1;
return 0;
}
/*
* NAME: add_filetag()
* DESCRIPTION: add a new file tag entry
*/
static
int add_filetag(struct id3_file *file, struct filetag const *filetag)
{
struct filetag *tags;
tags = realloc(file->tags, (file->ntags + 1) * sizeof(*tags));
if (tags == 0)
return -1;
file->tags = tags;
file->tags[file->ntags++] = *filetag;
/* sort tags by location */
if (file->ntags > 1)
qsort(file->tags, file->ntags, sizeof(file->tags[0]), tag_compare);
return 0;
}
/*
* NAME: del_filetag()
* DESCRIPTION: delete a file tag entry
*/
static
void del_filetag(struct id3_file *file, unsigned int index)
{
assert(index < file->ntags);
while (index < file->ntags - 1) {
file->tags[index] = file->tags[index + 1];
++index;
}
--file->ntags;
}
/*
* NAME: add_tag()
* DESCRIPTION: read, parse, and add a tag to a file structure
*/
static
struct id3_tag *add_tag(struct id3_file *file, id3_length_t length)
{
long location;
unsigned int i;
struct filetag filetag;
struct id3_tag *tag;
location = ftell(file->iofile);
if (location == -1)
return 0;
/* check for duplication/overlap */
{
unsigned long begin1, end1, begin2, end2;
begin1 = location;
end1 = begin1 + length;
for (i = 0; i < file->ntags; ++i) {
begin2 = file->tags[i].location;
end2 = begin2 + file->tags[i].length;
if (begin1 == begin2 && end1 == end2)
return file->tags[i].tag; /* duplicate */
if (begin1 < end2 && end1 > begin2)
return 0; /* overlap */
}
}
tag = read_tag(file->iofile, length);
filetag.tag = tag;
filetag.location = location;
filetag.length = length;
if (add_filetag(file, &filetag) == -1 ||
update_primary(file->primary, tag) == -1) {
if (tag)
id3_tag_delete(tag);
return 0;
}
if (tag)
id3_tag_addref(tag);
return tag;
}
/*
* NAME: search_tags()
* DESCRIPTION: search for tags in a file
*/
static
int search_tags(struct id3_file *file)
{
fpos_t save_position;
signed long size;
/*
* save the current seek position
*
* We also verify the stream is seekable by calling fsetpos(), since
* fgetpos() alone is not reliable enough for this purpose.
*
* [Apparently not even fsetpos() is sufficient under Win32.]
*/
if (fgetpos(file->iofile, &save_position) == -1 ||
fsetpos(file->iofile, &save_position) == -1)
return -1;
/* look for an ID3v1 tag */
if (fseek(file->iofile, -128, SEEK_END) == 0) {
size = query_tag(file->iofile);
if (size > 0) {
struct id3_tag const *tag;
tag = add_tag(file, size);
/* if this is indeed an ID3v1 tag, mark the file so */
if (tag && (ID3_TAG_VERSION_MAJOR(id3_tag_version(tag)) == 1))
file->flags |= ID3_FILE_FLAG_ID3V1;
}
}
/* look for a tag at the beginning of the file */
rewind(file->iofile);
size = query_tag(file->iofile);
if (size > 0) {
struct id3_tag const *tag;
struct id3_frame const *frame;
tag = add_tag(file, size);
/* locate tags indicated by SEEK frames */
while (tag && (frame = id3_tag_findframe(tag, "SEEK", 0))) {
long seek;
seek = id3_field_getint(id3_frame_field(frame, 0));
if (seek < 0 || fseek(file->iofile, seek, SEEK_CUR) == -1)
break;
size = query_tag(file->iofile);
tag = (size > 0) ? add_tag(file, size) : 0;
}
}
/* look for a tag at the end of the file (before any ID3v1 tag) */
if (fseek(file->iofile, ((file->flags & ID3_FILE_FLAG_ID3V1) ? -128 : 0) +
-10, SEEK_END) == 0) {
size = query_tag(file->iofile);
if (size < 0 && fseek(file->iofile, size, SEEK_CUR) == 0) {
size = query_tag(file->iofile);
if (size > 0)
add_tag(file, size);
}
}
clearerr(file->iofile);
/* restore seek position */
if (fsetpos(file->iofile, &save_position) == -1)
return -1;
/* set primary tag options and target padded length for convenience */
if ((file->ntags > 0 && !(file->flags & ID3_FILE_FLAG_ID3V1)) ||
(file->ntags > 1 && (file->flags & ID3_FILE_FLAG_ID3V1))) {
if (file->tags[0].location == 0)
id3_tag_setlength(file->primary, file->tags[0].length);
else
id3_tag_options(file->primary, ID3_TAG_OPTION_APPENDEDTAG, ~0);
}
return 0;
}
/*
* NAME: finish_file()
* DESCRIPTION: release memory associated with a file
*/
static
void finish_file(struct id3_file *file)
{
unsigned int i;
if (file->path)
free(file->path);
if (file->primary) {
id3_tag_delref(file->primary);
id3_tag_delete(file->primary);
}
for (i = 0; i < file->ntags; ++i) {
struct id3_tag *tag;
tag = file->tags[i].tag;
if (tag) {
id3_tag_delref(tag);
id3_tag_delete(tag);
}
}
if (file->tags)
free(file->tags);
free(file);
}
/*
* NAME: new_file()
* DESCRIPTION: create a new file structure and load tags
*/
static
struct id3_file *new_file(FILE *iofile, enum id3_file_mode mode,
char const *path)
{
struct id3_file *file;
file = malloc(sizeof(*file));
if (file == 0)
goto fail;
file->iofile = iofile;
file->mode = mode;
file->path = path ? strdup(path) : 0;
file->flags = 0;
file->ntags = 0;
file->tags = 0;
file->primary = id3_tag_new();
if (file->primary == 0)
goto fail;
id3_tag_addref(file->primary);
/* load tags from the file */
if (search_tags(file) == -1)
goto fail;
id3_tag_options(file->primary, ID3_TAG_OPTION_ID3V1,
(file->flags & ID3_FILE_FLAG_ID3V1) ? ~0 : 0);
if (0) {
fail:
if (file) {
finish_file(file);
file = 0;
}
}
return file;
}
/*
* NAME: file->open()
* DESCRIPTION: open a file given its pathname
*/
struct id3_file *id3_file_open(char const *path, enum id3_file_mode mode)
{
FILE *iofile;
struct id3_file *file;
assert(path);
iofile = fopen(path, (mode == ID3_FILE_MODE_READWRITE) ? "r+b" : "rb");
if (iofile == 0)
return 0;
file = new_file(iofile, mode, path);
if (file == 0)
fclose(iofile);
return file;
}
/*
* NAME: file->fdopen()
* DESCRIPTION: open a file using an existing file descriptor
*/
struct id3_file *id3_file_fdopen(int fd, enum id3_file_mode mode)
{
# if 1 || defined(HAVE_UNISTD_H)
FILE *iofile;
struct id3_file *file;
iofile = fdopen(fd, (mode == ID3_FILE_MODE_READWRITE) ? "r+b" : "rb");
if (iofile == 0)
return 0;
file = new_file(iofile, mode, 0);
if (file == 0) {
int save_fd;
/* close iofile without closing fd */
save_fd = dup(fd);
fclose(iofile);
dup2(save_fd, fd);
close(save_fd);
}
return file;
# else
return 0;
# endif
}
/*
* NAME: file->close()
* DESCRIPTION: close a file and delete its associated tags
*/
int id3_file_close(struct id3_file *file)
{
int result = 0;
assert(file);
if (fclose(file->iofile) == EOF)
result = -1;
finish_file(file);
return result;
}
/*
* NAME: file->tag()
* DESCRIPTION: return the primary tag structure for a file
*/
struct id3_tag *id3_file_tag(struct id3_file const *file)
{
assert(file);
return file->primary;
}
/*
* NAME: v1_write()
* DESCRIPTION: write ID3v1 tag modifications to a file
*/
static
int v1_write(struct id3_file *file,
id3_byte_t const *data, id3_length_t length)
{
assert(!data || length == 128);
if (data) {
long location;
if (fseek(file->iofile, (file->flags & ID3_FILE_FLAG_ID3V1) ? -128 : 0,
SEEK_END) == -1 ||
(location = ftell(file->iofile)) == -1 ||
fwrite(data, 128, 1, file->iofile) != 1 ||
fflush(file->iofile) == EOF)
return -1;
/* add file tag reference */
if (!(file->flags & ID3_FILE_FLAG_ID3V1)) {
struct filetag filetag;
filetag.tag = 0;
filetag.location = location;
filetag.length = 128;
if (add_filetag(file, &filetag) == -1)
return -1;
file->flags |= ID3_FILE_FLAG_ID3V1;
}
}
# if defined(HAVE_FTRUNCATE)
else if (file->flags & ID3_FILE_FLAG_ID3V1) {
long length;
if (fseek(file->iofile, 0, SEEK_END) == -1)
return -1;
length = ftell(file->iofile);
if (length == -1 ||
(length >= 0 && length < 128))
return -1;
if (ftruncate(fileno(file->iofile), length - 128) == -1)
return -1;
/* delete file tag reference */
del_filetag(file, file->ntags - 1);
file->flags &= ~ID3_FILE_FLAG_ID3V1;
}
# endif
return 0;
}
/*
* NAME: v2_write()
* DESCRIPTION: write ID3v2 tag modifications to a file
*/
static
int v2_write(struct id3_file *file,
id3_byte_t const *data, id3_length_t length)
{
assert(!data || length > 0);
if (data &&
((file->ntags == 1 && !(file->flags & ID3_FILE_FLAG_ID3V1)) ||
(file->ntags == 2 && (file->flags & ID3_FILE_FLAG_ID3V1))) &&
file->tags[0].length == length) {
/* easy special case: rewrite existing tag in-place */
if (fseek(file->iofile, file->tags[0].location, SEEK_SET) == -1 ||
fwrite(data, length, 1, file->iofile) != 1 ||
fflush(file->iofile) == EOF)
return -1;
goto done;
}
/* hard general case: rewrite entire file */
/* ... */
done:
return 0;
}
/*
* NAME: file->update()
* DESCRIPTION: rewrite tag(s) to a file
*/
int id3_file_update(struct id3_file *file)
{
int options, result = 0;
id3_length_t v1size = 0, v2size = 0;
id3_byte_t id3v1_data[128], *id3v1 = 0, *id3v2 = 0;
assert(file);
if (file->mode != ID3_FILE_MODE_READWRITE)
return -1;
options = id3_tag_options(file->primary, 0, 0);
/* render ID3v1 */
if (options & ID3_TAG_OPTION_ID3V1) {
v1size = id3_tag_render(file->primary, 0);
if (v1size) {
assert(v1size == sizeof(id3v1_data));
v1size = id3_tag_render(file->primary, id3v1_data);
if (v1size) {
assert(v1size == sizeof(id3v1_data));
id3v1 = id3v1_data;
}
}
}
/* render ID3v2 */
id3_tag_options(file->primary, ID3_TAG_OPTION_ID3V1, 0);
v2size = id3_tag_render(file->primary, 0);
if (v2size) {
id3v2 = malloc(v2size);
if (id3v2 == 0)
goto fail;
v2size = id3_tag_render(file->primary, id3v2);
if (v2size == 0) {
free(id3v2);
id3v2 = 0;
}
}
/* write tags */
if (v2_write(file, id3v2, v2size) == -1 ||
v1_write(file, id3v1, v1size) == -1)
goto fail;
rewind(file->iofile);
/* update file tags array? ... */
if (0) {
fail:
result = -1;
}
/* clean up; restore tag options */
if (id3v2)
free(id3v2);
id3_tag_options(file->primary, ~0, options);
return result;
}

View File

@ -0,0 +1,25 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: file.h,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_FILE_H
# define LIBID3TAG_FILE_H
# endif

View File

@ -0,0 +1,626 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: frame.c,v 1.15 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include <string.h>
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include "id3tag.h"
# include "frame.h"
# include "frametype.h"
# include "compat.h"
# include "field.h"
# include "render.h"
# include "parse.h"
# include "util.h"
static
int valid_idchar(char c)
{
return (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9');
}
/*
* NAME: frame->validid()
* DESCRIPTION: return true if the parameter string is a legal frame ID
*/
int id3_frame_validid(char const *id)
{
return id &&
valid_idchar(id[0]) &&
valid_idchar(id[1]) &&
valid_idchar(id[2]) &&
valid_idchar(id[3]);
}
/*
* NAME: frame->new()
* DESCRIPTION: allocate and return a new frame
*/
struct id3_frame *id3_frame_new(char const *id)
{
struct id3_frametype const *frametype;
struct id3_frame *frame;
unsigned int i;
if (!id3_frame_validid(id))
return 0;
frametype = id3_frametype_lookup(id, 4);
if (frametype == 0) {
switch (id[0]) {
case 'T':
frametype = &id3_frametype_text;
break;
case 'W':
frametype = &id3_frametype_url;
break;
case 'X':
case 'Y':
case 'Z':
frametype = &id3_frametype_experimental;
break;
default:
frametype = &id3_frametype_unknown;
if (id3_compat_lookup(id, 4))
frametype = &id3_frametype_obsolete;
break;
}
}
frame = malloc(sizeof(*frame) + frametype->nfields * sizeof(*frame->fields));
if (frame) {
frame->id[0] = id[0];
frame->id[1] = id[1];
frame->id[2] = id[2];
frame->id[3] = id[3];
frame->id[4] = 0;
frame->description = frametype->description;
frame->refcount = 0;
frame->flags = frametype->defaultflags;
frame->group_id = 0;
frame->encryption_method = 0;
frame->encoded = 0;
frame->encoded_length = 0;
frame->decoded_length = 0;
frame->nfields = frametype->nfields;
frame->fields = (union id3_field *) &frame[1];
for (i = 0; i < frame->nfields; ++i)
id3_field_init(&frame->fields[i], frametype->fields[i]);
}
return frame;
}
void id3_frame_delete(struct id3_frame *frame)
{
assert(frame);
if (frame->refcount == 0) {
unsigned int i;
for (i = 0; i < frame->nfields; ++i)
id3_field_finish(&frame->fields[i]);
if (frame->encoded)
free(frame->encoded);
free(frame);
}
}
/*
* NAME: frame->addref()
* DESCRIPTION: add an external reference to a frame
*/
void id3_frame_addref(struct id3_frame *frame)
{
assert(frame);
++frame->refcount;
}
/*
* NAME: frame->delref()
* DESCRIPTION: remove an external reference to a frame
*/
void id3_frame_delref(struct id3_frame *frame)
{
assert(frame && frame->refcount > 0);
--frame->refcount;
}
/*
* NAME: frame->field()
* DESCRIPTION: return a pointer to a field in a frame
*/
union id3_field *id3_frame_field(struct id3_frame const *frame,
unsigned int index)
{
assert(frame);
return (index < frame->nfields) ? &frame->fields[index] : 0;
}
static
struct id3_frame *obsolete(char const *id, id3_byte_t const *data,
id3_length_t length)
{
struct id3_frame *frame;
frame = id3_frame_new(ID3_FRAME_OBSOLETE);
if (frame) {
if (id3_field_setframeid(&frame->fields[0], id) == -1 ||
id3_field_setbinarydata(&frame->fields[1], data, length) == -1)
goto fail;
}
if (0) {
fail:
if (frame) {
id3_frame_delete(frame);
frame = 0;
}
}
return frame;
}
static
struct id3_frame *unparseable(char const *id, id3_byte_t const **ptr,
id3_length_t length, int flags,
int group_id, int encryption_method,
id3_length_t decoded_length)
{
struct id3_frame *frame = 0;
id3_byte_t *mem;
mem = malloc(length ? length : 1);
if (mem == 0)
goto fail;
frame = id3_frame_new(id);
if (frame == 0)
free(mem);
else {
memcpy(mem, *ptr, length);
frame->flags = flags;
frame->group_id = group_id;
frame->encryption_method = encryption_method;
frame->encoded = mem;
frame->encoded_length = length;
frame->decoded_length = decoded_length;
}
if (0) {
fail:
;
}
*ptr += length;
return frame;
}
static
int parse_data(struct id3_frame *frame,
id3_byte_t const *data, id3_length_t length)
{
enum id3_field_textencoding encoding;
id3_byte_t const *end;
unsigned int i;
encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;
end = data + length;
for (i = 0; i < frame->nfields; ++i) {
if (id3_field_parse(&frame->fields[i], &data, end - data, &encoding) == -1)
return -1;
}
return 0;
}
/*
* NAME: frame->parse()
* DESCRIPTION: parse raw frame data according to the specified ID3 tag version
*/
struct id3_frame *id3_frame_parse(id3_byte_t const **ptr, id3_length_t length,
unsigned int version)
{
struct id3_frame *frame = 0;
id3_byte_t const *id, *end, *data;
id3_length_t size, decoded_length = 0;
int flags = 0, group_id = 0, encryption_method = 0;
struct id3_compat const *compat = 0;
id3_byte_t *mem = 0;
char xid[4];
id = *ptr;
end = *ptr + length;
if (ID3_TAG_VERSION_MAJOR(version) < 4) {
switch (ID3_TAG_VERSION_MAJOR(version)) {
case 2:
if (length < 6)
goto fail;
compat = id3_compat_lookup(id, 3);
*ptr += 3;
size = id3_parse_uint(ptr, 3);
if (size > end - *ptr)
goto fail;
end = *ptr + size;
break;
case 3:
if (length < 10)
goto fail;
compat = id3_compat_lookup(id, 4);
*ptr += 4;
size = id3_parse_uint(ptr, 4);
flags = id3_parse_uint(ptr, 2);
if (size > end - *ptr)
goto fail;
end = *ptr + size;
if (flags & (ID3_FRAME_FLAG_FORMATFLAGS & ~0x00e0)) {
frame = unparseable(id, ptr, end - *ptr, 0, 0, 0, 0);
goto done;
}
flags =
((flags >> 1) & ID3_FRAME_FLAG_STATUSFLAGS) |
((flags >> 4) & (ID3_FRAME_FLAG_COMPRESSION |
ID3_FRAME_FLAG_ENCRYPTION)) |
((flags << 1) & ID3_FRAME_FLAG_GROUPINGIDENTITY);
if (flags & ID3_FRAME_FLAG_COMPRESSION) {
if (end - *ptr < 4)
goto fail;
decoded_length = id3_parse_uint(ptr, 4);
}
if (flags & ID3_FRAME_FLAG_ENCRYPTION) {
if (end - *ptr < 1)
goto fail;
encryption_method = id3_parse_uint(ptr, 1);
}
if (flags & ID3_FRAME_FLAG_GROUPINGIDENTITY) {
if (end - *ptr < 1)
goto fail;
group_id = id3_parse_uint(ptr, 1);
}
break;
default:
goto fail;
}
/* canonicalize frame ID for ID3v2.4 */
if (compat && compat->equiv)
id = compat->equiv;
else if (ID3_TAG_VERSION_MAJOR(version) == 2) {
xid[0] = 'Y';
xid[1] = id[0];
xid[2] = id[1];
xid[3] = id[2];
id = xid;
flags |=
ID3_FRAME_FLAG_TAGALTERPRESERVATION |
ID3_FRAME_FLAG_FILEALTERPRESERVATION;
}
}
else { /* ID3v2.4 */
if (length < 10)
goto fail;
*ptr += 4;
size = id3_parse_syncsafe(ptr, 4);
flags = id3_parse_uint(ptr, 2);
if (size > end - *ptr)
goto fail;
end = *ptr + size;
if (flags & (ID3_FRAME_FLAG_FORMATFLAGS & ~ID3_FRAME_FLAG_KNOWNFLAGS)) {
frame = unparseable(id, ptr, end - *ptr, flags, 0, 0, 0);
goto done;
}
if (flags & ID3_FRAME_FLAG_GROUPINGIDENTITY) {
if (end - *ptr < 1)
goto fail;
group_id = id3_parse_uint(ptr, 1);
}
if ((flags & ID3_FRAME_FLAG_COMPRESSION) &&
!(flags & ID3_FRAME_FLAG_DATALENGTHINDICATOR))
goto fail;
if (flags & ID3_FRAME_FLAG_ENCRYPTION) {
if (end - *ptr < 1)
goto fail;
encryption_method = id3_parse_uint(ptr, 1);
}
if (flags & ID3_FRAME_FLAG_DATALENGTHINDICATOR) {
if (end - *ptr < 4)
goto fail;
decoded_length = id3_parse_syncsafe(ptr, 4);
}
}
data = *ptr;
*ptr = end;
/* undo frame encodings */
if ((flags & ID3_FRAME_FLAG_UNSYNCHRONISATION) && end - data > 0) {
mem = malloc(end - data);
if (mem == 0)
goto fail;
memcpy(mem, data, end - data);
end = mem + id3_util_deunsynchronise(mem, end - data);
data = mem;
}
if (flags & ID3_FRAME_FLAG_ENCRYPTION) {
frame = unparseable(id, &data, end - data, flags,
group_id, encryption_method, decoded_length);
goto done;
}
if (flags & ID3_FRAME_FLAG_COMPRESSION) {
id3_byte_t *decomp;
decomp = id3_util_decompress(data, end - data, decoded_length);
if (decomp == 0)
goto fail;
if (mem)
free(mem);
data = mem = decomp;
end = data + decoded_length;
}
/* check for obsolescence */
if (compat && !compat->equiv) {
frame = obsolete(id, data, end - data);
goto done;
}
/* generate the internal frame structure */
frame = id3_frame_new(id);
if (frame) {
frame->flags = flags;
frame->group_id = group_id;
if (compat && compat->translate) {
if (compat->translate(frame, compat->id, data, end - data) == -1)
goto fail;
}
else {
if (parse_data(frame, data, end - data) == -1)
goto fail;
}
}
if (0) {
fail:
if (frame) {
id3_frame_delete(frame);
frame = 0;
}
}
done:
if (mem)
free(mem);
return frame;
}
static
id3_length_t render_data(id3_byte_t **ptr,
union id3_field *fields, unsigned int length)
{
id3_length_t size = 0;
enum id3_field_textencoding encoding;
unsigned int i;
encoding = ID3_FIELD_TEXTENCODING_ISO_8859_1;
for (i = 0; i < length; ++i)
size += id3_field_render(&fields[i], ptr, &encoding, i < length - 1);
return size;
}
/*
* NAME: frame->render()
* DESCRIPTION: render a single, complete frame
*/
id3_length_t id3_frame_render(struct id3_frame const *frame,
id3_byte_t **ptr, int options)
{
id3_length_t size = 0, decoded_length, datalen;
id3_byte_t *size_ptr = 0, *flags_ptr = 0, *data = 0;
int flags;
assert(frame);
if ((frame->flags & ID3_FRAME_FLAG_TAGALTERPRESERVATION) ||
((options & ID3_TAG_OPTION_FILEALTERED) &&
(frame->flags & ID3_FRAME_FLAG_FILEALTERPRESERVATION)))
return 0;
/* a frame must be at least 1 byte big, excluding the header */
decoded_length = render_data(0, frame->fields, frame->nfields);
if (decoded_length == 0 && frame->encoded == 0)
return 0;
/* header */
size += id3_render_immediate(ptr, frame->id, 4);
if (ptr)
size_ptr = *ptr;
size += id3_render_syncsafe(ptr, 0, 4);
if (ptr)
flags_ptr = *ptr;
flags = frame->flags;
size += id3_render_int(ptr, flags, 2);
if (flags & (ID3_FRAME_FLAG_FORMATFLAGS & ~ID3_FRAME_FLAG_KNOWNFLAGS)) {
size += id3_render_binary(ptr, frame->encoded, frame->encoded_length);
if (size_ptr)
id3_render_syncsafe(&size_ptr, size - 10, 4);
return size;
}
flags &= ID3_FRAME_FLAG_KNOWNFLAGS;
flags &= ~ID3_FRAME_FLAG_UNSYNCHRONISATION;
if (options & ID3_TAG_OPTION_UNSYNCHRONISATION)
flags |= ID3_FRAME_FLAG_UNSYNCHRONISATION;
if (!(flags & ID3_FRAME_FLAG_ENCRYPTION)) {
flags &= ~ID3_FRAME_FLAG_COMPRESSION;
if (options & ID3_TAG_OPTION_COMPRESSION)
flags |= ID3_FRAME_FLAG_COMPRESSION | ID3_FRAME_FLAG_DATALENGTHINDICATOR;
}
if (flags & ID3_FRAME_FLAG_GROUPINGIDENTITY)
size += id3_render_int(ptr, frame->group_id, 1);
if (flags & ID3_FRAME_FLAG_ENCRYPTION)
size += id3_render_int(ptr, frame->encryption_method, 1);
if (flags & ID3_FRAME_FLAG_DATALENGTHINDICATOR) {
if (flags & ID3_FRAME_FLAG_ENCRYPTION)
decoded_length = frame->decoded_length;
size += id3_render_syncsafe(ptr, decoded_length, 4);
}
if (ptr)
data = *ptr;
if (flags & ID3_FRAME_FLAG_ENCRYPTION)
datalen = id3_render_binary(ptr, frame->encoded, frame->encoded_length);
else {
if (ptr == 0)
datalen = decoded_length;
else {
datalen = render_data(ptr, frame->fields, frame->nfields);
if (flags & ID3_FRAME_FLAG_COMPRESSION) {
id3_byte_t *comp;
id3_length_t complen;
comp = id3_util_compress(data, datalen, &complen);
if (comp == 0)
flags &= ~ID3_FRAME_FLAG_COMPRESSION;
else {
*ptr = data;
datalen = id3_render_binary(ptr, comp, complen);
free(comp);
}
}
}
}
/* unsynchronisation */
if (flags & ID3_FRAME_FLAG_UNSYNCHRONISATION) {
if (data == 0)
datalen *= 2;
else {
id3_length_t newlen;
newlen = id3_util_unsynchronise(data, datalen);
if (newlen == datalen)
flags &= ~ID3_FRAME_FLAG_UNSYNCHRONISATION;
else {
*ptr += newlen - datalen;
datalen = newlen;
}
}
}
size += datalen;
/* patch size and flags */
if (size_ptr)
id3_render_syncsafe(&size_ptr, size - 10, 4);
if (flags_ptr)
id3_render_int(&flags_ptr, flags, 2);
return size;
}

View File

@ -0,0 +1,36 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: frame.h,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_FRAME_H
# define LIBID3TAG_FRAME_H
# include "id3tag.h"
int id3_frame_validid(char const *);
void id3_frame_addref(struct id3_frame *);
void id3_frame_delref(struct id3_frame *);
struct id3_frame *id3_frame_parse(id3_byte_t const **, id3_length_t,
unsigned int);
id3_length_t id3_frame_render(struct id3_frame const *, id3_byte_t **, int);
# endif

View File

@ -0,0 +1,568 @@
/* C code produced by gperf version 3.0.1 */
/* Command-line: gperf -tCcTonD -K id -N id3_frametype_lookup -s -3 -k '*' frametype.gperf */
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
/* The character set is not based on ISO-646. */
error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
#endif
#line 1 "frametype.gperf"
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* Id: frametype.gperf,v 1.7 2004/01/23 09:41:32 rob Exp
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <string.h>
# include "id3tag.h"
# include "frametype.h"
# define FIELDS(id) static enum id3_field_type const fields_##id[]
/* frame field descriptions */
FIELDS(UFID) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(TXXX) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRING
};
FIELDS(WXXX) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_LATIN1
};
FIELDS(MCDI) = {
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(ETCO) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(MLLT) = {
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT24,
ID3_FIELD_TYPE_INT24,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(SYTC) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(USLT) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRINGFULL
};
FIELDS(SYLT) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(COMM) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRINGFULL
};
FIELDS(RVA2) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(EQU2) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(RVRB) = {
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8
};
FIELDS(APIC) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(GEOB) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(PCNT) = {
ID3_FIELD_TYPE_INT32PLUS
};
FIELDS(POPM) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT32PLUS
};
FIELDS(RBUF) = {
ID3_FIELD_TYPE_INT24,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT32
};
FIELDS(AENC) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(LINK) = {
ID3_FIELD_TYPE_FRAMEID,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_LATIN1LIST
};
FIELDS(POSS) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(USER) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_STRING
};
FIELDS(OWNE) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_DATE,
ID3_FIELD_TYPE_STRING
};
FIELDS(COMR) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_DATE,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(ENCR) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(GRID) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(PRIV) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(SIGN) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(SEEK) = {
ID3_FIELD_TYPE_INT32
};
FIELDS(ASPI) = {
ID3_FIELD_TYPE_INT32,
ID3_FIELD_TYPE_INT32,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(text) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_STRINGLIST
};
FIELDS(url) = {
ID3_FIELD_TYPE_LATIN1
};
FIELDS(unknown) = {
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(ZOBS) = {
ID3_FIELD_TYPE_FRAMEID,
ID3_FIELD_TYPE_BINARYDATA
};
# define FRAME(id) \
sizeof(fields_##id) / sizeof(fields_##id[0]), fields_##id
# define PRESERVE 0
# define DISCARD ID3_FRAME_FLAG_FILEALTERPRESERVATION
# define OBSOLETE (DISCARD | ID3_FRAME_FLAG_TAGALTERPRESERVATION)
# define FRAMETYPE(type, id, flags, desc) \
struct id3_frametype const id3_frametype_##type = { \
0, FRAME(id), flags, desc \
}
/* static frame types */
FRAMETYPE(text, text, PRESERVE, "Unknown text information frame");
FRAMETYPE(url, url, PRESERVE, "Unknown URL link frame");
FRAMETYPE(experimental, unknown, PRESERVE, "Experimental frame");
FRAMETYPE(unknown, unknown, PRESERVE, "Unknown frame");
FRAMETYPE(obsolete, unknown, OBSOLETE, "Obsolete frame");
#define TOTAL_KEYWORDS 84
#define MIN_WORD_LENGTH 4
#define MAX_WORD_LENGTH 4
#define MIN_HASH_VALUE 7
#define MAX_HASH_VALUE 155
/* maximum key range = 149, duplicates = 0 */
#ifdef __GNUC__
__inline
#else
#ifdef __cplusplus
inline
#endif
#endif
static unsigned int
hash (str, len)
register const char *str;
register unsigned int len;
{
static const unsigned char asso_values[] =
{
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
43, 4, 47, 49, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 31, 53, 3, 15, 3,
24, 25, 10, 52, 69, 34, 23, 30, 1, 5,
10, 62, 20, 0, 28, 28, 22, 19, 47, 3,
10, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156, 156, 156, 156,
156, 156, 156, 156, 156, 156, 156
};
return asso_values[(unsigned char)str[3]+1] + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[1]] + asso_values[(unsigned char)str[0]];
}
#ifdef __GNUC__
__inline
#endif
const struct id3_frametype *
id3_frametype_lookup (str, len)
register const char *str;
register unsigned int len;
{
static const struct id3_frametype wordlist[] =
{
#line 282 "frametype.gperf"
{"ENCR", FRAME(ENCR), PRESERVE, "Encryption method registration"},
#line 292 "frametype.gperf"
{"POPM", FRAME(POPM), PRESERVE, "Popularimeter"},
#line 351 "frametype.gperf"
{"WCOM", FRAME(url), PRESERVE, "Commercial information"},
#line 298 "frametype.gperf"
{"SEEK", FRAME(SEEK), DISCARD, "Seek frame"},
#line 349 "frametype.gperf"
{"USER", FRAME(USER), PRESERVE, "Terms of use"},
#line 285 "frametype.gperf"
{"GEOB", FRAME(GEOB), PRESERVE, "General encapsulated object"},
#line 304 "frametype.gperf"
{"TCOM", FRAME(text), PRESERVE, "Composer"},
#line 281 "frametype.gperf"
{"COMR", FRAME(COMR), PRESERVE, "Commercial frame"},
#line 280 "frametype.gperf"
{"COMM", FRAME(COMM), PRESERVE, "Comments"},
#line 305 "frametype.gperf"
{"TCON", FRAME(text), PRESERVE, "Content type"},
#line 291 "frametype.gperf"
{"PCNT", FRAME(PCNT), PRESERVE, "Play counter"},
#line 293 "frametype.gperf"
{"POSS", FRAME(POSS), DISCARD, "Position synchronisation frame"},
#line 284 "frametype.gperf"
{"ETCO", FRAME(ETCO), DISCARD, "Event timing codes"},
#line 332 "frametype.gperf"
{"TPE2", FRAME(text), PRESERVE, "Band/orchestra/accompaniment"},
#line 301 "frametype.gperf"
{"SYTC", FRAME(SYTC), DISCARD, "Synchronised tempo codes"},
#line 313 "frametype.gperf"
{"TENC", FRAME(text), DISCARD, "Encoded by"},
#line 309 "frametype.gperf"
{"TDOR", FRAME(text), PRESERVE, "Original release time"},
#line 290 "frametype.gperf"
{"OWNE", FRAME(OWNE), PRESERVE, "Ownership frame"},
#line 277 "frametype.gperf"
{"AENC", FRAME(AENC), DISCARD, "Audio encryption"},
#line 307 "frametype.gperf"
{"TDEN", FRAME(text), PRESERVE, "Encoding time"},
#line 345 "frametype.gperf"
{"TSSE", FRAME(text), PRESERVE, "Software/hardware and settings used for encoding"},
#line 339 "frametype.gperf"
{"TRSN", FRAME(text), PRESERVE, "Internet radio station name"},
#line 300 "frametype.gperf"
{"SYLT", FRAME(SYLT), DISCARD, "Synchronised lyric/text"},
#line 354 "frametype.gperf"
{"WOAR", FRAME(url), PRESERVE, "Official artist/performer webpage"},
#line 346 "frametype.gperf"
{"TSST", FRAME(text), PRESERVE, "Set subtitle"},
#line 330 "frametype.gperf"
{"TOWN", FRAME(text), PRESERVE, "File owner/licensee"},
#line 340 "frametype.gperf"
{"TRSO", FRAME(text), PRESERVE, "Internet radio station owner"},
#line 322 "frametype.gperf"
{"TLEN", FRAME(text), DISCARD, "Length"},
#line 358 "frametype.gperf"
{"WPUB", FRAME(url), PRESERVE, "Publishers official webpage"},
#line 343 "frametype.gperf"
{"TSOT", FRAME(text), PRESERVE, "Title sort order"},
#line 327 "frametype.gperf"
{"TOFN", FRAME(text), PRESERVE, "Original filename"},
#line 344 "frametype.gperf"
{"TSRC", FRAME(text), PRESERVE, "ISRC (international standard recording code)"},
#line 324 "frametype.gperf"
{"TMED", FRAME(text), PRESERVE, "Media type"},
#line 297 "frametype.gperf"
{"RVRB", FRAME(RVRB), PRESERVE, "Reverb"},
#line 328 "frametype.gperf"
{"TOLY", FRAME(text), PRESERVE, "Original lyricist(s)/text writer(s)"},
#line 329 "frametype.gperf"
{"TOPE", FRAME(text), PRESERVE, "Original artist(s)/performer(s)"},
#line 336 "frametype.gperf"
{"TPRO", FRAME(text), PRESERVE, "Produced notice"},
#line 337 "frametype.gperf"
{"TPUB", FRAME(text), PRESERVE, "Publisher"},
#line 357 "frametype.gperf"
{"WPAY", FRAME(url), PRESERVE, "Payment"},
#line 335 "frametype.gperf"
{"TPOS", FRAME(text), PRESERVE, "Part of a set"},
#line 356 "frametype.gperf"
{"WORS", FRAME(url), PRESERVE, "Official Internet radio station homepage"},
#line 325 "frametype.gperf"
{"TMOO", FRAME(text), PRESERVE, "Mood"},
#line 338 "frametype.gperf"
{"TRCK", FRAME(text), PRESERVE, "Track number/position in set"},
#line 320 "frametype.gperf"
{"TKEY", FRAME(text), PRESERVE, "Initial key"},
#line 308 "frametype.gperf"
{"TDLY", FRAME(text), PRESERVE, "Playlist delay"},
#line 296 "frametype.gperf"
{"RVA2", FRAME(RVA2), DISCARD, "Relative volume adjustment (2)"},
#line 310 "frametype.gperf"
{"TDRC", FRAME(text), PRESERVE, "Recording time"},
#line 350 "frametype.gperf"
{"USLT", FRAME(USLT), PRESERVE, "Unsynchronised lyric/text transcription"},
#line 353 "frametype.gperf"
{"WOAF", FRAME(url), PRESERVE, "Official audio file webpage"},
#line 312 "frametype.gperf"
{"TDTG", FRAME(text), PRESERVE, "Tagging time"},
#line 299 "frametype.gperf"
{"SIGN", FRAME(SIGN), PRESERVE, "Signature frame"},
#line 355 "frametype.gperf"
{"WOAS", FRAME(url), PRESERVE, "Official audio source webpage"},
#line 331 "frametype.gperf"
{"TPE1", FRAME(text), PRESERVE, "Lead performer(s)/soloist(s)"},
#line 302 "frametype.gperf"
{"TALB", FRAME(text), PRESERVE, "Album/movie/show title"},
#line 341 "frametype.gperf"
{"TSOA", FRAME(text), PRESERVE, "Album sort order"},
#line 321 "frametype.gperf"
{"TLAN", FRAME(text), PRESERVE, "Language(s)"},
#line 333 "frametype.gperf"
{"TPE3", FRAME(text), PRESERVE, "Conductor/performer refinement"},
#line 352 "frametype.gperf"
{"WCOP", FRAME(url), PRESERVE, "Copyright/legal information"},
#line 334 "frametype.gperf"
{"TPE4", FRAME(text), PRESERVE, "Interpreted, remixed, or otherwise modified by"},
#line 323 "frametype.gperf"
{"TMCL", FRAME(text), PRESERVE, "Musician credits list"},
#line 303 "frametype.gperf"
{"TBPM", FRAME(text), PRESERVE, "BPM (beats per minute)"},
#line 311 "frametype.gperf"
{"TDRL", FRAME(text), PRESERVE, "Release time"},
#line 326 "frametype.gperf"
{"TOAL", FRAME(text), PRESERVE, "Original album/movie/show title"},
#line 342 "frametype.gperf"
{"TSOP", FRAME(text), PRESERVE, "Performer sort order"},
#line 363 "frametype.gperf"
{"ZOBS", FRAME(ZOBS), OBSOLETE, "Obsolete frame"},
#line 283 "frametype.gperf"
{"EQU2", FRAME(EQU2), DISCARD, "Equalisation (2)"},
#line 306 "frametype.gperf"
{"TCOP", FRAME(text), PRESERVE, "Copyright message"},
#line 287 "frametype.gperf"
{"LINK", FRAME(LINK), PRESERVE, "Linked information"},
#line 286 "frametype.gperf"
{"GRID", FRAME(GRID), PRESERVE, "Group identification registration"},
#line 294 "frametype.gperf"
{"PRIV", FRAME(PRIV), PRESERVE, "Private frame"},
#line 315 "frametype.gperf"
{"TFLT", FRAME(text), PRESERVE, "File type"},
#line 289 "frametype.gperf"
{"MLLT", FRAME(MLLT), DISCARD, "MPEG location lookup table"},
#line 314 "frametype.gperf"
{"TEXT", FRAME(text), PRESERVE, "Lyricist/text writer"},
#line 348 "frametype.gperf"
{"UFID", FRAME(UFID), PRESERVE, "Unique file identifier"},
#line 278 "frametype.gperf"
{"APIC", FRAME(APIC), PRESERVE, "Attached picture"},
#line 279 "frametype.gperf"
{"ASPI", FRAME(ASPI), DISCARD, "Audio seek point index"},
#line 318 "frametype.gperf"
{"TIT2", FRAME(text), PRESERVE, "Title/songname/content description"},
#line 359 "frametype.gperf"
{"WXXX", FRAME(WXXX), PRESERVE, "User defined URL link frame"},
#line 288 "frametype.gperf"
{"MCDI", FRAME(MCDI), PRESERVE, "Music CD identifier"},
#line 316 "frametype.gperf"
{"TIPL", FRAME(text), PRESERVE, "Involved people list"},
#line 347 "frametype.gperf"
{"TXXX", FRAME(TXXX), PRESERVE, "User defined text information frame"},
#line 295 "frametype.gperf"
{"RBUF", FRAME(RBUF), PRESERVE, "Recommended buffer size"},
#line 317 "frametype.gperf"
{"TIT1", FRAME(text), PRESERVE, "Content group description"},
#line 319 "frametype.gperf"
{"TIT3", FRAME(text), PRESERVE, "Subtitle/description refinement"}
};
static const short lookup[] =
{
-1, -1, -1, -1, -1, -1, -1, 0, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, -1,
2, 3, -1, 4, -1, -1, -1, -1, 5, 6, 7, 8, -1, 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, -1, 70, 71, -1, 72, 73, 74, -1, 75, -1,
76, -1, -1, -1, 77, 78, -1, -1, 79, -1, -1, -1, -1, 80,
81, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 82, -1, -1,
-1, 83
};
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
{
register int key = hash (str, len);
if (key <= MAX_HASH_VALUE && key >= 0)
{
register int index = lookup[key];
if (index >= 0)
{
register const char *s = wordlist[index].id;
if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\0')
return &wordlist[index];
}
}
}
return 0;
}

View File

@ -0,0 +1,363 @@
%{
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: frametype.gperf,v 1.7 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <string.h>
# include "id3tag.h"
# include "frametype.h"
# define FIELDS(id) static enum id3_field_type const fields_##id[]
/* frame field descriptions */
FIELDS(UFID) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(TXXX) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRING
};
FIELDS(WXXX) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_LATIN1
};
FIELDS(MCDI) = {
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(ETCO) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(MLLT) = {
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT24,
ID3_FIELD_TYPE_INT24,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(SYTC) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(USLT) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRINGFULL
};
FIELDS(SYLT) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(COMM) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRINGFULL
};
FIELDS(RVA2) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(EQU2) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(RVRB) = {
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT8
};
FIELDS(APIC) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(GEOB) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(PCNT) = {
ID3_FIELD_TYPE_INT32PLUS
};
FIELDS(POPM) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT32PLUS
};
FIELDS(RBUF) = {
ID3_FIELD_TYPE_INT24,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT32
};
FIELDS(AENC) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(LINK) = {
ID3_FIELD_TYPE_FRAMEID,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_LATIN1LIST
};
FIELDS(POSS) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(USER) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_STRING
};
FIELDS(OWNE) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_DATE,
ID3_FIELD_TYPE_STRING
};
FIELDS(COMR) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_DATE,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(ENCR) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(GRID) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(PRIV) = {
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(SIGN) = {
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(SEEK) = {
ID3_FIELD_TYPE_INT32
};
FIELDS(ASPI) = {
ID3_FIELD_TYPE_INT32,
ID3_FIELD_TYPE_INT32,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(text) = {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_STRINGLIST
};
FIELDS(url) = {
ID3_FIELD_TYPE_LATIN1
};
FIELDS(unknown) = {
ID3_FIELD_TYPE_BINARYDATA
};
FIELDS(ZOBS) = {
ID3_FIELD_TYPE_FRAMEID,
ID3_FIELD_TYPE_BINARYDATA
};
# define FRAME(id) \
sizeof(fields_##id) / sizeof(fields_##id[0]), fields_##id
# define PRESERVE 0
# define DISCARD ID3_FRAME_FLAG_FILEALTERPRESERVATION
# define OBSOLETE (DISCARD | ID3_FRAME_FLAG_TAGALTERPRESERVATION)
# define FRAMETYPE(type, id, flags, desc) \
struct id3_frametype const id3_frametype_##type = { \
0, FRAME(id), flags, desc \
}
/* static frame types */
FRAMETYPE(text, text, PRESERVE, "Unknown text information frame");
FRAMETYPE(url, url, PRESERVE, "Unknown URL link frame");
FRAMETYPE(experimental, unknown, PRESERVE, "Experimental frame");
FRAMETYPE(unknown, unknown, PRESERVE, "Unknown frame");
FRAMETYPE(obsolete, unknown, OBSOLETE, "Obsolete frame");
%}
struct id3_frametype;
%%
#
# ID3v2.4 frames
#
AENC, FRAME(AENC), DISCARD, "Audio encryption"
APIC, FRAME(APIC), PRESERVE, "Attached picture"
ASPI, FRAME(ASPI), DISCARD, "Audio seek point index"
COMM, FRAME(COMM), PRESERVE, "Comments"
COMR, FRAME(COMR), PRESERVE, "Commercial frame"
ENCR, FRAME(ENCR), PRESERVE, "Encryption method registration"
EQU2, FRAME(EQU2), DISCARD, "Equalisation (2)"
ETCO, FRAME(ETCO), DISCARD, "Event timing codes"
GEOB, FRAME(GEOB), PRESERVE, "General encapsulated object"
GRID, FRAME(GRID), PRESERVE, "Group identification registration"
LINK, FRAME(LINK), PRESERVE, "Linked information"
MCDI, FRAME(MCDI), PRESERVE, "Music CD identifier"
MLLT, FRAME(MLLT), DISCARD, "MPEG location lookup table"
OWNE, FRAME(OWNE), PRESERVE, "Ownership frame"
PCNT, FRAME(PCNT), PRESERVE, "Play counter"
POPM, FRAME(POPM), PRESERVE, "Popularimeter"
POSS, FRAME(POSS), DISCARD, "Position synchronisation frame"
PRIV, FRAME(PRIV), PRESERVE, "Private frame"
RBUF, FRAME(RBUF), PRESERVE, "Recommended buffer size"
RVA2, FRAME(RVA2), DISCARD, "Relative volume adjustment (2)"
RVRB, FRAME(RVRB), PRESERVE, "Reverb"
SEEK, FRAME(SEEK), DISCARD, "Seek frame"
SIGN, FRAME(SIGN), PRESERVE, "Signature frame"
SYLT, FRAME(SYLT), DISCARD, "Synchronised lyric/text"
SYTC, FRAME(SYTC), DISCARD, "Synchronised tempo codes"
TALB, FRAME(text), PRESERVE, "Album/movie/show title"
TBPM, FRAME(text), PRESERVE, "BPM (beats per minute)"
TCOM, FRAME(text), PRESERVE, "Composer"
TCON, FRAME(text), PRESERVE, "Content type"
TCOP, FRAME(text), PRESERVE, "Copyright message"
TDEN, FRAME(text), PRESERVE, "Encoding time"
TDLY, FRAME(text), PRESERVE, "Playlist delay"
TDOR, FRAME(text), PRESERVE, "Original release time"
TDRC, FRAME(text), PRESERVE, "Recording time"
TDRL, FRAME(text), PRESERVE, "Release time"
TDTG, FRAME(text), PRESERVE, "Tagging time"
TENC, FRAME(text), DISCARD, "Encoded by"
TEXT, FRAME(text), PRESERVE, "Lyricist/text writer"
TFLT, FRAME(text), PRESERVE, "File type"
TIPL, FRAME(text), PRESERVE, "Involved people list"
TIT1, FRAME(text), PRESERVE, "Content group description"
TIT2, FRAME(text), PRESERVE, "Title/songname/content description"
TIT3, FRAME(text), PRESERVE, "Subtitle/description refinement"
TKEY, FRAME(text), PRESERVE, "Initial key"
TLAN, FRAME(text), PRESERVE, "Language(s)"
TLEN, FRAME(text), DISCARD, "Length"
TMCL, FRAME(text), PRESERVE, "Musician credits list"
TMED, FRAME(text), PRESERVE, "Media type"
TMOO, FRAME(text), PRESERVE, "Mood"
TOAL, FRAME(text), PRESERVE, "Original album/movie/show title"
TOFN, FRAME(text), PRESERVE, "Original filename"
TOLY, FRAME(text), PRESERVE, "Original lyricist(s)/text writer(s)"
TOPE, FRAME(text), PRESERVE, "Original artist(s)/performer(s)"
TOWN, FRAME(text), PRESERVE, "File owner/licensee"
TPE1, FRAME(text), PRESERVE, "Lead performer(s)/soloist(s)"
TPE2, FRAME(text), PRESERVE, "Band/orchestra/accompaniment"
TPE3, FRAME(text), PRESERVE, "Conductor/performer refinement"
TPE4, FRAME(text), PRESERVE, "Interpreted, remixed, or otherwise modified by"
TPOS, FRAME(text), PRESERVE, "Part of a set"
TPRO, FRAME(text), PRESERVE, "Produced notice"
TPUB, FRAME(text), PRESERVE, "Publisher"
TRCK, FRAME(text), PRESERVE, "Track number/position in set"
TRSN, FRAME(text), PRESERVE, "Internet radio station name"
TRSO, FRAME(text), PRESERVE, "Internet radio station owner"
TSOA, FRAME(text), PRESERVE, "Album sort order"
TSOP, FRAME(text), PRESERVE, "Performer sort order"
TSOT, FRAME(text), PRESERVE, "Title sort order"
TSRC, FRAME(text), PRESERVE, "ISRC (international standard recording code)"
TSSE, FRAME(text), PRESERVE, "Software/hardware and settings used for encoding"
TSST, FRAME(text), PRESERVE, "Set subtitle"
TXXX, FRAME(TXXX), PRESERVE, "User defined text information frame"
UFID, FRAME(UFID), PRESERVE, "Unique file identifier"
USER, FRAME(USER), PRESERVE, "Terms of use"
USLT, FRAME(USLT), PRESERVE, "Unsynchronised lyric/text transcription"
WCOM, FRAME(url), PRESERVE, "Commercial information"
WCOP, FRAME(url), PRESERVE, "Copyright/legal information"
WOAF, FRAME(url), PRESERVE, "Official audio file webpage"
WOAR, FRAME(url), PRESERVE, "Official artist/performer webpage"
WOAS, FRAME(url), PRESERVE, "Official audio source webpage"
WORS, FRAME(url), PRESERVE, "Official Internet radio station homepage"
WPAY, FRAME(url), PRESERVE, "Payment"
WPUB, FRAME(url), PRESERVE, "Publishers official webpage"
WXXX, FRAME(WXXX), PRESERVE, "User defined URL link frame"
#
# Special frames
#
ZOBS, FRAME(ZOBS), OBSOLETE, "Obsolete frame"

View File

@ -0,0 +1,42 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: frametype.h,v 1.7 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_FRAMETYPE_H
# define LIBID3TAG_FRAMETYPE_H
struct id3_frametype {
char const *id;
unsigned int nfields;
enum id3_field_type const *fields;
int defaultflags;
char const *description;
};
extern struct id3_frametype const id3_frametype_text;
extern struct id3_frametype const id3_frametype_url;
extern struct id3_frametype const id3_frametype_experimental;
extern struct id3_frametype const id3_frametype_unknown;
extern struct id3_frametype const id3_frametype_obsolete;
struct id3_frametype const *id3_frametype_lookup(register char const *,
register unsigned int);
# endif

View File

@ -0,0 +1,151 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: genre.c,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include "id3tag.h"
# include "ucs4.h"
/* genres are stored in ucs4 format */
# include "genre.dat"
# define NGENRES (sizeof(genre_table) / sizeof(genre_table[0]))
/*
* NAME: genre->index()
* DESCRIPTION: return an ID3v1 genre string indexed by number
*/
id3_ucs4_t const *id3_genre_index(unsigned int index)
{
return (index < NGENRES) ? genre_table[index] : 0;
}
/*
* NAME: genre->name()
* DESCRIPTION: translate an ID3v2 genre number/keyword to its full name
*/
id3_ucs4_t const *id3_genre_name(id3_ucs4_t const *string)
{
id3_ucs4_t const *ptr;
static id3_ucs4_t const genre_remix[] = { 'R', 'e', 'm', 'i', 'x', 0 };
static id3_ucs4_t const genre_cover[] = { 'C', 'o', 'v', 'e', 'r', 0 };
unsigned long number;
if (string == 0 || *string == 0)
return id3_ucs4_empty;
if (string[0] == 'R' && string[1] == 'X' && string[2] == 0)
return genre_remix;
if (string[0] == 'C' && string[1] == 'R' && string[2] == 0)
return genre_cover;
for (ptr = string; *ptr; ++ptr) {
if (*ptr < '0' || *ptr > '9')
return string;
}
number = id3_ucs4_getnumber(string);
return (number < NGENRES) ? genre_table[number] : string;
}
/*
* NAME: translate()
* DESCRIPTION: return a canonicalized character for testing genre equivalence
*/
static
id3_ucs4_t translate(id3_ucs4_t ch)
{
if (ch) {
if (ch >= 'A' && ch <= 'Z')
ch += 'a' - 'A';
if (ch < 'a' || ch > 'z')
ch = ID3_UCS4_REPLACEMENTCHAR;
}
return ch;
}
/*
* NAME: compare()
* DESCRIPTION: test two ucs4 genre strings for equivalence
*/
static
int compare(id3_ucs4_t const *str1, id3_ucs4_t const *str2)
{
id3_ucs4_t c1, c2;
if (str1 == str2)
return 1;
do {
do
c1 = translate(*str1++);
while (c1 == ID3_UCS4_REPLACEMENTCHAR);
do
c2 = translate(*str2++);
while (c2 == ID3_UCS4_REPLACEMENTCHAR);
}
while (c1 && c1 == c2);
return c1 == c2;
}
/*
* NAME: genre->number()
* DESCRIPTION: translate an ID3v2 genre name/number to its ID3v1 index number
*/
int id3_genre_number(id3_ucs4_t const *string)
{
id3_ucs4_t const *ptr;
int i;
if (string == 0 || *string == 0)
return -1;
for (ptr = string; *ptr; ++ptr) {
if (*ptr < '0' || *ptr > '9')
break;
}
if (*ptr == 0) {
unsigned long number;
number = id3_ucs4_getnumber(string);
return (number <= 0xff) ? number : -1;
}
for (i = 0; i < NGENRES; ++i) {
if (compare(string, genre_table[i]))
return i;
}
/* no equivalent */
return -1;
}

View File

@ -0,0 +1,480 @@
/* Automatically generated from genre.dat.in */
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* Id: genre.dat.in,v 1.7 2004/01/23 09:41:32 rob Exp
*/
/*
* These are the ID3 genre names, taken as a combination of names from ID3v1
* (listed in Appendix A of the ID3 tag version 2.4.0 informal standard) and
* the extensions made by Winamp as of version 2.80.
*/
/* ID3v1 names (0-79) */
static id3_ucs4_t const genre_BLUES[] =
{ 'B', 'l', 'u', 'e', 's', 0 };
static id3_ucs4_t const genre_CLASSIC_ROCK[] =
{ 'C', 'l', 'a', 's', 's', 'i', 'c', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_COUNTRY[] =
{ 'C', 'o', 'u', 'n', 't', 'r', 'y', 0 };
static id3_ucs4_t const genre_DANCE[] =
{ 'D', 'a', 'n', 'c', 'e', 0 };
static id3_ucs4_t const genre_DISCO[] =
{ 'D', 'i', 's', 'c', 'o', 0 };
static id3_ucs4_t const genre_FUNK[] =
{ 'F', 'u', 'n', 'k', 0 };
static id3_ucs4_t const genre_GRUNGE[] =
{ 'G', 'r', 'u', 'n', 'g', 'e', 0 };
static id3_ucs4_t const genre_HIP_HOP[] =
{ 'H', 'i', 'p', '-', 'H', 'o', 'p', 0 };
static id3_ucs4_t const genre_JAZZ[] =
{ 'J', 'a', 'z', 'z', 0 };
static id3_ucs4_t const genre_METAL[] =
{ 'M', 'e', 't', 'a', 'l', 0 };
static id3_ucs4_t const genre_NEW_AGE[] =
{ 'N', 'e', 'w', ' ', 'A', 'g', 'e', 0 };
static id3_ucs4_t const genre_OLDIES[] =
{ 'O', 'l', 'd', 'i', 'e', 's', 0 };
static id3_ucs4_t const genre_OTHER[] =
{ 'O', 't', 'h', 'e', 'r', 0 };
static id3_ucs4_t const genre_POP[] =
{ 'P', 'o', 'p', 0 };
static id3_ucs4_t const genre_R_B[] =
{ 'R', '&', 'B', 0 };
static id3_ucs4_t const genre_RAP[] =
{ 'R', 'a', 'p', 0 };
static id3_ucs4_t const genre_REGGAE[] =
{ 'R', 'e', 'g', 'g', 'a', 'e', 0 };
static id3_ucs4_t const genre_ROCK[] =
{ 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_TECHNO[] =
{ 'T', 'e', 'c', 'h', 'n', 'o', 0 };
static id3_ucs4_t const genre_INDUSTRIAL[] =
{ 'I', 'n', 'd', 'u', 's', 't', 'r', 'i', 'a', 'l', 0 };
static id3_ucs4_t const genre_ALTERNATIVE[] =
{ 'A', 'l', 't', 'e', 'r', 'n', 'a', 't', 'i', 'v', 'e', 0 };
static id3_ucs4_t const genre_SKA[] =
{ 'S', 'k', 'a', 0 };
static id3_ucs4_t const genre_DEATH_METAL[] =
{ 'D', 'e', 'a', 't', 'h', ' ', 'M', 'e', 't', 'a', 'l', 0 };
static id3_ucs4_t const genre_PRANKS[] =
{ 'P', 'r', 'a', 'n', 'k', 's', 0 };
static id3_ucs4_t const genre_SOUNDTRACK[] =
{ 'S', 'o', 'u', 'n', 'd', 't', 'r', 'a', 'c', 'k', 0 };
static id3_ucs4_t const genre_EURO_TECHNO[] =
{ 'E', 'u', 'r', 'o', '-', 'T', 'e', 'c', 'h', 'n', 'o', 0 };
static id3_ucs4_t const genre_AMBIENT[] =
{ 'A', 'm', 'b', 'i', 'e', 'n', 't', 0 };
static id3_ucs4_t const genre_TRIP_HOP[] =
{ 'T', 'r', 'i', 'p', '-', 'H', 'o', 'p', 0 };
static id3_ucs4_t const genre_VOCAL[] =
{ 'V', 'o', 'c', 'a', 'l', 0 };
static id3_ucs4_t const genre_JAZZ_FUNK[] =
{ 'J', 'a', 'z', 'z', '+', 'F', 'u', 'n', 'k', 0 };
static id3_ucs4_t const genre_FUSION[] =
{ 'F', 'u', 's', 'i', 'o', 'n', 0 };
static id3_ucs4_t const genre_TRANCE[] =
{ 'T', 'r', 'a', 'n', 'c', 'e', 0 };
static id3_ucs4_t const genre_CLASSICAL[] =
{ 'C', 'l', 'a', 's', 's', 'i', 'c', 'a', 'l', 0 };
static id3_ucs4_t const genre_INSTRUMENTAL[] =
{ 'I', 'n', 's', 't', 'r', 'u', 'm', 'e', 'n', 't', 'a', 'l', 0 };
static id3_ucs4_t const genre_ACID[] =
{ 'A', 'c', 'i', 'd', 0 };
static id3_ucs4_t const genre_HOUSE[] =
{ 'H', 'o', 'u', 's', 'e', 0 };
static id3_ucs4_t const genre_GAME[] =
{ 'G', 'a', 'm', 'e', 0 };
static id3_ucs4_t const genre_SOUND_CLIP[] =
{ 'S', 'o', 'u', 'n', 'd', ' ', 'C', 'l', 'i', 'p', 0 };
static id3_ucs4_t const genre_GOSPEL[] =
{ 'G', 'o', 's', 'p', 'e', 'l', 0 };
static id3_ucs4_t const genre_NOISE[] =
{ 'N', 'o', 'i', 's', 'e', 0 };
static id3_ucs4_t const genre_ALTERNROCK[] =
{ 'A', 'l', 't', 'e', 'r', 'n', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_BASS[] =
{ 'B', 'a', 's', 's', 0 };
static id3_ucs4_t const genre_SOUL[] =
{ 'S', 'o', 'u', 'l', 0 };
static id3_ucs4_t const genre_PUNK[] =
{ 'P', 'u', 'n', 'k', 0 };
static id3_ucs4_t const genre_SPACE[] =
{ 'S', 'p', 'a', 'c', 'e', 0 };
static id3_ucs4_t const genre_MEDITATIVE[] =
{ 'M', 'e', 'd', 'i', 't', 'a', 't', 'i', 'v', 'e', 0 };
static id3_ucs4_t const genre_INSTRUMENTAL_POP[] =
{ 'I', 'n', 's', 't', 'r', 'u', 'm', 'e', 'n', 't', 'a', 'l', ' ', 'P', 'o', 'p', 0 };
static id3_ucs4_t const genre_INSTRUMENTAL_ROCK[] =
{ 'I', 'n', 's', 't', 'r', 'u', 'm', 'e', 'n', 't', 'a', 'l', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_ETHNIC[] =
{ 'E', 't', 'h', 'n', 'i', 'c', 0 };
static id3_ucs4_t const genre_GOTHIC[] =
{ 'G', 'o', 't', 'h', 'i', 'c', 0 };
static id3_ucs4_t const genre_DARKWAVE[] =
{ 'D', 'a', 'r', 'k', 'w', 'a', 'v', 'e', 0 };
static id3_ucs4_t const genre_TECHNO_INDUSTRIAL[] =
{ 'T', 'e', 'c', 'h', 'n', 'o', '-', 'I', 'n', 'd', 'u', 's', 't', 'r', 'i', 'a', 'l', 0 };
static id3_ucs4_t const genre_ELECTRONIC[] =
{ 'E', 'l', 'e', 'c', 't', 'r', 'o', 'n', 'i', 'c', 0 };
static id3_ucs4_t const genre_POP_FOLK[] =
{ 'P', 'o', 'p', '-', 'F', 'o', 'l', 'k', 0 };
static id3_ucs4_t const genre_EURODANCE[] =
{ 'E', 'u', 'r', 'o', 'd', 'a', 'n', 'c', 'e', 0 };
static id3_ucs4_t const genre_DREAM[] =
{ 'D', 'r', 'e', 'a', 'm', 0 };
static id3_ucs4_t const genre_SOUTHERN_ROCK[] =
{ 'S', 'o', 'u', 't', 'h', 'e', 'r', 'n', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_COMEDY[] =
{ 'C', 'o', 'm', 'e', 'd', 'y', 0 };
static id3_ucs4_t const genre_CULT[] =
{ 'C', 'u', 'l', 't', 0 };
static id3_ucs4_t const genre_GANGSTA[] =
{ 'G', 'a', 'n', 'g', 's', 't', 'a', 0 };
static id3_ucs4_t const genre_TOP_40[] =
{ 'T', 'o', 'p', ' ', '4', '0', 0 };
static id3_ucs4_t const genre_CHRISTIAN_RAP[] =
{ 'C', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', ' ', 'R', 'a', 'p', 0 };
static id3_ucs4_t const genre_POP_FUNK[] =
{ 'P', 'o', 'p', '/', 'F', 'u', 'n', 'k', 0 };
static id3_ucs4_t const genre_JUNGLE[] =
{ 'J', 'u', 'n', 'g', 'l', 'e', 0 };
static id3_ucs4_t const genre_NATIVE_AMERICAN[] =
{ 'N', 'a', 't', 'i', 'v', 'e', ' ', 'A', 'm', 'e', 'r', 'i', 'c', 'a', 'n', 0 };
static id3_ucs4_t const genre_CABARET[] =
{ 'C', 'a', 'b', 'a', 'r', 'e', 't', 0 };
static id3_ucs4_t const genre_NEW_WAVE[] =
{ 'N', 'e', 'w', ' ', 'W', 'a', 'v', 'e', 0 };
static id3_ucs4_t const genre_PSYCHEDELIC[] =
{ 'P', 's', 'y', 'c', 'h', 'e', 'd', 'e', 'l', 'i', 'c', 0 };
static id3_ucs4_t const genre_RAVE[] =
{ 'R', 'a', 'v', 'e', 0 };
static id3_ucs4_t const genre_SHOWTUNES[] =
{ 'S', 'h', 'o', 'w', 't', 'u', 'n', 'e', 's', 0 };
static id3_ucs4_t const genre_TRAILER[] =
{ 'T', 'r', 'a', 'i', 'l', 'e', 'r', 0 };
static id3_ucs4_t const genre_LO_FI[] =
{ 'L', 'o', '-', 'F', 'i', 0 };
static id3_ucs4_t const genre_TRIBAL[] =
{ 'T', 'r', 'i', 'b', 'a', 'l', 0 };
static id3_ucs4_t const genre_ACID_PUNK[] =
{ 'A', 'c', 'i', 'd', ' ', 'P', 'u', 'n', 'k', 0 };
static id3_ucs4_t const genre_ACID_JAZZ[] =
{ 'A', 'c', 'i', 'd', ' ', 'J', 'a', 'z', 'z', 0 };
static id3_ucs4_t const genre_POLKA[] =
{ 'P', 'o', 'l', 'k', 'a', 0 };
static id3_ucs4_t const genre_RETRO[] =
{ 'R', 'e', 't', 'r', 'o', 0 };
static id3_ucs4_t const genre_MUSICAL[] =
{ 'M', 'u', 's', 'i', 'c', 'a', 'l', 0 };
static id3_ucs4_t const genre_ROCK___ROLL[] =
{ 'R', 'o', 'c', 'k', ' ', '&', ' ', 'R', 'o', 'l', 'l', 0 };
static id3_ucs4_t const genre_HARD_ROCK[] =
{ 'H', 'a', 'r', 'd', ' ', 'R', 'o', 'c', 'k', 0 };
/* Winamp extensions (80-147) */
static id3_ucs4_t const genre_FOLK[] =
{ 'F', 'o', 'l', 'k', 0 };
static id3_ucs4_t const genre_FOLK_ROCK[] =
{ 'F', 'o', 'l', 'k', '/', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_NATIONAL_FOLK[] =
{ 'N', 'a', 't', 'i', 'o', 'n', 'a', 'l', ' ', 'F', 'o', 'l', 'k', 0 };
static id3_ucs4_t const genre_SWING[] =
{ 'S', 'w', 'i', 'n', 'g', 0 };
static id3_ucs4_t const genre_FAST_FUSION[] =
{ 'F', 'a', 's', 't', '-', 'F', 'u', 's', 'i', 'o', 'n', 0 };
static id3_ucs4_t const genre_BEBOB[] =
{ 'B', 'e', 'b', 'o', 'b', 0 };
static id3_ucs4_t const genre_LATIN[] =
{ 'L', 'a', 't', 'i', 'n', 0 };
static id3_ucs4_t const genre_REVIVAL[] =
{ 'R', 'e', 'v', 'i', 'v', 'a', 'l', 0 };
static id3_ucs4_t const genre_CELTIC[] =
{ 'C', 'e', 'l', 't', 'i', 'c', 0 };
static id3_ucs4_t const genre_BLUEGRASS[] =
{ 'B', 'l', 'u', 'e', 'g', 'r', 'a', 's', 's', 0 };
static id3_ucs4_t const genre_AVANTGARDE[] =
{ 'A', 'v', 'a', 'n', 't', 'g', 'a', 'r', 'd', 'e', 0 };
static id3_ucs4_t const genre_GOTHIC_ROCK[] =
{ 'G', 'o', 't', 'h', 'i', 'c', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_PROGRESSIVE_ROCK[] =
{ 'P', 'r', 'o', 'g', 'r', 'e', 's', 's', 'i', 'v', 'e', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_PSYCHEDELIC_ROCK[] =
{ 'P', 's', 'y', 'c', 'h', 'e', 'd', 'e', 'l', 'i', 'c', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_SYMPHONIC_ROCK[] =
{ 'S', 'y', 'm', 'p', 'h', 'o', 'n', 'i', 'c', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_SLOW_ROCK[] =
{ 'S', 'l', 'o', 'w', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_BIG_BAND[] =
{ 'B', 'i', 'g', ' ', 'B', 'a', 'n', 'd', 0 };
static id3_ucs4_t const genre_CHORUS[] =
{ 'C', 'h', 'o', 'r', 'u', 's', 0 };
static id3_ucs4_t const genre_EASY_LISTENING[] =
{ 'E', 'a', 's', 'y', ' ', 'L', 'i', 's', 't', 'e', 'n', 'i', 'n', 'g', 0 };
static id3_ucs4_t const genre_ACOUSTIC[] =
{ 'A', 'c', 'o', 'u', 's', 't', 'i', 'c', 0 };
static id3_ucs4_t const genre_HUMOUR[] =
{ 'H', 'u', 'm', 'o', 'u', 'r', 0 };
static id3_ucs4_t const genre_SPEECH[] =
{ 'S', 'p', 'e', 'e', 'c', 'h', 0 };
static id3_ucs4_t const genre_CHANSON[] =
{ 'C', 'h', 'a', 'n', 's', 'o', 'n', 0 };
static id3_ucs4_t const genre_OPERA[] =
{ 'O', 'p', 'e', 'r', 'a', 0 };
static id3_ucs4_t const genre_CHAMBER_MUSIC[] =
{ 'C', 'h', 'a', 'm', 'b', 'e', 'r', ' ', 'M', 'u', 's', 'i', 'c', 0 };
static id3_ucs4_t const genre_SONATA[] =
{ 'S', 'o', 'n', 'a', 't', 'a', 0 };
static id3_ucs4_t const genre_SYMPHONY[] =
{ 'S', 'y', 'm', 'p', 'h', 'o', 'n', 'y', 0 };
static id3_ucs4_t const genre_BOOTY_BASS[] =
{ 'B', 'o', 'o', 't', 'y', ' ', 'B', 'a', 's', 's', 0 };
static id3_ucs4_t const genre_PRIMUS[] =
{ 'P', 'r', 'i', 'm', 'u', 's', 0 };
static id3_ucs4_t const genre_PORN_GROOVE[] =
{ 'P', 'o', 'r', 'n', ' ', 'G', 'r', 'o', 'o', 'v', 'e', 0 };
static id3_ucs4_t const genre_SATIRE[] =
{ 'S', 'a', 't', 'i', 'r', 'e', 0 };
static id3_ucs4_t const genre_SLOW_JAM[] =
{ 'S', 'l', 'o', 'w', ' ', 'J', 'a', 'm', 0 };
static id3_ucs4_t const genre_CLUB[] =
{ 'C', 'l', 'u', 'b', 0 };
static id3_ucs4_t const genre_TANGO[] =
{ 'T', 'a', 'n', 'g', 'o', 0 };
static id3_ucs4_t const genre_SAMBA[] =
{ 'S', 'a', 'm', 'b', 'a', 0 };
static id3_ucs4_t const genre_FOLKLORE[] =
{ 'F', 'o', 'l', 'k', 'l', 'o', 'r', 'e', 0 };
static id3_ucs4_t const genre_BALLAD[] =
{ 'B', 'a', 'l', 'l', 'a', 'd', 0 };
static id3_ucs4_t const genre_POWER_BALLAD[] =
{ 'P', 'o', 'w', 'e', 'r', ' ', 'B', 'a', 'l', 'l', 'a', 'd', 0 };
static id3_ucs4_t const genre_RHYTHMIC_SOUL[] =
{ 'R', 'h', 'y', 't', 'h', 'm', 'i', 'c', ' ', 'S', 'o', 'u', 'l', 0 };
static id3_ucs4_t const genre_FREESTYLE[] =
{ 'F', 'r', 'e', 'e', 's', 't', 'y', 'l', 'e', 0 };
static id3_ucs4_t const genre_DUET[] =
{ 'D', 'u', 'e', 't', 0 };
static id3_ucs4_t const genre_PUNK_ROCK[] =
{ 'P', 'u', 'n', 'k', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_DRUM_SOLO[] =
{ 'D', 'r', 'u', 'm', ' ', 'S', 'o', 'l', 'o', 0 };
static id3_ucs4_t const genre_A_CAPPELLA[] =
{ 'A', ' ', 'C', 'a', 'p', 'p', 'e', 'l', 'l', 'a', 0 };
static id3_ucs4_t const genre_EURO_HOUSE[] =
{ 'E', 'u', 'r', 'o', '-', 'H', 'o', 'u', 's', 'e', 0 };
static id3_ucs4_t const genre_DANCE_HALL[] =
{ 'D', 'a', 'n', 'c', 'e', ' ', 'H', 'a', 'l', 'l', 0 };
static id3_ucs4_t const genre_GOA[] =
{ 'G', 'o', 'a', 0 };
static id3_ucs4_t const genre_DRUM___BASS[] =
{ 'D', 'r', 'u', 'm', ' ', '&', ' ', 'B', 'a', 's', 's', 0 };
static id3_ucs4_t const genre_CLUB_HOUSE[] =
{ 'C', 'l', 'u', 'b', '-', 'H', 'o', 'u', 's', 'e', 0 };
static id3_ucs4_t const genre_HARDCORE[] =
{ 'H', 'a', 'r', 'd', 'c', 'o', 'r', 'e', 0 };
static id3_ucs4_t const genre_TERROR[] =
{ 'T', 'e', 'r', 'r', 'o', 'r', 0 };
static id3_ucs4_t const genre_INDIE[] =
{ 'I', 'n', 'd', 'i', 'e', 0 };
static id3_ucs4_t const genre_BRITPOP[] =
{ 'B', 'r', 'i', 't', 'P', 'o', 'p', 0 };
static id3_ucs4_t const genre_NEGERPUNK[] =
{ 'N', 'e', 'g', 'e', 'r', 'p', 'u', 'n', 'k', 0 };
static id3_ucs4_t const genre_POLSK_PUNK[] =
{ 'P', 'o', 'l', 's', 'k', ' ', 'P', 'u', 'n', 'k', 0 };
static id3_ucs4_t const genre_BEAT[] =
{ 'B', 'e', 'a', 't', 0 };
static id3_ucs4_t const genre_CHRISTIAN_GANGSTA_RAP[] =
{ 'C', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', ' ', 'G', 'a', 'n', 'g', 's', 't', 'a', ' ', 'R', 'a', 'p', 0 };
static id3_ucs4_t const genre_HEAVY_METAL[] =
{ 'H', 'e', 'a', 'v', 'y', ' ', 'M', 'e', 't', 'a', 'l', 0 };
static id3_ucs4_t const genre_BLACK_METAL[] =
{ 'B', 'l', 'a', 'c', 'k', ' ', 'M', 'e', 't', 'a', 'l', 0 };
static id3_ucs4_t const genre_CROSSOVER[] =
{ 'C', 'r', 'o', 's', 's', 'o', 'v', 'e', 'r', 0 };
static id3_ucs4_t const genre_CONTEMPORARY_CHRISTIAN[] =
{ 'C', 'o', 'n', 't', 'e', 'm', 'p', 'o', 'r', 'a', 'r', 'y', ' ', 'C', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', 0 };
static id3_ucs4_t const genre_CHRISTIAN_ROCK[] =
{ 'C', 'h', 'r', 'i', 's', 't', 'i', 'a', 'n', ' ', 'R', 'o', 'c', 'k', 0 };
static id3_ucs4_t const genre_MERENGUE[] =
{ 'M', 'e', 'r', 'e', 'n', 'g', 'u', 'e', 0 };
static id3_ucs4_t const genre_SALSA[] =
{ 'S', 'a', 'l', 's', 'a', 0 };
static id3_ucs4_t const genre_THRASH_METAL[] =
{ 'T', 'h', 'r', 'a', 's', 'h', ' ', 'M', 'e', 't', 'a', 'l', 0 };
static id3_ucs4_t const genre_ANIME[] =
{ 'A', 'n', 'i', 'm', 'e', 0 };
static id3_ucs4_t const genre_JPOP[] =
{ 'J', 'P', 'o', 'p', 0 };
static id3_ucs4_t const genre_SYNTHPOP[] =
{ 'S', 'y', 'n', 't', 'h', 'p', 'o', 'p', 0 };
static id3_ucs4_t const *const genre_table[] = {
genre_BLUES,
genre_CLASSIC_ROCK,
genre_COUNTRY,
genre_DANCE,
genre_DISCO,
genre_FUNK,
genre_GRUNGE,
genre_HIP_HOP,
genre_JAZZ,
genre_METAL,
genre_NEW_AGE,
genre_OLDIES,
genre_OTHER,
genre_POP,
genre_R_B,
genre_RAP,
genre_REGGAE,
genre_ROCK,
genre_TECHNO,
genre_INDUSTRIAL,
genre_ALTERNATIVE,
genre_SKA,
genre_DEATH_METAL,
genre_PRANKS,
genre_SOUNDTRACK,
genre_EURO_TECHNO,
genre_AMBIENT,
genre_TRIP_HOP,
genre_VOCAL,
genre_JAZZ_FUNK,
genre_FUSION,
genre_TRANCE,
genre_CLASSICAL,
genre_INSTRUMENTAL,
genre_ACID,
genre_HOUSE,
genre_GAME,
genre_SOUND_CLIP,
genre_GOSPEL,
genre_NOISE,
genre_ALTERNROCK,
genre_BASS,
genre_SOUL,
genre_PUNK,
genre_SPACE,
genre_MEDITATIVE,
genre_INSTRUMENTAL_POP,
genre_INSTRUMENTAL_ROCK,
genre_ETHNIC,
genre_GOTHIC,
genre_DARKWAVE,
genre_TECHNO_INDUSTRIAL,
genre_ELECTRONIC,
genre_POP_FOLK,
genre_EURODANCE,
genre_DREAM,
genre_SOUTHERN_ROCK,
genre_COMEDY,
genre_CULT,
genre_GANGSTA,
genre_TOP_40,
genre_CHRISTIAN_RAP,
genre_POP_FUNK,
genre_JUNGLE,
genre_NATIVE_AMERICAN,
genre_CABARET,
genre_NEW_WAVE,
genre_PSYCHEDELIC,
genre_RAVE,
genre_SHOWTUNES,
genre_TRAILER,
genre_LO_FI,
genre_TRIBAL,
genre_ACID_PUNK,
genre_ACID_JAZZ,
genre_POLKA,
genre_RETRO,
genre_MUSICAL,
genre_ROCK___ROLL,
genre_HARD_ROCK,
genre_FOLK,
genre_FOLK_ROCK,
genre_NATIONAL_FOLK,
genre_SWING,
genre_FAST_FUSION,
genre_BEBOB,
genre_LATIN,
genre_REVIVAL,
genre_CELTIC,
genre_BLUEGRASS,
genre_AVANTGARDE,
genre_GOTHIC_ROCK,
genre_PROGRESSIVE_ROCK,
genre_PSYCHEDELIC_ROCK,
genre_SYMPHONIC_ROCK,
genre_SLOW_ROCK,
genre_BIG_BAND,
genre_CHORUS,
genre_EASY_LISTENING,
genre_ACOUSTIC,
genre_HUMOUR,
genre_SPEECH,
genre_CHANSON,
genre_OPERA,
genre_CHAMBER_MUSIC,
genre_SONATA,
genre_SYMPHONY,
genre_BOOTY_BASS,
genre_PRIMUS,
genre_PORN_GROOVE,
genre_SATIRE,
genre_SLOW_JAM,
genre_CLUB,
genre_TANGO,
genre_SAMBA,
genre_FOLKLORE,
genre_BALLAD,
genre_POWER_BALLAD,
genre_RHYTHMIC_SOUL,
genre_FREESTYLE,
genre_DUET,
genre_PUNK_ROCK,
genre_DRUM_SOLO,
genre_A_CAPPELLA,
genre_EURO_HOUSE,
genre_DANCE_HALL,
genre_GOA,
genre_DRUM___BASS,
genre_CLUB_HOUSE,
genre_HARDCORE,
genre_TERROR,
genre_INDIE,
genre_BRITPOP,
genre_NEGERPUNK,
genre_POLSK_PUNK,
genre_BEAT,
genre_CHRISTIAN_GANGSTA_RAP,
genre_HEAVY_METAL,
genre_BLACK_METAL,
genre_CROSSOVER,
genre_CONTEMPORARY_CHRISTIAN,
genre_CHRISTIAN_ROCK,
genre_MERENGUE,
genre_SALSA,
genre_THRASH_METAL,
genre_ANIME,
genre_JPOP,
genre_SYNTHPOP
};

View File

@ -0,0 +1,180 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: genre.dat.in,v 1.7 2004/01/23 09:41:32 rob Exp $
*/
/*
* These are the ID3 genre names, taken as a combination of names from ID3v1
* (listed in Appendix A of the ID3 tag version 2.4.0 informal standard) and
* the extensions made by Winamp as of version 2.80.
*/
/* ID3v1 names (0-79) */
Blues
Classic Rock
Country
Dance
Disco
Funk
Grunge
Hip-Hop
Jazz
Metal
New Age
Oldies
Other
Pop
R&B
Rap
Reggae
Rock
Techno
Industrial
Alternative
Ska
Death Metal
Pranks
Soundtrack
Euro-Techno
Ambient
Trip-Hop
Vocal
Jazz+Funk
Fusion
Trance
Classical
Instrumental
Acid
House
Game
Sound Clip
Gospel
Noise
AlternRock
Bass
Soul
Punk
Space
Meditative
Instrumental Pop
Instrumental Rock
Ethnic
Gothic
Darkwave
Techno-Industrial
Electronic
Pop-Folk
Eurodance
Dream
Southern Rock
Comedy
Cult
Gangsta
Top 40
Christian Rap
Pop/Funk
Jungle
Native American
Cabaret
New Wave
Psychedelic
Rave
Showtunes
Trailer
Lo-Fi
Tribal
Acid Punk
Acid Jazz
Polka
Retro
Musical
Rock & Roll
Hard Rock
/* Winamp extensions (80-147) */
Folk
Folk/Rock
National Folk
Swing
Fast-Fusion
Bebob
Latin
Revival
Celtic
Bluegrass
Avantgarde
Gothic Rock
Progressive Rock
Psychedelic Rock
Symphonic Rock
Slow Rock
Big Band
Chorus
Easy Listening
Acoustic
Humour
Speech
Chanson
Opera
Chamber Music
Sonata
Symphony
Booty Bass
Primus
Porn Groove
Satire
Slow Jam
Club
Tango
Samba
Folklore
Ballad
Power Ballad
Rhythmic Soul
Freestyle
Duet
Punk Rock
Drum Solo
A Cappella
Euro-House
Dance Hall
Goa
Drum & Bass
Club-House
Hardcore
Terror
Indie
BritPop
Negerpunk
Polsk Punk
Beat
Christian Gangsta Rap
Heavy Metal
Black Metal
Crossover
Contemporary Christian
Christian Rock
Merengue
Salsa
Thrash Metal
Anime
JPop
Synthpop

View File

@ -0,0 +1,54 @@
#
# libid3tag - ID3 tag manipulation library
# Copyright (C) 2000-2004 Underbit Technologies, Inc.
#
# 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
#
# $Id: genre.dat.sed,v 1.10 2004/01/23 09:41:32 rob Exp $
#
1i\
/* Automatically generated from genre.dat.in */
# generate an array from a string
/^[A-Za-z]/{
H
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
s/[^A-Z0-9]/_/g
s/.*/static id3_ucs4_t const genre_&[] =/p
g
s/.*\n//
s/./'&', /g
s/.*/ { &0 };/
}
# write the final table of arrays
${
p
i\
\
static id3_ucs4_t const *const genre_table[] = {
g
s/^\(\n\)\(.*\)$/\2\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
s/[^A-Z0-9\n]/_/g
s/\([^\n]*\)\(\n\)/ genre_\1,\2/g
s/,\n$//
a\
};
}
# print the pattern space (assumes -n)
p

View File

@ -0,0 +1,27 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: genre.h,v 1.6 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_GENRE_H
# define LIBID3TAG_GENRE_H
# define ID3_GENRE_OTHER 12
# endif

View File

@ -0,0 +1,53 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: global.h,v 1.9 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_GLOBAL_H
# define LIBID3TAG_GLOBAL_H
/* conditional debugging */
# if defined(DEBUG) && defined(NDEBUG)
# error "cannot define both DEBUG and NDEBUG"
# endif
# if defined(DEBUG)
# include <stdio.h>
# include "debug.h"
# define malloc(sz) id3_debug_malloc(sz, __FILE__, __LINE__)
# define calloc(n, sz) id3_debug_calloc(n, sz, __FILE__, __LINE__)
# define realloc(ptr, sz) id3_debug_realloc(ptr, sz, __FILE__, __LINE__)
# define free(ptr) id3_debug_free(ptr, __FILE__, __LINE__)
# define release(ptr) id3_debug_release(ptr, __FILE__, __LINE__)
# else
# define release(ptr) (ptr)
# endif
/* conditional features */
# if !defined(HAVE_ASSERT_H)
# if defined(NDEBUG)
# define assert(x) /* nothing */
# else
# define assert(x) do { if (!(x)) abort(); } while (0)
# endif
# endif
# endif

View File

@ -0,0 +1,364 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* If you would like to negotiate alternate licensing terms, you may do
* so by contacting: Underbit Technologies, Inc. <info@underbit.com>
*
* $Id: id3tag.h,v 1.17 2004/01/23 23:22:46 rob Exp $
*/
# ifndef LIBID3TAG_ID3TAG_H
# define LIBID3TAG_ID3TAG_H
# ifdef __cplusplus
extern "C" {
# endif
# define ID3_TAG_VERSION 0x0400
# define ID3_TAG_VERSION_MAJOR(x) (((x) >> 8) & 0xff)
# define ID3_TAG_VERSION_MINOR(x) (((x) >> 0) & 0xff)
typedef unsigned char id3_byte_t;
typedef unsigned long id3_length_t;
typedef unsigned long id3_ucs4_t;
typedef unsigned char id3_latin1_t;
typedef unsigned short id3_utf16_t;
typedef signed char id3_utf8_t;
struct id3_tag {
unsigned int refcount;
unsigned int version;
int flags;
int extendedflags;
int restrictions;
int options;
unsigned int nframes;
struct id3_frame **frames;
id3_length_t paddedsize;
};
# define ID3_TAG_QUERYSIZE 10
/* ID3v1 field frames */
# define ID3_FRAME_TITLE "TIT2"
# define ID3_FRAME_ARTIST "TPE1"
# define ID3_FRAME_ALBUM "TALB"
# define ID3_FRAME_TRACK "TRCK"
# define ID3_FRAME_YEAR "TDRC"
# define ID3_FRAME_GENRE "TCON"
# define ID3_FRAME_COMMENT "COMM"
/* special frames */
# define ID3_FRAME_OBSOLETE "ZOBS" /* with apologies to the French */
/* tag flags */
enum {
ID3_TAG_FLAG_UNSYNCHRONISATION = 0x80,
ID3_TAG_FLAG_EXTENDEDHEADER = 0x40,
ID3_TAG_FLAG_EXPERIMENTALINDICATOR = 0x20,
ID3_TAG_FLAG_FOOTERPRESENT = 0x10,
ID3_TAG_FLAG_KNOWNFLAGS = 0xf0
};
/* tag extended flags */
enum {
ID3_TAG_EXTENDEDFLAG_TAGISANUPDATE = 0x40,
ID3_TAG_EXTENDEDFLAG_CRCDATAPRESENT = 0x20,
ID3_TAG_EXTENDEDFLAG_TAGRESTRICTIONS = 0x10,
ID3_TAG_EXTENDEDFLAG_KNOWNFLAGS = 0x70
};
/* tag restrictions */
enum {
ID3_TAG_RESTRICTION_TAGSIZE_MASK = 0xc0,
ID3_TAG_RESTRICTION_TAGSIZE_128_FRAMES_1_MB = 0x00,
ID3_TAG_RESTRICTION_TAGSIZE_64_FRAMES_128_KB = 0x40,
ID3_TAG_RESTRICTION_TAGSIZE_32_FRAMES_40_KB = 0x80,
ID3_TAG_RESTRICTION_TAGSIZE_32_FRAMES_4_KB = 0xc0
};
enum {
ID3_TAG_RESTRICTION_TEXTENCODING_MASK = 0x20,
ID3_TAG_RESTRICTION_TEXTENCODING_NONE = 0x00,
ID3_TAG_RESTRICTION_TEXTENCODING_LATIN1_UTF8 = 0x20
};
enum {
ID3_TAG_RESTRICTION_TEXTSIZE_MASK = 0x18,
ID3_TAG_RESTRICTION_TEXTSIZE_NONE = 0x00,
ID3_TAG_RESTRICTION_TEXTSIZE_1024_CHARS = 0x08,
ID3_TAG_RESTRICTION_TEXTSIZE_128_CHARS = 0x10,
ID3_TAG_RESTRICTION_TEXTSIZE_30_CHARS = 0x18
};
enum {
ID3_TAG_RESTRICTION_IMAGEENCODING_MASK = 0x04,
ID3_TAG_RESTRICTION_IMAGEENCODING_NONE = 0x00,
ID3_TAG_RESTRICTION_IMAGEENCODING_PNG_JPEG = 0x04
};
enum {
ID3_TAG_RESTRICTION_IMAGESIZE_MASK = 0x03,
ID3_TAG_RESTRICTION_IMAGESIZE_NONE = 0x00,
ID3_TAG_RESTRICTION_IMAGESIZE_256_256 = 0x01,
ID3_TAG_RESTRICTION_IMAGESIZE_64_64 = 0x02,
ID3_TAG_RESTRICTION_IMAGESIZE_64_64_EXACT = 0x03
};
/* library options */
enum {
ID3_TAG_OPTION_UNSYNCHRONISATION = 0x0001, /* use unsynchronisation */
ID3_TAG_OPTION_COMPRESSION = 0x0002, /* use compression */
ID3_TAG_OPTION_CRC = 0x0004, /* use CRC */
ID3_TAG_OPTION_APPENDEDTAG = 0x0010, /* tag will be appended */
ID3_TAG_OPTION_FILEALTERED = 0x0020, /* audio data was altered */
ID3_TAG_OPTION_ID3V1 = 0x0100 /* render ID3v1/ID3v1.1 tag */
};
struct id3_frame {
char id[5];
char const *description;
unsigned int refcount;
int flags;
int group_id;
int encryption_method;
id3_byte_t *encoded;
id3_length_t encoded_length;
id3_length_t decoded_length;
unsigned int nfields;
union id3_field *fields;
};
enum {
/* frame status flags */
ID3_FRAME_FLAG_TAGALTERPRESERVATION = 0x4000,
ID3_FRAME_FLAG_FILEALTERPRESERVATION = 0x2000,
ID3_FRAME_FLAG_READONLY = 0x1000,
ID3_FRAME_FLAG_STATUSFLAGS = 0xff00,
/* frame format flags */
ID3_FRAME_FLAG_GROUPINGIDENTITY = 0x0040,
ID3_FRAME_FLAG_COMPRESSION = 0x0008,
ID3_FRAME_FLAG_ENCRYPTION = 0x0004,
ID3_FRAME_FLAG_UNSYNCHRONISATION = 0x0002,
ID3_FRAME_FLAG_DATALENGTHINDICATOR = 0x0001,
ID3_FRAME_FLAG_FORMATFLAGS = 0x00ff,
ID3_FRAME_FLAG_KNOWNFLAGS = 0x704f
};
enum id3_field_type {
ID3_FIELD_TYPE_TEXTENCODING,
ID3_FIELD_TYPE_LATIN1,
ID3_FIELD_TYPE_LATIN1FULL,
ID3_FIELD_TYPE_LATIN1LIST,
ID3_FIELD_TYPE_STRING,
ID3_FIELD_TYPE_STRINGFULL,
ID3_FIELD_TYPE_STRINGLIST,
ID3_FIELD_TYPE_LANGUAGE,
ID3_FIELD_TYPE_FRAMEID,
ID3_FIELD_TYPE_DATE,
ID3_FIELD_TYPE_INT8,
ID3_FIELD_TYPE_INT16,
ID3_FIELD_TYPE_INT24,
ID3_FIELD_TYPE_INT32,
ID3_FIELD_TYPE_INT32PLUS,
ID3_FIELD_TYPE_BINARYDATA
};
enum id3_field_textencoding {
ID3_FIELD_TEXTENCODING_ISO_8859_1 = 0x00,
ID3_FIELD_TEXTENCODING_UTF_16 = 0x01,
ID3_FIELD_TEXTENCODING_UTF_16BE = 0x02,
ID3_FIELD_TEXTENCODING_UTF_8 = 0x03
};
union id3_field {
enum id3_field_type type;
struct {
enum id3_field_type type;
signed long value;
} number;
struct {
enum id3_field_type type;
id3_latin1_t *ptr;
} latin1;
struct {
enum id3_field_type type;
unsigned int nstrings;
id3_latin1_t **strings;
} latin1list;
struct {
enum id3_field_type type;
id3_ucs4_t *ptr;
} string;
struct {
enum id3_field_type type;
unsigned int nstrings;
id3_ucs4_t **strings;
} stringlist;
struct {
enum id3_field_type type;
char value[9];
} immediate;
struct {
enum id3_field_type type;
id3_byte_t *data;
id3_length_t length;
} binary;
};
/* file interface */
enum id3_file_mode {
ID3_FILE_MODE_READONLY = 0,
ID3_FILE_MODE_READWRITE
};
struct id3_file *id3_file_open(char const *, enum id3_file_mode);
struct id3_file *id3_file_fdopen(int, enum id3_file_mode);
int id3_file_close(struct id3_file *);
struct id3_tag *id3_file_tag(struct id3_file const *);
int id3_file_update(struct id3_file *);
/* tag interface */
struct id3_tag *id3_tag_new(void);
void id3_tag_delete(struct id3_tag *);
unsigned int id3_tag_version(struct id3_tag const *);
int id3_tag_options(struct id3_tag *, int, int);
void id3_tag_setlength(struct id3_tag *, id3_length_t);
void id3_tag_clearframes(struct id3_tag *);
int id3_tag_attachframe(struct id3_tag *, struct id3_frame *);
int id3_tag_detachframe(struct id3_tag *, struct id3_frame *);
struct id3_frame *id3_tag_findframe(struct id3_tag const *,
char const *, unsigned int);
signed long id3_tag_query(id3_byte_t const *, id3_length_t);
struct id3_tag *id3_tag_parse(id3_byte_t const *, id3_length_t);
id3_length_t id3_tag_render(struct id3_tag const *, id3_byte_t *);
/* frame interface */
struct id3_frame *id3_frame_new(char const *);
void id3_frame_delete(struct id3_frame *);
union id3_field *id3_frame_field(struct id3_frame const *, unsigned int);
/* field interface */
enum id3_field_type id3_field_type(union id3_field const *);
int id3_field_setint(union id3_field *, signed long);
int id3_field_settextencoding(union id3_field *, enum id3_field_textencoding);
int id3_field_setstrings(union id3_field *, unsigned int, id3_ucs4_t **);
int id3_field_addstring(union id3_field *, id3_ucs4_t const *);
int id3_field_setlanguage(union id3_field *, char const *);
int id3_field_setlatin1(union id3_field *, id3_latin1_t const *);
int id3_field_setfulllatin1(union id3_field *, id3_latin1_t const *);
int id3_field_setstring(union id3_field *, id3_ucs4_t const *);
int id3_field_setfullstring(union id3_field *, id3_ucs4_t const *);
int id3_field_setframeid(union id3_field *, char const *);
int id3_field_setbinarydata(union id3_field *,
id3_byte_t const *, id3_length_t);
signed long id3_field_getint(union id3_field const *);
enum id3_field_textencoding id3_field_gettextencoding(union id3_field const *);
id3_latin1_t const *id3_field_getlatin1(union id3_field const *);
id3_latin1_t const *id3_field_getfulllatin1(union id3_field const *);
id3_ucs4_t const *id3_field_getstring(union id3_field const *);
id3_ucs4_t const *id3_field_getfullstring(union id3_field const *);
unsigned int id3_field_getnstrings(union id3_field const *);
id3_ucs4_t const *id3_field_getstrings(union id3_field const *,
unsigned int);
char const *id3_field_getframeid(union id3_field const *);
id3_byte_t const *id3_field_getbinarydata(union id3_field const *,
id3_length_t *);
/* genre interface */
id3_ucs4_t const *id3_genre_index(unsigned int);
id3_ucs4_t const *id3_genre_name(id3_ucs4_t const *);
int id3_genre_number(id3_ucs4_t const *);
/* ucs4 interface */
id3_latin1_t *id3_ucs4_latin1duplicate(id3_ucs4_t const *);
id3_utf16_t *id3_ucs4_utf16duplicate(id3_ucs4_t const *);
id3_utf8_t *id3_ucs4_utf8duplicate(id3_ucs4_t const *);
void id3_ucs4_putnumber(id3_ucs4_t *, unsigned long);
unsigned long id3_ucs4_getnumber(id3_ucs4_t const *);
/* latin1/utf16/utf8 interfaces */
id3_ucs4_t *id3_latin1_ucs4duplicate(id3_latin1_t const *);
id3_ucs4_t *id3_utf16_ucs4duplicate(id3_utf16_t const *);
id3_ucs4_t *id3_utf8_ucs4duplicate(id3_utf8_t const *);
/* version interface */
# define ID3_VERSION_MAJOR 0
# define ID3_VERSION_MINOR 15
# define ID3_VERSION_PATCH 1
# define ID3_VERSION_EXTRA " (beta)"
# define ID3_VERSION_STRINGIZE(str) #str
# define ID3_VERSION_STRING(num) ID3_VERSION_STRINGIZE(num)
# define ID3_VERSION ID3_VERSION_STRING(ID3_VERSION_MAJOR) "." \
ID3_VERSION_STRING(ID3_VERSION_MINOR) "." \
ID3_VERSION_STRING(ID3_VERSION_PATCH) \
ID3_VERSION_EXTRA
# define ID3_PUBLISHYEAR "2000-2004"
# define ID3_AUTHOR "Underbit Technologies, Inc."
# define ID3_EMAIL "info@underbit.com"
extern char const id3_version[];
extern char const id3_copyright[];
extern char const id3_author[];
extern char const id3_build[];
# ifdef __cplusplus
}
# endif
# endif

276
Libraries/ID3Tag/Files/install-sh Executable file
View File

@ -0,0 +1,276 @@
#!/bin/sh
#
# install - install a program, script, or datafile
# This comes from X11R5 (mit/util/scripts/install.sh).
#
# Copyright 1991 by the Massachusetts Institute of Technology
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation, and that the name of M.I.T. not be used in advertising or
# publicity pertaining to distribution of the software without specific,
# written prior permission. M.I.T. makes no representations about the
# suitability of this software for any purpose. It is provided "as is"
# without express or implied warranty.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
transformbasename=""
transform_arg=""
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=""
chgrpcmd=""
stripcmd=""
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=""
dst=""
dir_arg=""
while [ x"$1" != x ]; do
case $1 in
-c) instcmd=$cpprog
shift
continue;;
-d) dir_arg=true
shift
continue;;
-m) chmodcmd="$chmodprog $2"
shift
shift
continue;;
-o) chowncmd="$chownprog $2"
shift
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
shift
shift
continue;;
-s) stripcmd=$stripprog
shift
continue;;
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
shift
continue;;
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
shift
continue;;
*) if [ x"$src" = x ]
then
src=$1
else
# this colon is to work around a 386BSD /bin/sh bug
:
dst=$1
fi
shift
continue;;
esac
done
if [ x"$src" = x ]
then
echo "$0: no input file specified" >&2
exit 1
else
:
fi
if [ x"$dir_arg" != x ]; then
dst=$src
src=""
if [ -d "$dst" ]; then
instcmd=:
chmodcmd=""
else
instcmd=$mkdirprog
fi
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if [ -f "$src" ] || [ -d "$src" ]
then
:
else
echo "$0: $src does not exist" >&2
exit 1
fi
if [ x"$dst" = x ]
then
echo "$0: no destination specified" >&2
exit 1
else
:
fi
# If destination is a directory, append the input filename; if your system
# does not like double slashes in filenames, you may need to add some logic
if [ -d "$dst" ]
then
dst=$dst/`basename "$src"`
else
:
fi
fi
## this sed command emulates the dirname command
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# this part is taken from Noah Friedman's mkinstalldirs script
# Skip lots of stat calls in the usual case.
if [ ! -d "$dstdir" ]; then
defaultIFS='
'
IFS="${IFS-$defaultIFS}"
oIFS=$IFS
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
IFS=$oIFS
pathcomp=''
while [ $# -ne 0 ] ; do
pathcomp=$pathcomp$1
shift
if [ ! -d "$pathcomp" ] ;
then
$mkdirprog "$pathcomp"
else
:
fi
pathcomp=$pathcomp/
done
fi
if [ x"$dir_arg" != x ]
then
$doit $instcmd "$dst" &&
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dst"; else : ; fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dst"; else : ; fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dst"; else : ; fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dst"; else : ; fi
else
# If we're going to rename the final executable, determine the name now.
if [ x"$transformarg" = x ]
then
dstfile=`basename "$dst"`
else
dstfile=`basename "$dst" $transformbasename |
sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename
if [ x"$dstfile" = x ]
then
dstfile=`basename "$dst"`
else
:
fi
# Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/#inst.$$#
rmtmp=$dstdir/#rm.$$#
# Trap to clean up temp files at exit.
trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
trap '(exit $?); exit' 1 2 13 15
# Move or copy the file name to the temp name
$doit $instcmd "$src" "$dsttmp" &&
# and set any options; do chmod last to preserve setuid bits
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.
if [ x"$chowncmd" != x ]; then $doit $chowncmd "$dsttmp"; else :;fi &&
if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd "$dsttmp"; else :;fi &&
if [ x"$stripcmd" != x ]; then $doit $stripcmd "$dsttmp"; else :;fi &&
if [ x"$chmodcmd" != x ]; then $doit $chmodcmd "$dsttmp"; else :;fi &&
# Now remove or move aside any old file at destination location. We try this
# two ways since rm can't unlink itself on some systems and the destination
# file might be busy for other reasons. In this case, the final cleanup
# might fail but the new file should still install successfully.
{
if [ -f "$dstdir/$dstfile" ]
then
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null ||
$doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null ||
{
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
(exit 1); exit
}
else
:
fi
} &&
# Now rename the file to the real destination.
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
fi &&
# The final little trick to "correctly" pass the exit status to the exit trap.
{
(exit 0); exit
}

View File

@ -0,0 +1,217 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: latin1.c,v 1.10 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include "id3tag.h"
# include "latin1.h"
# include "ucs4.h"
/*
* NAME: latin1->length()
* DESCRIPTION: return the number of ucs4 chars represented by a latin1 string
*/
id3_length_t id3_latin1_length(id3_latin1_t const *latin1)
{
id3_latin1_t const *ptr = latin1;
while (*ptr)
++ptr;
return ptr - latin1;
}
/*
* NAME: latin1->size()
* DESCRIPTION: return the encoding size of a latin1 string
*/
id3_length_t id3_latin1_size(id3_latin1_t const *latin1)
{
return id3_latin1_length(latin1) + 1;
}
/*
* NAME: latin1->copy()
* DESCRIPTION: copy a latin1 string
*/
void id3_latin1_copy(id3_latin1_t *dest, id3_latin1_t const *src)
{
while ((*dest++ = *src++))
;
}
/*
* NAME: latin1->duplicate()
* DESCRIPTION: duplicate a latin1 string
*/
id3_latin1_t *id3_latin1_duplicate(id3_latin1_t const *src)
{
id3_latin1_t *latin1;
latin1 = malloc(id3_latin1_size(src) * sizeof(*latin1));
if (latin1)
id3_latin1_copy(latin1, src);
return latin1;
}
/*
* NAME: latin1->ucs4duplicate()
* DESCRIPTION: duplicate and decode a latin1 string into ucs4
*/
id3_ucs4_t *id3_latin1_ucs4duplicate(id3_latin1_t const *latin1)
{
id3_ucs4_t *ucs4;
ucs4 = malloc((id3_latin1_length(latin1) + 1) * sizeof(*ucs4));
if (ucs4)
id3_latin1_decode(latin1, ucs4);
return release(ucs4);
}
/*
* NAME: latin1->decodechar()
* DESCRIPTION: decode a (single) latin1 char into a single ucs4 char
*/
id3_length_t id3_latin1_decodechar(id3_latin1_t const *latin1,
id3_ucs4_t *ucs4)
{
*ucs4 = *latin1;
return 1;
}
/*
* NAME: latin1->encodechar()
* DESCRIPTION: encode a single ucs4 char into a (single) latin1 char
*/
id3_length_t id3_latin1_encodechar(id3_latin1_t *latin1, id3_ucs4_t ucs4)
{
*latin1 = ucs4;
if (ucs4 > 0x000000ffL)
*latin1 = ID3_UCS4_REPLACEMENTCHAR;
return 1;
}
/*
* NAME: latin1->decode()
* DESCRIPTION: decode a complete latin1 string into a ucs4 string
*/
void id3_latin1_decode(id3_latin1_t const *latin1, id3_ucs4_t *ucs4)
{
do
latin1 += id3_latin1_decodechar(latin1, ucs4);
while (*ucs4++);
}
/*
* NAME: latin1->encode()
* DESCRIPTION: encode a complete ucs4 string into a latin1 string
*/
void id3_latin1_encode(id3_latin1_t *latin1, id3_ucs4_t const *ucs4)
{
do
latin1 += id3_latin1_encodechar(latin1, *ucs4);
while (*ucs4++);
}
/*
* NAME: latin1->put()
* DESCRIPTION: serialize a single latin1 character
*/
id3_length_t id3_latin1_put(id3_byte_t **ptr, id3_latin1_t latin1)
{
if (ptr)
*(*ptr)++ = latin1;
return 1;
}
/*
* NAME: latin1->get()
* DESCRIPTION: deserialize a single latin1 character
*/
id3_latin1_t id3_latin1_get(id3_byte_t const **ptr)
{
return *(*ptr)++;
}
/*
* NAME: latin1->serialize()
* DESCRIPTION: serialize a ucs4 string using latin1 encoding
*/
id3_length_t id3_latin1_serialize(id3_byte_t **ptr, id3_ucs4_t const *ucs4,
int terminate)
{
id3_length_t size = 0;
id3_latin1_t latin1[1], *out;
while (*ucs4) {
switch (id3_latin1_encodechar(out = latin1, *ucs4++)) {
case 1: size += id3_latin1_put(ptr, *out++);
case 0: break;
}
}
if (terminate)
size += id3_latin1_put(ptr, 0);
return size;
}
/*
* NAME: latin1->deserialize()
* DESCRIPTION: deserialize a ucs4 string using latin1 encoding
*/
id3_ucs4_t *id3_latin1_deserialize(id3_byte_t const **ptr, id3_length_t length)
{
id3_byte_t const *end;
id3_latin1_t *latin1ptr, *latin1;
id3_ucs4_t *ucs4;
end = *ptr + length;
latin1 = malloc((length + 1) * sizeof(*latin1));
if (latin1 == 0)
return 0;
latin1ptr = latin1;
while (end - *ptr > 0 && (*latin1ptr = id3_latin1_get(ptr)))
++latin1ptr;
*latin1ptr = 0;
ucs4 = malloc((id3_latin1_length(latin1) + 1) * sizeof(*ucs4));
if (ucs4)
id3_latin1_decode(latin1, ucs4);
free(latin1);
return ucs4;
}

View File

@ -0,0 +1,45 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: latin1.h,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_LATIN1_H
# define LIBID3TAG_LATIN1_H
# include "id3tag.h"
id3_length_t id3_latin1_length(id3_latin1_t const *);
id3_length_t id3_latin1_size(id3_latin1_t const *);
void id3_latin1_copy(id3_latin1_t *, id3_latin1_t const *);
id3_latin1_t *id3_latin1_duplicate(id3_latin1_t const *);
id3_length_t id3_latin1_decodechar(id3_latin1_t const *, id3_ucs4_t *);
id3_length_t id3_latin1_encodechar(id3_latin1_t *, id3_ucs4_t);
void id3_latin1_decode(id3_latin1_t const *, id3_ucs4_t *);
void id3_latin1_encode(id3_latin1_t *, id3_ucs4_t const *);
id3_length_t id3_latin1_put(id3_byte_t **, id3_latin1_t);
id3_latin1_t id3_latin1_get(id3_byte_t const **);
id3_length_t id3_latin1_serialize(id3_byte_t **, id3_ucs4_t const *, int);
id3_ucs4_t *id3_latin1_deserialize(id3_byte_t const **, id3_length_t);
# endif

View File

@ -0,0 +1,21 @@
# @configure_input@
# Directories...
$prefix=@prefix@
$exec_prefix=@exec_prefix@
$srcdir=@srcdir@
# Product information
%product @PACKAGE@
%copyright GPL
%vendor Underbit Technologies, Inc. <info@underbit.com>
%license @srcdir@/COPYING
%readme @srcdir@/README
%description libid3tag is an ID3 tag manipulation library.
%version @VERSION@
%packager Giuseppe "Cowo" Corbelli <cowo@lugbs.linux.it>
%system all
f 0755 root root @libdir@/libid3tag.la .libs/libid3tag.lai
f 0644 root root @libdir@/libid3tag.a .libs/libid3tag.a
f 0644 root root @includedir@/id3tag.h @srcdir@/id3tag.h

File diff suppressed because it is too large Load Diff

336
Libraries/ID3Tag/Files/missing Executable file
View File

@ -0,0 +1,336 @@
#! /bin/sh
# Common stub for a few missing GNU programs while installing.
# Copyright (C) 1996, 1997, 1999, 2000, 2002 Free Software Foundation, Inc.
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# 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, 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.
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
if test $# -eq 0; then
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
fi
run=:
# In the cases where this matters, `missing' is being run in the
# srcdir already.
if test -f configure.ac; then
configure_ac=configure.ac
else
configure_ac=configure.in
fi
case "$1" in
--run)
# Try to run requested program, and just exit if it succeeds.
run=
shift
"$@" && exit 0
;;
esac
# If it does not exist, or fails to run (possibly an outdated version),
# try to emulate it.
case "$1" in
-h|--h|--he|--hel|--help)
echo "\
$0 [OPTION]... PROGRAM [ARGUMENT]...
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
error status if there is no known handling for PROGRAM.
Options:
-h, --help display this help and exit
-v, --version output version information and exit
--run try to run the given command, and emulate it if it fails
Supported PROGRAM values:
aclocal touch file \`aclocal.m4'
autoconf touch file \`configure'
autoheader touch file \`config.h.in'
automake touch all \`Makefile.in' files
bison create \`y.tab.[ch]', if possible, from existing .[ch]
flex create \`lex.yy.c', if possible, from existing .c
help2man touch the output file
lex create \`lex.yy.c', if possible, from existing .c
makeinfo touch the output file
tar try tar, gnutar, gtar, then tar without non-portable flags
yacc create \`y.tab.[ch]', if possible, from existing .[ch]"
;;
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
echo "missing 0.4 - GNU automake"
;;
-*)
echo 1>&2 "$0: Unknown \`$1' option"
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
;;
aclocal*)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
to install the \`Automake' and \`Perl' packages. Grab them from
any GNU archive site."
touch aclocal.m4
;;
autoconf)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`${configure_ac}'. You might want to install the
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
archive site."
touch configure
;;
autoheader)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`acconfig.h' or \`${configure_ac}'. You might want
to install the \`Autoconf' and \`GNU m4' packages. Grab them
from any GNU archive site."
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
test -z "$files" && files="config.h"
touch_files=
for f in $files; do
case "$f" in
*:*) touch_files="$touch_files "`echo "$f" |
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
*) touch_files="$touch_files $f.in";;
esac
done
touch $touch_files
;;
automake*)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
You might want to install the \`Automake' and \`Perl' packages.
Grab them from any GNU archive site."
find . -type f -name Makefile.am -print |
sed 's/\.am$/.in/' |
while read f; do touch "$f"; done
;;
autom4te)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is needed, and you do not seem to have it handy on your
system. You might have modified some files without having the
proper tools for further handling them.
You can get \`$1Help2man' as part of \`Autoconf' from any GNU
archive site."
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
if test -f "$file"; then
touch $file
else
test -z "$file" || exec >$file
echo "#! /bin/sh"
echo "# Created by GNU Automake missing as a replacement of"
echo "# $ $@"
echo "exit 0"
chmod +x $file
exit 1
fi
;;
bison|yacc)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a \`.y' file. You may need the \`Bison' package
in order for those modifications to take effect. You can get
\`Bison' from any GNU archive site."
rm -f y.tab.c y.tab.h
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.y)
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.c
fi
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.h
fi
;;
esac
fi
if [ ! -f y.tab.h ]; then
echo >y.tab.h
fi
if [ ! -f y.tab.c ]; then
echo 'main() { return 0; }' >y.tab.c
fi
;;
lex|flex)
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a \`.l' file. You may need the \`Flex' package
in order for those modifications to take effect. You can get
\`Flex' from any GNU archive site."
rm -f lex.yy.c
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.l)
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" lex.yy.c
fi
;;
esac
fi
if [ ! -f lex.yy.c ]; then
echo 'main() { return 0; }' >lex.yy.c
fi
;;
help2man)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a dependency of a manual page. You may need the
\`Help2man' package in order for those modifications to take
effect. You can get \`Help2man' from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
fi
if [ -f "$file" ]; then
touch $file
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
exit 1
fi
;;
makeinfo)
if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
# We have makeinfo, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is missing on your system. You should only need it if
you modified a \`.texi' or \`.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy \`make' (AIX,
DU, IRIX). You might want to install the \`Texinfo' package or
the \`GNU make' package. Grab either from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
fi
touch $file
;;
tar)
shift
if test -n "$run"; then
echo 1>&2 "ERROR: \`tar' requires --run"
exit 1
fi
# We have already tried tar in the generic part.
# Look for gnutar/gtar before invocation to avoid ugly error
# messages.
if (gnutar --version > /dev/null 2>&1); then
gnutar "$@" && exit 0
fi
if (gtar --version > /dev/null 2>&1); then
gtar "$@" && exit 0
fi
firstarg="$1"
if shift; then
case "$firstarg" in
*o*)
firstarg=`echo "$firstarg" | sed s/o//`
tar "$firstarg" "$@" && exit 0
;;
esac
case "$firstarg" in
*h*)
firstarg=`echo "$firstarg" | sed s/h//`
tar "$firstarg" "$@" && exit 0
;;
esac
fi
echo 1>&2 "\
WARNING: I can't seem to be able to run \`tar' with the given arguments.
You may want to install GNU tar or Free paxutils, or check the
command line arguments."
exit 1
;;
*)
echo 1>&2 "\
WARNING: \`$1' is needed, and you do not seem to have it handy on your
system. You might have modified some files without having the
proper tools for further handling them. Check the \`README' file,
it often tells you about the needed prerequirements for installing
this package. You may also peek at any GNU archive site, in case
some other package would contain this missing \`$1' program."
exit 1
;;
esac
exit 0

View File

@ -0,0 +1,111 @@
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
# Author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain
errstatus=0
dirmode=""
usage="\
Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..."
# process command line arguments
while test $# -gt 0 ; do
case $1 in
-h | --help | --h*) # -h for help
echo "$usage" 1>&2
exit 0
;;
-m) # -m PERM arg
shift
test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
dirmode=$1
shift
;;
--) # stop option processing
shift
break
;;
-*) # unknown option
echo "$usage" 1>&2
exit 1
;;
*) # first non-opt arg
break
;;
esac
done
for file
do
if test -d "$file"; then
shift
else
break
fi
done
case $# in
0) exit 0 ;;
esac
case $dirmode in
'')
if mkdir -p -- . 2>/dev/null; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
fi
;;
*)
if mkdir -m "$dirmode" -p -- . 2>/dev/null; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
fi
;;
esac
for file
do
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
shift
pathcomp=
for d
do
pathcomp="$pathcomp$d"
case $pathcomp in
-*) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp"
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
errstatus=$lasterr
else
if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
lasterr=""
chmod "$dirmode" "$pathcomp" || lasterr=$?
if test ! -z "$lasterr"; then
errstatus=$lasterr
fi
fi
fi
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# End:
# mkinstalldirs ends here

View File

@ -0,0 +1,24 @@
##
## libid3tag - ID3 tag manipulation library
## Copyright (C) 2000-2004 Underbit Technologies, Inc.
##
## 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
##
## $Id: Makefile.am,v 1.2 2004/01/23 09:41:32 rob Exp $
##
## Process this file with automake to produce Makefile.in
EXTRA_DIST = config.h libid3tag.dsp

View File

@ -0,0 +1,309 @@
# Makefile.in generated by automake 1.8.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_triplet = @host@
subdir = msvc++
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEBUG_FALSE = @DEBUG_FALSE@
DEBUG_TRUE = @DEBUG_TRUE@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
EXTRA_DIST = config.h libid3tag.dsp
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign msvc++/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign msvc++/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-libtool
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am:
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
distclean distclean-generic distclean-libtool distdir dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-exec install-exec-am \
install-info install-info-am install-man install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-info-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -0,0 +1,78 @@
/* config.h. Generated by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to enable diagnostic debugging support. */
/* #undef DEBUG */
/* Define to 1 if you have the <assert.h> header file. */
#define HAVE_ASSERT_H 1
/* Define to 1 if you have the <dlfcn.h> header file. */
/* #undef HAVE_DLFCN_H */
/* Define to 1 if you have the `ftruncate' function. */
/* #undef HAVE_FTRUNCATE */
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the `z' library (-lz). */
#define HAVE_LIBZ 1
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <unistd.h> header file. */
/* #undef HAVE_UNISTD_H */
/* Define to disable debugging assertions. */
/* #undef NDEBUG */
/* Name of package */
#define PACKAGE "libid3tag"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "support@underbit.com"
/* Define to the full name of this package. */
#define PACKAGE_NAME "ID3 Tag"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "ID3 Tag 0.15.1b"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "libid3tag"
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.15.1b"
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "0.15.1b"
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define as `__inline' if that's what the C compiler calls it, or to nothing
if it is not supported. */
/* #undef inline */

View File

@ -0,0 +1,250 @@
# Microsoft Developer Studio Project File - Name="libid3tag" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=libid3tag - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "libid3tag.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "libid3tag.mak" CFG="libid3tag - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "libid3tag - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "libid3tag - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "libid3tag - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /GX /O2 /I "." /I "..\..\libz" /I "..\..\libz-1.1.4" /D "NDEBUG" /D "WIN32" /D "_MBCS" /D "_LIB" /D "HAVE_CONFIG_H" /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "libid3tag - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /Gm /GX /ZI /Od /I "." /I "..\..\libz" /I "..\..\libz-1.1.4" /D "_LIB" /D "HAVE_CONFIG_H" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "DEBUG" /FD /GZ /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "libid3tag - Win32 Release"
# Name "libid3tag - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "c"
# Begin Source File
SOURCE=..\compat.c
# End Source File
# Begin Source File
SOURCE=..\crc.c
# End Source File
# Begin Source File
SOURCE=..\debug.c
# End Source File
# Begin Source File
SOURCE=..\field.c
# End Source File
# Begin Source File
SOURCE=..\file.c
# End Source File
# Begin Source File
SOURCE=..\frame.c
# End Source File
# Begin Source File
SOURCE=..\frametype.c
# End Source File
# Begin Source File
SOURCE=..\genre.c
# End Source File
# Begin Source File
SOURCE=..\latin1.c
# End Source File
# Begin Source File
SOURCE=..\parse.c
# End Source File
# Begin Source File
SOURCE=..\render.c
# End Source File
# Begin Source File
SOURCE=..\tag.c
# End Source File
# Begin Source File
SOURCE=..\ucs4.c
# End Source File
# Begin Source File
SOURCE=..\utf16.c
# End Source File
# Begin Source File
SOURCE=..\utf8.c
# End Source File
# Begin Source File
SOURCE=..\util.c
# End Source File
# Begin Source File
SOURCE=..\version.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h"
# Begin Source File
SOURCE=..\compat.h
# End Source File
# Begin Source File
SOURCE=.\config.h
# End Source File
# Begin Source File
SOURCE=..\crc.h
# End Source File
# Begin Source File
SOURCE=..\debug.h
# End Source File
# Begin Source File
SOURCE=..\field.h
# End Source File
# Begin Source File
SOURCE=..\file.h
# End Source File
# Begin Source File
SOURCE=..\frame.h
# End Source File
# Begin Source File
SOURCE=..\frametype.h
# End Source File
# Begin Source File
SOURCE=..\genre.h
# End Source File
# Begin Source File
SOURCE=..\global.h
# End Source File
# Begin Source File
SOURCE=..\id3tag.h
# End Source File
# Begin Source File
SOURCE=..\latin1.h
# End Source File
# Begin Source File
SOURCE=..\parse.h
# End Source File
# Begin Source File
SOURCE=..\render.h
# End Source File
# Begin Source File
SOURCE=..\tag.h
# End Source File
# Begin Source File
SOURCE=..\ucs4.h
# End Source File
# Begin Source File
SOURCE=..\utf16.h
# End Source File
# Begin Source File
SOURCE=..\utf8.h
# End Source File
# Begin Source File
SOURCE=..\util.h
# End Source File
# Begin Source File
SOURCE=..\version.h
# End Source File
# End Group
# Begin Group "Data Files"
# PROP Default_Filter "dat"
# Begin Source File
SOURCE=..\genre.dat
# End Source File
# End Group
# End Target
# End Project

View File

@ -0,0 +1,196 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: parse.c,v 1.9 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include <stdlib.h>
# include <string.h>
# include "id3tag.h"
# include "parse.h"
# include "latin1.h"
# include "utf16.h"
# include "utf8.h"
signed long id3_parse_int(id3_byte_t const **ptr, unsigned int bytes)
{
signed long value = 0;
assert(bytes >= 1 && bytes <= 4);
if (**ptr & 0x80)
value = ~0;
switch (bytes) {
case 4: value = (value << 8) | *(*ptr)++;
case 3: value = (value << 8) | *(*ptr)++;
case 2: value = (value << 8) | *(*ptr)++;
case 1: value = (value << 8) | *(*ptr)++;
}
return value;
}
unsigned long id3_parse_uint(id3_byte_t const **ptr, unsigned int bytes)
{
unsigned long value = 0;
assert(bytes >= 1 && bytes <= 4);
switch (bytes) {
case 4: value = (value << 8) | *(*ptr)++;
case 3: value = (value << 8) | *(*ptr)++;
case 2: value = (value << 8) | *(*ptr)++;
case 1: value = (value << 8) | *(*ptr)++;
}
return value;
}
unsigned long id3_parse_syncsafe(id3_byte_t const **ptr, unsigned int bytes)
{
unsigned long value = 0;
assert(bytes == 4 || bytes == 5);
switch (bytes) {
case 5: value = (value << 4) | (*(*ptr)++ & 0x0f);
case 4: value = (value << 7) | (*(*ptr)++ & 0x7f);
value = (value << 7) | (*(*ptr)++ & 0x7f);
value = (value << 7) | (*(*ptr)++ & 0x7f);
value = (value << 7) | (*(*ptr)++ & 0x7f);
}
return value;
}
void id3_parse_immediate(id3_byte_t const **ptr, unsigned int bytes,
char *value)
{
assert(value);
assert(bytes == 8 || bytes == 4 || bytes == 3);
switch (bytes) {
case 8: *value++ = *(*ptr)++;
*value++ = *(*ptr)++;
*value++ = *(*ptr)++;
*value++ = *(*ptr)++;
case 4: *value++ = *(*ptr)++;
case 3: *value++ = *(*ptr)++;
*value++ = *(*ptr)++;
*value++ = *(*ptr)++;
}
*value = 0;
}
id3_latin1_t *id3_parse_latin1(id3_byte_t const **ptr, id3_length_t length,
int full)
{
id3_byte_t const *end;
int terminated = 0;
id3_latin1_t *latin1;
end = memchr(*ptr, 0, length);
if (end == 0)
end = *ptr + length;
else {
length = end - *ptr;
terminated = 1;
}
latin1 = malloc(length + 1);
if (latin1) {
memcpy(latin1, *ptr, length);
latin1[length] = 0;
if (!full) {
id3_latin1_t *check;
for (check = latin1; *check; ++check) {
if (*check == '\n')
*check = ' ';
}
}
}
*ptr += length + terminated;
return latin1;
}
id3_ucs4_t *id3_parse_string(id3_byte_t const **ptr, id3_length_t length,
enum id3_field_textencoding encoding, int full)
{
id3_ucs4_t *ucs4 = 0;
enum id3_utf16_byteorder byteorder = ID3_UTF16_BYTEORDER_ANY;
switch (encoding) {
case ID3_FIELD_TEXTENCODING_ISO_8859_1:
ucs4 = id3_latin1_deserialize(ptr, length);
break;
case ID3_FIELD_TEXTENCODING_UTF_16BE:
byteorder = ID3_UTF16_BYTEORDER_BE;
case ID3_FIELD_TEXTENCODING_UTF_16:
ucs4 = id3_utf16_deserialize(ptr, length, byteorder);
break;
case ID3_FIELD_TEXTENCODING_UTF_8:
ucs4 = id3_utf8_deserialize(ptr, length);
break;
}
if (ucs4 && !full) {
id3_ucs4_t *check;
for (check = ucs4; *check; ++check) {
if (*check == '\n')
*check = ' ';
}
}
return ucs4;
}
id3_byte_t *id3_parse_binary(id3_byte_t const **ptr, id3_length_t length)
{
id3_byte_t *data;
if (length == 0)
return malloc(1);
data = malloc(length);
if (data)
memcpy(data, *ptr, length);
*ptr += length;
return data;
}

View File

@ -0,0 +1,34 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: parse.h,v 1.6 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_PARSE_H
# define LIBID3TAG_PARSE_H
signed long id3_parse_int(id3_byte_t const **, unsigned int);
unsigned long id3_parse_uint(id3_byte_t const **, unsigned int);
unsigned long id3_parse_syncsafe(id3_byte_t const **, unsigned int);
void id3_parse_immediate(id3_byte_t const **, unsigned int, char *);
id3_latin1_t *id3_parse_latin1(id3_byte_t const **, id3_length_t, int);
id3_ucs4_t *id3_parse_string(id3_byte_t const **, id3_length_t,
enum id3_field_textencoding, int);
id3_byte_t *id3_parse_binary(id3_byte_t const **, id3_length_t);
# endif

View File

@ -0,0 +1,200 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: render.c,v 1.11 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <string.h>
# include <stdlib.h>
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include "id3tag.h"
# include "render.h"
# include "ucs4.h"
# include "latin1.h"
# include "utf16.h"
# include "utf8.h"
id3_length_t id3_render_immediate(id3_byte_t **ptr,
char const *value, unsigned int bytes)
{
assert(value);
assert(bytes == 8 || bytes == 4 || bytes == 3);
if (ptr) {
switch (bytes) {
case 8: *(*ptr)++ = *value++;
*(*ptr)++ = *value++;
*(*ptr)++ = *value++;
*(*ptr)++ = *value++;
case 4: *(*ptr)++ = *value++;
case 3: *(*ptr)++ = *value++;
*(*ptr)++ = *value++;
*(*ptr)++ = *value++;
}
}
return bytes;
}
id3_length_t id3_render_syncsafe(id3_byte_t **ptr,
unsigned long num, unsigned int bytes)
{
assert(bytes == 4 || bytes == 5);
if (ptr) {
switch (bytes) {
case 5: *(*ptr)++ = (num >> 28) & 0x0f;
case 4: *(*ptr)++ = (num >> 21) & 0x7f;
*(*ptr)++ = (num >> 14) & 0x7f;
*(*ptr)++ = (num >> 7) & 0x7f;
*(*ptr)++ = (num >> 0) & 0x7f;
}
}
return bytes;
}
id3_length_t id3_render_int(id3_byte_t **ptr,
signed long num, unsigned int bytes)
{
assert(bytes >= 1 && bytes <= 4);
if (ptr) {
switch (bytes) {
case 4: *(*ptr)++ = num >> 24;
case 3: *(*ptr)++ = num >> 16;
case 2: *(*ptr)++ = num >> 8;
case 1: *(*ptr)++ = num >> 0;
}
}
return bytes;
}
id3_length_t id3_render_binary(id3_byte_t **ptr,
id3_byte_t const *data, id3_length_t length)
{
if (data == 0)
return 0;
if (ptr) {
memcpy(*ptr, data, length);
*ptr += length;
}
return length;
}
id3_length_t id3_render_latin1(id3_byte_t **ptr,
id3_latin1_t const *latin1, int terminate)
{
id3_length_t size;
if (latin1 == 0)
latin1 = "";
size = id3_latin1_size(latin1);
if (!terminate)
--size;
if (ptr) {
memcpy(*ptr, latin1, size);
*ptr += size;
}
return size;
}
id3_length_t id3_render_string(id3_byte_t **ptr, id3_ucs4_t const *ucs4,
enum id3_field_textencoding encoding,
int terminate)
{
enum id3_utf16_byteorder byteorder = ID3_UTF16_BYTEORDER_ANY;
if (ucs4 == 0)
ucs4 = id3_ucs4_empty;
switch (encoding) {
case ID3_FIELD_TEXTENCODING_ISO_8859_1:
return id3_latin1_serialize(ptr, ucs4, terminate);
case ID3_FIELD_TEXTENCODING_UTF_16BE:
byteorder = ID3_UTF16_BYTEORDER_BE;
case ID3_FIELD_TEXTENCODING_UTF_16:
return id3_utf16_serialize(ptr, ucs4, byteorder, terminate);
case ID3_FIELD_TEXTENCODING_UTF_8:
return id3_utf8_serialize(ptr, ucs4, terminate);
}
return 0;
}
id3_length_t id3_render_padding(id3_byte_t **ptr, id3_byte_t value,
id3_length_t length)
{
if (ptr) {
memset(*ptr, value, length);
*ptr += length;
}
return length;
}
/*
* NAME: render->paddedstring()
* DESCRIPTION: render a space-padded string using latin1 encoding
*/
id3_length_t id3_render_paddedstring(id3_byte_t **ptr, id3_ucs4_t const *ucs4,
id3_length_t length)
{
id3_ucs4_t padded[31], *data, *end;
/* latin1 encoding only (this is used for ID3v1 fields) */
assert(length <= 30);
data = padded;
end = data + length;
if (ucs4) {
while (*ucs4 && end - data > 0) {
*data++ = *ucs4++;
if (data[-1] == '\n')
data[-1] = ' ';
}
}
while (end - data > 0)
*data++ = ' ';
*data = 0;
return id3_latin1_serialize(ptr, padded, 0);
}

View File

@ -0,0 +1,40 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: render.h,v 1.7 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_RENDER_H
# define LIBID3TAG_RENDER_H
# include "id3tag.h"
id3_length_t id3_render_immediate(id3_byte_t **, char const *, unsigned int);
id3_length_t id3_render_syncsafe(id3_byte_t **, unsigned long, unsigned int);
id3_length_t id3_render_int(id3_byte_t **, signed long, unsigned int);
id3_length_t id3_render_binary(id3_byte_t **,
id3_byte_t const *, id3_length_t);
id3_length_t id3_render_latin1(id3_byte_t **, id3_latin1_t const *, int);
id3_length_t id3_render_string(id3_byte_t **, id3_ucs4_t const *,
enum id3_field_textencoding, int);
id3_length_t id3_render_padding(id3_byte_t **, id3_byte_t, id3_length_t);
id3_length_t id3_render_paddedstring(id3_byte_t **, id3_ucs4_t const *,
id3_length_t);
# endif

View File

@ -0,0 +1,909 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: tag.c,v 1.20 2004/02/17 02:04:10 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <string.h>
# include <stdlib.h>
# ifdef HAVE_ASSERT_H
# include <assert.h>
# endif
# include "id3tag.h"
# include "tag.h"
# include "frame.h"
# include "compat.h"
# include "parse.h"
# include "render.h"
# include "latin1.h"
# include "ucs4.h"
# include "genre.h"
# include "crc.h"
# include "field.h"
# include "util.h"
/*
* NAME: tag->new()
* DESCRIPTION: allocate and return a new, empty tag
*/
struct id3_tag *id3_tag_new(void)
{
struct id3_tag *tag;
tag = malloc(sizeof(*tag));
if (tag) {
tag->refcount = 0;
tag->version = ID3_TAG_VERSION;
tag->flags = 0;
tag->extendedflags = 0;
tag->restrictions = 0;
tag->options = /* ID3_TAG_OPTION_UNSYNCHRONISATION | */
ID3_TAG_OPTION_COMPRESSION | ID3_TAG_OPTION_CRC;
tag->nframes = 0;
tag->frames = 0;
tag->paddedsize = 0;
}
return tag;
}
/*
* NAME: tag->delete()
* DESCRIPTION: destroy a tag and deallocate all associated memory
*/
void id3_tag_delete(struct id3_tag *tag)
{
assert(tag);
if (tag->refcount == 0) {
id3_tag_clearframes(tag);
if (tag->frames)
free(tag->frames);
free(tag);
}
}
/*
* NAME: tag->addref()
* DESCRIPTION: add an external reference to a tag
*/
void id3_tag_addref(struct id3_tag *tag)
{
assert(tag);
++tag->refcount;
}
/*
* NAME: tag->delref()
* DESCRIPTION: remove an external reference to a tag
*/
void id3_tag_delref(struct id3_tag *tag)
{
assert(tag && tag->refcount > 0);
--tag->refcount;
}
/*
* NAME: tag->version()
* DESCRIPTION: return the tag's original ID3 version number
*/
unsigned int id3_tag_version(struct id3_tag const *tag)
{
assert(tag);
return tag->version;
}
/*
* NAME: tag->options()
* DESCRIPTION: get or set tag options
*/
int id3_tag_options(struct id3_tag *tag, int mask, int values)
{
assert(tag);
if (mask)
tag->options = (tag->options & ~mask) | (values & mask);
return tag->options;
}
/*
* NAME: tag->setlength()
* DESCRIPTION: set the minimum rendered tag size
*/
void id3_tag_setlength(struct id3_tag *tag, id3_length_t length)
{
assert(tag);
tag->paddedsize = length;
}
/*
* NAME: tag->clearframes()
* DESCRIPTION: detach and delete all frames associated with a tag
*/
void id3_tag_clearframes(struct id3_tag *tag)
{
unsigned int i;
assert(tag);
for (i = 0; i < tag->nframes; ++i) {
id3_frame_delref(tag->frames[i]);
id3_frame_delete(tag->frames[i]);
}
tag->nframes = 0;
}
/*
* NAME: tag->attachframe()
* DESCRIPTION: attach a frame to a tag
*/
int id3_tag_attachframe(struct id3_tag *tag, struct id3_frame *frame)
{
struct id3_frame **frames;
assert(tag && frame);
frames = realloc(tag->frames, (tag->nframes + 1) * sizeof(*frames));
if (frames == 0)
return -1;
tag->frames = frames;
tag->frames[tag->nframes++] = frame;
id3_frame_addref(frame);
return 0;
}
/*
* NAME: tag->detachframe()
* DESCRIPTION: detach (but don't delete) a frame from a tag
*/
int id3_tag_detachframe(struct id3_tag *tag, struct id3_frame *frame)
{
unsigned int i;
assert(tag && frame);
for (i = 0; i < tag->nframes; ++i) {
if (tag->frames[i] == frame)
break;
}
if (i == tag->nframes)
return -1;
--tag->nframes;
while (i++ < tag->nframes)
tag->frames[i - 1] = tag->frames[i];
id3_frame_delref(frame);
return 0;
}
/*
* NAME: tag->findframe()
* DESCRIPTION: find in a tag the nth (0-based) frame with the given frame ID
*/
struct id3_frame *id3_tag_findframe(struct id3_tag const *tag,
char const *id, unsigned int index)
{
unsigned int len, i;
assert(tag);
if (id == 0 || *id == 0)
return (index < tag->nframes) ? tag->frames[index] : 0;
len = strlen(id);
if (len == 4) {
struct id3_compat const *compat;
compat = id3_compat_lookup(id, len);
if (compat && compat->equiv && !compat->translate) {
id = compat->equiv;
len = strlen(id);
}
}
for (i = 0; i < tag->nframes; ++i) {
if (strncmp(tag->frames[i]->id, id, len) == 0 && index-- == 0)
return tag->frames[i];
}
return 0;
}
enum tagtype {
TAGTYPE_NONE = 0,
TAGTYPE_ID3V1,
TAGTYPE_ID3V2,
TAGTYPE_ID3V2_FOOTER
};
static
enum tagtype tagtype(id3_byte_t const *data, id3_length_t length)
{
if (length >= 3 &&
data[0] == 'T' && data[1] == 'A' && data[2] == 'G')
return TAGTYPE_ID3V1;
if (length >= 10 &&
((data[0] == 'I' && data[1] == 'D' && data[2] == '3') ||
(data[0] == '3' && data[1] == 'D' && data[2] == 'I')) &&
data[3] < 0xff && data[4] < 0xff &&
data[6] < 0x80 && data[7] < 0x80 && data[8] < 0x80 && data[9] < 0x80)
return data[0] == 'I' ? TAGTYPE_ID3V2 : TAGTYPE_ID3V2_FOOTER;
return TAGTYPE_NONE;
}
static
void parse_header(id3_byte_t const **ptr,
unsigned int *version, int *flags, id3_length_t *size)
{
*ptr += 3;
*version = id3_parse_uint(ptr, 2);
*flags = id3_parse_uint(ptr, 1);
*size = id3_parse_syncsafe(ptr, 4);
}
/*
* NAME: tag->query()
* DESCRIPTION: if a tag begins at the given location, return its size
*/
signed long id3_tag_query(id3_byte_t const *data, id3_length_t length)
{
unsigned int version;
int flags;
id3_length_t size;
assert(data);
switch (tagtype(data, length)) {
case TAGTYPE_ID3V1:
return 128;
case TAGTYPE_ID3V2:
parse_header(&data, &version, &flags, &size);
if (flags & ID3_TAG_FLAG_FOOTERPRESENT)
size += 10;
return 10 + size;
case TAGTYPE_ID3V2_FOOTER:
parse_header(&data, &version, &flags, &size);
return -size - 10;
case TAGTYPE_NONE:
break;
}
return 0;
}
static
void trim(char *str)
{
char *ptr;
ptr = str + strlen(str);
while (ptr > str && ptr[-1] == ' ')
--ptr;
*ptr = 0;
}
static
int v1_attachstr(struct id3_tag *tag, char const *id,
char *text, unsigned long number)
{
struct id3_frame *frame;
id3_ucs4_t ucs4[31];
if (text) {
trim(text);
if (*text == 0)
return 0;
}
frame = id3_frame_new(id);
if (frame == 0)
return -1;
if (id3_field_settextencoding(&frame->fields[0],
ID3_FIELD_TEXTENCODING_ISO_8859_1) == -1)
goto fail;
if (text)
id3_latin1_decode(text, ucs4);
else
id3_ucs4_putnumber(ucs4, number);
if (strcmp(id, ID3_FRAME_COMMENT) == 0) {
if (id3_field_setlanguage(&frame->fields[1], "XXX") == -1 ||
id3_field_setstring(&frame->fields[2], id3_ucs4_empty) == -1 ||
id3_field_setfullstring(&frame->fields[3], ucs4) == -1)
goto fail;
}
else {
id3_ucs4_t *ptr = ucs4;
if (id3_field_setstrings(&frame->fields[1], 1, &ptr) == -1)
goto fail;
}
if (id3_tag_attachframe(tag, frame) == -1)
goto fail;
return 0;
fail:
id3_frame_delete(frame);
return -1;
}
static
struct id3_tag *v1_parse(id3_byte_t const *data)
{
struct id3_tag *tag;
tag = id3_tag_new();
if (tag) {
char title[31], artist[31], album[31], year[5], comment[31];
unsigned int genre, track;
tag->version = 0x0100;
tag->options |= ID3_TAG_OPTION_ID3V1;
tag->options &= ~ID3_TAG_OPTION_COMPRESSION;
tag->restrictions =
ID3_TAG_RESTRICTION_TEXTENCODING_LATIN1_UTF8 |
ID3_TAG_RESTRICTION_TEXTSIZE_30_CHARS;
title[30] = artist[30] = album[30] = year[4] = comment[30] = 0;
memcpy(title, &data[3], 30);
memcpy(artist, &data[33], 30);
memcpy(album, &data[63], 30);
memcpy(year, &data[93], 4);
memcpy(comment, &data[97], 30);
genre = data[127];
track = 0;
if (comment[28] == 0 && comment[29] != 0) {
track = comment[29];
tag->version = 0x0101;
}
/* populate tag frames */
if (v1_attachstr(tag, ID3_FRAME_TITLE, title, 0) == -1 ||
v1_attachstr(tag, ID3_FRAME_ARTIST, artist, 0) == -1 ||
v1_attachstr(tag, ID3_FRAME_ALBUM, album, 0) == -1 ||
v1_attachstr(tag, ID3_FRAME_YEAR, year, 0) == -1 ||
(track && v1_attachstr(tag, ID3_FRAME_TRACK, 0, track) == -1) ||
(genre < 0xff && v1_attachstr(tag, ID3_FRAME_GENRE, 0, genre) == -1) ||
v1_attachstr(tag, ID3_FRAME_COMMENT, comment, 0) == -1) {
id3_tag_delete(tag);
tag = 0;
}
}
return tag;
}
static
struct id3_tag *v2_parse(id3_byte_t const *ptr)
{
struct id3_tag *tag;
id3_byte_t *mem = 0;
tag = id3_tag_new();
if (tag) {
id3_byte_t const *end;
id3_length_t size;
parse_header(&ptr, &tag->version, &tag->flags, &size);
tag->paddedsize = 10 + size;
if ((tag->flags & ID3_TAG_FLAG_UNSYNCHRONISATION) &&
ID3_TAG_VERSION_MAJOR(tag->version) < 4) {
mem = malloc(size);
if (mem == 0)
goto fail;
memcpy(mem, ptr, size);
size = id3_util_deunsynchronise(mem, size);
ptr = mem;
}
end = ptr + size;
if (tag->flags & ID3_TAG_FLAG_EXTENDEDHEADER) {
switch (ID3_TAG_VERSION_MAJOR(tag->version)) {
case 2:
goto fail;
case 3:
{
id3_byte_t const *ehptr, *ehend;
id3_length_t ehsize;
enum {
EH_FLAG_CRC = 0x8000 /* CRC data present */
};
if (end - ptr < 4)
goto fail;
ehsize = id3_parse_uint(&ptr, 4);
if (ehsize > end - ptr)
goto fail;
ehptr = ptr;
ehend = ptr + ehsize;
ptr = ehend;
if (ehend - ehptr >= 6) {
int ehflags;
id3_length_t padsize;
ehflags = id3_parse_uint(&ehptr, 2);
padsize = id3_parse_uint(&ehptr, 4);
if (padsize > end - ptr)
goto fail;
end -= padsize;
if (ehflags & EH_FLAG_CRC) {
unsigned long crc;
if (ehend - ehptr < 4)
goto fail;
crc = id3_parse_uint(&ehptr, 4);
if (crc != id3_crc_compute(ptr, end - ptr))
goto fail;
tag->extendedflags |= ID3_TAG_EXTENDEDFLAG_CRCDATAPRESENT;
}
}
}
break;
case 4:
{
id3_byte_t const *ehptr, *ehend;
id3_length_t ehsize;
unsigned int bytes;
if (end - ptr < 4)
goto fail;
ehptr = ptr;
ehsize = id3_parse_syncsafe(&ptr, 4);
if (ehsize < 6 || ehsize > end - ehptr)
goto fail;
ehend = ehptr + ehsize;
bytes = id3_parse_uint(&ptr, 1);
if (bytes < 1 || bytes > ehend - ptr)
goto fail;
ehptr = ptr + bytes;
/* verify extended header size */
{
id3_byte_t const *flagsptr = ptr, *dataptr = ehptr;
unsigned int datalen;
int ehflags;
while (bytes--) {
for (ehflags = id3_parse_uint(&flagsptr, 1); ehflags;
ehflags = (ehflags << 1) & 0xff) {
if (ehflags & 0x80) {
if (dataptr == ehend)
goto fail;
datalen = id3_parse_uint(&dataptr, 1);
if (datalen > 0x7f || datalen > ehend - dataptr)
goto fail;
dataptr += datalen;
}
}
}
}
tag->extendedflags = id3_parse_uint(&ptr, 1);
ptr = ehend;
if (tag->extendedflags & ID3_TAG_EXTENDEDFLAG_TAGISANUPDATE) {
bytes = id3_parse_uint(&ehptr, 1);
ehptr += bytes;
}
if (tag->extendedflags & ID3_TAG_EXTENDEDFLAG_CRCDATAPRESENT) {
unsigned long crc;
bytes = id3_parse_uint(&ehptr, 1);
if (bytes < 5)
goto fail;
crc = id3_parse_syncsafe(&ehptr, 5);
ehptr += bytes - 5;
if (crc != id3_crc_compute(ptr, end - ptr))
goto fail;
}
if (tag->extendedflags & ID3_TAG_EXTENDEDFLAG_TAGRESTRICTIONS) {
bytes = id3_parse_uint(&ehptr, 1);
if (bytes < 1)
goto fail;
tag->restrictions = id3_parse_uint(&ehptr, 1);
ehptr += bytes - 1;
}
}
break;
}
}
/* frames */
while (ptr < end) {
struct id3_frame *frame;
if (*ptr == 0)
break; /* padding */
frame = id3_frame_parse(&ptr, end - ptr, tag->version);
if (frame == 0 || id3_tag_attachframe(tag, frame) == -1)
goto fail;
}
if (ID3_TAG_VERSION_MAJOR(tag->version) < 4 &&
id3_compat_fixup(tag) == -1)
goto fail;
}
if (0) {
fail:
id3_tag_delete(tag);
tag = 0;
}
if (mem)
free(mem);
return tag;
}
/*
* NAME: tag->parse()
* DESCRIPTION: parse a complete ID3 tag
*/
struct id3_tag *id3_tag_parse(id3_byte_t const *data, id3_length_t length)
{
id3_byte_t const *ptr;
unsigned int version;
int flags;
id3_length_t size;
assert(data);
switch (tagtype(data, length)) {
case TAGTYPE_ID3V1:
return (length < 128) ? 0 : v1_parse(data);
case TAGTYPE_ID3V2:
break;
case TAGTYPE_ID3V2_FOOTER:
case TAGTYPE_NONE:
return 0;
}
/* ID3v2.x */
ptr = data;
parse_header(&ptr, &version, &flags, &size);
switch (ID3_TAG_VERSION_MAJOR(version)) {
case 4:
if (flags & ID3_TAG_FLAG_FOOTERPRESENT)
size += 10;
case 2:
case 3:
return (length < 10 + size) ? 0 : v2_parse(data);
}
return 0;
}
static
void v1_renderstr(struct id3_tag const *tag, char const *frameid,
id3_byte_t **buffer, id3_length_t length)
{
struct id3_frame *frame;
id3_ucs4_t const *string;
frame = id3_tag_findframe(tag, frameid, 0);
if (frame == 0)
string = id3_ucs4_empty;
else {
if (strcmp(frameid, ID3_FRAME_COMMENT) == 0)
string = id3_field_getfullstring(&frame->fields[3]);
else
string = id3_field_getstrings(&frame->fields[1], 0);
}
id3_render_paddedstring(buffer, string, length);
}
/*
* NAME: v1->render()
* DESCRIPTION: render an ID3v1 (or ID3v1.1) tag
*/
static
id3_length_t v1_render(struct id3_tag const *tag, id3_byte_t *buffer)
{
id3_byte_t data[128], *ptr;
struct id3_frame *frame;
unsigned int i;
int genre = -1;
ptr = data;
id3_render_immediate(&ptr, "TAG", 3);
v1_renderstr(tag, ID3_FRAME_TITLE, &ptr, 30);
v1_renderstr(tag, ID3_FRAME_ARTIST, &ptr, 30);
v1_renderstr(tag, ID3_FRAME_ALBUM, &ptr, 30);
v1_renderstr(tag, ID3_FRAME_YEAR, &ptr, 4);
v1_renderstr(tag, ID3_FRAME_COMMENT, &ptr, 30);
/* ID3v1.1 track number */
frame = id3_tag_findframe(tag, ID3_FRAME_TRACK, 0);
if (frame) {
unsigned int track;
track = id3_ucs4_getnumber(id3_field_getstrings(&frame->fields[1], 0));
if (track > 0 && track <= 0xff) {
ptr[-2] = 0;
ptr[-1] = track;
}
}
/* ID3v1 genre number */
frame = id3_tag_findframe(tag, ID3_FRAME_GENRE, 0);
if (frame) {
unsigned int nstrings;
nstrings = id3_field_getnstrings(&frame->fields[1]);
for (i = 0; i < nstrings; ++i) {
genre = id3_genre_number(id3_field_getstrings(&frame->fields[1], i));
if (genre != -1)
break;
}
if (i == nstrings && nstrings > 0)
genre = ID3_GENRE_OTHER;
}
id3_render_int(&ptr, genre, 1);
/* make sure the tag is not empty */
if (genre == -1) {
for (i = 3; i < 127; ++i) {
if (data[i] != ' ')
break;
}
if (i == 127)
return 0;
}
if (buffer)
memcpy(buffer, data, 128);
return 128;
}
/*
* NAME: tag->render()
* DESCRIPTION: render a complete ID3 tag
*/
id3_length_t id3_tag_render(struct id3_tag const *tag, id3_byte_t *buffer)
{
id3_length_t size = 0;
id3_byte_t **ptr,
*header_ptr = 0, *tagsize_ptr = 0, *crc_ptr = 0, *frames_ptr = 0;
int flags, extendedflags;
unsigned int i;
assert(tag);
if (tag->options & ID3_TAG_OPTION_ID3V1)
return v1_render(tag, buffer);
/* a tag must contain at least one (renderable) frame */
for (i = 0; i < tag->nframes; ++i) {
if (id3_frame_render(tag->frames[i], 0, 0) > 0)
break;
}
if (i == tag->nframes)
return 0;
ptr = buffer ? &buffer : 0;
/* get flags */
flags = tag->flags & ID3_TAG_FLAG_KNOWNFLAGS;
extendedflags = tag->extendedflags & ID3_TAG_EXTENDEDFLAG_KNOWNFLAGS;
extendedflags &= ~ID3_TAG_EXTENDEDFLAG_CRCDATAPRESENT;
if (tag->options & ID3_TAG_OPTION_CRC)
extendedflags |= ID3_TAG_EXTENDEDFLAG_CRCDATAPRESENT;
extendedflags &= ~ID3_TAG_EXTENDEDFLAG_TAGRESTRICTIONS;
if (tag->restrictions)
extendedflags |= ID3_TAG_EXTENDEDFLAG_TAGRESTRICTIONS;
flags &= ~ID3_TAG_FLAG_UNSYNCHRONISATION;
if (tag->options & ID3_TAG_OPTION_UNSYNCHRONISATION)
flags |= ID3_TAG_FLAG_UNSYNCHRONISATION;
flags &= ~ID3_TAG_FLAG_EXTENDEDHEADER;
if (extendedflags)
flags |= ID3_TAG_FLAG_EXTENDEDHEADER;
flags &= ~ID3_TAG_FLAG_FOOTERPRESENT;
if (tag->options & ID3_TAG_OPTION_APPENDEDTAG)
flags |= ID3_TAG_FLAG_FOOTERPRESENT;
/* header */
if (ptr)
header_ptr = *ptr;
size += id3_render_immediate(ptr, "ID3", 3);
size += id3_render_int(ptr, ID3_TAG_VERSION, 2);
size += id3_render_int(ptr, flags, 1);
if (ptr)
tagsize_ptr = *ptr;
size += id3_render_syncsafe(ptr, 0, 4);
/* extended header */
if (flags & ID3_TAG_FLAG_EXTENDEDHEADER) {
id3_length_t ehsize = 0;
id3_byte_t *ehsize_ptr = 0;
if (ptr)
ehsize_ptr = *ptr;
ehsize += id3_render_syncsafe(ptr, 0, 4);
ehsize += id3_render_int(ptr, 1, 1);
ehsize += id3_render_int(ptr, extendedflags, 1);
if (extendedflags & ID3_TAG_EXTENDEDFLAG_TAGISANUPDATE)
ehsize += id3_render_int(ptr, 0, 1);
if (extendedflags & ID3_TAG_EXTENDEDFLAG_CRCDATAPRESENT) {
ehsize += id3_render_int(ptr, 5, 1);
if (ptr)
crc_ptr = *ptr;
ehsize += id3_render_syncsafe(ptr, 0, 5);
}
if (extendedflags & ID3_TAG_EXTENDEDFLAG_TAGRESTRICTIONS) {
ehsize += id3_render_int(ptr, 1, 1);
ehsize += id3_render_int(ptr, tag->restrictions, 1);
}
if (ehsize_ptr)
id3_render_syncsafe(&ehsize_ptr, ehsize, 4);
size += ehsize;
}
/* frames */
if (ptr)
frames_ptr = *ptr;
for (i = 0; i < tag->nframes; ++i)
size += id3_frame_render(tag->frames[i], ptr, tag->options);
/* padding */
if (!(flags & ID3_TAG_FLAG_FOOTERPRESENT)) {
if (size < tag->paddedsize)
size += id3_render_padding(ptr, 0, tag->paddedsize - size);
else if (tag->options & ID3_TAG_OPTION_UNSYNCHRONISATION) {
if (ptr == 0)
size += 1;
else {
if ((*ptr)[-1] == 0xff)
size += id3_render_padding(ptr, 0, 1);
}
}
}
/* patch tag size and CRC */
if (tagsize_ptr)
id3_render_syncsafe(&tagsize_ptr, size - 10, 4);
if (crc_ptr) {
id3_render_syncsafe(&crc_ptr,
id3_crc_compute(frames_ptr, *ptr - frames_ptr), 5);
}
/* footer */
if (flags & ID3_TAG_FLAG_FOOTERPRESENT) {
size += id3_render_immediate(ptr, "3DI", 3);
size += id3_render_binary(ptr, header_ptr + 3, 7);
}
return size;
}

View File

@ -0,0 +1,30 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: tag.h,v 1.10 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_TAG_H
# define LIBID3TAG_TAG_H
# include "id3tag.h"
void id3_tag_addref(struct id3_tag *);
void id3_tag_delref(struct id3_tag *);
# endif

View File

@ -0,0 +1,224 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: ucs4.c,v 1.13 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include "id3tag.h"
# include "ucs4.h"
# include "latin1.h"
# include "utf16.h"
# include "utf8.h"
id3_ucs4_t const id3_ucs4_empty[] = { 0 };
/*
* NAME: ucs4->length()
* DESCRIPTION: return the number of ucs4 chars represented by a ucs4 string
*/
id3_length_t id3_ucs4_length(id3_ucs4_t const *ucs4)
{
id3_ucs4_t const *ptr = ucs4;
while (*ptr)
++ptr;
return ptr - ucs4;
}
/*
* NAME: ucs4->size()
* DESCRIPTION: return the encoding size of a ucs4 string
*/
id3_length_t id3_ucs4_size(id3_ucs4_t const *ucs4)
{
return id3_ucs4_length(ucs4) + 1;
}
/*
* NAME: ucs4->latin1size()
* DESCRIPTION: return the encoding size of a latin1-encoded ucs4 string
*/
id3_length_t id3_ucs4_latin1size(id3_ucs4_t const *ucs4)
{
return id3_ucs4_size(ucs4);
}
/*
* NAME: ucs4->utf16size()
* DESCRIPTION: return the encoding size of a utf16-encoded ucs4 string
*/
id3_length_t id3_ucs4_utf16size(id3_ucs4_t const *ucs4)
{
id3_length_t size = 0;
while (*ucs4) {
++size;
if (*ucs4 >= 0x00010000L &&
*ucs4 <= 0x0010ffffL)
++size;
++ucs4;
}
return size + 1;
}
/*
* NAME: ucs4->utf8size()
* DESCRIPTION: return the encoding size of a utf8-encoded ucs4 string
*/
id3_length_t id3_ucs4_utf8size(id3_ucs4_t const *ucs4)
{
id3_length_t size = 0;
while (*ucs4) {
if (*ucs4 <= 0x0000007fL)
size += 1;
else if (*ucs4 <= 0x000007ffL)
size += 2;
else if (*ucs4 <= 0x0000ffffL)
size += 3;
else if (*ucs4 <= 0x001fffffL)
size += 4;
else if (*ucs4 <= 0x03ffffffL)
size += 5;
else if (*ucs4 <= 0x7fffffffL)
size += 6;
else
size += 2; /* based on U+00B7 replacement char */
++ucs4;
}
return size + 1;
}
/*
* NAME: ucs4->latin1duplicate()
* DESCRIPTION: duplicate and encode a ucs4 string into latin1
*/
id3_latin1_t *id3_ucs4_latin1duplicate(id3_ucs4_t const *ucs4)
{
id3_latin1_t *latin1;
latin1 = malloc(id3_ucs4_latin1size(ucs4) * sizeof(*latin1));
if (latin1)
id3_latin1_encode(latin1, ucs4);
return release(latin1);
}
/*
* NAME: ucs4->utf16duplicate()
* DESCRIPTION: duplicate and encode a ucs4 string into utf16
*/
id3_utf16_t *id3_ucs4_utf16duplicate(id3_ucs4_t const *ucs4)
{
id3_utf16_t *utf16;
utf16 = malloc(id3_ucs4_utf16size(ucs4) * sizeof(*utf16));
if (utf16)
id3_utf16_encode(utf16, ucs4);
return release(utf16);
}
/*
* NAME: ucs4->utf8duplicate()
* DESCRIPTION: duplicate and encode a ucs4 string into utf8
*/
id3_utf8_t *id3_ucs4_utf8duplicate(id3_ucs4_t const *ucs4)
{
id3_utf8_t *utf8;
utf8 = malloc(id3_ucs4_utf8size(ucs4) * sizeof(*utf8));
if (utf8)
id3_utf8_encode(utf8, ucs4);
return release(utf8);
}
/*
* NAME: ucs4->copy()
* DESCRIPTION: copy a ucs4 string
*/
void id3_ucs4_copy(id3_ucs4_t *dest, id3_ucs4_t const *src)
{
while ((*dest++ = *src++))
;
}
/*
* NAME: ucs4->duplicate()
* DESCRIPTION: duplicate a ucs4 string
*/
id3_ucs4_t *id3_ucs4_duplicate(id3_ucs4_t const *src)
{
id3_ucs4_t *ucs4;
ucs4 = malloc(id3_ucs4_size(src) * sizeof(*ucs4));
if (ucs4)
id3_ucs4_copy(ucs4, src);
return ucs4;
}
/*
* NAME: ucs4->putnumber()
* DESCRIPTION: write a ucs4 string containing a (positive) decimal number
*/
void id3_ucs4_putnumber(id3_ucs4_t *ucs4, unsigned long number)
{
int digits[10], *digit;
digit = digits;
do {
*digit++ = number % 10;
number /= 10;
}
while (number);
while (digit != digits)
*ucs4++ = '0' + *--digit;
*ucs4 = 0;
}
/*
* NAME: ucs4->getnumber()
* DESCRIPTION: read a ucs4 string containing a (positive) decimal number
*/
unsigned long id3_ucs4_getnumber(id3_ucs4_t const *ucs4)
{
unsigned long number = 0;
while (*ucs4 >= '0' && *ucs4 <= '9')
number = 10 * number + (*ucs4++ - '0');
return number;
}

View File

@ -0,0 +1,41 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: ucs4.h,v 1.11 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_UCS4_H
# define LIBID3TAG_UCS4_H
# include "id3tag.h"
# define ID3_UCS4_REPLACEMENTCHAR 0x000000b7L /* middle dot */
extern id3_ucs4_t const id3_ucs4_empty[];
id3_length_t id3_ucs4_length(id3_ucs4_t const *);
id3_length_t id3_ucs4_size(id3_ucs4_t const *);
id3_length_t id3_ucs4_latin1size(id3_ucs4_t const *);
id3_length_t id3_ucs4_utf16size(id3_ucs4_t const *);
id3_length_t id3_ucs4_utf8size(id3_ucs4_t const *);
void id3_ucs4_copy(id3_ucs4_t *, id3_ucs4_t const *);
id3_ucs4_t *id3_ucs4_duplicate(id3_ucs4_t const *);
# endif

View File

@ -0,0 +1,286 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: utf16.c,v 1.9 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include "id3tag.h"
# include "utf16.h"
# include "ucs4.h"
/*
* NAME: utf16->length()
* DESCRIPTION: return the number of ucs4 chars represented by a utf16 string
*/
id3_length_t id3_utf16_length(id3_utf16_t const *utf16)
{
id3_length_t length = 0;
while (*utf16) {
if (utf16[0] < 0xd800 || utf16[0] > 0xdfff)
++length;
else if (utf16[0] >= 0xd800 && utf16[0] <= 0xdbff &&
utf16[1] >= 0xdc00 && utf16[1] <= 0xdfff) {
++length;
++utf16;
}
++utf16;
}
return length;
}
/*
* NAME: utf16->size()
* DESCRIPTION: return the encoding size of a utf16 string
*/
id3_length_t id3_utf16_size(id3_utf16_t const *utf16)
{
id3_utf16_t const *ptr = utf16;
while (*ptr)
++ptr;
return ptr - utf16 + 1;
}
/*
* NAME: utf16->ucs4duplicate()
* DESCRIPTION: duplicate and decode a utf16 string into ucs4
*/
id3_ucs4_t *id3_utf16_ucs4duplicate(id3_utf16_t const *utf16)
{
id3_ucs4_t *ucs4;
ucs4 = malloc((id3_utf16_length(utf16) + 1) * sizeof(*ucs4));
if (ucs4)
id3_utf16_decode(utf16, ucs4);
return release(ucs4);
}
/*
* NAME: utf16->decodechar()
* DESCRIPTION: decode a series of utf16 chars into a single ucs4 char
*/
id3_length_t id3_utf16_decodechar(id3_utf16_t const *utf16, id3_ucs4_t *ucs4)
{
id3_utf16_t const *start = utf16;
while (1) {
if (utf16[0] < 0xd800 || utf16[0] > 0xdfff) {
*ucs4 = utf16[0];
return utf16 - start + 1;
}
else if (utf16[0] >= 0xd800 && utf16[0] <= 0xdbff &&
utf16[1] >= 0xdc00 && utf16[1] <= 0xdfff) {
*ucs4 = (((utf16[0] & 0x03ffL) << 10) |
((utf16[1] & 0x03ffL) << 0)) + 0x00010000L;
return utf16 - start + 2;
}
++utf16;
}
}
/*
* NAME: utf16->encodechar()
* DESCRIPTION: encode a single ucs4 char into a series of up to 2 utf16 chars
*/
id3_length_t id3_utf16_encodechar(id3_utf16_t *utf16, id3_ucs4_t ucs4)
{
if (ucs4 < 0x00010000L) {
utf16[0] = ucs4;
return 1;
}
else if (ucs4 < 0x00110000L) {
ucs4 -= 0x00010000L;
utf16[0] = ((ucs4 >> 10) & 0x3ff) | 0xd800;
utf16[1] = ((ucs4 >> 0) & 0x3ff) | 0xdc00;
return 2;
}
/* default */
return id3_utf16_encodechar(utf16, ID3_UCS4_REPLACEMENTCHAR);
}
/*
* NAME: utf16->decode()
* DESCRIPTION: decode a complete utf16 string into a ucs4 string
*/
void id3_utf16_decode(id3_utf16_t const *utf16, id3_ucs4_t *ucs4)
{
do
utf16 += id3_utf16_decodechar(utf16, ucs4);
while (*ucs4++);
}
/*
* NAME: utf16->encode()
* DESCRIPTION: encode a complete ucs4 string into a utf16 string
*/
void id3_utf16_encode(id3_utf16_t *utf16, id3_ucs4_t const *ucs4)
{
do
utf16 += id3_utf16_encodechar(utf16, *ucs4);
while (*ucs4++);
}
/*
* NAME: utf16->put()
* DESCRIPTION: serialize a single utf16 character
*/
id3_length_t id3_utf16_put(id3_byte_t **ptr, id3_utf16_t utf16,
enum id3_utf16_byteorder byteorder)
{
if (ptr) {
switch (byteorder) {
default:
case ID3_UTF16_BYTEORDER_BE:
(*ptr)[0] = (utf16 >> 8) & 0xff;
(*ptr)[1] = (utf16 >> 0) & 0xff;
break;
case ID3_UTF16_BYTEORDER_LE:
(*ptr)[0] = (utf16 >> 0) & 0xff;
(*ptr)[1] = (utf16 >> 8) & 0xff;
break;
}
*ptr += 2;
}
return 2;
}
/*
* NAME: utf16->get()
* DESCRIPTION: deserialize a single utf16 character
*/
id3_utf16_t id3_utf16_get(id3_byte_t const **ptr,
enum id3_utf16_byteorder byteorder)
{
id3_utf16_t utf16;
switch (byteorder) {
default:
case ID3_UTF16_BYTEORDER_BE:
utf16 =
((*ptr)[0] << 8) |
((*ptr)[1] << 0);
break;
case ID3_UTF16_BYTEORDER_LE:
utf16 =
((*ptr)[0] << 0) |
((*ptr)[1] << 8);
break;
}
*ptr += 2;
return utf16;
}
/*
* NAME: utf16->serialize()
* DESCRIPTION: serialize a ucs4 string using utf16 encoding
*/
id3_length_t id3_utf16_serialize(id3_byte_t **ptr, id3_ucs4_t const *ucs4,
enum id3_utf16_byteorder byteorder,
int terminate)
{
id3_length_t size = 0;
id3_utf16_t utf16[2], *out;
if (byteorder == ID3_UTF16_BYTEORDER_ANY)
size += id3_utf16_put(ptr, 0xfeff, byteorder);
while (*ucs4) {
switch (id3_utf16_encodechar(out = utf16, *ucs4++)) {
case 2: size += id3_utf16_put(ptr, *out++, byteorder);
case 1: size += id3_utf16_put(ptr, *out++, byteorder);
case 0: break;
}
}
if (terminate)
size += id3_utf16_put(ptr, 0, byteorder);
return size;
}
/*
* NAME: utf16->deserialize()
* DESCRIPTION: deserialize a ucs4 string using utf16 encoding
*/
id3_ucs4_t *id3_utf16_deserialize(id3_byte_t const **ptr, id3_length_t length,
enum id3_utf16_byteorder byteorder)
{
id3_byte_t const *end;
id3_utf16_t *utf16ptr, *utf16;
id3_ucs4_t *ucs4;
end = *ptr + (length & ~1);
utf16 = malloc((length / 2 + 1) * sizeof(*utf16));
if (utf16 == 0)
return 0;
if (byteorder == ID3_UTF16_BYTEORDER_ANY && end - *ptr > 0) {
switch (((*ptr)[0] << 8) |
((*ptr)[1] << 0)) {
case 0xfeff:
byteorder = ID3_UTF16_BYTEORDER_BE;
*ptr += 2;
break;
case 0xfffe:
byteorder = ID3_UTF16_BYTEORDER_LE;
*ptr += 2;
break;
}
}
utf16ptr = utf16;
while (end - *ptr > 0 && (*utf16ptr = id3_utf16_get(ptr, byteorder)))
++utf16ptr;
*utf16ptr = 0;
ucs4 = malloc((id3_utf16_length(utf16) + 1) * sizeof(*ucs4));
if (ucs4)
id3_utf16_decode(utf16, ucs4);
free(utf16);
return ucs4;
}

View File

@ -0,0 +1,51 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: utf16.h,v 1.8 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_UTF16_H
# define LIBID3TAG_UTF16_H
# include "id3tag.h"
enum id3_utf16_byteorder {
ID3_UTF16_BYTEORDER_ANY,
ID3_UTF16_BYTEORDER_BE,
ID3_UTF16_BYTEORDER_LE
};
id3_length_t id3_utf16_length(id3_utf16_t const *);
id3_length_t id3_utf16_size(id3_utf16_t const *);
id3_length_t id3_utf16_decodechar(id3_utf16_t const *, id3_ucs4_t *);
id3_length_t id3_utf16_encodechar(id3_utf16_t *, id3_ucs4_t);
void id3_utf16_decode(id3_utf16_t const *, id3_ucs4_t *);
void id3_utf16_encode(id3_utf16_t *, id3_ucs4_t const *);
id3_length_t id3_utf16_put(id3_byte_t **, id3_utf16_t,
enum id3_utf16_byteorder);
id3_utf16_t id3_utf16_get(id3_byte_t const **, enum id3_utf16_byteorder);
id3_length_t id3_utf16_serialize(id3_byte_t **, id3_ucs4_t const *,
enum id3_utf16_byteorder, int);
id3_ucs4_t *id3_utf16_deserialize(id3_byte_t const **, id3_length_t,
enum id3_utf16_byteorder);
# endif

View File

@ -0,0 +1,365 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: utf8.c,v 1.9 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include "id3tag.h"
# include "utf8.h"
# include "ucs4.h"
/*
* NAME: utf8->length()
* DESCRIPTION: return the number of ucs4 chars represented by a utf8 string
*/
id3_length_t id3_utf8_length(id3_utf8_t const *utf8)
{
id3_length_t length = 0;
while (*utf8) {
if ((utf8[0] & 0x80) == 0x00)
++length;
else if ((utf8[0] & 0xe0) == 0xc0 &&
(utf8[1] & 0xc0) == 0x80) {
if (((utf8[0] & 0x1fL) << 6) >= 0x00000080L) {
++length;
utf8 += 1;
}
}
else if ((utf8[0] & 0xf0) == 0xe0 &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80) {
if ((((utf8[0] & 0x0fL) << 12) |
((utf8[1] & 0x3fL) << 6)) >= 0x00000800L) {
++length;
utf8 += 2;
}
}
else if ((utf8[0] & 0xf8) == 0xf0 &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80 &&
(utf8[3] & 0xc0) == 0x80) {
if ((((utf8[0] & 0x07L) << 18) |
((utf8[1] & 0x3fL) << 12)) >= 0x00010000L) {
++length;
utf8 += 3;
}
}
else if ((utf8[0] & 0xfc) == 0xf8 &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80 &&
(utf8[3] & 0xc0) == 0x80 &&
(utf8[4] & 0xc0) == 0x80) {
if ((((utf8[0] & 0x03L) << 24) |
((utf8[0] & 0x3fL) << 18)) >= 0x00200000L) {
++length;
utf8 += 4;
}
}
else if ((utf8[0] & 0xfe) == 0xfc &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80 &&
(utf8[3] & 0xc0) == 0x80 &&
(utf8[4] & 0xc0) == 0x80 &&
(utf8[5] & 0xc0) == 0x80) {
if ((((utf8[0] & 0x01L) << 30) |
((utf8[0] & 0x3fL) << 24)) >= 0x04000000L) {
++length;
utf8 += 5;
}
}
++utf8;
}
return length;
}
/*
* NAME: utf8->size()
* DESCRIPTION: return the encoding size of a utf8 string
*/
id3_length_t id3_utf8_size(id3_utf8_t const *utf8)
{
id3_utf8_t const *ptr = utf8;
while (*ptr)
++ptr;
return ptr - utf8 + 1;
}
/*
* NAME: utf8->ucs4duplicate()
* DESCRIPTION: duplicate and decode a utf8 string into ucs4
*/
id3_ucs4_t *id3_utf8_ucs4duplicate(id3_utf8_t const *utf8)
{
id3_ucs4_t *ucs4;
ucs4 = malloc((id3_utf8_length(utf8) + 1) * sizeof(*ucs4));
if (ucs4)
id3_utf8_decode(utf8, ucs4);
return release(ucs4);
}
/*
* NAME: utf8->decodechar()
* DESCRIPTION: decode a series of utf8 chars into a single ucs4 char
*/
id3_length_t id3_utf8_decodechar(id3_utf8_t const *utf8, id3_ucs4_t *ucs4)
{
id3_utf8_t const *start = utf8;
while (1) {
if ((utf8[0] & 0x80) == 0x00) {
*ucs4 = utf8[0];
return utf8 - start + 1;
}
else if ((utf8[0] & 0xe0) == 0xc0 &&
(utf8[1] & 0xc0) == 0x80) {
*ucs4 =
((utf8[0] & 0x1fL) << 6) |
((utf8[1] & 0x3fL) << 0);
if (*ucs4 >= 0x00000080L)
return utf8 - start + 2;
}
else if ((utf8[0] & 0xf0) == 0xe0 &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80) {
*ucs4 =
((utf8[0] & 0x0fL) << 12) |
((utf8[1] & 0x3fL) << 6) |
((utf8[2] & 0x3fL) << 0);
if (*ucs4 >= 0x00000800L)
return utf8 - start + 3;
}
else if ((utf8[0] & 0xf8) == 0xf0 &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80 &&
(utf8[3] & 0xc0) == 0x80) {
*ucs4 =
((utf8[0] & 0x07L) << 18) |
((utf8[1] & 0x3fL) << 12) |
((utf8[2] & 0x3fL) << 6) |
((utf8[3] & 0x3fL) << 0);
if (*ucs4 >= 0x00010000L)
return utf8 - start + 4;
}
else if ((utf8[0] & 0xfc) == 0xf8 &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80 &&
(utf8[3] & 0xc0) == 0x80 &&
(utf8[4] & 0xc0) == 0x80) {
*ucs4 =
((utf8[0] & 0x03L) << 24) |
((utf8[1] & 0x3fL) << 18) |
((utf8[2] & 0x3fL) << 12) |
((utf8[3] & 0x3fL) << 6) |
((utf8[4] & 0x3fL) << 0);
if (*ucs4 >= 0x00200000L)
return utf8 - start + 5;
}
else if ((utf8[0] & 0xfe) == 0xfc &&
(utf8[1] & 0xc0) == 0x80 &&
(utf8[2] & 0xc0) == 0x80 &&
(utf8[3] & 0xc0) == 0x80 &&
(utf8[4] & 0xc0) == 0x80 &&
(utf8[5] & 0xc0) == 0x80) {
*ucs4 =
((utf8[0] & 0x01L) << 30) |
((utf8[1] & 0x3fL) << 24) |
((utf8[2] & 0x3fL) << 18) |
((utf8[3] & 0x3fL) << 12) |
((utf8[4] & 0x3fL) << 6) |
((utf8[5] & 0x3fL) << 0);
if (*ucs4 >= 0x04000000L)
return utf8 - start + 6;
}
++utf8;
}
}
/*
* NAME: utf8->encodechar()
* DESCRIPTION: encode a single ucs4 char into a series of up to 6 utf8 chars
*/
id3_length_t id3_utf8_encodechar(id3_utf8_t *utf8, id3_ucs4_t ucs4)
{
if (ucs4 <= 0x0000007fL) {
utf8[0] = ucs4;
return 1;
}
else if (ucs4 <= 0x000007ffL) {
utf8[0] = 0xc0 | ((ucs4 >> 6) & 0x1f);
utf8[1] = 0x80 | ((ucs4 >> 0) & 0x3f);
return 2;
}
else if (ucs4 <= 0x0000ffffL) {
utf8[0] = 0xe0 | ((ucs4 >> 12) & 0x0f);
utf8[1] = 0x80 | ((ucs4 >> 6) & 0x3f);
utf8[2] = 0x80 | ((ucs4 >> 0) & 0x3f);
return 3;
}
else if (ucs4 <= 0x001fffffL) {
utf8[0] = 0xf0 | ((ucs4 >> 18) & 0x07);
utf8[1] = 0x80 | ((ucs4 >> 12) & 0x3f);
utf8[2] = 0x80 | ((ucs4 >> 6) & 0x3f);
utf8[3] = 0x80 | ((ucs4 >> 0) & 0x3f);
return 4;
}
else if (ucs4 <= 0x03ffffffL) {
utf8[0] = 0xf8 | ((ucs4 >> 24) & 0x03);
utf8[1] = 0x80 | ((ucs4 >> 18) & 0x3f);
utf8[2] = 0x80 | ((ucs4 >> 12) & 0x3f);
utf8[3] = 0x80 | ((ucs4 >> 6) & 0x3f);
utf8[4] = 0x80 | ((ucs4 >> 0) & 0x3f);
return 5;
}
else if (ucs4 <= 0x7fffffffL) {
utf8[0] = 0xfc | ((ucs4 >> 30) & 0x01);
utf8[1] = 0x80 | ((ucs4 >> 24) & 0x3f);
utf8[2] = 0x80 | ((ucs4 >> 18) & 0x3f);
utf8[3] = 0x80 | ((ucs4 >> 12) & 0x3f);
utf8[4] = 0x80 | ((ucs4 >> 6) & 0x3f);
utf8[5] = 0x80 | ((ucs4 >> 0) & 0x3f);
return 6;
}
/* default */
return id3_utf8_encodechar(utf8, ID3_UCS4_REPLACEMENTCHAR);
}
/*
* NAME: utf8->decode()
* DESCRIPTION: decode a complete utf8 string into a ucs4 string
*/
void id3_utf8_decode(id3_utf8_t const *utf8, id3_ucs4_t *ucs4)
{
do
utf8 += id3_utf8_decodechar(utf8, ucs4);
while (*ucs4++);
}
/*
* NAME: utf8->encode()
* DESCRIPTION: encode a complete ucs4 string into a utf8 string
*/
void id3_utf8_encode(id3_utf8_t *utf8, id3_ucs4_t const *ucs4)
{
do
utf8 += id3_utf8_encodechar(utf8, *ucs4);
while (*ucs4++);
}
/*
* NAME: utf8->put()
* DESCRIPTION: serialize a single utf8 character
*/
id3_length_t id3_utf8_put(id3_byte_t **ptr, id3_utf8_t utf8)
{
if (ptr)
*(*ptr)++ = utf8;
return 1;
}
/*
* NAME: utf8->get()
* DESCRIPTION: deserialize a single utf8 character
*/
id3_utf8_t id3_utf8_get(id3_byte_t const **ptr)
{
return *(*ptr)++;
}
/*
* NAME: utf8->serialize()
* DESCRIPTION: serialize a ucs4 string using utf8 encoding
*/
id3_length_t id3_utf8_serialize(id3_byte_t **ptr, id3_ucs4_t const *ucs4,
int terminate)
{
id3_length_t size = 0;
id3_utf8_t utf8[6], *out;
while (*ucs4) {
switch (id3_utf8_encodechar(out = utf8, *ucs4++)) {
case 6: size += id3_utf8_put(ptr, *out++);
case 5: size += id3_utf8_put(ptr, *out++);
case 4: size += id3_utf8_put(ptr, *out++);
case 3: size += id3_utf8_put(ptr, *out++);
case 2: size += id3_utf8_put(ptr, *out++);
case 1: size += id3_utf8_put(ptr, *out++);
case 0: break;
}
}
if (terminate)
size += id3_utf8_put(ptr, 0);
return size;
}
/*
* NAME: utf8->deserialize()
* DESCRIPTION: deserialize a ucs4 string using utf8 encoding
*/
id3_ucs4_t *id3_utf8_deserialize(id3_byte_t const **ptr, id3_length_t length)
{
id3_byte_t const *end;
id3_utf8_t *utf8ptr, *utf8;
id3_ucs4_t *ucs4;
end = *ptr + length;
utf8 = malloc((length + 1) * sizeof(*utf8));
if (utf8 == 0)
return 0;
utf8ptr = utf8;
while (end - *ptr > 0 && (*utf8ptr = id3_utf8_get(ptr)))
++utf8ptr;
*utf8ptr = 0;
ucs4 = malloc((id3_utf8_length(utf8) + 1) * sizeof(*ucs4));
if (ucs4)
id3_utf8_decode(utf8, ucs4);
free(utf8);
return ucs4;
}

View File

@ -0,0 +1,42 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: utf8.h,v 1.7 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_UTF8_H
# define LIBID3TAG_UTF8_H
# include "id3tag.h"
id3_length_t id3_utf8_length(id3_utf8_t const *);
id3_length_t id3_utf8_size(id3_utf8_t const *);
id3_length_t id3_utf8_decodechar(id3_utf8_t const *, id3_ucs4_t *);
id3_length_t id3_utf8_encodechar(id3_utf8_t *, id3_ucs4_t);
void id3_utf8_decode(id3_utf8_t const *, id3_ucs4_t *);
void id3_utf8_encode(id3_utf8_t *, id3_ucs4_t const *);
id3_length_t id3_utf8_put(id3_byte_t **, id3_utf8_t);
id3_utf8_t id3_utf8_get(id3_byte_t const **);
id3_length_t id3_utf8_serialize(id3_byte_t **, id3_ucs4_t const *, int);
id3_ucs4_t *id3_utf8_deserialize(id3_byte_t const **, id3_length_t);
# endif

View File

@ -0,0 +1,147 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: util.c,v 1.9 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include <stdlib.h>
# include <zlib.h>
# include "id3tag.h"
# include "util.h"
/*
* NAME: util->unsynchronise()
* DESCRIPTION: perform (in-place) unsynchronisation
*/
id3_length_t id3_util_unsynchronise(id3_byte_t *data, id3_length_t length)
{
id3_length_t bytes = 0, count;
id3_byte_t *end = data + length;
id3_byte_t const *ptr;
if (length == 0)
return 0;
for (ptr = data; ptr < end - 1; ++ptr) {
if (ptr[0] == 0xff && (ptr[1] == 0x00 || (ptr[1] & 0xe0) == 0xe0))
++bytes;
}
if (bytes) {
ptr = end;
end += bytes;
*--end = *--ptr;
for (count = bytes; count; *--end = *--ptr) {
if (ptr[-1] == 0xff && (ptr[0] == 0x00 || (ptr[0] & 0xe0) == 0xe0)) {
*--end = 0x00;
--count;
}
}
}
return length + bytes;
}
/*
* NAME: util->deunsynchronise()
* DESCRIPTION: undo unsynchronisation (in-place)
*/
id3_length_t id3_util_deunsynchronise(id3_byte_t *data, id3_length_t length)
{
id3_byte_t const *old, *end = data + length;
id3_byte_t *new;
if (length == 0)
return 0;
for (old = new = data; old < end - 1; ++old) {
*new++ = *old;
if (old[0] == 0xff && old[1] == 0x00)
++old;
}
*new++ = *old;
return new - data;
}
/*
* NAME: util->compress()
* DESCRIPTION: perform zlib deflate method compression
*/
id3_byte_t *id3_util_compress(id3_byte_t const *data, id3_length_t length,
id3_length_t *newlength)
{
id3_byte_t *compressed;
*newlength = length + 12;
*newlength += *newlength / 1000;
compressed = malloc(*newlength);
if (compressed) {
if (compress2(compressed, newlength, data, length,
Z_BEST_COMPRESSION) != Z_OK ||
*newlength >= length) {
free(compressed);
compressed = 0;
}
else {
id3_byte_t *resized;
resized = realloc(compressed, *newlength ? *newlength : 1);
if (resized)
compressed = resized;
}
}
return compressed;
}
/*
* NAME: util->decompress()
* DESCRIPTION: undo zlib deflate method compression
*/
id3_byte_t *id3_util_decompress(id3_byte_t const *data, id3_length_t length,
id3_length_t newlength)
{
id3_byte_t *decompressed;
decompressed = malloc(newlength ? newlength : 1);
if (decompressed) {
id3_length_t size;
size = newlength;
if (uncompress(decompressed, &size, data, length) != Z_OK ||
size != newlength) {
free(decompressed);
decompressed = 0;
}
}
return decompressed;
}

View File

@ -0,0 +1,35 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: util.h,v 1.6 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_UTIL_H
# define LIBID3TAG_UTIL_H
# include "id3tag.h"
id3_length_t id3_util_unsynchronise(id3_byte_t *, id3_length_t);
id3_length_t id3_util_deunsynchronise(id3_byte_t *, id3_length_t);
id3_byte_t *id3_util_compress(id3_byte_t const *, id3_length_t,
id3_length_t *);
id3_byte_t *id3_util_decompress(id3_byte_t const *, id3_length_t,
id3_length_t);
# endif

View File

@ -0,0 +1,45 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: version.c,v 1.7 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# include "id3tag.h"
# include "version.h"
char const id3_version[] = "ID3 Tag Library " ID3_VERSION;
char const id3_copyright[] = "Copyright (C) " ID3_PUBLISHYEAR " " ID3_AUTHOR;
char const id3_author[] = ID3_AUTHOR " <" ID3_EMAIL ">";
char const id3_build[] = ""
# if defined(DEBUG)
"DEBUG "
# elif defined(NDEBUG)
"NDEBUG "
# endif
# if defined(EXPERIMENTAL)
"EXPERIMENTAL "
# endif
;

View File

@ -0,0 +1,25 @@
/*
* libid3tag - ID3 tag manipulation library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: version.h,v 1.7 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBID3TAG_VERSION_H
# define LIBID3TAG_VERSION_H
# endif

View File

@ -0,0 +1,402 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 42;
objects = {
/* Begin PBXBuildFile section */
8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; };
8E53E7F30A44C045007E5BCE /* compat.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7CF0A44C045007E5BCE /* compat.c */; };
8E53E7F40A44C045007E5BCE /* compat.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7D00A44C045007E5BCE /* compat.h */; };
8E53E7F50A44C045007E5BCE /* crc.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7D10A44C045007E5BCE /* crc.c */; };
8E53E7F60A44C045007E5BCE /* crc.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7D20A44C045007E5BCE /* crc.h */; };
8E53E7F70A44C045007E5BCE /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7D30A44C045007E5BCE /* debug.c */; };
8E53E7F80A44C045007E5BCE /* debug.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7D40A44C045007E5BCE /* debug.h */; };
8E53E7F90A44C045007E5BCE /* field.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7D50A44C045007E5BCE /* field.c */; };
8E53E7FA0A44C045007E5BCE /* field.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7D60A44C045007E5BCE /* field.h */; };
8E53E7FB0A44C045007E5BCE /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7D70A44C045007E5BCE /* file.c */; };
8E53E7FC0A44C045007E5BCE /* file.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7D80A44C045007E5BCE /* file.h */; };
8E53E7FD0A44C045007E5BCE /* frame.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7D90A44C045007E5BCE /* frame.c */; };
8E53E7FE0A44C045007E5BCE /* frame.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7DA0A44C045007E5BCE /* frame.h */; };
8E53E7FF0A44C045007E5BCE /* frametype.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7DB0A44C045007E5BCE /* frametype.c */; };
8E53E8000A44C045007E5BCE /* frametype.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7DC0A44C045007E5BCE /* frametype.h */; };
8E53E8010A44C045007E5BCE /* genre.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7DD0A44C045007E5BCE /* genre.c */; };
8E53E8020A44C045007E5BCE /* genre.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7DE0A44C045007E5BCE /* genre.h */; };
8E53E8030A44C045007E5BCE /* global.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7DF0A44C045007E5BCE /* global.h */; };
8E53E8040A44C045007E5BCE /* id3tag.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7E00A44C045007E5BCE /* id3tag.h */; settings = {ATTRIBUTES = (Public, ); }; };
8E53E8050A44C045007E5BCE /* latin1.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7E10A44C045007E5BCE /* latin1.c */; };
8E53E8060A44C045007E5BCE /* latin1.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7E20A44C045007E5BCE /* latin1.h */; };
8E53E8070A44C045007E5BCE /* parse.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7E30A44C045007E5BCE /* parse.c */; };
8E53E8080A44C045007E5BCE /* parse.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7E40A44C045007E5BCE /* parse.h */; };
8E53E8090A44C045007E5BCE /* render.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7E50A44C045007E5BCE /* render.c */; };
8E53E80A0A44C045007E5BCE /* render.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7E60A44C045007E5BCE /* render.h */; };
8E53E80B0A44C045007E5BCE /* tag.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7E70A44C045007E5BCE /* tag.c */; };
8E53E80C0A44C045007E5BCE /* tag.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7E80A44C045007E5BCE /* tag.h */; };
8E53E80D0A44C045007E5BCE /* ucs4.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7E90A44C045007E5BCE /* ucs4.c */; };
8E53E80E0A44C045007E5BCE /* ucs4.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7EA0A44C045007E5BCE /* ucs4.h */; };
8E53E80F0A44C045007E5BCE /* utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7EB0A44C045007E5BCE /* utf8.c */; };
8E53E8100A44C045007E5BCE /* utf8.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7EC0A44C045007E5BCE /* utf8.h */; };
8E53E8110A44C045007E5BCE /* utf16.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7ED0A44C045007E5BCE /* utf16.c */; };
8E53E8120A44C045007E5BCE /* utf16.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7EE0A44C045007E5BCE /* utf16.h */; };
8E53E8130A44C045007E5BCE /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7EF0A44C045007E5BCE /* util.c */; };
8E53E8140A44C045007E5BCE /* util.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7F00A44C045007E5BCE /* util.h */; };
8E53E8150A44C045007E5BCE /* version.c in Sources */ = {isa = PBXBuildFile; fileRef = 8E53E7F10A44C045007E5BCE /* version.c */; };
8E53E8160A44C045007E5BCE /* version.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E53E7F20A44C045007E5BCE /* version.h */; };
8E53E8260A44C09C007E5BCE /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 8E53E8250A44C09C007E5BCE /* libz.dylib */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
089C1667FE841158C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = "<group>"; };
8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D07F2C80486CC7A007CD1D0 /* ID3Tag.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ID3Tag.framework; sourceTree = BUILT_PRODUCTS_DIR; };
8E53E7CF0A44C045007E5BCE /* compat.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = compat.c; path = Files/compat.c; sourceTree = "<group>"; };
8E53E7D00A44C045007E5BCE /* compat.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = compat.h; path = Files/compat.h; sourceTree = "<group>"; };
8E53E7D10A44C045007E5BCE /* crc.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = crc.c; path = Files/crc.c; sourceTree = "<group>"; };
8E53E7D20A44C045007E5BCE /* crc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = crc.h; path = Files/crc.h; sourceTree = "<group>"; };
8E53E7D30A44C045007E5BCE /* debug.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = debug.c; path = Files/debug.c; sourceTree = "<group>"; };
8E53E7D40A44C045007E5BCE /* debug.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = debug.h; path = Files/debug.h; sourceTree = "<group>"; };
8E53E7D50A44C045007E5BCE /* field.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = field.c; path = Files/field.c; sourceTree = "<group>"; };
8E53E7D60A44C045007E5BCE /* field.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = field.h; path = Files/field.h; sourceTree = "<group>"; };
8E53E7D70A44C045007E5BCE /* file.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = file.c; path = Files/file.c; sourceTree = "<group>"; };
8E53E7D80A44C045007E5BCE /* file.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = file.h; path = Files/file.h; sourceTree = "<group>"; };
8E53E7D90A44C045007E5BCE /* frame.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = frame.c; path = Files/frame.c; sourceTree = "<group>"; };
8E53E7DA0A44C045007E5BCE /* frame.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = frame.h; path = Files/frame.h; sourceTree = "<group>"; };
8E53E7DB0A44C045007E5BCE /* frametype.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = frametype.c; path = Files/frametype.c; sourceTree = "<group>"; };
8E53E7DC0A44C045007E5BCE /* frametype.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = frametype.h; path = Files/frametype.h; sourceTree = "<group>"; };
8E53E7DD0A44C045007E5BCE /* genre.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = genre.c; path = Files/genre.c; sourceTree = "<group>"; };
8E53E7DE0A44C045007E5BCE /* genre.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = genre.h; path = Files/genre.h; sourceTree = "<group>"; };
8E53E7DF0A44C045007E5BCE /* global.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = global.h; path = Files/global.h; sourceTree = "<group>"; };
8E53E7E00A44C045007E5BCE /* id3tag.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = id3tag.h; path = Files/id3tag.h; sourceTree = "<group>"; };
8E53E7E10A44C045007E5BCE /* latin1.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = latin1.c; path = Files/latin1.c; sourceTree = "<group>"; };
8E53E7E20A44C045007E5BCE /* latin1.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = latin1.h; path = Files/latin1.h; sourceTree = "<group>"; };
8E53E7E30A44C045007E5BCE /* parse.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = parse.c; path = Files/parse.c; sourceTree = "<group>"; };
8E53E7E40A44C045007E5BCE /* parse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = parse.h; path = Files/parse.h; sourceTree = "<group>"; };
8E53E7E50A44C045007E5BCE /* render.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = render.c; path = Files/render.c; sourceTree = "<group>"; };
8E53E7E60A44C045007E5BCE /* render.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = render.h; path = Files/render.h; sourceTree = "<group>"; };
8E53E7E70A44C045007E5BCE /* tag.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = tag.c; path = Files/tag.c; sourceTree = "<group>"; };
8E53E7E80A44C045007E5BCE /* tag.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = tag.h; path = Files/tag.h; sourceTree = "<group>"; };
8E53E7E90A44C045007E5BCE /* ucs4.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ucs4.c; path = Files/ucs4.c; sourceTree = "<group>"; };
8E53E7EA0A44C045007E5BCE /* ucs4.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ucs4.h; path = Files/ucs4.h; sourceTree = "<group>"; };
8E53E7EB0A44C045007E5BCE /* utf8.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = utf8.c; path = Files/utf8.c; sourceTree = "<group>"; };
8E53E7EC0A44C045007E5BCE /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = utf8.h; path = Files/utf8.h; sourceTree = "<group>"; };
8E53E7ED0A44C045007E5BCE /* utf16.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = utf16.c; path = Files/utf16.c; sourceTree = "<group>"; };
8E53E7EE0A44C045007E5BCE /* utf16.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = utf16.h; path = Files/utf16.h; sourceTree = "<group>"; };
8E53E7EF0A44C045007E5BCE /* util.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = util.c; path = Files/util.c; sourceTree = "<group>"; };
8E53E7F00A44C045007E5BCE /* util.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = util.h; path = Files/util.h; sourceTree = "<group>"; };
8E53E7F10A44C045007E5BCE /* version.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = version.c; path = Files/version.c; sourceTree = "<group>"; };
8E53E7F20A44C045007E5BCE /* version.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = version.h; path = Files/version.h; sourceTree = "<group>"; };
8E53E8250A44C09C007E5BCE /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
8D07F2C30486CC7A007CD1D0 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
8E53E8260A44C09C007E5BCE /* libz.dylib in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
034768DDFF38A45A11DB9C8B /* Products */ = {
isa = PBXGroup;
children = (
8D07F2C80486CC7A007CD1D0 /* ID3Tag.framework */,
);
name = Products;
sourceTree = "<group>";
};
0867D691FE84028FC02AAC07 /* ID3Tag */ = {
isa = PBXGroup;
children = (
08FB77ACFE841707C02AAC07 /* Source */,
089C1665FE841158C02AAC07 /* Resources */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
034768DDFF38A45A11DB9C8B /* Products */,
);
name = ID3Tag;
sourceTree = "<group>";
};
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
isa = PBXGroup;
children = (
8E53E8250A44C09C007E5BCE /* libz.dylib */,
);
name = "External Frameworks and Libraries";
sourceTree = "<group>";
};
089C1665FE841158C02AAC07 /* Resources */ = {
isa = PBXGroup;
children = (
8D07F2C70486CC7A007CD1D0 /* Info.plist */,
089C1666FE841158C02AAC07 /* InfoPlist.strings */,
);
name = Resources;
sourceTree = "<group>";
};
08FB77ACFE841707C02AAC07 /* Source */ = {
isa = PBXGroup;
children = (
8E53E7CF0A44C045007E5BCE /* compat.c */,
8E53E7D00A44C045007E5BCE /* compat.h */,
8E53E7D10A44C045007E5BCE /* crc.c */,
8E53E7D20A44C045007E5BCE /* crc.h */,
8E53E7D30A44C045007E5BCE /* debug.c */,
8E53E7D40A44C045007E5BCE /* debug.h */,
8E53E7D50A44C045007E5BCE /* field.c */,
8E53E7D60A44C045007E5BCE /* field.h */,
8E53E7D70A44C045007E5BCE /* file.c */,
8E53E7D80A44C045007E5BCE /* file.h */,
8E53E7D90A44C045007E5BCE /* frame.c */,
8E53E7DA0A44C045007E5BCE /* frame.h */,
8E53E7DB0A44C045007E5BCE /* frametype.c */,
8E53E7DC0A44C045007E5BCE /* frametype.h */,
8E53E7DD0A44C045007E5BCE /* genre.c */,
8E53E7DE0A44C045007E5BCE /* genre.h */,
8E53E7DF0A44C045007E5BCE /* global.h */,
8E53E7E00A44C045007E5BCE /* id3tag.h */,
8E53E7E10A44C045007E5BCE /* latin1.c */,
8E53E7E20A44C045007E5BCE /* latin1.h */,
8E53E7E30A44C045007E5BCE /* parse.c */,
8E53E7E40A44C045007E5BCE /* parse.h */,
8E53E7E50A44C045007E5BCE /* render.c */,
8E53E7E60A44C045007E5BCE /* render.h */,
8E53E7E70A44C045007E5BCE /* tag.c */,
8E53E7E80A44C045007E5BCE /* tag.h */,
8E53E7E90A44C045007E5BCE /* ucs4.c */,
8E53E7EA0A44C045007E5BCE /* ucs4.h */,
8E53E7EB0A44C045007E5BCE /* utf8.c */,
8E53E7EC0A44C045007E5BCE /* utf8.h */,
8E53E7ED0A44C045007E5BCE /* utf16.c */,
8E53E7EE0A44C045007E5BCE /* utf16.h */,
8E53E7EF0A44C045007E5BCE /* util.c */,
8E53E7F00A44C045007E5BCE /* util.h */,
8E53E7F10A44C045007E5BCE /* version.c */,
8E53E7F20A44C045007E5BCE /* version.h */,
);
name = Source;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
8D07F2BD0486CC7A007CD1D0 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
8E53E7F40A44C045007E5BCE /* compat.h in Headers */,
8E53E7F60A44C045007E5BCE /* crc.h in Headers */,
8E53E7F80A44C045007E5BCE /* debug.h in Headers */,
8E53E7FA0A44C045007E5BCE /* field.h in Headers */,
8E53E7FC0A44C045007E5BCE /* file.h in Headers */,
8E53E7FE0A44C045007E5BCE /* frame.h in Headers */,
8E53E8000A44C045007E5BCE /* frametype.h in Headers */,
8E53E8020A44C045007E5BCE /* genre.h in Headers */,
8E53E8030A44C045007E5BCE /* global.h in Headers */,
8E53E8040A44C045007E5BCE /* id3tag.h in Headers */,
8E53E8060A44C045007E5BCE /* latin1.h in Headers */,
8E53E8080A44C045007E5BCE /* parse.h in Headers */,
8E53E80A0A44C045007E5BCE /* render.h in Headers */,
8E53E80C0A44C045007E5BCE /* tag.h in Headers */,
8E53E80E0A44C045007E5BCE /* ucs4.h in Headers */,
8E53E8100A44C045007E5BCE /* utf8.h in Headers */,
8E53E8120A44C045007E5BCE /* utf16.h in Headers */,
8E53E8140A44C045007E5BCE /* util.h in Headers */,
8E53E8160A44C045007E5BCE /* version.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
8D07F2BC0486CC7A007CD1D0 /* ID3Tag */ = {
isa = PBXNativeTarget;
buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "ID3Tag" */;
buildPhases = (
8D07F2BD0486CC7A007CD1D0 /* Headers */,
8D07F2BF0486CC7A007CD1D0 /* Resources */,
8D07F2C10486CC7A007CD1D0 /* Sources */,
8D07F2C30486CC7A007CD1D0 /* Frameworks */,
8D07F2C50486CC7A007CD1D0 /* Rez */,
);
buildRules = (
);
dependencies = (
);
name = ID3Tag;
productInstallPath = "$(HOME)/Library/Frameworks";
productName = ID3Tag;
productReference = 8D07F2C80486CC7A007CD1D0 /* ID3Tag.framework */;
productType = "com.apple.product-type.framework";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
0867D690FE84028FC02AAC07 /* Project object */ = {
isa = PBXProject;
buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "ID3Tag" */;
hasScannedForEncodings = 1;
mainGroup = 0867D691FE84028FC02AAC07 /* ID3Tag */;
productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
projectDirPath = "";
targets = (
8D07F2BC0486CC7A007CD1D0 /* ID3Tag */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
8D07F2BF0486CC7A007CD1D0 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8D07F2C00486CC7A007CD1D0 /* InfoPlist.strings in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXRezBuildPhase section */
8D07F2C50486CC7A007CD1D0 /* Rez */ = {
isa = PBXRezBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXRezBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
8D07F2C10486CC7A007CD1D0 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
8E53E7F30A44C045007E5BCE /* compat.c in Sources */,
8E53E7F50A44C045007E5BCE /* crc.c in Sources */,
8E53E7F70A44C045007E5BCE /* debug.c in Sources */,
8E53E7F90A44C045007E5BCE /* field.c in Sources */,
8E53E7FB0A44C045007E5BCE /* file.c in Sources */,
8E53E7FD0A44C045007E5BCE /* frame.c in Sources */,
8E53E7FF0A44C045007E5BCE /* frametype.c in Sources */,
8E53E8010A44C045007E5BCE /* genre.c in Sources */,
8E53E8050A44C045007E5BCE /* latin1.c in Sources */,
8E53E8070A44C045007E5BCE /* parse.c in Sources */,
8E53E8090A44C045007E5BCE /* render.c in Sources */,
8E53E80B0A44C045007E5BCE /* tag.c in Sources */,
8E53E80D0A44C045007E5BCE /* ucs4.c in Sources */,
8E53E80F0A44C045007E5BCE /* utf8.c in Sources */,
8E53E8110A44C045007E5BCE /* utf16.c in Sources */,
8E53E8130A44C045007E5BCE /* util.c in Sources */,
8E53E8150A44C045007E5BCE /* version.c in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
089C1666FE841158C02AAC07 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
089C1667FE841158C02AAC07 /* English */,
);
name = InfoPlist.strings;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
4FADC24308B4156D00ABE55E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = NO;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_MODEL_TUNING = G5;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = ID3Tag_Prefix.pch;
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "$(HOME)/Library/Frameworks";
LIBRARY_STYLE = DYNAMIC;
MACH_O_TYPE = mh_dylib;
PRODUCT_NAME = ID3Tag;
WRAPPER_EXTENSION = framework;
ZERO_LINK = YES;
};
name = Debug;
};
4FADC24408B4156D00ABE55E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ARCHS = (
ppc,
i386,
);
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
FRAMEWORK_VERSION = A;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_MODEL_TUNING = G5;
GCC_PRECOMPILE_PREFIX_HEADER = NO;
GCC_PREFIX_HEADER = "";
INFOPLIST_FILE = Info.plist;
INSTALL_PATH = "@executable_path/../Frameworks";
LIBRARY_STYLE = DYNAMIC;
MACH_O_TYPE = mh_dylib;
PRODUCT_NAME = ID3Tag;
WRAPPER_EXTENSION = framework;
};
name = Release;
};
4FADC24708B4156D00ABE55E /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
};
name = Debug;
};
4FADC24808B4156D00ABE55E /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
PREBINDING = NO;
SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "ID3Tag" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4FADC24308B4156D00ABE55E /* Debug */,
4FADC24408B4156D00ABE55E /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "ID3Tag" */ = {
isa = XCConfigurationList;
buildConfigurations = (
4FADC24708B4156D00ABE55E /* Debug */,
4FADC24808B4156D00ABE55E /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>ID3Tag</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.apple.carbonframeworktemplate</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
</plist>

Binary file not shown.

338
Libraries/MAD/Files/CHANGES Normal file
View File

@ -0,0 +1,338 @@
libmad - MPEG audio decoder library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: CHANGES,v 1.14 2004/02/17 02:02:03 rob Exp $
===============================================================================
Version 0.15.1 (beta)
* Updated to autoconf 2.59, automake 1.8.2, libtool 1.5.2.
* Replaced Layer III IMDCT routine with one based on a faster algorithm,
improving both speed and accuracy.
* Improved portability of the Huffman table initialization.
* Fixed a problem that could result in an assertion failure in layer3.c
due to an invalid Layer III free format bitrate.
* Improved the robustness of Layer II bitrate/mode combinations, and added
a new MAD_ERROR_BADMODE error enum. The allowability of low-bitrate
stereo streams is influenced by the --enable-strict-iso option to
`configure'.
Version 0.15.0 (beta)
* Updated to autoconf 2.57, automake 1.7.5, libtool 1.4.3.
* Added new mad_f_div() API routine.
* Added a 64th entry to the Layer I/Layer II scalefactor table, for better
compatibility with existing streams. The --enable-strict-iso option to
`configure' can be used to disable use of this entry.
* Modified the header decoding routine to allow the reserved emphasis
value, for better compatibility with existing streams. The
--enable-strict-iso option to `configure' can be used to restore the
previous behavior of reporting this value as an error.
* Added new MAD_EMPHASIS_RESERVED enumeration constant.
* Fixed a bug in the ARM version of mad_f_scale64() discovered by Andre
McCurdy.
* Rewrote PowerPC assembly for minor gains.
* Modified mad_timer_fraction() to avoid the possibility of division by
zero when 0 is passed as the second argument.
* Fixed a non-fatal problem caused by attempting to designate ancillary
bits in Layer III after a decoding error.
* Changed to build a shared library by default.
* Changed to use native Cygwin build by default; give --host=mingw32 to
`configure' to use MinGW (and avoid a dependency on the Cygwin DLL).
Version 0.14.2 (beta)
* Changed Cygwin builds to use MinGW; resulting Win32 executables no
longer have a dependency on Cygwin DLLs.
* Added a new mad_stream_errorstr() API function to libmad for retrieving
a string description of the current error condition.
Version 0.14.1 (beta)
* Updated config.guess and config.sub to latest upstream versions.
* Enabled libtool versioning rather than release numbering.
* Improved the documentation in minimad.c.
* Several other small fixes.
Version 0.14.0 (beta)
* Added a 64-bit FPM negation operation to improve performance of subband
synthesis on some platforms.
* Improved MSVC++ portability and added MSVC++ project files.
* Added rounding to Layer III requantization for slightly better accuracy.
Version 0.13.0 (beta)
* Ancillary data is now properly extracted from Layer III streams.
* Rewrote the Layer III joint stereo decoding routine to correct a major
MPEG-2 problem and a minor MPEG-1 problem decoding intensity stereo.
* Eliminated the dependency on sign-extending right shifts for Layer I and
Layer II.
* Renamed `private' field to `private_bits' for better C++ compatibility.
* Gratuitously renamed `sfreq' field to `samplerate' and
MAD_ERROR_BADSAMPLEFREQ constant to MAD_ERROR_BADSAMPLERATE.
* Added `samplerate' and `channels' fields to synth.pcm struct to allow
these to be different from the decoded frame, and for simpler access.
* Added new mad_stream_options() and mad_decoder_options() API entries for
special runtime decoding options.
* Added new MAD_OPTION_IGNORECRC and MAD_OPTION_HALFSAMPLERATE options.
* Added new MAD_FLAG_FREEFORMAT indicator flag.
* Fixed some bugs in the async decoder.
* Added a new mad_timer_multiply() API routine.
* Eliminated `+' from asm constraints under Intel for better compatibility
with some compilers.
* Fixed a PIC-related problem in imdct_l_arm.S.
* Eliminated a static variable to make libmad thread-safe.
Version 0.12.5 (beta)
* Modified Layer III requantization to occur during Huffman decoding for
significant performance gains.
* Optimized short block IMDCT by eliminating redundant calculations.
* Made several other Layer III performance improvements; added
ASO_INTERLEAVE1, ASO_INTERLEAVE2, and ASO_ZEROCHECK
architecture-specific options for best performance on various
architectures.
* Optimized synthesis DCT to store result values as soon as they are
calculated.
Version 0.12.4 (beta)
* New PowerPC fixed-point assembly courtesy of David Blythe.
* Reorganized fixed-point assembly routines for easier maintenance and
better performance.
* Improved performance of subband synthesis through better indexing and
fewer local variables.
* Added alias reduction for the lower two subbands of mixed short blocks,
per a report of ambiguity with ISO/IEC 11172-3 and for uniformity with
most other implementations. Also improved alias reduction performance
using multiply/accumulate.
* Added --enable-strict-iso option to `configure' to override best
accepted practices such as the alias reduction for mixed short blocks.
* Improved performance of Layer III IMDCT by using longer
multiply/accumulate runs where possible.
Version 0.12.3 (beta)
* Added MPEG 2.5 support.
* Added preliminary support for parameterizing the binary point position
in the fixed-point representation.
* Added multiply/accumulate optimization to the Layer III IMDCT for long
blocks.
* Fixed a bug in the handling of Layer III mixed_block_flag.
* Fixed a configure problem when multiple -O CFLAGS are present.
Version 0.12.2 (beta)
* Rearranged the synthesis polyphase filterbank memory vector for better
locality of reference, and rewrote mad_synth_frame() to accommodate,
resulting in improved performance.
* Discovered a combination of compiler optimization flags that further
improve performance.
* Changed some array references in layer3.c to pointer derefs.
Version 0.12.1 (beta)
* Resolved the intensity + MS joint stereo issue (a simple bug).
OPT_ISKLUGE is no longer considered to be a kluge.
* Fixed another, hopefully last main_data memory bug.
* Split part of struct mad_frame into struct mad_header for convenience
and size.
Version 0.12.0 (alpha)
* Changed the build environment to use automake and libtool. A libmad
shared library can now be built using the --enable-shared option to
`configure'.
* Added another callback to MAD's high-level decoder API after the frame
header has been read but before the frame's audio data is decoded.
* Streamlined header processing so that mad_frame_decode() can be called
with or without having already called mad_frame_header().
* Fixed some other header reading miscellany, including CRC handling and
free bitrate detection, and frame length verification with free
bitrates.
* Fixed a problem with Layer III free bitrates > 320 kbps. The main_data
buffer size should now be large enough to handle any size frame, by
virtue of the maximum possible part2_3_length.
* Further developed the async API; arbitrary messages can now be passed to
the subsidiary decoding process.
* Streamlined timer.c and extended its interface. It now has support for
video frame/field lengths, including output support for drop-frame
encoding.
* Replaced many constant integer preprocessor defines with enums.
Version 0.11.4 (beta)
* Fixed free format bitrate discovery.
* Changed the timer implementation and extended its interface.
* Integrated Nicolas Pitre's patch for pre-shifting at compile-time and
for better multiply/accumulate code output.
* Applied Simon Burge's patch to imdct_l_arm.S for a.out compatibility.
* Added -mtune=strongarm for all ARM targets.
Version 0.11.3 (beta)
* Added new --enable-speed and --enable-accuracy options for `configure'
to automatically select appropriate SSO/ASO options, et al.
* Modified subband synthesis to use multiply/accumulate optimization (if
available) for better speed and/or accuracy.
* Incorporated Andre McCurdy's changes for further rounding optimizations
in the rest of his code.
Version 0.11.2 (beta)
* Incorporated Nicolas Pitre's ARM assembly and parameterized scaling
changes.
* Incorporated Andre McCurdy's ARM assembly optimization (used only if
--enable-aso is given to `configure' to enable architecture-specific
optimizations.)
* Reduced FPM_INTEL assembly to two instructions.
* Fixed accuracy problems with certain FPM modes in synth.c.
* Improved the accuracy of FPM_APPROX.
* Improved the accuracy of SSO.
* Improved sync discovery by checking for a sync word in the following
frame.
* Minor code clean-up.
* Added experimental rules for generating a libmad.so shared library.
Version 0.11.1 (beta)
* Moved libmad code into a separate directory.
* Changed SSO to be disabled by default, as output accuracy is deemed to
be more important than speed in the general case.
* Fixed a bug in Layer III sanity checking that could cause a crash on
certain random data input.
* Extended the Layer III requantization table from 8191 to 8206 as some
encoders are known to use these values, even though ISO/IEC 11172-3
suggests the maximum should be 8191.
Version 0.11.0 (beta)
* Implemented MPEG-2 extension to Lower Sampling Frequencies.
* Improved Layer III performance by avoiding IMDCT calculation when all
input samples are zero.
* Significantly reduced size of Layer II tables.
Version 0.10.3 (beta)
* Improved SSO output quality.
* Made portable to cygwin.
* Localized memory references in III_huffdecode() for better performance.
Version 0.10.2 (beta)
* Rewrote Layer III long block 36-point IMDCT routine for better
performance.
* Improved subband synthesis fixed-point games somewhat.
Version 0.10.1 (beta)
* Added a subband synthesis optimization (SSO) which involves modifying
the fixed-point multiplication method during windowing. This produces
subtle differences in the output but improves performance greatly.
* Added I_STEREO and MS_STEREO flags to frame struct.
* Eliminated privately-used CRCFAILED flag.
* Fixed a bug where Layer III decoding could crash on some badly-formatted
(e.g. non-MPEG) bitstreams.
* Miscellaneous code clean-up.
Version 0.10.0 (beta)
* Added SPARC fixed-point math support.
* Revamped libmad API for better high- and low-level support.
* Documented more of the code.
* Changed sync semantics such that new stream buffers are assumed to be
sync-aligned.
* Changed Layer III to dynamically allocate static memory so as not to
waste it (about 6.4K) when only decoding Layer I or Layer II.
===============================================================================

340
Libraries/MAD/Files/COPYING Normal file
View File

@ -0,0 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.

View File

@ -0,0 +1,21 @@
libmad - MPEG audio decoder library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
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
If you would like to negotiate alternate licensing terms, you may do
so by contacting: Underbit Technologies, Inc. <info@underbit.com>

116
Libraries/MAD/Files/CREDITS Normal file
View File

@ -0,0 +1,116 @@
libmad - MPEG audio decoder library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: CREDITS,v 1.5 2004/02/17 02:02:03 rob Exp $
===============================================================================
AUTHOR
Except where otherwise noted, all code was authored by:
Robert Leslie <rob@underbit.com>
CONTRIBUTORS
Significant contributions have been incorporated with thanks to:
Anonymous
2002/03/15: frame.c
- Reported problem with use of reserved emphasis value.
2003/08/31: layer12.c
- Suggested support for certain disallowed bitrate/mode
combinations.
Niek Albers <info@daansystems.com>
2003/04/21: layer3.c
- Reported runtime uninitialized use of `ptr' in designating
ancillary bits after a decoding error.
Christian Biere <cbiere@users.sourceforge.net>
2003/02/01: frame.c
- Reported assertion failure in layer3.c due to an
invalid/unsupported Layer III free format bitrate.
David Blythe <blythe@routefree.com>
2001/01/30: fixed.h
- Provided initial PowerPC fixed-point assembly.
Simon Burge <simonb@wasabisystems.com>
2000/09/20: imdct_l_arm.S
- Suggested patch for a.out compatibility.
Brian Cameron <Brian.Cameron@sun.com>
2003/07/02: huffman.c
- Suggested changes for improved portability.
Joshua Haberman <joshua@haberman.com>
2001/08/10: decoder.c, huffman.c
- Suggested portability fixes.
Timothy King <lordzork@lordzork.com>
2002/05/04: sf_table.dat, layer12.c
- Reported problem with use of (missing) scalefactor index 63.
Felix von Leitner <felix-mad@fefe.de>
2003/01/21: fixed.h
- Suggested Intel scaling alternative for possible speedup.
Andre McCurdy <armccurdy@yahoo.co.uk>
2000/08/10: imdct_l_arm.S
- ARM optimized assembly replacement for III_imdct_l().
2000/09/15: imdct_l_arm.S
- Applied Nicolas Pitre's rounding optimisation in all remaining
places.
2001/02/10: layer3.c
- Inspiration for Huffman decoding and requantization rewrite, and
other miscellany.
2001/03/24: imdct_l_arm.S
- Corrected PIC unsafe code.
2002/02/16: fixed.h
- Discovered bug in ARM version of mad_f_scale64().
Haruhiko OGASAWARA <theta@m1.interq.or.jp>
2001/01/28: layer3.c
- Reported discrepancy in alias reduction for mixed short blocks.
Brett Paterson <brett@fmod.org>
2001/10/28: global.h
- Reported missing <assert.h> et al. under MS Embedded Visual C.
Sean 'Shaleh' Perry <shaleh@via.net>
2000/04/04: fixed.h
- Suggested use of size-dependent typedefs.
2001/10/22: config.guess, config.sub
- Keep up to date for proper Debian packaging.
Bertrand Petit <eemad@phoe.frmug.org>
2001/11/05: synth.h
- Suggested PCM channel enumeration constants.
2001/11/05: stream.h
- Suggested MAD_ERROR_NONE enumeration constant.
2001/11/05: stream.c
- Suggested mad_stream_errorstr() function.
Nicolas Pitre <nico@cam.org>
2000/09/09: fixed.h
- Parameterized all scaling for correct use of all multiplication
methods within mad_synth_frame().
- Rewrote the FPM_ARM version of mad_f_mul() so we have 64-bit
multiplication result, rounding and scaling with 3 instructions.
2000/09/09: imdct_l_arm.S
- Optimized rounding + scaling operations.
2000/09/17: synth.c
- Changed D[] run-time shifts to compile-time.
- Modified synthesis for better multiply/accumulate code output.
2001/08/11: fixed.h, synth.c
- Suggested 64-bit FPM negation and negative term factorization
during synthesis.
2001/08/11: fixed.h
- Suggested unrounded behavior for FPM_DEFAULT when OPT_SPEED.
2001/11/19: fixed.c
- Suggested computation of any resampling ratio.
===============================================================================

607
Libraries/MAD/Files/D.dat Normal file
View File

@ -0,0 +1,607 @@
/*
* libmad - MPEG audio decoder library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: D.dat,v 1.9 2004/01/23 09:41:32 rob Exp $
*/
/*
* These are the coefficients for the subband synthesis window. This is a
* reordered version of Table B.3 from ISO/IEC 11172-3.
*
* Every value is parameterized so that shift optimizations can be made at
* compile-time. For example, every value can be right-shifted 12 bits to
* minimize multiply instruction times without any loss of accuracy.
*/
{ PRESHIFT(0x00000000) /* 0.000000000 */, /* 0 */
-PRESHIFT(0x0001d000) /* -0.000442505 */,
PRESHIFT(0x000d5000) /* 0.003250122 */,
-PRESHIFT(0x001cb000) /* -0.007003784 */,
PRESHIFT(0x007f5000) /* 0.031082153 */,
-PRESHIFT(0x01421000) /* -0.078628540 */,
PRESHIFT(0x019ae000) /* 0.100311279 */,
-PRESHIFT(0x09271000) /* -0.572036743 */,
PRESHIFT(0x1251e000) /* 1.144989014 */,
PRESHIFT(0x09271000) /* 0.572036743 */,
PRESHIFT(0x019ae000) /* 0.100311279 */,
PRESHIFT(0x01421000) /* 0.078628540 */,
PRESHIFT(0x007f5000) /* 0.031082153 */,
PRESHIFT(0x001cb000) /* 0.007003784 */,
PRESHIFT(0x000d5000) /* 0.003250122 */,
PRESHIFT(0x0001d000) /* 0.000442505 */,
PRESHIFT(0x00000000) /* 0.000000000 */,
-PRESHIFT(0x0001d000) /* -0.000442505 */,
PRESHIFT(0x000d5000) /* 0.003250122 */,
-PRESHIFT(0x001cb000) /* -0.007003784 */,
PRESHIFT(0x007f5000) /* 0.031082153 */,
-PRESHIFT(0x01421000) /* -0.078628540 */,
PRESHIFT(0x019ae000) /* 0.100311279 */,
-PRESHIFT(0x09271000) /* -0.572036743 */,
PRESHIFT(0x1251e000) /* 1.144989014 */,
PRESHIFT(0x09271000) /* 0.572036743 */,
PRESHIFT(0x019ae000) /* 0.100311279 */,
PRESHIFT(0x01421000) /* 0.078628540 */,
PRESHIFT(0x007f5000) /* 0.031082153 */,
PRESHIFT(0x001cb000) /* 0.007003784 */,
PRESHIFT(0x000d5000) /* 0.003250122 */,
PRESHIFT(0x0001d000) /* 0.000442505 */ },
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 1 */
-PRESHIFT(0x0001f000) /* -0.000473022 */,
PRESHIFT(0x000da000) /* 0.003326416 */,
-PRESHIFT(0x00207000) /* -0.007919312 */,
PRESHIFT(0x007d0000) /* 0.030517578 */,
-PRESHIFT(0x0158d000) /* -0.084182739 */,
PRESHIFT(0x01747000) /* 0.090927124 */,
-PRESHIFT(0x099a8000) /* -0.600219727 */,
PRESHIFT(0x124f0000) /* 1.144287109 */,
PRESHIFT(0x08b38000) /* 0.543823242 */,
PRESHIFT(0x01bde000) /* 0.108856201 */,
PRESHIFT(0x012b4000) /* 0.073059082 */,
PRESHIFT(0x0080f000) /* 0.031478882 */,
PRESHIFT(0x00191000) /* 0.006118774 */,
PRESHIFT(0x000d0000) /* 0.003173828 */,
PRESHIFT(0x0001a000) /* 0.000396729 */,
-PRESHIFT(0x00001000) /* -0.000015259 */,
-PRESHIFT(0x0001f000) /* -0.000473022 */,
PRESHIFT(0x000da000) /* 0.003326416 */,
-PRESHIFT(0x00207000) /* -0.007919312 */,
PRESHIFT(0x007d0000) /* 0.030517578 */,
-PRESHIFT(0x0158d000) /* -0.084182739 */,
PRESHIFT(0x01747000) /* 0.090927124 */,
-PRESHIFT(0x099a8000) /* -0.600219727 */,
PRESHIFT(0x124f0000) /* 1.144287109 */,
PRESHIFT(0x08b38000) /* 0.543823242 */,
PRESHIFT(0x01bde000) /* 0.108856201 */,
PRESHIFT(0x012b4000) /* 0.073059082 */,
PRESHIFT(0x0080f000) /* 0.031478882 */,
PRESHIFT(0x00191000) /* 0.006118774 */,
PRESHIFT(0x000d0000) /* 0.003173828 */,
PRESHIFT(0x0001a000) /* 0.000396729 */ },
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 2 */
-PRESHIFT(0x00023000) /* -0.000534058 */,
PRESHIFT(0x000de000) /* 0.003387451 */,
-PRESHIFT(0x00245000) /* -0.008865356 */,
PRESHIFT(0x007a0000) /* 0.029785156 */,
-PRESHIFT(0x016f7000) /* -0.089706421 */,
PRESHIFT(0x014a8000) /* 0.080688477 */,
-PRESHIFT(0x0a0d8000) /* -0.628295898 */,
PRESHIFT(0x12468000) /* 1.142211914 */,
PRESHIFT(0x083ff000) /* 0.515609741 */,
PRESHIFT(0x01dd8000) /* 0.116577148 */,
PRESHIFT(0x01149000) /* 0.067520142 */,
PRESHIFT(0x00820000) /* 0.031738281 */,
PRESHIFT(0x0015b000) /* 0.005294800 */,
PRESHIFT(0x000ca000) /* 0.003082275 */,
PRESHIFT(0x00018000) /* 0.000366211 */,
-PRESHIFT(0x00001000) /* -0.000015259 */,
-PRESHIFT(0x00023000) /* -0.000534058 */,
PRESHIFT(0x000de000) /* 0.003387451 */,
-PRESHIFT(0x00245000) /* -0.008865356 */,
PRESHIFT(0x007a0000) /* 0.029785156 */,
-PRESHIFT(0x016f7000) /* -0.089706421 */,
PRESHIFT(0x014a8000) /* 0.080688477 */,
-PRESHIFT(0x0a0d8000) /* -0.628295898 */,
PRESHIFT(0x12468000) /* 1.142211914 */,
PRESHIFT(0x083ff000) /* 0.515609741 */,
PRESHIFT(0x01dd8000) /* 0.116577148 */,
PRESHIFT(0x01149000) /* 0.067520142 */,
PRESHIFT(0x00820000) /* 0.031738281 */,
PRESHIFT(0x0015b000) /* 0.005294800 */,
PRESHIFT(0x000ca000) /* 0.003082275 */,
PRESHIFT(0x00018000) /* 0.000366211 */ },
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 3 */
-PRESHIFT(0x00026000) /* -0.000579834 */,
PRESHIFT(0x000e1000) /* 0.003433228 */,
-PRESHIFT(0x00285000) /* -0.009841919 */,
PRESHIFT(0x00765000) /* 0.028884888 */,
-PRESHIFT(0x0185d000) /* -0.095169067 */,
PRESHIFT(0x011d1000) /* 0.069595337 */,
-PRESHIFT(0x0a7fe000) /* -0.656219482 */,
PRESHIFT(0x12386000) /* 1.138763428 */,
PRESHIFT(0x07ccb000) /* 0.487472534 */,
PRESHIFT(0x01f9c000) /* 0.123474121 */,
PRESHIFT(0x00fdf000) /* 0.061996460 */,
PRESHIFT(0x00827000) /* 0.031845093 */,
PRESHIFT(0x00126000) /* 0.004486084 */,
PRESHIFT(0x000c4000) /* 0.002990723 */,
PRESHIFT(0x00015000) /* 0.000320435 */,
-PRESHIFT(0x00001000) /* -0.000015259 */,
-PRESHIFT(0x00026000) /* -0.000579834 */,
PRESHIFT(0x000e1000) /* 0.003433228 */,
-PRESHIFT(0x00285000) /* -0.009841919 */,
PRESHIFT(0x00765000) /* 0.028884888 */,
-PRESHIFT(0x0185d000) /* -0.095169067 */,
PRESHIFT(0x011d1000) /* 0.069595337 */,
-PRESHIFT(0x0a7fe000) /* -0.656219482 */,
PRESHIFT(0x12386000) /* 1.138763428 */,
PRESHIFT(0x07ccb000) /* 0.487472534 */,
PRESHIFT(0x01f9c000) /* 0.123474121 */,
PRESHIFT(0x00fdf000) /* 0.061996460 */,
PRESHIFT(0x00827000) /* 0.031845093 */,
PRESHIFT(0x00126000) /* 0.004486084 */,
PRESHIFT(0x000c4000) /* 0.002990723 */,
PRESHIFT(0x00015000) /* 0.000320435 */ },
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 4 */
-PRESHIFT(0x00029000) /* -0.000625610 */,
PRESHIFT(0x000e3000) /* 0.003463745 */,
-PRESHIFT(0x002c7000) /* -0.010848999 */,
PRESHIFT(0x0071e000) /* 0.027801514 */,
-PRESHIFT(0x019bd000) /* -0.100540161 */,
PRESHIFT(0x00ec0000) /* 0.057617187 */,
-PRESHIFT(0x0af15000) /* -0.683914185 */,
PRESHIFT(0x12249000) /* 1.133926392 */,
PRESHIFT(0x075a0000) /* 0.459472656 */,
PRESHIFT(0x0212c000) /* 0.129577637 */,
PRESHIFT(0x00e79000) /* 0.056533813 */,
PRESHIFT(0x00825000) /* 0.031814575 */,
PRESHIFT(0x000f4000) /* 0.003723145 */,
PRESHIFT(0x000be000) /* 0.002899170 */,
PRESHIFT(0x00013000) /* 0.000289917 */,
-PRESHIFT(0x00001000) /* -0.000015259 */,
-PRESHIFT(0x00029000) /* -0.000625610 */,
PRESHIFT(0x000e3000) /* 0.003463745 */,
-PRESHIFT(0x002c7000) /* -0.010848999 */,
PRESHIFT(0x0071e000) /* 0.027801514 */,
-PRESHIFT(0x019bd000) /* -0.100540161 */,
PRESHIFT(0x00ec0000) /* 0.057617187 */,
-PRESHIFT(0x0af15000) /* -0.683914185 */,
PRESHIFT(0x12249000) /* 1.133926392 */,
PRESHIFT(0x075a0000) /* 0.459472656 */,
PRESHIFT(0x0212c000) /* 0.129577637 */,
PRESHIFT(0x00e79000) /* 0.056533813 */,
PRESHIFT(0x00825000) /* 0.031814575 */,
PRESHIFT(0x000f4000) /* 0.003723145 */,
PRESHIFT(0x000be000) /* 0.002899170 */,
PRESHIFT(0x00013000) /* 0.000289917 */ },
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 5 */
-PRESHIFT(0x0002d000) /* -0.000686646 */,
PRESHIFT(0x000e4000) /* 0.003479004 */,
-PRESHIFT(0x0030b000) /* -0.011886597 */,
PRESHIFT(0x006cb000) /* 0.026535034 */,
-PRESHIFT(0x01b17000) /* -0.105819702 */,
PRESHIFT(0x00b77000) /* 0.044784546 */,
-PRESHIFT(0x0b619000) /* -0.711318970 */,
PRESHIFT(0x120b4000) /* 1.127746582 */,
PRESHIFT(0x06e81000) /* 0.431655884 */,
PRESHIFT(0x02288000) /* 0.134887695 */,
PRESHIFT(0x00d17000) /* 0.051132202 */,
PRESHIFT(0x0081b000) /* 0.031661987 */,
PRESHIFT(0x000c5000) /* 0.003005981 */,
PRESHIFT(0x000b7000) /* 0.002792358 */,
PRESHIFT(0x00011000) /* 0.000259399 */,
-PRESHIFT(0x00001000) /* -0.000015259 */,
-PRESHIFT(0x0002d000) /* -0.000686646 */,
PRESHIFT(0x000e4000) /* 0.003479004 */,
-PRESHIFT(0x0030b000) /* -0.011886597 */,
PRESHIFT(0x006cb000) /* 0.026535034 */,
-PRESHIFT(0x01b17000) /* -0.105819702 */,
PRESHIFT(0x00b77000) /* 0.044784546 */,
-PRESHIFT(0x0b619000) /* -0.711318970 */,
PRESHIFT(0x120b4000) /* 1.127746582 */,
PRESHIFT(0x06e81000) /* 0.431655884 */,
PRESHIFT(0x02288000) /* 0.134887695 */,
PRESHIFT(0x00d17000) /* 0.051132202 */,
PRESHIFT(0x0081b000) /* 0.031661987 */,
PRESHIFT(0x000c5000) /* 0.003005981 */,
PRESHIFT(0x000b7000) /* 0.002792358 */,
PRESHIFT(0x00011000) /* 0.000259399 */ },
{ -PRESHIFT(0x00001000) /* -0.000015259 */, /* 6 */
-PRESHIFT(0x00031000) /* -0.000747681 */,
PRESHIFT(0x000e4000) /* 0.003479004 */,
-PRESHIFT(0x00350000) /* -0.012939453 */,
PRESHIFT(0x0066c000) /* 0.025085449 */,
-PRESHIFT(0x01c67000) /* -0.110946655 */,
PRESHIFT(0x007f5000) /* 0.031082153 */,
-PRESHIFT(0x0bd06000) /* -0.738372803 */,
PRESHIFT(0x11ec7000) /* 1.120223999 */,
PRESHIFT(0x06772000) /* 0.404083252 */,
PRESHIFT(0x023b3000) /* 0.139450073 */,
PRESHIFT(0x00bbc000) /* 0.045837402 */,
PRESHIFT(0x00809000) /* 0.031387329 */,
PRESHIFT(0x00099000) /* 0.002334595 */,
PRESHIFT(0x000b0000) /* 0.002685547 */,
PRESHIFT(0x00010000) /* 0.000244141 */,
-PRESHIFT(0x00001000) /* -0.000015259 */,
-PRESHIFT(0x00031000) /* -0.000747681 */,
PRESHIFT(0x000e4000) /* 0.003479004 */,
-PRESHIFT(0x00350000) /* -0.012939453 */,
PRESHIFT(0x0066c000) /* 0.025085449 */,
-PRESHIFT(0x01c67000) /* -0.110946655 */,
PRESHIFT(0x007f5000) /* 0.031082153 */,
-PRESHIFT(0x0bd06000) /* -0.738372803 */,
PRESHIFT(0x11ec7000) /* 1.120223999 */,
PRESHIFT(0x06772000) /* 0.404083252 */,
PRESHIFT(0x023b3000) /* 0.139450073 */,
PRESHIFT(0x00bbc000) /* 0.045837402 */,
PRESHIFT(0x00809000) /* 0.031387329 */,
PRESHIFT(0x00099000) /* 0.002334595 */,
PRESHIFT(0x000b0000) /* 0.002685547 */,
PRESHIFT(0x00010000) /* 0.000244141 */ },
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 7 */
-PRESHIFT(0x00035000) /* -0.000808716 */,
PRESHIFT(0x000e3000) /* 0.003463745 */,
-PRESHIFT(0x00397000) /* -0.014022827 */,
PRESHIFT(0x005ff000) /* 0.023422241 */,
-PRESHIFT(0x01dad000) /* -0.115921021 */,
PRESHIFT(0x0043a000) /* 0.016510010 */,
-PRESHIFT(0x0c3d9000) /* -0.765029907 */,
PRESHIFT(0x11c83000) /* 1.111373901 */,
PRESHIFT(0x06076000) /* 0.376800537 */,
PRESHIFT(0x024ad000) /* 0.143264771 */,
PRESHIFT(0x00a67000) /* 0.040634155 */,
PRESHIFT(0x007f0000) /* 0.031005859 */,
PRESHIFT(0x0006f000) /* 0.001693726 */,
PRESHIFT(0x000a9000) /* 0.002578735 */,
PRESHIFT(0x0000e000) /* 0.000213623 */,
-PRESHIFT(0x00002000) /* -0.000030518 */,
-PRESHIFT(0x00035000) /* -0.000808716 */,
PRESHIFT(0x000e3000) /* 0.003463745 */,
-PRESHIFT(0x00397000) /* -0.014022827 */,
PRESHIFT(0x005ff000) /* 0.023422241 */,
-PRESHIFT(0x01dad000) /* -0.115921021 */,
PRESHIFT(0x0043a000) /* 0.016510010 */,
-PRESHIFT(0x0c3d9000) /* -0.765029907 */,
PRESHIFT(0x11c83000) /* 1.111373901 */,
PRESHIFT(0x06076000) /* 0.376800537 */,
PRESHIFT(0x024ad000) /* 0.143264771 */,
PRESHIFT(0x00a67000) /* 0.040634155 */,
PRESHIFT(0x007f0000) /* 0.031005859 */,
PRESHIFT(0x0006f000) /* 0.001693726 */,
PRESHIFT(0x000a9000) /* 0.002578735 */,
PRESHIFT(0x0000e000) /* 0.000213623 */ },
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 8 */
-PRESHIFT(0x0003a000) /* -0.000885010 */,
PRESHIFT(0x000e0000) /* 0.003417969 */,
-PRESHIFT(0x003df000) /* -0.015121460 */,
PRESHIFT(0x00586000) /* 0.021575928 */,
-PRESHIFT(0x01ee6000) /* -0.120697021 */,
PRESHIFT(0x00046000) /* 0.001068115 */,
-PRESHIFT(0x0ca8d000) /* -0.791213989 */,
PRESHIFT(0x119e9000) /* 1.101211548 */,
PRESHIFT(0x05991000) /* 0.349868774 */,
PRESHIFT(0x02578000) /* 0.146362305 */,
PRESHIFT(0x0091a000) /* 0.035552979 */,
PRESHIFT(0x007d1000) /* 0.030532837 */,
PRESHIFT(0x00048000) /* 0.001098633 */,
PRESHIFT(0x000a1000) /* 0.002456665 */,
PRESHIFT(0x0000d000) /* 0.000198364 */,
-PRESHIFT(0x00002000) /* -0.000030518 */,
-PRESHIFT(0x0003a000) /* -0.000885010 */,
PRESHIFT(0x000e0000) /* 0.003417969 */,
-PRESHIFT(0x003df000) /* -0.015121460 */,
PRESHIFT(0x00586000) /* 0.021575928 */,
-PRESHIFT(0x01ee6000) /* -0.120697021 */,
PRESHIFT(0x00046000) /* 0.001068115 */,
-PRESHIFT(0x0ca8d000) /* -0.791213989 */,
PRESHIFT(0x119e9000) /* 1.101211548 */,
PRESHIFT(0x05991000) /* 0.349868774 */,
PRESHIFT(0x02578000) /* 0.146362305 */,
PRESHIFT(0x0091a000) /* 0.035552979 */,
PRESHIFT(0x007d1000) /* 0.030532837 */,
PRESHIFT(0x00048000) /* 0.001098633 */,
PRESHIFT(0x000a1000) /* 0.002456665 */,
PRESHIFT(0x0000d000) /* 0.000198364 */ },
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 9 */
-PRESHIFT(0x0003f000) /* -0.000961304 */,
PRESHIFT(0x000dd000) /* 0.003372192 */,
-PRESHIFT(0x00428000) /* -0.016235352 */,
PRESHIFT(0x00500000) /* 0.019531250 */,
-PRESHIFT(0x02011000) /* -0.125259399 */,
-PRESHIFT(0x003e6000) /* -0.015228271 */,
-PRESHIFT(0x0d11e000) /* -0.816864014 */,
PRESHIFT(0x116fc000) /* 1.089782715 */,
PRESHIFT(0x052c5000) /* 0.323318481 */,
PRESHIFT(0x02616000) /* 0.148773193 */,
PRESHIFT(0x007d6000) /* 0.030609131 */,
PRESHIFT(0x007aa000) /* 0.029937744 */,
PRESHIFT(0x00024000) /* 0.000549316 */,
PRESHIFT(0x0009a000) /* 0.002349854 */,
PRESHIFT(0x0000b000) /* 0.000167847 */,
-PRESHIFT(0x00002000) /* -0.000030518 */,
-PRESHIFT(0x0003f000) /* -0.000961304 */,
PRESHIFT(0x000dd000) /* 0.003372192 */,
-PRESHIFT(0x00428000) /* -0.016235352 */,
PRESHIFT(0x00500000) /* 0.019531250 */,
-PRESHIFT(0x02011000) /* -0.125259399 */,
-PRESHIFT(0x003e6000) /* -0.015228271 */,
-PRESHIFT(0x0d11e000) /* -0.816864014 */,
PRESHIFT(0x116fc000) /* 1.089782715 */,
PRESHIFT(0x052c5000) /* 0.323318481 */,
PRESHIFT(0x02616000) /* 0.148773193 */,
PRESHIFT(0x007d6000) /* 0.030609131 */,
PRESHIFT(0x007aa000) /* 0.029937744 */,
PRESHIFT(0x00024000) /* 0.000549316 */,
PRESHIFT(0x0009a000) /* 0.002349854 */,
PRESHIFT(0x0000b000) /* 0.000167847 */ },
{ -PRESHIFT(0x00002000) /* -0.000030518 */, /* 10 */
-PRESHIFT(0x00044000) /* -0.001037598 */,
PRESHIFT(0x000d7000) /* 0.003280640 */,
-PRESHIFT(0x00471000) /* -0.017349243 */,
PRESHIFT(0x0046b000) /* 0.017257690 */,
-PRESHIFT(0x0212b000) /* -0.129562378 */,
-PRESHIFT(0x0084a000) /* -0.032379150 */,
-PRESHIFT(0x0d78a000) /* -0.841949463 */,
PRESHIFT(0x113be000) /* 1.077117920 */,
PRESHIFT(0x04c16000) /* 0.297210693 */,
PRESHIFT(0x02687000) /* 0.150497437 */,
PRESHIFT(0x0069c000) /* 0.025817871 */,
PRESHIFT(0x0077f000) /* 0.029281616 */,
PRESHIFT(0x00002000) /* 0.000030518 */,
PRESHIFT(0x00093000) /* 0.002243042 */,
PRESHIFT(0x0000a000) /* 0.000152588 */,
-PRESHIFT(0x00002000) /* -0.000030518 */,
-PRESHIFT(0x00044000) /* -0.001037598 */,
PRESHIFT(0x000d7000) /* 0.003280640 */,
-PRESHIFT(0x00471000) /* -0.017349243 */,
PRESHIFT(0x0046b000) /* 0.017257690 */,
-PRESHIFT(0x0212b000) /* -0.129562378 */,
-PRESHIFT(0x0084a000) /* -0.032379150 */,
-PRESHIFT(0x0d78a000) /* -0.841949463 */,
PRESHIFT(0x113be000) /* 1.077117920 */,
PRESHIFT(0x04c16000) /* 0.297210693 */,
PRESHIFT(0x02687000) /* 0.150497437 */,
PRESHIFT(0x0069c000) /* 0.025817871 */,
PRESHIFT(0x0077f000) /* 0.029281616 */,
PRESHIFT(0x00002000) /* 0.000030518 */,
PRESHIFT(0x00093000) /* 0.002243042 */,
PRESHIFT(0x0000a000) /* 0.000152588 */ },
{ -PRESHIFT(0x00003000) /* -0.000045776 */, /* 11 */
-PRESHIFT(0x00049000) /* -0.001113892 */,
PRESHIFT(0x000d0000) /* 0.003173828 */,
-PRESHIFT(0x004ba000) /* -0.018463135 */,
PRESHIFT(0x003ca000) /* 0.014801025 */,
-PRESHIFT(0x02233000) /* -0.133590698 */,
-PRESHIFT(0x00ce4000) /* -0.050354004 */,
-PRESHIFT(0x0ddca000) /* -0.866363525 */,
PRESHIFT(0x1102f000) /* 1.063217163 */,
PRESHIFT(0x04587000) /* 0.271591187 */,
PRESHIFT(0x026cf000) /* 0.151596069 */,
PRESHIFT(0x0056c000) /* 0.021179199 */,
PRESHIFT(0x0074e000) /* 0.028533936 */,
-PRESHIFT(0x0001d000) /* -0.000442505 */,
PRESHIFT(0x0008b000) /* 0.002120972 */,
PRESHIFT(0x00009000) /* 0.000137329 */,
-PRESHIFT(0x00003000) /* -0.000045776 */,
-PRESHIFT(0x00049000) /* -0.001113892 */,
PRESHIFT(0x000d0000) /* 0.003173828 */,
-PRESHIFT(0x004ba000) /* -0.018463135 */,
PRESHIFT(0x003ca000) /* 0.014801025 */,
-PRESHIFT(0x02233000) /* -0.133590698 */,
-PRESHIFT(0x00ce4000) /* -0.050354004 */,
-PRESHIFT(0x0ddca000) /* -0.866363525 */,
PRESHIFT(0x1102f000) /* 1.063217163 */,
PRESHIFT(0x04587000) /* 0.271591187 */,
PRESHIFT(0x026cf000) /* 0.151596069 */,
PRESHIFT(0x0056c000) /* 0.021179199 */,
PRESHIFT(0x0074e000) /* 0.028533936 */,
-PRESHIFT(0x0001d000) /* -0.000442505 */,
PRESHIFT(0x0008b000) /* 0.002120972 */,
PRESHIFT(0x00009000) /* 0.000137329 */ },
{ -PRESHIFT(0x00003000) /* -0.000045776 */, /* 12 */
-PRESHIFT(0x0004f000) /* -0.001205444 */,
PRESHIFT(0x000c8000) /* 0.003051758 */,
-PRESHIFT(0x00503000) /* -0.019577026 */,
PRESHIFT(0x0031a000) /* 0.012115479 */,
-PRESHIFT(0x02326000) /* -0.137298584 */,
-PRESHIFT(0x011b5000) /* -0.069168091 */,
-PRESHIFT(0x0e3dd000) /* -0.890090942 */,
PRESHIFT(0x10c54000) /* 1.048156738 */,
PRESHIFT(0x03f1b000) /* 0.246505737 */,
PRESHIFT(0x026ee000) /* 0.152069092 */,
PRESHIFT(0x00447000) /* 0.016708374 */,
PRESHIFT(0x00719000) /* 0.027725220 */,
-PRESHIFT(0x00039000) /* -0.000869751 */,
PRESHIFT(0x00084000) /* 0.002014160 */,
PRESHIFT(0x00008000) /* 0.000122070 */,
-PRESHIFT(0x00003000) /* -0.000045776 */,
-PRESHIFT(0x0004f000) /* -0.001205444 */,
PRESHIFT(0x000c8000) /* 0.003051758 */,
-PRESHIFT(0x00503000) /* -0.019577026 */,
PRESHIFT(0x0031a000) /* 0.012115479 */,
-PRESHIFT(0x02326000) /* -0.137298584 */,
-PRESHIFT(0x011b5000) /* -0.069168091 */,
-PRESHIFT(0x0e3dd000) /* -0.890090942 */,
PRESHIFT(0x10c54000) /* 1.048156738 */,
PRESHIFT(0x03f1b000) /* 0.246505737 */,
PRESHIFT(0x026ee000) /* 0.152069092 */,
PRESHIFT(0x00447000) /* 0.016708374 */,
PRESHIFT(0x00719000) /* 0.027725220 */,
-PRESHIFT(0x00039000) /* -0.000869751 */,
PRESHIFT(0x00084000) /* 0.002014160 */,
PRESHIFT(0x00008000) /* 0.000122070 */ },
{ -PRESHIFT(0x00004000) /* -0.000061035 */, /* 13 */
-PRESHIFT(0x00055000) /* -0.001296997 */,
PRESHIFT(0x000bd000) /* 0.002883911 */,
-PRESHIFT(0x0054c000) /* -0.020690918 */,
PRESHIFT(0x0025d000) /* 0.009231567 */,
-PRESHIFT(0x02403000) /* -0.140670776 */,
-PRESHIFT(0x016ba000) /* -0.088775635 */,
-PRESHIFT(0x0e9be000) /* -0.913055420 */,
PRESHIFT(0x1082d000) /* 1.031936646 */,
PRESHIFT(0x038d4000) /* 0.221984863 */,
PRESHIFT(0x026e7000) /* 0.151962280 */,
PRESHIFT(0x0032e000) /* 0.012420654 */,
PRESHIFT(0x006df000) /* 0.026840210 */,
-PRESHIFT(0x00053000) /* -0.001266479 */,
PRESHIFT(0x0007d000) /* 0.001907349 */,
PRESHIFT(0x00007000) /* 0.000106812 */,
-PRESHIFT(0x00004000) /* -0.000061035 */,
-PRESHIFT(0x00055000) /* -0.001296997 */,
PRESHIFT(0x000bd000) /* 0.002883911 */,
-PRESHIFT(0x0054c000) /* -0.020690918 */,
PRESHIFT(0x0025d000) /* 0.009231567 */,
-PRESHIFT(0x02403000) /* -0.140670776 */,
-PRESHIFT(0x016ba000) /* -0.088775635 */,
-PRESHIFT(0x0e9be000) /* -0.913055420 */,
PRESHIFT(0x1082d000) /* 1.031936646 */,
PRESHIFT(0x038d4000) /* 0.221984863 */,
PRESHIFT(0x026e7000) /* 0.151962280 */,
PRESHIFT(0x0032e000) /* 0.012420654 */,
PRESHIFT(0x006df000) /* 0.026840210 */,
-PRESHIFT(0x00053000) /* -0.001266479 */,
PRESHIFT(0x0007d000) /* 0.001907349 */,
PRESHIFT(0x00007000) /* 0.000106812 */ },
{ -PRESHIFT(0x00004000) /* -0.000061035 */, /* 14 */
-PRESHIFT(0x0005b000) /* -0.001388550 */,
PRESHIFT(0x000b1000) /* 0.002700806 */,
-PRESHIFT(0x00594000) /* -0.021789551 */,
PRESHIFT(0x00192000) /* 0.006134033 */,
-PRESHIFT(0x024c8000) /* -0.143676758 */,
-PRESHIFT(0x01bf2000) /* -0.109161377 */,
-PRESHIFT(0x0ef69000) /* -0.935195923 */,
PRESHIFT(0x103be000) /* 1.014617920 */,
PRESHIFT(0x032b4000) /* 0.198059082 */,
PRESHIFT(0x026bc000) /* 0.151306152 */,
PRESHIFT(0x00221000) /* 0.008316040 */,
PRESHIFT(0x006a2000) /* 0.025909424 */,
-PRESHIFT(0x0006a000) /* -0.001617432 */,
PRESHIFT(0x00075000) /* 0.001785278 */,
PRESHIFT(0x00007000) /* 0.000106812 */,
-PRESHIFT(0x00004000) /* -0.000061035 */,
-PRESHIFT(0x0005b000) /* -0.001388550 */,
PRESHIFT(0x000b1000) /* 0.002700806 */,
-PRESHIFT(0x00594000) /* -0.021789551 */,
PRESHIFT(0x00192000) /* 0.006134033 */,
-PRESHIFT(0x024c8000) /* -0.143676758 */,
-PRESHIFT(0x01bf2000) /* -0.109161377 */,
-PRESHIFT(0x0ef69000) /* -0.935195923 */,
PRESHIFT(0x103be000) /* 1.014617920 */,
PRESHIFT(0x032b4000) /* 0.198059082 */,
PRESHIFT(0x026bc000) /* 0.151306152 */,
PRESHIFT(0x00221000) /* 0.008316040 */,
PRESHIFT(0x006a2000) /* 0.025909424 */,
-PRESHIFT(0x0006a000) /* -0.001617432 */,
PRESHIFT(0x00075000) /* 0.001785278 */,
PRESHIFT(0x00007000) /* 0.000106812 */ },
{ -PRESHIFT(0x00005000) /* -0.000076294 */, /* 15 */
-PRESHIFT(0x00061000) /* -0.001480103 */,
PRESHIFT(0x000a3000) /* 0.002487183 */,
-PRESHIFT(0x005da000) /* -0.022857666 */,
PRESHIFT(0x000b9000) /* 0.002822876 */,
-PRESHIFT(0x02571000) /* -0.146255493 */,
-PRESHIFT(0x0215c000) /* -0.130310059 */,
-PRESHIFT(0x0f4dc000) /* -0.956481934 */,
PRESHIFT(0x0ff0a000) /* 0.996246338 */,
PRESHIFT(0x02cbf000) /* 0.174789429 */,
PRESHIFT(0x0266e000) /* 0.150115967 */,
PRESHIFT(0x00120000) /* 0.004394531 */,
PRESHIFT(0x00662000) /* 0.024932861 */,
-PRESHIFT(0x0007f000) /* -0.001937866 */,
PRESHIFT(0x0006f000) /* 0.001693726 */,
PRESHIFT(0x00006000) /* 0.000091553 */,
-PRESHIFT(0x00005000) /* -0.000076294 */,
-PRESHIFT(0x00061000) /* -0.001480103 */,
PRESHIFT(0x000a3000) /* 0.002487183 */,
-PRESHIFT(0x005da000) /* -0.022857666 */,
PRESHIFT(0x000b9000) /* 0.002822876 */,
-PRESHIFT(0x02571000) /* -0.146255493 */,
-PRESHIFT(0x0215c000) /* -0.130310059 */,
-PRESHIFT(0x0f4dc000) /* -0.956481934 */,
PRESHIFT(0x0ff0a000) /* 0.996246338 */,
PRESHIFT(0x02cbf000) /* 0.174789429 */,
PRESHIFT(0x0266e000) /* 0.150115967 */,
PRESHIFT(0x00120000) /* 0.004394531 */,
PRESHIFT(0x00662000) /* 0.024932861 */,
-PRESHIFT(0x0007f000) /* -0.001937866 */,
PRESHIFT(0x0006f000) /* 0.001693726 */,
PRESHIFT(0x00006000) /* 0.000091553 */ },
{ -PRESHIFT(0x00005000) /* -0.000076294 */, /* 16 */
-PRESHIFT(0x00068000) /* -0.001586914 */,
PRESHIFT(0x00092000) /* 0.002227783 */,
-PRESHIFT(0x0061f000) /* -0.023910522 */,
-PRESHIFT(0x0002d000) /* -0.000686646 */,
-PRESHIFT(0x025ff000) /* -0.148422241 */,
-PRESHIFT(0x026f7000) /* -0.152206421 */,
-PRESHIFT(0x0fa13000) /* -0.976852417 */,
PRESHIFT(0x0fa13000) /* 0.976852417 */,
PRESHIFT(0x026f7000) /* 0.152206421 */,
PRESHIFT(0x025ff000) /* 0.148422241 */,
PRESHIFT(0x0002d000) /* 0.000686646 */,
PRESHIFT(0x0061f000) /* 0.023910522 */,
-PRESHIFT(0x00092000) /* -0.002227783 */,
PRESHIFT(0x00068000) /* 0.001586914 */,
PRESHIFT(0x00005000) /* 0.000076294 */,
-PRESHIFT(0x00005000) /* -0.000076294 */,
-PRESHIFT(0x00068000) /* -0.001586914 */,
PRESHIFT(0x00092000) /* 0.002227783 */,
-PRESHIFT(0x0061f000) /* -0.023910522 */,
-PRESHIFT(0x0002d000) /* -0.000686646 */,
-PRESHIFT(0x025ff000) /* -0.148422241 */,
-PRESHIFT(0x026f7000) /* -0.152206421 */,
-PRESHIFT(0x0fa13000) /* -0.976852417 */,
PRESHIFT(0x0fa13000) /* 0.976852417 */,
PRESHIFT(0x026f7000) /* 0.152206421 */,
PRESHIFT(0x025ff000) /* 0.148422241 */,
PRESHIFT(0x0002d000) /* 0.000686646 */,
PRESHIFT(0x0061f000) /* 0.023910522 */,
-PRESHIFT(0x00092000) /* -0.002227783 */,
PRESHIFT(0x00068000) /* 0.001586914 */,
PRESHIFT(0x00005000) /* 0.000076294 */ }

183
Libraries/MAD/Files/INSTALL Normal file
View File

@ -0,0 +1,183 @@
Basic Installation
==================
These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, a file
`config.cache' that saves the results of its tests to speed up
reconfiguring, and a file `config.log' containing compiler output
(useful mainly for debugging `configure').
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If at some point `config.cache'
contains results you don't want to keep, you may remove or edit it.
The file `configure.in' is used to create `configure' by a program
called `autoconf'. You only need `configure.in' if you want to change
it or regenerate `configure' using a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. You can give `configure'
initial values for variables by setting them in the environment. Using
a Bourne-compatible shell, you can do that on the command line like
this:
CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
Or on systems that have the `env' program, you can do it like this:
env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not supports the `VPATH'
variable, you have to compile the package for one architecture at a time
in the source code directory. After you have installed the package for
one architecture, use `make distclean' before reconfiguring for another
architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PATH'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PATH', the package will use
PATH as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=PATH' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' can not figure out
automatically, but needs to determine by the type of host the package
will run on. Usually `configure' can figure that out, but if it prints
a message saying it can not guess the host type, give it the
`--host=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name with three fields:
CPU-COMPANY-SYSTEM
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the host type.
If you are building compiler tools for cross-compiling, you can also
use the `--target=TYPE' option to select the type of system they will
produce code for and the `--build=TYPE' option to select the type of
system on which you are compiling the package.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Operation Controls
==================
`configure' recognizes the following options to control how it
operates.
`--cache-file=FILE'
Use and save the results of the tests in FILE instead of
`./config.cache'. Set FILE to `/dev/null' to disable caching, for
debugging `configure'.
`--help'
Print a summary of the options to `configure', and exit.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--version'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`configure' also accepts some other, not widely useful, options.

View File

@ -0,0 +1,140 @@
##
## libmad - MPEG audio decoder library
## Copyright (C) 2000-2004 Underbit Technologies, Inc.
##
## 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
##
## $Id: Makefile.am,v 1.23 2004/02/17 02:02:03 rob Exp $
##
## Process this file with automake to produce Makefile.in
SUBDIRS =
DIST_SUBDIRS = msvc++
lib_LTLIBRARIES = libmad.la
include_HEADERS = mad.h
EXTRA_PROGRAMS = minimad
minimad_SOURCES = minimad.c
minimad_INCLUDES =
minimad_LDADD = libmad.la
EXTRA_DIST = mad.h.sed \
CHANGES COPYRIGHT CREDITS README TODO VERSION
exported_headers = version.h fixed.h bit.h timer.h stream.h frame.h \
synth.h decoder.h
headers = $(exported_headers) \
global.h layer12.h layer3.h huffman.h
data_includes = D.dat imdct_s.dat qc_table.dat rq_table.dat \
sf_table.dat
libmad_la_SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c \
synth.c decoder.c layer12.c layer3.c huffman.c \
$(headers) $(data_includes)
EXTRA_libmad_la_SOURCES = imdct_l_arm.S #synth_mmx.S
libmad_la_DEPENDENCIES = @ASO_OBJS@
libmad_la_LIBADD = @ASO_OBJS@
INCLUDES = $(FPM) $(ASO)
BUILT_SOURCES = mad.h
CLEANFILES = mad.h
## From the libtool documentation on library versioning:
##
## CURRENT
## The most recent interface number that this library implements.
##
## REVISION
## The implementation number of the CURRENT interface.
##
## AGE
## The difference between the newest and oldest interfaces that this
## library implements. In other words, the library implements all the
## interface numbers in the range from number `CURRENT - AGE' to
## `CURRENT'.
##
## If two libraries have identical CURRENT and AGE numbers, then the
## dynamic linker chooses the library with the greater REVISION number.
##
## 1. Start with version information of `0:0:0' for each libtool library.
##
## 2. Update the version information only immediately before a public
## release of your software. More frequent updates are unnecessary,
## and only guarantee that the current interface number gets larger
## faster.
##
## 3. If the library source code has changed at all since the last
## update, then increment REVISION (`C:R:A' becomes `C:r+1:A').
##
## 4. If any interfaces have been added, removed, or changed since the
## last update, increment CURRENT, and set REVISION to 0.
##
## 5. If any interfaces have been added since the last public release,
## then increment AGE.
##
## 6. If any interfaces have been removed since the last public release,
## then set AGE to 0.
version_current = 2
version_revision = 1
version_age = 2
version_info = $(version_current):$(version_revision):$(version_age)
libmad_la_LDFLAGS = -version-info $(version_info)
mad.h: config.status config.h Makefile.am \
$(srcdir)/COPYRIGHT $(srcdir)/mad.h.sed $(exported_headers)
(sed -e '1s|.*|/*|' -e '1b' -e '$$s|.*| */|' -e '$$b' \
-e 's/^.*/ *&/' $(srcdir)/COPYRIGHT; echo; \
echo "# ifdef __cplusplus"; \
echo 'extern "C" {'; \
echo "# endif"; echo; \
if [ ".$(FPM)" != "." ]; then \
echo ".$(FPM)" | sed -e 's|^\.-D|# define |'; echo; \
fi; \
sed -ne 's/^# *define *\(HAVE_.*_ASM\).*/# define \1/p' \
config.h; echo; \
sed -ne 's/^# *define *OPT_\(SPEED\|ACCURACY\).*/# define OPT_\1/p' \
config.h; echo; \
sed -ne 's/^# *define *\(SIZEOF_.*\)/# define \1/p' \
config.h; echo; \
for header in $(exported_headers); do \
echo; \
sed -n -f $(srcdir)/mad.h.sed $(srcdir)/$$header; \
done; echo; \
echo "# ifdef __cplusplus"; \
echo '}'; \
echo "# endif") >$@
libtool: $(LIBTOOL_DEPS)
$(SHELL) ./config.status --recheck
.c.s:
$(COMPILE) -S $<
again:
$(MAKE) clean
$(MAKE)
.PHONY: again

View File

@ -0,0 +1,821 @@
# Makefile.in generated by automake 1.8.2 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
SOURCES = $(libmad_la_SOURCES) $(EXTRA_libmad_la_SOURCES) $(minimad_SOURCES)
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
host_triplet = @host@
EXTRA_PROGRAMS = minimad$(EXEEXT)
DIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \
$(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/config.h.in $(srcdir)/libmad.list.in \
$(top_srcdir)/configure COPYING INSTALL TODO config.guess \
config.sub depcomp install-sh ltmain.sh missing mkinstalldirs
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno configure.status.lineno
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_HEADER = config.h
CONFIG_CLEAN_FILES = libmad.list
am__installdirs = $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
am__objects_1 =
am__objects_2 = $(am__objects_1)
am_libmad_la_OBJECTS = version.lo fixed.lo bit.lo timer.lo stream.lo \
frame.lo synth.lo decoder.lo layer12.lo layer3.lo huffman.lo \
$(am__objects_2) $(am__objects_1)
libmad_la_OBJECTS = $(am_libmad_la_OBJECTS)
am_minimad_OBJECTS = minimad.$(OBJEXT)
minimad_OBJECTS = $(am_minimad_OBJECTS)
minimad_DEPENDENCIES = libmad.la
DEFAULT_INCLUDES = -I. -I$(srcdir) -I.
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/bit.Plo ./$(DEPDIR)/decoder.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/fixed.Plo ./$(DEPDIR)/frame.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/huffman.Plo ./$(DEPDIR)/layer12.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/layer3.Plo ./$(DEPDIR)/minimad.Po \
@AMDEP_TRUE@ ./$(DEPDIR)/stream.Plo ./$(DEPDIR)/synth.Plo \
@AMDEP_TRUE@ ./$(DEPDIR)/timer.Plo ./$(DEPDIR)/version.Plo
CCASCOMPILE = $(CCAS) $(AM_CCASFLAGS) $(CCASFLAGS)
LTCCASCOMPILE = $(LIBTOOL) --mode=compile $(CCAS) $(AM_CCASFLAGS) \
$(CCASFLAGS)
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libmad_la_SOURCES) $(EXTRA_libmad_la_SOURCES) \
$(minimad_SOURCES)
DIST_SOURCES = $(libmad_la_SOURCES) $(EXTRA_libmad_la_SOURCES) \
$(minimad_SOURCES)
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-exec-recursive install-info-recursive \
install-recursive installcheck-recursive installdirs-recursive \
pdf-recursive ps-recursive uninstall-info-recursive \
uninstall-recursive
includeHEADERS_INSTALL = $(INSTALL_HEADER)
HEADERS = $(include_HEADERS)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
{ test ! -d $(distdir) \
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -fr $(distdir); }; }
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
ASO = @ASO@
ASO_OBJS = @ASO_OBJS@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCAS = @CCAS@
CCASFLAGS = @CCASFLAGS@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
FPM = @FPM@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
SUBDIRS =
DIST_SUBDIRS = msvc++
lib_LTLIBRARIES = libmad.la
include_HEADERS = mad.h
minimad_SOURCES = minimad.c
minimad_INCLUDES =
minimad_LDADD = libmad.la
EXTRA_DIST = mad.h.sed \
CHANGES COPYRIGHT CREDITS README TODO VERSION
exported_headers = version.h fixed.h bit.h timer.h stream.h frame.h \
synth.h decoder.h
headers = $(exported_headers) \
global.h layer12.h layer3.h huffman.h
data_includes = D.dat imdct_s.dat qc_table.dat rq_table.dat \
sf_table.dat
libmad_la_SOURCES = version.c fixed.c bit.c timer.c stream.c frame.c \
synth.c decoder.c layer12.c layer3.c huffman.c \
$(headers) $(data_includes)
EXTRA_libmad_la_SOURCES = imdct_l_arm.S #synth_mmx.S
libmad_la_DEPENDENCIES = @ASO_OBJS@
libmad_la_LIBADD = @ASO_OBJS@
INCLUDES = $(FPM) $(ASO)
BUILT_SOURCES = mad.h
CLEANFILES = mad.h
version_current = 2
version_revision = 1
version_age = 2
version_info = $(version_current):$(version_revision):$(version_age)
libmad_la_LDFLAGS = -version-info $(version_info)
all: $(BUILT_SOURCES) config.h
$(MAKE) $(AM_MAKEFLAGS) all-recursive
.SUFFIXES:
.SUFFIXES: .S .c .lo .o .obj .s
am--refresh:
@:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
cd $(srcdir) && $(AUTOMAKE) --foreign \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --foreign Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
echo ' $(SHELL) ./config.status'; \
$(SHELL) ./config.status;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(top_srcdir)/configure: $(am__configure_deps)
cd $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
config.h: stamp-h1
@if test ! -f $@; then \
rm -f stamp-h1; \
$(MAKE) stamp-h1; \
else :; fi
stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
@rm -f stamp-h1
cd $(top_builddir) && $(SHELL) ./config.status config.h
$(srcdir)/config.h.in: $(am__configure_deps)
cd $(top_srcdir) && $(AUTOHEADER)
rm -f stamp-h1
touch $@
distclean-hdr:
-rm -f config.h stamp-h1
libmad.list: $(top_builddir)/config.status $(srcdir)/libmad.list.in
cd $(top_builddir) && $(SHELL) ./config.status $@
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
$(mkdir_p) $(DESTDIR)$(libdir)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f"; \
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(libdir)/$$f; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
p="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p"; \
$(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(libdir)/$$p; \
done
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
test "$$dir" = "$$p" && dir=.; \
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
libmad.la: $(libmad_la_OBJECTS) $(libmad_la_DEPENDENCIES)
$(LINK) -rpath $(libdir) $(libmad_la_LDFLAGS) $(libmad_la_OBJECTS) $(libmad_la_LIBADD) $(LIBS)
minimad$(EXEEXT): $(minimad_OBJECTS) $(minimad_DEPENDENCIES)
@rm -f minimad$(EXEEXT)
$(LINK) $(minimad_LDFLAGS) $(minimad_OBJECTS) $(minimad_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bit.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/decoder.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fixed.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/frame.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/huffman.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer12.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/layer3.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/minimad.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stream.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/synth.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timer.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Plo@am__quote@
.S.o:
$(CCASCOMPILE) -c $<
.S.obj:
$(CCASCOMPILE) -c `$(CYGPATH_W) '$<'`
.S.lo:
$(LTCCASCOMPILE) -c -o $@ $<
.c.o:
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
.c.obj:
@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL)
$(mkdir_p) $(DESTDIR)$(includedir)
@list='$(include_HEADERS)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " $(includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(includedir)/$$f"; \
$(includeHEADERS_INSTALL) $$d$$p $(DESTDIR)$(includedir)/$$f; \
done
uninstall-includeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(include_HEADERS)'; for p in $$list; do \
f="`echo $$p | sed -e 's|^.*/||'`"; \
echo " rm -f $(DESTDIR)$(includedir)/$$f"; \
rm -f $(DESTDIR)$(includedir)/$$f; \
done
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@set fnord $$MAKEFLAGS; amf=$$2; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
@set fnord $$MAKEFLAGS; amf=$$2; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
if (etags --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
else \
include_option=--include; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -f $$subdir/TAGS && \
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(ETAGS_ARGS)$$tags$$unique" \
|| $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(am__remove_distdir)
mkdir $(distdir)
$(mkdir_p) $(distdir)/.
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| mkdir "$(distdir)/$$subdir" \
|| exit 1; \
(cd $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="../$(top_distdir)" \
distdir="../$(distdir)/$$subdir" \
distdir) \
|| exit 1; \
fi; \
done
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r $(distdir)
dist-gzip: distdir
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
dist-bzip2: distdir
$(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-tarZ: distdir
$(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z
$(am__remove_distdir)
dist-shar: distdir
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
$(am__remove_distdir)
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
$(am__remove_distdir)
dist dist-all: distdir
$(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\
*.tar.bz2*) \
bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\
*.shar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& cd $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
distuninstallcheck \
&& chmod -R a-w "$$dc_install_base" \
&& ({ \
(cd ../.. && $(mkdir_p) "$$dc_destdir") \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
} || { rm -rf "$$dc_destdir"; exit 1; }) \
&& rm -rf "$$dc_destdir" \
&& $(MAKE) $(AM_MAKEFLAGS) dist \
&& rm -rf $(DIST_ARCHIVES) \
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
$(am__remove_distdir)
@(echo "$(distdir) archives ready for distribution: "; \
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
distuninstallcheck:
@cd $(distuninstallcheck_dir) \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
fi ; \
$(distuninstallcheck_listfiles) ; \
exit 1; } >&2
distcleancheck: distclean
@if test '$(srcdir)' = . ; then \
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
exit 1 ; \
fi
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left in build directory after distclean:" ; \
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
check: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) check-recursive
all-am: Makefile $(LTLIBRARIES) $(HEADERS) config.h
installdirs: installdirs-recursive
installdirs-am:
$(mkdir_p) $(DESTDIR)$(libdir) $(DESTDIR)$(includedir)
install: $(BUILT_SOURCES)
$(MAKE) $(AM_MAKEFLAGS) install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES)
clean: clean-recursive
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
mostlyclean-am
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-hdr distclean-libtool distclean-tags
dvi: dvi-recursive
dvi-am:
html: html-recursive
info: info-recursive
info-am:
install-data-am: install-includeHEADERS
install-exec-am: install-libLTLIBRARIES
install-info: install-info-recursive
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-recursive
pdf-am:
ps: ps-recursive
ps-am:
uninstall-am: uninstall-includeHEADERS uninstall-info-am \
uninstall-libLTLIBRARIES
uninstall-info: uninstall-info-recursive
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
check-am clean clean-generic clean-libLTLIBRARIES \
clean-libtool clean-recursive ctags ctags-recursive dist \
dist-all dist-bzip2 dist-gzip dist-shar dist-tarZ dist-zip \
distcheck distclean distclean-compile distclean-generic \
distclean-hdr distclean-libtool distclean-recursive \
distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-exec install-exec-am \
install-includeHEADERS install-info install-info-am \
install-libLTLIBRARIES install-man install-strip installcheck \
installcheck-am installdirs installdirs-am maintainer-clean \
maintainer-clean-generic maintainer-clean-recursive \
mostlyclean mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
tags tags-recursive uninstall uninstall-am \
uninstall-includeHEADERS uninstall-info-am \
uninstall-libLTLIBRARIES
mad.h: config.status config.h Makefile.am \
$(srcdir)/COPYRIGHT $(srcdir)/mad.h.sed $(exported_headers)
(sed -e '1s|.*|/*|' -e '1b' -e '$$s|.*| */|' -e '$$b' \
-e 's/^.*/ *&/' $(srcdir)/COPYRIGHT; echo; \
echo "# ifdef __cplusplus"; \
echo 'extern "C" {'; \
echo "# endif"; echo; \
if [ ".$(FPM)" != "." ]; then \
echo ".$(FPM)" | sed -e 's|^\.-D|# define |'; echo; \
fi; \
sed -ne 's/^# *define *\(HAVE_.*_ASM\).*/# define \1/p' \
config.h; echo; \
sed -ne 's/^# *define *OPT_\(SPEED\|ACCURACY\).*/# define OPT_\1/p' \
config.h; echo; \
sed -ne 's/^# *define *\(SIZEOF_.*\)/# define \1/p' \
config.h; echo; \
for header in $(exported_headers); do \
echo; \
sed -n -f $(srcdir)/mad.h.sed $(srcdir)/$$header; \
done; echo; \
echo "# ifdef __cplusplus"; \
echo '}'; \
echo "# endif") >$@
libtool: $(LIBTOOL_DEPS)
$(SHELL) ./config.status --recheck
.c.s:
$(COMPILE) -S $<
again:
$(MAKE) clean
$(MAKE)
.PHONY: again
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

241
Libraries/MAD/Files/README Normal file
View File

@ -0,0 +1,241 @@
libmad - MPEG audio decoder library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: README,v 1.4 2004/01/23 09:41:32 rob Exp $
===============================================================================
INTRODUCTION
MAD (libmad) is a high-quality MPEG audio decoder. It currently supports
MPEG-1 and the MPEG-2 extension to Lower Sampling Frequencies, as well as
the so-called MPEG 2.5 format. All three audio layers (Layer I, Layer II,
and Layer III a.k.a. MP3) are fully implemented.
MAD does not yet support MPEG-2 multichannel audio (although it should be
backward compatible with such streams) nor does it currently support AAC.
MAD has the following special features:
- 24-bit PCM output
- 100% fixed-point (integer) computation
- completely new implementation based on the ISO/IEC standards
- distributed under the terms of the GNU General Public License (GPL)
Because MAD provides full 24-bit PCM output, applications using MAD are
able to produce high quality audio. Even when the output device supports
only 16-bit PCM, applications can use the extra resolution to increase the
audible dynamic range through the use of dithering or noise shaping.
Because MAD uses integer computation rather than floating point, it is
well suited for architectures without a floating point unit. All
calculations are performed with a 32-bit fixed-point integer
representation.
Because MAD is a new implementation of the ISO/IEC standards, it is
unencumbered by the errors of other implementations. MAD is NOT a
derivation of the ISO reference source or any other code. Considerable
effort has been expended to ensure a correct implementation, even in cases
where the standards are ambiguous or misleading.
Because MAD is distributed under the terms of the GPL, its redistribution
is not generally restricted, so long as the terms of the GPL are followed.
This means MAD can be incorporated into other software as long as that
software is also distributed under the GPL. (Should this be undesirable,
alternate arrangements may be possible by contacting Underbit.)
===============================================================================
ABOUT THE CODE
The code is optimized and performs very well, although specific
improvements can still be made. The output from the decoder library
consists of 32-bit signed linear fixed-point values that can be easily
scaled for any size PCM output, up to 24 bits per sample.
The API for libmad can be found in the `mad.h' header file. Note that this
file is automatically generated, and will not exist until after you have
built the library.
There are two APIs available, one high-level, and the other low-level.
With the low-level API, each step of the decoding process must be handled
explicitly, offering the greatest amount of control. With the high-level
API, after callbacks are configured, a single routine will decode an
entire bitstream.
The high-level API may either be used synchronously or asynchronously. If
used asynchronously, decoding will occur in a separate process.
Communication is possible with the decoding process by passing control
messages.
The file `minimad.c' contains an example usage of the libmad API that
shows only the bare minimum required to implement a useful decoder. It
expects a regular file to be redirected to standard input, and it sends
decoded 16-bit signed little-endian PCM samples to standard output. If a
decoding error occurs, it is reported to standard error and decoding
continues. Note that the scale() routine in this code is only provided as
an example; it rounds MAD's high-resolution samples down to 16 bits, but
does not perform any dithering or noise shaping. It is therefore not
recommended to use this routine as-is in your own code if sound quality is
important.
Integer Performance
To get the best possible performance, it is recommended that an assembly
version of the fixed-point multiply and related routines be selected.
Several such assembly routines have been written for various CPUs.
If an assembly version is not available, a fast approximation version will
be used. This will result in reduced accuracy of the decoder.
Alternatively, if 64-bit integers are supported as a datatype by the
compiler, another version can be used that is much more accurate.
However, using an assembly version is generally much faster and just as
accurate.
More information can be gathered from the `fixed.h' header file.
MAD's CPU-intensive subband synthesis routine can be further optimized at
the expense of a slight loss in output accuracy due to a modified method
for fixed-point multiplication with a small windowing constant. While this
is helpful for performance and the output accuracy loss is generally
undetectable, it is disabled by default and must be explicitly enabled.
Under some architectures, other special optimizations may also be
available.
Audio Quality
The output from MAD has been found to satisfy the ISO/IEC 11172-4
computational accuracy requirements for compliance. In most
configurations, MAD is a Full Layer III ISO/IEC 11172-3 audio decoder as
defined by the standard.
When the approximation version of the fixed-point multiply is used, MAD is
a limited accuracy ISO/IEC 11172-3 audio decoder as defined by the
standard.
MAD can alternatively be configured to produce output with less or more
accuracy than the default, as a tradeoff with performance.
MAD produces output samples with a precision greater than 24 bits. Because
most output formats use fewer bits, typically 16, it is recommended that a
dithering algorithm be used (rather than rounding or truncating) to obtain
the highest quality audio. However, dithering may unfavorably affect an
analytic examination of the output (such as compliance testing); you may
therefore wish to use rounding in this case instead.
Portability Issues
GCC is preferred to compile the code, but other compilers may also work.
The assembly code in `fixed.h' depends on the inline assembly features of
your compiler. If you're not using GCC or MSVC++, you can either write
your own assembly macros or use the default (low quality output) version.
The union initialization of `huffman.c' may not be portable to all
platforms when GCC is not used.
The code should not be sensitive to word sizes or byte ordering, however
it does assume A % B has the same sign as A.
===============================================================================
BUILDING AND INSTALLING
Windows Platforms
MAD can be built under Windows using either MSVC++ or Cygwin. A MSVC++
project file can be found under the `msvc++' subdirectory.
To build libmad using Cygwin, you will first need to install the Cygwin
tools:
http://www.cygwin.com/
You may then proceed with the following POSIX instructions within the
Cygwin shell.
Note that by default Cygwin will build a library that depends on the
Cygwin DLL. You can use MinGW to build a library that does not depend on
the Cygwin DLL. To do so, give the option --host=mingw32 to `configure'.
POSIX Platforms (including Cygwin)
The code is distributed with a `configure' script that will generate for
you a `Makefile' and a `config.h' for your platform. See the file
`INSTALL' for generic instructions.
The specific options you may want to give `configure' are:
--enable-speed optimize for speed over accuracy
--enable-accuracy optimize for accuracy over speed
--disable-debugging do not compile with debugging support, and
use more optimizations
--disable-shared do not build a shared library
Note that you need not specify one of --enable-speed or --enable-accuracy;
in its default configuration, MAD is optimized for both. You should only
use one of these options if you wish to compromise speed or accuracy for
the other.
By default the package will build a shared library if possible for your
platform. If you want only a static library, use --disable-shared.
It is not normally necessary to use the following options, but you may
fine-tune the configuration with them if desired:
--enable-fpm=ARCH use the ARCH-specific version of the
fixed-point math assembly routines
(current options are: intel, arm, mips,
sparc, ppc; also allowed are: 64bit, approx)
--enable-sso use the subband synthesis optimization,
with reduced accuracy
--disable-aso do not use certain architecture-specific
optimizations
By default an appropriate fixed-point assembly routine will be selected
for the configured host type, if it can be determined. Thus if you are
cross-compiling for another architecture, you should be sure either to
give `configure' a host type argument (--host) or to use an explicit
--enable-fpm option.
If an appropriate assembly routine cannot be determined, the default
approximation version will be used. In this case, use of an alternate
--enable-fpm is highly recommended.
Experimenting and Developing
Further options for `configure' that may be useful to developers and
experimenters are:
--enable-debugging enable diagnostic debugging support and
debugging symbols
--enable-profiling generate `gprof' profiling code
--enable-experimental enable code using the EXPERIMENTAL
preprocessor define
===============================================================================
COPYRIGHT
Please read the `COPYRIGHT' file for copyright and warranty information.
Also, the file `COPYING' contains the full text of the GNU GPL.
Send inquiries, comments, bug reports, suggestions, patches, etc. to:
Underbit Technologies, Inc. <support@underbit.com>
See also the MAD home page on the Web:
http://www.underbit.com/products/mad/
===============================================================================

69
Libraries/MAD/Files/TODO Normal file
View File

@ -0,0 +1,69 @@
libmad - MPEG audio decoder library
Copyright (C) 2000-2004 Underbit Technologies, Inc.
$Id: TODO,v 1.3 2004/02/05 09:02:39 rob Exp $
===============================================================================
libmad:
- more API layers (buffering, PCM samples, dithering, etc.)
- x86 performance optimization compiler flags
- function documentation, general docs
- finish async API
- parse system streams?
- MPEG-2 MC, AAC?
- logarithmic multiplication?
- multiple frame decoding for better locality of reference?
- frame serial numbers, Layer III frame continuity checks
fixed.h:
- experiment with FPM_INTEL:
# if 1
# define mad_f_scale64(hi, lo) \
({ mad_fixed_t __result; \
asm ("shrl %3,%1\n\t" \
"shll %4,%2\n\t" \
"orl %2,%1" \
: "=rm" (__result) \
: "0" (lo), "r" (hi), \
"I" (MAD_F_SCALEBITS), "I" (32 - MAD_F_SCALEBITS) \
: "cc"); \
__result; \
})
# else
# define mad_f_scale64(hi, lo) \
({ mad_fixed64hi_t __hi_; \
mad_fixed64lo_t __lo_; \
mad_fixed_t __result; \
asm ("sall %2,%1" \
: "=r" (__hi_) \
: "0" (hi), "I" (32 - MAD_F_SCALEBITS) \
: "cc"); \
asm ("shrl %2,%1" \
: "=r" (__lo_) \
: "0" (lo), "I" (MAD_F_SCALEBITS) \
: "cc"); \
asm ("orl %1,%2" \
: "=rm" (__result) \
: "r" (__hi_), "0" (__lo_) \
: "cc"); \
__result; \
})
# endif
libmad Layer I:
- check frame length sanity
libmad Layer II:
- check frame length sanity
libmad Layer III:
- circular buffer
- optimize zero_part from Huffman decoding throughout
- MPEG 2.5 8000 Hz sf bands? mixed blocks?
- stereo->mono conversion optimization?
- enable frame-at-a-time decoding
- improve portability of huffman.c

View File

@ -0,0 +1,7 @@
0.15.1b
configure.ac:24
version.h:25-28
msvc++/config.h:99,105,120
msvc++/mad.h:41-44
Makefile.am:98-100

6849
Libraries/MAD/Files/aclocal.m4 vendored Normal file

File diff suppressed because it is too large Load Diff

237
Libraries/MAD/Files/bit.c Normal file
View File

@ -0,0 +1,237 @@
/*
* libmad - MPEG audio decoder library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: bit.c,v 1.12 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# ifdef HAVE_LIMITS_H
# include <limits.h>
# else
# define CHAR_BIT 8
# endif
# include "bit.h"
/*
* This is the lookup table for computing the CRC-check word.
* As described in section 2.4.3.1 and depicted in Figure A.9
* of ISO/IEC 11172-3, the generator polynomial is:
*
* G(X) = X^16 + X^15 + X^2 + 1
*/
static
unsigned short const crc_table[256] = {
0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
};
# define CRC_POLY 0x8005
/*
* NAME: bit->init()
* DESCRIPTION: initialize bit pointer struct
*/
void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte)
{
bitptr->byte = byte;
bitptr->cache = 0;
bitptr->left = CHAR_BIT;
}
/*
* NAME: bit->length()
* DESCRIPTION: return number of bits between start and end points
*/
unsigned int mad_bit_length(struct mad_bitptr const *begin,
struct mad_bitptr const *end)
{
return begin->left +
CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left);
}
/*
* NAME: bit->nextbyte()
* DESCRIPTION: return pointer to next unprocessed byte
*/
unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr)
{
return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1;
}
/*
* NAME: bit->skip()
* DESCRIPTION: advance bit pointer
*/
void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len)
{
bitptr->byte += len / CHAR_BIT;
bitptr->left -= len % CHAR_BIT;
if (bitptr->left > CHAR_BIT) {
bitptr->byte++;
bitptr->left += CHAR_BIT;
}
if (bitptr->left < CHAR_BIT)
bitptr->cache = *bitptr->byte;
}
/*
* NAME: bit->read()
* DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value
*/
unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len)
{
register unsigned long value;
if (bitptr->left == CHAR_BIT)
bitptr->cache = *bitptr->byte;
if (len < bitptr->left) {
value = (bitptr->cache & ((1 << bitptr->left) - 1)) >>
(bitptr->left - len);
bitptr->left -= len;
return value;
}
/* remaining bits in current byte */
value = bitptr->cache & ((1 << bitptr->left) - 1);
len -= bitptr->left;
bitptr->byte++;
bitptr->left = CHAR_BIT;
/* more bytes */
while (len >= CHAR_BIT) {
value = (value << CHAR_BIT) | *bitptr->byte++;
len -= CHAR_BIT;
}
if (len > 0) {
bitptr->cache = *bitptr->byte;
value = (value << len) | (bitptr->cache >> (CHAR_BIT - len));
bitptr->left -= len;
}
return value;
}
# if 0
/*
* NAME: bit->write()
* DESCRIPTION: write an arbitrary number of bits
*/
void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len,
unsigned long value)
{
unsigned char *ptr;
ptr = (unsigned char *) bitptr->byte;
/* ... */
}
# endif
/*
* NAME: bit->crc()
* DESCRIPTION: compute CRC-check word
*/
unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len,
unsigned short init)
{
register unsigned int crc;
for (crc = init; len >= 32; len -= 32) {
register unsigned long data;
data = mad_bit_read(&bitptr, 32);
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff];
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff];
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff];
crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff];
}
switch (len / 8) {
case 3: crc = (crc << 8) ^
crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
case 2: crc = (crc << 8) ^
crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
case 1: crc = (crc << 8) ^
crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
len %= 8;
case 0: break;
}
while (len--) {
register unsigned int msb;
msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15);
crc <<= 1;
if (msb & 1)
crc ^= CRC_POLY;
}
return crc & 0xffff;
}

47
Libraries/MAD/Files/bit.h Normal file
View File

@ -0,0 +1,47 @@
/*
* libmad - MPEG audio decoder library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: bit.h,v 1.12 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBMAD_BIT_H
# define LIBMAD_BIT_H
struct mad_bitptr {
unsigned char const *byte;
unsigned short cache;
unsigned short left;
};
void mad_bit_init(struct mad_bitptr *, unsigned char const *);
# define mad_bit_finish(bitptr) /* nothing */
unsigned int mad_bit_length(struct mad_bitptr const *,
struct mad_bitptr const *);
# define mad_bit_bitsleft(bitptr) ((bitptr)->left)
unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *);
void mad_bit_skip(struct mad_bitptr *, unsigned int);
unsigned long mad_bit_read(struct mad_bitptr *, unsigned int);
void mad_bit_write(struct mad_bitptr *, unsigned int, unsigned long);
unsigned short mad_bit_crc(struct mad_bitptr, unsigned int, unsigned short);
# endif

1432
Libraries/MAD/Files/config.guess vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,136 @@
/* config.h. Generated by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to enable diagnostic debugging support. */
/* #undef DEBUG */
/* Define to enable experimental code. */
/* #undef EXPERIMENTAL */
/* Define to 1 if you have the <assert.h> header file. */
#define HAVE_ASSERT_H 1
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the <errno.h> header file. */
#define HAVE_ERRNO_H 1
/* Define to 1 if you have the `fcntl' function. */
#define HAVE_FCNTL 1
/* Define to 1 if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define to 1 if you have the `fork' function. */
#define HAVE_FORK 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
/* Define if your MIPS CPU supports a 2-operand MADD16 instruction. */
/* #undef HAVE_MADD16_ASM */
/* Define if your MIPS CPU supports a 2-operand MADD instruction. */
/* #undef HAVE_MADD_ASM */
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the `pipe' function. */
#define HAVE_PIPE 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
#define HAVE_SYS_WAIT_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if you have the `waitpid' function. */
#define HAVE_WAITPID 1
/* Define to disable debugging assertions. */
/* #undef NDEBUG */
/* Define to optimize for accuracy over speed. */
/* #undef OPT_ACCURACY */
/* Define to optimize for speed over accuracy. */
/* #undef OPT_SPEED */
/* Define to enable a fast subband synthesis approximation optimization. */
/* #undef OPT_SSO */
/* Define to influence a strict interpretation of the ISO/IEC standards, even
if this is in opposition with best accepted practices. */
/* #undef OPT_STRICT */
/* Name of package */
#define PACKAGE "libmad"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "support@underbit.com"
/* Define to the full name of this package. */
#define PACKAGE_NAME "MPEG Audio Decoder"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "MPEG Audio Decoder 0.15.1b"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "libmad"
/* Define to the version of this package. */
#define PACKAGE_VERSION "0.15.1b"
/* The size of a `int', as computed by sizeof. */
#define SIZEOF_INT 4
/* The size of a `long', as computed by sizeof. */
#define SIZEOF_LONG 4
/* The size of a `long long', as computed by sizeof. */
#define SIZEOF_LONG_LONG 8
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Version number of package */
#define VERSION "0.15.1b"
/* Define to 1 if your processor stores words with the most significant byte
first (like Motorola and SPARC, unlike Intel and VAX). */
#define WORDS_BIGENDIAN 1
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
/* Define to `int' if <sys/types.h> does not define. */
/* #undef pid_t */

View File

@ -0,0 +1,135 @@
/* config.h.in. Generated from configure.ac by autoheader. */
/* Define to enable diagnostic debugging support. */
#undef DEBUG
/* Define to enable experimental code. */
#undef EXPERIMENTAL
/* Define to 1 if you have the <assert.h> header file. */
#undef HAVE_ASSERT_H
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the <errno.h> header file. */
#undef HAVE_ERRNO_H
/* Define to 1 if you have the `fcntl' function. */
#undef HAVE_FCNTL
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define to 1 if you have the `fork' function. */
#undef HAVE_FORK
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Define to 1 if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
/* Define if your MIPS CPU supports a 2-operand MADD16 instruction. */
#undef HAVE_MADD16_ASM
/* Define if your MIPS CPU supports a 2-operand MADD instruction. */
#undef HAVE_MADD_ASM
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `pipe' function. */
#undef HAVE_PIPE
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */
#undef HAVE_SYS_WAIT_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the `waitpid' function. */
#undef HAVE_WAITPID
/* Define to disable debugging assertions. */
#undef NDEBUG
/* Define to optimize for accuracy over speed. */
#undef OPT_ACCURACY
/* Define to optimize for speed over accuracy. */
#undef OPT_SPEED
/* Define to enable a fast subband synthesis approximation optimization. */
#undef OPT_SSO
/* Define to influence a strict interpretation of the ISO/IEC standards, even
if this is in opposition with best accepted practices. */
#undef OPT_STRICT
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* The size of a `int', as computed by sizeof. */
#undef SIZEOF_INT
/* The size of a `long', as computed by sizeof. */
#undef SIZEOF_LONG
/* The size of a `long long', as computed by sizeof. */
#undef SIZEOF_LONG_LONG
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Version number of package */
#undef VERSION
/* Define to 1 if your processor stores words with the most significant byte
first (like Motorola and SPARC, unlike Intel and VAX). */
#undef WORDS_BIGENDIAN
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
/* Define to `int' if <sys/types.h> does not define. */
#undef pid_t

1537
Libraries/MAD/Files/config.sub vendored Executable file

File diff suppressed because it is too large Load Diff

23106
Libraries/MAD/Files/configure vendored Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,433 @@
dnl -*- m4 -*-
dnl
dnl libmad - MPEG audio decoder library
dnl Copyright (C) 2000-2004 Underbit Technologies, Inc.
dnl
dnl This program is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 2 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; if not, write to the Free Software
dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
dnl
AC_REVISION([$Id: configure.ac,v 1.9 2004/01/23 09:41:32 rob Exp $])dnl
dnl Process this file with autoconf to produce a configure script.
AC_INIT([MPEG Audio Decoder], [0.15.1b], [support@underbit.com], [libmad])
AC_PREREQ(2.53)
AC_CONFIG_SRCDIR([decoder.h])
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER([config.h])
dnl System type.
AC_CANONICAL_HOST
dnl Checks for programs.
AC_PROG_CC
AM_PROG_AS
if test "$GCC" = yes
then
case "$host" in
*-*-mingw*)
case "$build" in
*-*-cygwin*)
CPPFLAGS="$CPPFLAGS -mno-cygwin"
LDFLAGS="$LDFLAGS -mno-cygwin"
;;
esac
esac
dnl case "$host" in
dnl *-*-cygwin* | *-*-mingw*)
dnl LDFLAGS="$LDFLAGS -no-undefined -mdll"
dnl ;;
dnl esac
fi
dnl Support for libtool.
dnl AC_DISABLE_SHARED
dnl AC_LIBTOOL_WIN32_DLL
AC_PROG_LIBTOOL
AC_SUBST(LIBTOOL_DEPS)
dnl Compiler options.
arch=""
debug=""
optimize=""
profile=""
set -- $CFLAGS
CFLAGS=""
if test "$GCC" = yes
then
CFLAGS="-Wall"
fi
while test $# -gt 0
do
case "$1" in
-Wall)
if test "$GCC" = yes
then
:
else
CFLAGS="$CFLAGS $1"
fi
shift
;;
-g)
debug="-g"
shift
;;
-mno-cygwin)
shift
;;
-m*)
arch="$arch $1"
shift
;;
-O2)
optimize="-O"
shift
;;
-fomit-frame-pointer)
shift
;;
-O*|-f*)
optimize="$optimize $1"
shift
;;
*)
CFLAGS="$CFLAGS $1"
shift
;;
esac
done
if test "$GCC" = yes
then
if test -z "$arch"
then
case "$host" in
i386-*) ;;
i?86-*) arch="-march=i486" ;;
arm*-empeg-*) arch="-march=armv4 -mtune=strongarm1100" ;;
armv4*-*) arch="-march=armv4 -mtune=strongarm" ;;
powerpc-*) ;;
mips*-agenda-*) arch="-mcpu=vr4100" ;;
mips*-luxsonor-*) arch="-mips1 -mcpu=r3000 -Wa,-m4010" ;;
esac
fi
case "$optimize" in
-O|"-O "*)
optimize="-O"
optimize="$optimize -fforce-mem"
optimize="$optimize -fforce-addr"
: #x optimize="$optimize -finline-functions"
: #- optimize="$optimize -fstrength-reduce"
optimize="$optimize -fthread-jumps"
optimize="$optimize -fcse-follow-jumps"
optimize="$optimize -fcse-skip-blocks"
: #x optimize="$optimize -frerun-cse-after-loop"
: #x optimize="$optimize -frerun-loop-opt"
: #x optimize="$optimize -fgcse"
optimize="$optimize -fexpensive-optimizations"
optimize="$optimize -fregmove"
: #* optimize="$optimize -fdelayed-branch"
: #x optimize="$optimize -fschedule-insns"
optimize="$optimize -fschedule-insns2"
: #? optimize="$optimize -ffunction-sections"
: #? optimize="$optimize -fcaller-saves"
: #> optimize="$optimize -funroll-loops"
: #> optimize="$optimize -funroll-all-loops"
: #x optimize="$optimize -fmove-all-movables"
: #x optimize="$optimize -freduce-all-givs"
: #? optimize="$optimize -fstrict-aliasing"
: #* optimize="$optimize -fstructure-noalias"
case "$host" in
arm*-*)
optimize="$optimize -fstrength-reduce"
;;
mips*-*)
optimize="$optimize -fstrength-reduce"
optimize="$optimize -finline-functions"
;;
i?86-*)
optimize="$optimize -fstrength-reduce"
;;
powerpc-apple-*)
# this triggers an internal compiler error with gcc2
: #optimize="$optimize -fstrength-reduce"
# this is really only beneficial with gcc3
: #optimize="$optimize -finline-functions"
;;
*)
# this sometimes provokes bugs in gcc 2.95.2
: #optimize="$optimize -fstrength-reduce"
;;
esac
;;
esac
fi
case "$host" in
mips*-agenda-*)
AC_DEFINE(HAVE_MADD16_ASM, 1,
[Define if your MIPS CPU supports a 2-operand MADD16 instruction.])
;;
mips*-luxsonor-*)
AC_DEFINE(HAVE_MADD_ASM, 1,
[Define if your MIPS CPU supports a 2-operand MADD instruction.])
;;
esac
dnl Checks for header files.
AC_HEADER_STDC
AC_HEADER_SYS_WAIT
AC_CHECK_HEADERS(assert.h limits.h unistd.h sys/types.h fcntl.h errno.h)
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_C_INLINE
AC_C_BIGENDIAN
AC_TYPE_PID_T
AC_CHECK_SIZEOF(int, 2)
AC_CHECK_SIZEOF(long, 4)
AC_CHECK_SIZEOF(long long, 8)
dnl Checks for library functions.
AC_CHECK_FUNCS(waitpid fcntl pipe fork)
dnl Other options.
AC_SUBST(FPM)
AC_SUBST(ASO)
AC_SUBST(ASO_OBJS)
dnl handle --enable and --disable options
AC_CACHE_SAVE
AC_MSG_CHECKING(whether to optimize for speed or for accuracy)
AC_ARG_ENABLE(speed, AC_HELP_STRING([--enable-speed],
[optimize for speed over accuracy]),
[
case "$enableval" in
yes)
optimize_for="speed"
AC_DEFINE(OPT_SPEED, 1,
[Define to optimize for speed over accuracy.])
;;
esac
])
AC_ARG_ENABLE(accuracy, AC_HELP_STRING([--enable-accuracy],
[optimize for accuracy over speed]),
[
case "$enableval" in
yes)
if test "$optimize_for" = "speed"
then
optimize_for="both"
else
optimize_for="accuracy"
fi
AC_DEFINE(OPT_ACCURACY, 1,
[Define to optimize for accuracy over speed.])
;;
esac
])
AC_MSG_RESULT(${optimize_for-default})
if test "$optimize_for" = "both"
then
AC_MSG_ERROR(cannot optimize for both speed and accuracy)
fi
AC_MSG_CHECKING(for architecture-specific fixed-point math routines)
AC_ARG_ENABLE(fpm, AC_HELP_STRING([--enable-fpm=ARCH],
[use ARCH-specific fixed-point math routines
(one of: intel, arm, mips, sparc, ppc, 64bit, default)]),
[
case "$enableval" in
yes) ;;
no|default|approx) FPM="DEFAULT" ;;
intel|i?86) FPM="INTEL" ;;
arm) FPM="ARM" ;;
mips) FPM="MIPS" ;;
sparc) FPM="SPARC" ;;
ppc|powerpc) FPM="PPC" ;;
64bit) FPM="64BIT" ;;
float) FPM="FLOAT" ;;
*)
AC_MSG_RESULT(failed)
AC_MSG_ERROR([bad --enable-fpm option])
;;
esac
])
if test -z "$FPM" && test "$GCC" = yes
then
case "$host" in
i?86-*) FPM="INTEL" ;;
arm*-*) FPM="ARM" ;;
mips*-*) FPM="MIPS" ;;
sparc*-*) FPM="SPARC" ;;
powerpc*-*) FPM="PPC" ;;
# FIXME: need to test for 64-bit long long...
esac
fi
AC_MSG_RESULT(${FPM=DEFAULT})
if test "$FPM" = "DEFAULT"
then
AC_MSG_WARN([default fixed-point math will yield limited accuracy])
fi
FPM="-DFPM_$FPM"
AC_ARG_ENABLE(sso, AC_HELP_STRING([--enable-sso],
[use subband synthesis optimization]),
[
case "$enableval" in
yes)
AC_DEFINE(OPT_SSO, 1,
[Define to enable a fast subband synthesis approximation optimization.])
;;
esac
])
AC_ARG_ENABLE(aso, AC_HELP_STRING([--disable-aso],
[disable architecture-specific optimizations]),
[], [enable_aso=yes])
if test "$enable_aso" = yes
then
case "$host" in
i?86-*)
: #ASO="$ASO -DASO_INTERLEAVE1"
ASO="$ASO -DASO_ZEROCHECK"
: #not yet #ASO="$ASO -DASO_SYNTH"
: #not yet #ASO_OBJS="synth_mmx.lo"
;;
arm*-*)
ASO="$ASO -DASO_INTERLEAVE1"
ASO="$ASO -DASO_IMDCT"
ASO_OBJS="imdct_l_arm.lo"
;;
mips*-*)
ASO="$ASO -DASO_INTERLEAVE2"
ASO="$ASO -DASO_ZEROCHECK"
;;
esac
fi
AC_MSG_CHECKING(for ISO/IEC interpretation)
AC_ARG_ENABLE(strict-iso, AC_HELP_STRING([--enable-strict-iso],
[use strict ISO/IEC interpretations]),
[
case "$enableval" in
yes)
AC_DEFINE(OPT_STRICT, 1,
[Define to influence a strict interpretation of the ISO/IEC standards,
even if this is in opposition with best accepted practices.])
interpretation="strict"
;;
esac
])
AC_MSG_RESULT(${interpretation-best accepted practices})
AC_MSG_CHECKING(whether to enable profiling)
AC_ARG_ENABLE(profiling, AC_HELP_STRING([--enable-profiling],
[generate profiling code]),
[
case "$enableval" in
yes) profile="-pg" ;;
esac
])
AC_MSG_RESULT(${enable_profiling-no})
AC_MSG_CHECKING(whether to enable debugging)
AC_ARG_ENABLE(debugging, AC_HELP_STRING([--enable-debugging],
[enable diagnostic debugging support])
AC_HELP_STRING([--disable-debugging],
[do not enable debugging and use more optimization]),
[
case "$enableval" in
yes)
AC_DEFINE(DEBUG, 1,
[Define to enable diagnostic debugging support.])
optimize=""
;;
no)
if test -n "$profile"
then
AC_MSG_ERROR(--enable-profiling and --disable-debugging are incompatible)
fi
AC_DEFINE(NDEBUG, 1,
[Define to disable debugging assertions.])
debug=""
if test "$GCC" = yes
then
optimize="$optimize -fomit-frame-pointer"
fi
;;
esac
])
AC_MSG_RESULT(${enable_debugging-default})
AC_MSG_CHECKING(whether to enable experimental code)
AC_ARG_ENABLE(experimental, AC_HELP_STRING([--enable-experimental],
[enable experimental code]),
[
case "$enableval" in
yes)
AC_DEFINE(EXPERIMENTAL, 1,
[Define to enable experimental code.])
;;
esac
])
AC_MSG_RESULT(${enable_experimental-no})
dnl Create output files.
test -n "$arch" && CFLAGS="$CFLAGS $arch"
test -n "$debug" && CFLAGS="$CFLAGS $debug"
test -n "$optimize" && CFLAGS="$CFLAGS $optimize"
test -n "$profile" && CFLAGS="$CFLAGS $profile" LDFLAGS="$LDFLAGS $profile"
dnl LTLIBOBJS=`echo "$LIBOBJS" | sed -e 's/\.o/.lo/g'`
dnl AC_SUBST(LTLIBOBJS)
AC_CONFIG_FILES([Makefile msvc++/Makefile \
libmad.list])
AC_OUTPUT

View File

@ -0,0 +1,582 @@
/*
* libmad - MPEG audio decoder library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: decoder.c,v 1.22 2004/01/23 09:41:32 rob Exp $
*/
# ifdef HAVE_CONFIG_H
# include "config.h"
# endif
# include "global.h"
# ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
# endif
# ifdef HAVE_SYS_WAIT_H
# include <sys/wait.h>
# endif
# ifdef HAVE_UNISTD_H
# include <unistd.h>
# endif
# ifdef HAVE_FCNTL_H
# include <fcntl.h>
# endif
# include <stdlib.h>
# ifdef HAVE_ERRNO_H
# include <errno.h>
# endif
# include "stream.h"
# include "frame.h"
# include "synth.h"
# include "decoder.h"
/*
* NAME: decoder->init()
* DESCRIPTION: initialize a decoder object with callback routines
*/
void mad_decoder_init(struct mad_decoder *decoder, void *data,
enum mad_flow (*input_func)(void *,
struct mad_stream *),
enum mad_flow (*header_func)(void *,
struct mad_header const *),
enum mad_flow (*filter_func)(void *,
struct mad_stream const *,
struct mad_frame *),
enum mad_flow (*output_func)(void *,
struct mad_header const *,
struct mad_pcm *),
enum mad_flow (*error_func)(void *,
struct mad_stream *,
struct mad_frame *),
enum mad_flow (*message_func)(void *,
void *, unsigned int *))
{
decoder->mode = -1;
decoder->options = 0;
decoder->async.pid = 0;
decoder->async.in = -1;
decoder->async.out = -1;
decoder->sync = 0;
decoder->cb_data = data;
decoder->input_func = input_func;
decoder->header_func = header_func;
decoder->filter_func = filter_func;
decoder->output_func = output_func;
decoder->error_func = error_func;
decoder->message_func = message_func;
}
int mad_decoder_finish(struct mad_decoder *decoder)
{
# if defined(USE_ASYNC)
if (decoder->mode == MAD_DECODER_MODE_ASYNC && decoder->async.pid) {
pid_t pid;
int status;
close(decoder->async.in);
do
pid = waitpid(decoder->async.pid, &status, 0);
while (pid == -1 && errno == EINTR);
decoder->mode = -1;
close(decoder->async.out);
decoder->async.pid = 0;
decoder->async.in = -1;
decoder->async.out = -1;
if (pid == -1)
return -1;
return (!WIFEXITED(status) || WEXITSTATUS(status)) ? -1 : 0;
}
# endif
return 0;
}
# if defined(USE_ASYNC)
static
enum mad_flow send_io(int fd, void const *data, size_t len)
{
char const *ptr = data;
ssize_t count;
while (len) {
do
count = write(fd, ptr, len);
while (count == -1 && errno == EINTR);
if (count == -1)
return MAD_FLOW_BREAK;
len -= count;
ptr += count;
}
return MAD_FLOW_CONTINUE;
}
static
enum mad_flow receive_io(int fd, void *buffer, size_t len)
{
char *ptr = buffer;
ssize_t count;
while (len) {
do
count = read(fd, ptr, len);
while (count == -1 && errno == EINTR);
if (count == -1)
return (errno == EAGAIN) ? MAD_FLOW_IGNORE : MAD_FLOW_BREAK;
else if (count == 0)
return MAD_FLOW_STOP;
len -= count;
ptr += count;
}
return MAD_FLOW_CONTINUE;
}
static
enum mad_flow receive_io_blocking(int fd, void *buffer, size_t len)
{
int flags, blocking;
enum mad_flow result;
flags = fcntl(fd, F_GETFL);
if (flags == -1)
return MAD_FLOW_BREAK;
blocking = flags & ~O_NONBLOCK;
if (blocking != flags &&
fcntl(fd, F_SETFL, blocking) == -1)
return MAD_FLOW_BREAK;
result = receive_io(fd, buffer, len);
if (flags != blocking &&
fcntl(fd, F_SETFL, flags) == -1)
return MAD_FLOW_BREAK;
return result;
}
static
enum mad_flow send(int fd, void const *message, unsigned int size)
{
enum mad_flow result;
/* send size */
result = send_io(fd, &size, sizeof(size));
/* send message */
if (result == MAD_FLOW_CONTINUE)
result = send_io(fd, message, size);
return result;
}
static
enum mad_flow receive(int fd, void **message, unsigned int *size)
{
enum mad_flow result;
unsigned int actual;
if (*message == 0)
*size = 0;
/* receive size */
result = receive_io(fd, &actual, sizeof(actual));
/* receive message */
if (result == MAD_FLOW_CONTINUE) {
if (actual > *size)
actual -= *size;
else {
*size = actual;
actual = 0;
}
if (*size > 0) {
if (*message == 0) {
*message = malloc(*size);
if (*message == 0)
return MAD_FLOW_BREAK;
}
result = receive_io_blocking(fd, *message, *size);
}
/* throw away remainder of message */
while (actual && result == MAD_FLOW_CONTINUE) {
char sink[256];
unsigned int len;
len = actual > sizeof(sink) ? sizeof(sink) : actual;
result = receive_io_blocking(fd, sink, len);
actual -= len;
}
}
return result;
}
static
enum mad_flow check_message(struct mad_decoder *decoder)
{
enum mad_flow result;
void *message = 0;
unsigned int size;
result = receive(decoder->async.in, &message, &size);
if (result == MAD_FLOW_CONTINUE) {
if (decoder->message_func == 0)
size = 0;
else {
result = decoder->message_func(decoder->cb_data, message, &size);
if (result == MAD_FLOW_IGNORE ||
result == MAD_FLOW_BREAK)
size = 0;
}
if (send(decoder->async.out, message, size) != MAD_FLOW_CONTINUE)
result = MAD_FLOW_BREAK;
}
if (message)
free(message);
return result;
}
# endif
static
enum mad_flow error_default(void *data, struct mad_stream *stream,
struct mad_frame *frame)
{
int *bad_last_frame = data;
switch (stream->error) {
case MAD_ERROR_BADCRC:
if (*bad_last_frame)
mad_frame_mute(frame);
else
*bad_last_frame = 1;
return MAD_FLOW_IGNORE;
default:
return MAD_FLOW_CONTINUE;
}
}
static
int run_sync(struct mad_decoder *decoder)
{
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
void *error_data;
int bad_last_frame = 0;
struct mad_stream *stream;
struct mad_frame *frame;
struct mad_synth *synth;
int result = 0;
if (decoder->input_func == 0)
return 0;
if (decoder->error_func) {
error_func = decoder->error_func;
error_data = decoder->cb_data;
}
else {
error_func = error_default;
error_data = &bad_last_frame;
}
stream = &decoder->sync->stream;
frame = &decoder->sync->frame;
synth = &decoder->sync->synth;
mad_stream_init(stream);
mad_frame_init(frame);
mad_synth_init(synth);
mad_stream_options(stream, decoder->options);
do {
switch (decoder->input_func(decoder->cb_data, stream)) {
case MAD_FLOW_STOP:
goto done;
case MAD_FLOW_BREAK:
goto fail;
case MAD_FLOW_IGNORE:
continue;
case MAD_FLOW_CONTINUE:
break;
}
while (1) {
# if defined(USE_ASYNC)
if (decoder->mode == MAD_DECODER_MODE_ASYNC) {
switch (check_message(decoder)) {
case MAD_FLOW_IGNORE:
case MAD_FLOW_CONTINUE:
break;
case MAD_FLOW_BREAK:
goto fail;
case MAD_FLOW_STOP:
goto done;
}
}
# endif
if (decoder->header_func) {
if (mad_header_decode(&frame->header, stream) == -1) {
if (!MAD_RECOVERABLE(stream->error))
break;
switch (error_func(error_data, stream, frame)) {
case MAD_FLOW_STOP:
goto done;
case MAD_FLOW_BREAK:
goto fail;
case MAD_FLOW_IGNORE:
case MAD_FLOW_CONTINUE:
default:
continue;
}
}
switch (decoder->header_func(decoder->cb_data, &frame->header)) {
case MAD_FLOW_STOP:
goto done;
case MAD_FLOW_BREAK:
goto fail;
case MAD_FLOW_IGNORE:
continue;
case MAD_FLOW_CONTINUE:
break;
}
}
if (mad_frame_decode(frame, stream) == -1) {
if (!MAD_RECOVERABLE(stream->error))
break;
switch (error_func(error_data, stream, frame)) {
case MAD_FLOW_STOP:
goto done;
case MAD_FLOW_BREAK:
goto fail;
case MAD_FLOW_IGNORE:
break;
case MAD_FLOW_CONTINUE:
default:
continue;
}
}
else
bad_last_frame = 0;
if (decoder->filter_func) {
switch (decoder->filter_func(decoder->cb_data, stream, frame)) {
case MAD_FLOW_STOP:
goto done;
case MAD_FLOW_BREAK:
goto fail;
case MAD_FLOW_IGNORE:
continue;
case MAD_FLOW_CONTINUE:
break;
}
}
mad_synth_frame(synth, frame);
if (decoder->output_func) {
switch (decoder->output_func(decoder->cb_data,
&frame->header, &synth->pcm)) {
case MAD_FLOW_STOP:
goto done;
case MAD_FLOW_BREAK:
goto fail;
case MAD_FLOW_IGNORE:
case MAD_FLOW_CONTINUE:
break;
}
}
}
}
while (stream->error == MAD_ERROR_BUFLEN);
fail:
result = -1;
done:
mad_synth_finish(synth);
mad_frame_finish(frame);
mad_stream_finish(stream);
return result;
}
# if defined(USE_ASYNC)
static
int run_async(struct mad_decoder *decoder)
{
pid_t pid;
int ptoc[2], ctop[2], flags;
if (pipe(ptoc) == -1)
return -1;
if (pipe(ctop) == -1) {
close(ptoc[0]);
close(ptoc[1]);
return -1;
}
flags = fcntl(ptoc[0], F_GETFL);
if (flags == -1 ||
fcntl(ptoc[0], F_SETFL, flags | O_NONBLOCK) == -1) {
close(ctop[0]);
close(ctop[1]);
close(ptoc[0]);
close(ptoc[1]);
return -1;
}
pid = fork();
if (pid == -1) {
close(ctop[0]);
close(ctop[1]);
close(ptoc[0]);
close(ptoc[1]);
return -1;
}
decoder->async.pid = pid;
if (pid) {
/* parent */
close(ptoc[0]);
close(ctop[1]);
decoder->async.in = ctop[0];
decoder->async.out = ptoc[1];
return 0;
}
/* child */
close(ptoc[1]);
close(ctop[0]);
decoder->async.in = ptoc[0];
decoder->async.out = ctop[1];
_exit(run_sync(decoder));
/* not reached */
return -1;
}
# endif
/*
* NAME: decoder->run()
* DESCRIPTION: run the decoder thread either synchronously or asynchronously
*/
int mad_decoder_run(struct mad_decoder *decoder, enum mad_decoder_mode mode)
{
int result;
int (*run)(struct mad_decoder *) = 0;
switch (decoder->mode = mode) {
case MAD_DECODER_MODE_SYNC:
run = run_sync;
break;
case MAD_DECODER_MODE_ASYNC:
# if defined(USE_ASYNC)
run = run_async;
# endif
break;
}
if (run == 0)
return -1;
decoder->sync = malloc(sizeof(*decoder->sync));
if (decoder->sync == 0)
return -1;
result = run(decoder);
free(decoder->sync);
decoder->sync = 0;
return result;
}
/*
* NAME: decoder->message()
* DESCRIPTION: send a message to and receive a reply from the decoder process
*/
int mad_decoder_message(struct mad_decoder *decoder,
void *message, unsigned int *len)
{
# if defined(USE_ASYNC)
if (decoder->mode != MAD_DECODER_MODE_ASYNC ||
send(decoder->async.out, message, *len) != MAD_FLOW_CONTINUE ||
receive(decoder->async.in, &message, len) != MAD_FLOW_CONTINUE)
return -1;
return 0;
# else
return -1;
# endif
}

View File

@ -0,0 +1,91 @@
/*
* libmad - MPEG audio decoder library
* Copyright (C) 2000-2004 Underbit Technologies, Inc.
*
* 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
*
* $Id: decoder.h,v 1.17 2004/01/23 09:41:32 rob Exp $
*/
# ifndef LIBMAD_DECODER_H
# define LIBMAD_DECODER_H
# include "stream.h"
# include "frame.h"
# include "synth.h"
enum mad_decoder_mode {
MAD_DECODER_MODE_SYNC = 0,
MAD_DECODER_MODE_ASYNC
};
enum mad_flow {
MAD_FLOW_CONTINUE = 0x0000, /* continue normally */
MAD_FLOW_STOP = 0x0010, /* stop decoding normally */
MAD_FLOW_BREAK = 0x0011, /* stop decoding and signal an error */
MAD_FLOW_IGNORE = 0x0020 /* ignore the current frame */
};
struct mad_decoder {
enum mad_decoder_mode mode;
int options;
struct {
long pid;
int in;
int out;
} async;
struct {
struct mad_stream stream;
struct mad_frame frame;
struct mad_synth synth;
} *sync;
void *cb_data;
enum mad_flow (*input_func)(void *, struct mad_stream *);
enum mad_flow (*header_func)(void *, struct mad_header const *);
enum mad_flow (*filter_func)(void *,
struct mad_stream const *, struct mad_frame *);
enum mad_flow (*output_func)(void *,
struct mad_header const *, struct mad_pcm *);
enum mad_flow (*error_func)(void *, struct mad_stream *, struct mad_frame *);
enum mad_flow (*message_func)(void *, void *, unsigned int *);
};
void mad_decoder_init(struct mad_decoder *, void *,
enum mad_flow (*)(void *, struct mad_stream *),
enum mad_flow (*)(void *, struct mad_header const *),
enum mad_flow (*)(void *,
struct mad_stream const *,
struct mad_frame *),
enum mad_flow (*)(void *,
struct mad_header const *,
struct mad_pcm *),
enum mad_flow (*)(void *,
struct mad_stream *,
struct mad_frame *),
enum mad_flow (*)(void *, void *, unsigned int *));
int mad_decoder_finish(struct mad_decoder *);
# define mad_decoder_options(decoder, opts) \
((void) ((decoder)->options = (opts)))
int mad_decoder_run(struct mad_decoder *, enum mad_decoder_mode);
int mad_decoder_message(struct mad_decoder *, void *, unsigned int *);
# endif

Some files were not shown because too many files have changed in this diff Show More