=======================================================================
  AudioWerkzeugeBibliothek - ChangeLog 
	Version 3.2
	12/2025
=======================================================================

The library AudioWerkzeugeBibliothek originated from several format-specific 
libraries for mp3, flag, ogg and others. Because of that, there were a lot burden
of the past contained in the code. Some duplicates, no consistency in parameter
order, type or naming and some other inconveniences.

With version 3.0, I tried to improve the overall consistency and usability of the 
provided methods. However, it is not possible to do this downward compatible. 
Also, I decided to implement a more consistent way to access all Tag Items in all
AudioFile classes.

Therefore, a lot of the previous methods like GetAllFrames or GetAllFields have 
been replaced by a new method, which is the same for all classes.


Bug fixes and changes in 3.2 (12/2025)
======================================
- Adding cover art to Flac files did not work properly. The mime type was 
  not written correctly to the file, so some players could not display the cover.
- Fixed some issues regarding duplicate identifiers in properties and 
  method parameters.
- Renamed property TTagItem.Description to TTagItem.ReadableKey to avoid mix-ups 
  with the picture description in picture tags derived from TTagItem.
- Added public properties TFlacFile.BitsPerSample und TFlacFile.Samples.
- The field "nominal bitrate" (used as a backup for bitrate and duration 
  calculation) in the OggVorbis Identification Header was misinterpreted 
  (in kbit/s instead of bit/s). 
- Bitrate was calculated as 0 for compressed wav files. 
- Added property TWavfile.WaveCodec. 
- Better exception handling: 
  Removed "MessageBox(..)" from the exception block in some methods, added 
  optional out parameter aExceptionMessage instead. 
  Added property TBaseAudioFile.LastExceptionMessage. This can be used to get 
  more information about the last exception occured during a read/write 
  operation on files.


Bug fixes and changes in 3.1.1 (12/2024)
========================================
- Fixed some possible Range Exceptions in "Rating" and "Private" ID3v2-Frames

New in version 3.1 (10/2024)
============================
- Property TTagItem.DataSize.
- Added URL frames and Comment to TID3v2Tag.GetUnusedTextTags.
- Method TOggContainer.ReadPackets(Target: TObjectList) to get all packets 
  from the OggStream. 
- Property TOpusFile.VBR (which should be "True" in almost every case) 
- Methods to read/write Integer atoms in m4a Files. 
  Note: Use with caution. I need this in my main project "Nemp" for the "tmpo" 
  atom (aka BPM, Beats Per Minute), but this is not widely tested for other atoms. 
  The documentation there is not very helpful, and there are some inconsistencies 
  regarding Signed/Unsigned Integers and the size of the values (8, 16, 24, 32 Bit).
  
Bug fixes in 3.1
==================
- TagType in `TApeTag.GetUnusedTextTags` was `ttVorbis`, correct is `ttApev2`. 
- Getter and Setter for `TApeTag.EAN` used different keys.
- Fixed the clutter with Cardinal/Integer type for SerialNumber in OggPages.
- Flac files: deleted deprecated function fIsValid
- Fixed a parsing error regarding OggPages and OggPackets (which had actually 
  no effect on Ogg/Opus files, but on the new method ReadPackets).


New in Version 3.0 (10/2024)
============================
- Support for *.opus-Files
- Support for CoverArt in VorbisComments (*.ogg and *.opus)
  Support only for the "official" version, using METADATA_BLOCK_PICTURE as Key. The
  unofficial, deprecated variant "COVERART" is NOT directly supported. However, you 
  can check for this key, and try to get the picture data from it.

Updated class TBaseAudioFile
----------------------------
- new: procedure GetTagList(Dest: TTagItemList; 
			ContentTypes: TTagContentTypes = cDefaultTagContentTypes);			
- new: procedure DeleteTagItem(aTagItem: TTagItem);
- new: function GetPicture( ... ): Boolean; 
- new: function SetPicture( ... ): Boolean;   
- new: property Lyrics: String;

new class TTagItem (unit AudioFiles.BaseTags.pas)
-------------------------------------------------
A new base class TTagItem for all separate TagItems (like "Artist" or "Title").
Derived from that are classes like TID3v2Frame, TCommentVector or TFlacMetaBlock

Basic properties:
- TagType: teTagType; // e.g. ttID3v2, ttVorbis, ttFlacMetaBlock, ttApev2, ttM4AAtom
- Key: String;
- Description: String;
- TagContentType: TTagContentType; // e.g. tctText, tctPicture, tctBinary, ...	  
  

Changes in Version 3.0 
======================
- removed: const Array Picture_Types: Array[0..20] of string = ( ... )
		(units Id3v2Frames.pas, FlacFiles)
- removed: Type TApePictureTypes
- removed: const TPictureTypeStrings: Array[TApePictureTypes] of AnsiString = ( ... )
		(unit ApeTagItem.pas)

These three Arrays were basically the same, and are replaced with one new Array,
declared in Unit AudioFiles.Declarations.pas.

- new: Type TPictureType = ( ... );
- new: Const cPictureTypes: Array[TPictureType] of string = ( ... );
		(unit AudioFiles.Declarations.pas)
This type replaces the Byte or Cardinal parameter "PicType" (or similar) for 
picture-related methods in Flac and ID3v2, and also Ape.
		
- modified: type TAudioError; (Renamed/removed/added some error types)

Unified parameters for picture related methods 
----------------------------------------------
It is now always "Stream, Mime, PictureType, Description"
Note: 
	Not all Tag-Formats actually contain values for Mime/PictureType/Description. 
	Use dummy values in these cases.

Mp3Files
--------
TID3v2Tag
- removed: procedure DeleteFrame(aFrame: TID3v2Frame); 
			(use DeleteTagItem instead)
- removed: already deprecated functions GetAll*Frames: TObjectList;
- modified: GetAll*Frames(aList: TObjectlist); to procedure GetAll*Frames(aList: TTagItemList);

TID3v2Frame
- removed: property	FrameType: TID3v2FrameTypes
			(use property TagContentType instead)
- removed: type TID3v2FrameTypes 
			(use TTagContentType instead)
		   
OggVorbisFiles, FlacFiles
-------------------------
Note: 
	Classes TFlacFile, TOggVorbisFile and (new) TOpusFile are derived from a common
	ancestor TBaseVorbisFile that provides access to the VorbisComments.
	Also note that CoverArt in Flac files is *NOT* stored within the VorbisComments,
	but in a separate structure.
	
- removed: procedure GetAllFields(Target: TStrings); 
			(use GetTagList instead)
- removed: GetPropertyByIndex 
- removed: SetPropertyByIndex
			(use the TagItems determined by GetTagList instead)
			
FlacFiles
-------------------------
- renamed: GetPictureStream (to: GetPicture)
- removed: procedure GetAllPictureBlocks(aTarget: TObjectList); 
			(use GetTagList instead with parameter [tctPicture])	
- removed: procedure DeletePicture(aFlacPictureBlock: TFlacPictureBlock); 
			(use DeleteTagItem instead)		  

ApeFiles (Monkey, MusePack, OptimFrog, TrueAudio, WavPack)
----------------------------------------------------------
TApeTag
- removed: procedure GetAllFrames(dest: TStrings);
- removed: procedure GetAllTextFrames(dest: TStrings);
- removed: procedure GetAllPictureFrames(dest: TStrings);
			(use GetTagList instead)
TApeTagItem
- removed: Property Value 
			(use methods Get/SetText instead for text information)

M4AFiles
--------
TM4AFile
- removed: procedure GetAllTextAtomDescriptions(dest: TStrings);	
- removed: procedure GetAllTextAtoms(dest: TObjectList);
- removed: procedure GetAllAtoms(dest: TObjectList);
			(use GetTagList instead)
- removed: procedure RemoveAtom(aAtom: TMetaAtom); 		
			(use DeleteTagItem instead)
- removed: function GetTextDataByDescription(aDescription: UnicodeString): UnicodeString;
			(use acces through the TTagItems instead)
			
TMetaAtom
- removed: function GetListDescription: UnicodeString;
			(use property Description from BaseClass TTagItem instead)

TUdtaAtom
- removed: procedure GetAllTextAtomDescriptions(dest: TStrings);
- removed: procedure GetAllTextAtoms(dest: TObjectList);
- removed: procedure GetAllAtoms(dest: TObjectList);
			(use GetTagList instead)
- removed: procedure RemoveAtom(aAtom: TMetaAtom);		
			(use DeleteTagItem instead)

