//  The authors have released ID3Lib as Public Domain (PD) and claim no copyright,
//  patent or other intellectual property protection in this work.  This means that
//  it may be modified, redistributed and used in commercial and non-commercial
//  software and hardware without restrictions.  ID3Lib is distributed on an "AS IS"
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
//  
//  The ID3Lib authors encourage improvements and optimisations to be sent to the
//  ID3Lib coordinator, currently Dirk Mahoney (dirk@id3.org).  Approved
//  submissions may be altered, and will be included and released under these terms.
//  
//  Mon Nov 23 18:34:01 1998


#ifndef	ID3LIB_DLLHEADERS_H
#define	ID3LIB_DLLHEADERS_H


typedef	unsigned char		uchar;
typedef short signed int	ssint;
typedef short unsigned int	suint;
typedef long signed int		lsint;
typedef long unsigned int	luint;
typedef	long double			ldoub;
typedef long unsigned int *	bitset;


struct ID3_VerInfo
{
char	name		[ 30 ];
luint	version,
		revision;
};


enum ID3_TextEnc
{
	ID3TE_ASCII			= 0,
	ID3TE_UNICODE
};


enum ID3_FieldID
{
	ID3FN_NOFIELD			= 0,
	ID3FN_TEXTENC,
	ID3FN_TEXT,
	ID3FN_URL,
	ID3FN_DATA,
	ID3FN_DESCRIPTION,
	ID3FN_OWNER,
	ID3FN_EMAIL,
	ID3FN_RATING,
	ID3FN_FILENAME,
	ID3FN_LANGUAGE,
	ID3FN_PICTURETYPE,
	ID3FN_IMAGEFORMAT,
	ID3FN_MIMETYPE,
	ID3FN_COUNTER,
	ID3FN_SYMBOL,
	ID3FN_VOLUMEADJ,
	ID3FN_NUMBITS,
	ID3FN_VOLCHGRIGHT,
	ID3FN_VOLCHGLEFT,
	ID3FN_PEAKVOLRIGHT,
	ID3FN_PEAKVOLLEFT,

	ID3FN_LASTFIELDID
};


enum ID3_FrameID
{
	ID3FID_NOFRAME			= 0,
	ID3FID_ORIGALBUM,
	ID3FID_PUBLISHER,
	ID3FID_ENCODEDBY,
	ID3FID_ENCODERSETTINGS,
	ID3FID_ORIGFILENAME,
	ID3FID_LANGUAGE,
	ID3FID_PARTINSET,
	ID3FID_DATE,
	ID3FID_TIME,
	ID3FID_RECORDINGDATES,
	ID3FID_MEDIATYPE,
	ID3FID_FILETYPE,
	ID3FID_NETRADIOSTATION,
	ID3FID_NETRADIOOWNER,
	ID3FID_LYRICIST,
	ID3FID_ORIGARTIST,
	ID3FID_ORIGLYRICIST,
	ID3FID_SUBTITLE,
	ID3FID_MIXARTIST,
	ID3FID_USERTEXT,
	ID3FID_CONTENTGROUP,
	ID3FID_TITLE,
	ID3FID_LEADARTIST,
	ID3FID_BAND,
	ID3FID_ALBUM,
	ID3FID_YEAR,
	ID3FID_CONDUCTOR,
	ID3FID_COMPOSER,
	ID3FID_COPYRIGHT,
	ID3FID_CONTENTTYPE,
	ID3FID_TRACKNUM,
	ID3FID_COMMENT,
	ID3FID_WWWAUDIOFILE,
	ID3FID_WWWARTIST,
	ID3FID_WWWAUDIOSOURCE,
	ID3FID_WWWCOMMERCIALINFO,
	ID3FID_WWWCOPYRIGHT,
	ID3FID_WWWPUBLISHER,
	ID3FID_WWWPAYMENT,
	ID3FID_WWWRADIOPAGE,
	ID3FID_WWWUSER,
	ID3FID_INVOLVEDPEOPLE,
	ID3FID_UNSYNCEDLYRICS,
	ID3FID_PICTURE,
	ID3FID_GENERALOBJECT,
	ID3FID_UNIQUEFILEID,
	ID3FID_PLAYCOUNTER,
	ID3FID_POPULARIMETER,
	ID3FID_GROUPINGREG,
	ID3FID_CRYPTOREG
};


class ID3_Field;
class ID3_Frame;
class ID3_Tag;


void			ID3_GetVersion					( ID3_VerInfo *info );
// tag wrappers
ID3_Tag			*ID3Tag_New						( void );
void			ID3Tag_Delete					( ID3_Tag *tag );
void			ID3Tag_Clear					( ID3_Tag *tag );
bool			ID3Tag_HasChanged				( ID3_Tag *tag );
void			ID3Tag_SetUnsync				( ID3_Tag *tag, bool unsync );
void			ID3Tag_SetExtendedHeader		( ID3_Tag *tag, bool ext );
void			ID3Tag_SetCompression			( ID3_Tag *tag, bool comp );
void			ID3Tag_SetPadding				( ID3_Tag *tag, bool pad );
void			ID3Tag_AddFrame					( ID3_Tag *tag, ID3_Frame *frame );
void			ID3Tag_AddFrames				( ID3_Tag *tag, ID3_Frame *frames, luint num );
void			ID3Tag_RemoveFrame				( ID3_Tag *tag, ID3_Frame *frame );
void			ID3Tag_Parse					( ID3_Tag *tag, uchar header[ ID3_TAGHEADERSIZE ], uchar *buffer );
luint			ID3Tag_Link						( ID3_Tag *tag, char *fileName );
void			ID3Tag_Update					( ID3_Tag *tag );
void			ID3Tag_Strip					( ID3_Tag *tag, bool v1Also );
ID3_Frame		*ID3Tag_FindFrameWithID			( ID3_Tag *tag, ID3_FrameID id );
ID3_Frame		*ID3Tag_FindFrameWithINT		( ID3_Tag *tag, ID3_FrameID id, ID3_FieldID fld, luint data );
ID3_Frame		*ID3Tag_FindFrameWithASCII		( ID3_Tag *tag, ID3_FrameID id, ID3_FieldID fld, char *data );
ID3_Frame		*ID3Tag_FindFrameWithUNICODE	( ID3_Tag *tag, ID3_FrameID id, ID3_FieldID fld, wchar_t *data );
ID3_Frame		*ID3Tag_GetFrameNum				( ID3_Tag *tag, luint num );
luint			ID3Tag_NumFrames				( ID3_Tag *tag );
// frame wrappers
void			ID3Frame_Clear					( ID3_Frame *frame );
void			ID3Frame_SetID					( ID3_Frame *frame, ID3_FrameID id );
ID3_FrameID		ID3Frame_GetID					( ID3_Frame *frame );
ID3_Field		*ID3Frame_GetField				( ID3_Frame *frame, ID3_FieldID name );
// field wrappers
void			ID3Field_Clear					( ID3_Field *field );
luint			ID3Field_Size					( ID3_Field *field );
luint			ID3Field_GetNumTextItems		( ID3_Field *field );
void			ID3Field_SetINT					( ID3_Field *field, luint data );
luint			ID3Field_GetINT					( ID3_Field *field );
void			ID3Field_SetUNICODE				( ID3_Field *field, wchar_t *string );
luint			ID3Field_GetUNICODE				( ID3_Field *field, wchar_t *buffer, luint maxChars, luint itemNum );
void			ID3Field_AddUNICODE				( ID3_Field *field, wchar_t *string );
void			ID3Field_SetASCII				( ID3_Field *field, char *string );
luint			ID3Field_GetASCII				( ID3_Field *field, char *buffer, luint maxChars, luint itemNum );
void			ID3Field_AddASCII				( ID3_Field *field, char *string );
void			ID3Field_SetBINARY				( ID3_Field *field, uchar *data, luint size );
void			ID3Field_GetBINARY				( ID3_Field *field, uchar *buffer, luint buffLength );
void			ID3Field_FromFile				( ID3_Field *field, char *fileName );
void			ID3Field_ToFile					( ID3_Field *field, char *fileName );


#endif