diff options
Diffstat (limited to 'src/et_core.h')
-rwxr-xr-x | src/et_core.h | 469 |
1 files changed, 469 insertions, 0 deletions
diff --git a/src/et_core.h b/src/et_core.h new file mode 100755 index 0000000..ccc7f76 --- /dev/null +++ b/src/et_core.h @@ -0,0 +1,469 @@ +/* et_core.h - 2001/10/21 */ +/* + * EasyTAG - Tag editor for MP3 and Ogg Vorbis files + * Copyright (C) 2000-2003 Jerome Couderc <easytag@gmail.com> + * + * 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. + */ + + +#ifndef __ET_CORE_H__ +#define __ET_CORE_H__ + + +#include <glib.h> +#include <gdk/gdktypes.h> +#include <config.h> // For definition of ENABLE_OGG, ... + + +/*************** + * Declaration * + ***************/ + +#ifndef MAX +# define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif + +#ifndef MIN +# define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif +#ifndef MIN3 +# define MIN3(x,y,z) (MIN(x,y) < (z) ? MIN(x,y) : (z)) +#endif +#ifndef MIN4 +# define MIN4(x,y,z,w) (MIN3(x,y,z) < (w) ? MIN3(x,y,z) : (w)) +#endif + + +/* + * Colors Used (see declaration into et_core.c) + */ +GdkColor LIGHT_BLUE; +GdkColor RED; +GdkColor LIGHT_RED; +GdkColor GREY; +GdkColor LIGHT_GREY; +GdkColor YELLOW; +GdkColor BLACK; + + +/* + * Types of sorting (discontinuous value to avoid separators in SortingFileOptionMenu). + */ +typedef enum +{ + SORTING_BY_ASCENDING_FILENAME, + SORTING_BY_DESCENDING_FILENAME, + SORTING_BY_ASCENDING_TRACK_NUMBER, + SORTING_BY_DESCENDING_TRACK_NUMBER, + SORTING_BY_ASCENDING_CREATION_DATE, + SORTING_BY_DESCENDING_CREATION_DATE, + SORTING_BY_ASCENDING_TITLE, + SORTING_BY_DESCENDING_TITLE, + SORTING_BY_ASCENDING_ARTIST, + SORTING_BY_DESCENDING_ARTIST, + SORTING_BY_ASCENDING_ALBUM, + SORTING_BY_DESCENDING_ALBUM, + SORTING_BY_ASCENDING_YEAR, + SORTING_BY_DESCENDING_YEAR, + SORTING_BY_ASCENDING_GENRE, + SORTING_BY_DESCENDING_GENRE, + SORTING_BY_ASCENDING_COMMENT, + SORTING_BY_DESCENDING_COMMENT, + SORTING_BY_ASCENDING_COMPOSER, + SORTING_BY_DESCENDING_COMPOSER, + SORTING_BY_ASCENDING_ORIG_ARTIST, + SORTING_BY_DESCENDING_ORIG_ARTIST, + SORTING_BY_ASCENDING_COPYRIGHT, + SORTING_BY_DESCENDING_COPYRIGHT, + SORTING_BY_ASCENDING_URL, + SORTING_BY_DESCENDING_URL, + SORTING_BY_ASCENDING_ENCODED_BY, + SORTING_BY_DESCENDING_ENCODED_BY, + SORTING_BY_ASCENDING_FILE_TYPE, + SORTING_BY_DESCENDING_FILE_TYPE, + SORTING_BY_ASCENDING_FILE_SIZE, + SORTING_BY_DESCENDING_FILE_SIZE, + SORTING_BY_ASCENDING_FILE_DURATION, + SORTING_BY_DESCENDING_FILE_DURATION, + SORTING_BY_ASCENDING_FILE_BITRATE, + SORTING_BY_DESCENDING_FILE_BITRATE, + SORTING_BY_ASCENDING_FILE_SAMPLERATE, + SORTING_BY_DESCENDING_FILE_SAMPLERATE, + SORTING_UNKNOWN +} ET_Sorting_Type; + + +/* + * Types of files + */ +typedef enum +{ // (.ext) is not so popular + MP2_FILE = 0, // Mpeg audio Layer 2 : .mp2 (.mpg) (.mpga) + MP3_FILE, // Mpeg audio Layer 3 : .mp3 (.mpg) (.mpga) + MP4_FILE, // Mpeg audio Layer 4 / AAC : .mp4 (.m4a) (.m4p) + OGG_FILE, // Ogg Vorbis audio : .ogg (.ogm) + FLAC_FILE, // FLAC (lossless) : .flac .fla + MPC_FILE, // MusePack : .mpc .mp+ .mpp + MAC_FILE, // Monkey's Audio (lossless) : .ape (.mac) + SPEEX_FILE, // Speech audio files : .spx + OFR_FILE, // OptimFROG (lossless) : .ofr .ofs + WAVPACK_FILE, // Wavpack (lossless) : .wv + UNKNOWN_FILE +} ET_File_Type; + + +/* + * Types of tags + */ +typedef enum +{ + ID3_TAG = 0, + OGG_TAG, + APE_TAG, + FLAC_TAG, + MP4_TAG, + WAVPACK_TAG, + UNKNOWN_TAG +} ET_Tag_Type; + + +/* + * Description of each item of the FileNameList list + */ +typedef struct _File_Name File_Name; +struct _File_Name +{ + guint key; + gboolean saved; /* Set to TRUE if this filename had been saved */ + gchar *value; /* The filename containing the full path and the extension of the file */ + gchar *value_utf8; /* Same than "value", but converted to UTF-8 to avoid multiple call to the convertion function */ + gchar *value_ck; /* Collate key of "value_utf8" to speed up comparaison */ +}; + + +/* + * Description of Picture item (see picture.h) + */ +typedef struct _Picture Picture; +struct _Picture +{ + gint type; + gchar *description; + gint width; /* Original width of the picture */ + gint height; /* Original height of the picture */ + gulong size; /* Picture size in bits */ + guchar *data; + Picture *next; +}; + + +/* + * Description of each item of the TagList list + */ +typedef struct _File_Tag File_Tag; +struct _File_Tag +{ + guint key; /* Incremented value */ + gboolean saved; /* Set to TRUE if this tag had been saved */ + + gchar *title; /* Title of track */ + gchar *artist; /* Artist name */ + gchar *album; /* Album name */ + gchar *disc_number; /* Disc number */ + gchar *year; /* Year of track */ + gchar *track; /* Position of track in the album */ + gchar *track_total; /* The number of tracks for the album (ex: 12/20) */ + gchar *genre; /* Genre of song */ + gchar *comment; /* Comment */ + gchar *composer; /* Composer */ + gchar *orig_artist; /* Original artist / Performer */ + gchar *copyright; /* Copyright */ + gchar *url; /* URL */ + gchar *encoded_by; /* Encoded by */ + Picture *picture; /* Picture */ + GList *other; /* List of unsupported fields (used for ogg only) */ +}; + + +/* + * Structure containing informations of the header of file + * Nota: This struct was copied from an "MP3 structure", and will change later. + */ +typedef struct _ET_File_Info ET_File_Info; +struct _ET_File_Info +{ + gint version; /* Version of bitstream (mpeg version for mp3, encoder version for ogg) */ + gint mpeg25; /* Version is MPEG 2.5? */ + gint layer; /* "MP3 data" */ + gint bitrate; /* Bitrate (kb/s) */ + gboolean variable_bitrate; /* Is a VBR file? */ + gint samplerate; /* Samplerate (Hz) */ + gint mode; /* Stereo, ... or channels for ogg */ + gint size; /* The size of file (in bytes) */ + gint duration; /* The duration of file (in seconds) */ + gchar *mpc_profile; /* MPC data */ + gchar *mpc_version; /* MPC data : encoder version (also for Speex) */ +}; + + +/* + * Structure for descripting supported files + */ +typedef struct _ET_File_Description ET_File_Description; +struct _ET_File_Description +{ + ET_File_Type FileType; /* Type of file (ex: MP3) */ + gchar *Extension; /* Extension (ex: ".mp3") */ + ET_Tag_Type TagType; /* Type of tag (ex: ID3) */ +}; + + +/* + * Description of supported files + */ +static const ET_File_Description ETFileDescription[] = +{ +#ifdef ENABLE_MP3 + {MP3_FILE, ".mp3", ID3_TAG}, + {MP2_FILE, ".mp2", ID3_TAG}, +#endif +#ifdef ENABLE_OGG + {OGG_FILE, ".ogg", OGG_TAG}, +#endif +#ifdef ENABLE_SPEEX + {SPEEX_FILE, ".spx", OGG_TAG}, // Implemented by Pierre Dumuid +#endif +#ifdef ENABLE_FLAC + {FLAC_FILE, ".flac", FLAC_TAG}, + {FLAC_FILE, ".fla", FLAC_TAG}, +#endif + {MPC_FILE, ".mpc", APE_TAG}, // Implemented by Artur Polaczynski + {MPC_FILE, ".mp+", APE_TAG}, // Implemented by Artur Polaczynski + {MPC_FILE, ".mpp", APE_TAG}, // Implemented by Artur Polaczynski + {MAC_FILE, ".ape", APE_TAG}, // Implemented by Artur Polaczynski + {MAC_FILE, ".mac", APE_TAG}, // Implemented by Artur Polaczynski + {OFR_FILE, ".ofr", APE_TAG}, + {OFR_FILE, ".ofs", APE_TAG}, +#ifdef ENABLE_MP4 + {MP4_FILE, ".mp4", MP4_TAG}, // Implemented by Michael Ihde + {MP4_FILE, ".m4a", MP4_TAG}, // Implemented by Michael Ihde + {MP4_FILE, ".m4p", MP4_TAG}, // Implemented by Michael Ihde +#endif +#ifdef ENABLE_WAVPACK + {WAVPACK_FILE, ".wv", WAVPACK_TAG}, // Implemented by Maarten Maathuis +#endif + {UNKNOWN_FILE, "", UNKNOWN_TAG} /* This item must be placed to the end! */ +}; + +/* Calculate the last index of the previous tab */ +#define ET_FILE_DESCRIPTION_SIZE ( sizeof(ETFileDescription)/sizeof(ETFileDescription[0]) - 1 ) + + +/* + * Description of each item of the ETFileList list + */ +typedef struct _ET_File ET_File; +struct _ET_File +{ + guint IndexKey; /* Value used to display the position in the list (and in the BrowserList) - Must be renumered after resorting the list - This value varies when resorting list */ + + guint ETFileKey; /* Primary key to identify each item of the list (no longer used?) */ + + ET_File_Description *ETFileDescription; + gchar *ETFileExtension; /* Real extension of the file (keeping the case) (should be placed in ETFileDescription?) */ + ET_File_Info *ETFileInfo; /* Header infos: bitrate, duration, ... */ + + GList *FileNameCur; /* Points to item of FileNameList that represents the current value of filename state (i.e. file on hard disk) */ + GList *FileNameNew; /* Points to item of FileNameList that represents the new value of filename state */ + GList *FileNameList; /* Contains the history of changes about the file name */ + GList *FileNameListBak; /* Contains items of FileNameList removed by 'undo' procedure but have data currently saved (for example, when you save your last changes, make some 'undo', then make new changes) */ + + GList *FileTag; /* Points to the current item used of FileTagList */ + GList *FileTagList; /* Contains the history of changes about file tag data */ + GList *FileTagListBak; /* Contains items of FileTagList removed by 'undo' procedure but have data currently saved */ + +}; + + + +/* + * Description of each item of the ETHistoryFileList list + */ +typedef struct _ET_History_File ET_History_File; +struct _ET_History_File +{ + ET_File *ETFile; /* Pointer to item of ETFileList changed */ +}; + + + +/* + * Description of all variables, lists needed by EasyTAG + */ +typedef struct _ET_Core ET_Core; +struct _ET_Core +{ + // The main list of files + GList *ETFileList; // List of ALL FILES (ET_File) loaded in the directory and sub-directories (List of ET_File) (This list musn't be altered, and points always to the first item) + + // The list of files organized by artist then album + GList *ETArtistAlbumFileList; + + + // Displayed list (part of the main list of files displayed in BrowserList) (used when displaying by Artist & Album) + GList *ETFileDisplayedList; // List of files displayed (List of ET_File from ETFileList / ATArtistAlbumFileList) | !! May not point to the first item!! + GList *ETFileDisplayedListPtr; // Pointer to the current item of ETFileDisplayedList used with ET_Displayed_File_List_First, ET_Displayed_File_List_Previous + guint ETFileDisplayedList_Length; // Contains the length of the displayed list + gfloat ETFileDisplayedList_TotalSize; // Total of the size of files in displayed list (in bytes) + gulong ETFileDisplayedList_TotalDuration; // Total of duration of files in displayed list (in seconds) + + // Displayed item + ET_File *ETFileDisplayed; // Pointer to the current ETFile displayed in EasyTAG (may be NULL) + + + // History list + GList *ETHistoryFileList; // History list of files changes for undo/redo actions +}; + +ET_Core *ETCore; // Main pointer to structure needed by EasyTAG + + + +/************** + * Prototypes * + **************/ + +void ET_Core_Create (void); +void ET_Core_Initialize (void); +void ET_Core_Free (void); +void ET_Core_Destroy (void); + +gboolean ET_File_Is_Supported (gchar *filename); +GList *ET_Add_File_To_File_List (gchar *filename); +gboolean ET_Remove_File_From_File_List (ET_File *ETFile); + +gboolean ET_Create_Artist_Album_File_List (void); +gboolean ET_Add_File_To_Artist_Album_File_List (ET_File *ETFile); +gboolean ET_Remove_File_From_File_List (ET_File *ETFile); + +gboolean ET_Check_If_File_Is_Saved (ET_File *ETFile); +gboolean ET_Check_If_All_Files_Are_Saved (void); + +//gboolean ET_Free_File_List (void); +gboolean ET_Free_History_File_List (void); +gboolean ET_Free_Displayed_File_List (void); + +ET_File *ET_File_Item_New (void); +File_Name *ET_File_Name_Item_New (void); +File_Tag *ET_File_Tag_Item_New (void); +ET_File_Info *ET_File_Info_Item_New (void); +gboolean ET_Free_File_Tag_Item (File_Tag *FileTag); +gboolean ET_Free_File_List_Item (ET_File *ETFile); + +gboolean ET_Copy_File_Tag_Item (ET_File *ETFile, File_Tag *FileTag); +gboolean ET_Set_Field_File_Name_Item (gchar **FileNameField, gchar *value); +gboolean ET_Set_Filename_File_Name_Item (File_Name *FileName, gchar *filename_utf8, gchar *filename); +gboolean ET_Set_Field_File_Tag_Item (gchar **FileTagField, gchar *value); +gboolean ET_Set_Field_File_Tag_Picture (Picture **FileTagField, Picture *pic); + +GList *ET_Displayed_File_List_First (void); +GList *ET_Displayed_File_List_Previous (void); +GList *ET_Displayed_File_List_Next (void); +GList *ET_Displayed_File_List_Last (void); +GList *ET_Displayed_File_List_By_Etfile (ET_File *ETFile); +GList *ET_Displayed_File_List_By_Position (gulong pos_in_list); +guint ET_Displayed_File_List_Get_Length (void); +//GList *ET_Displayed_File_List_Current (void); + +gboolean ET_Set_Displayed_File_List (GList *ETFileList); + +void ET_Display_File_Data_To_UI (ET_File *ETFile); +void ET_Save_File_Data_From_UI (ET_File *ETFile); +gboolean ET_Save_File_Tag_To_HD (ET_File *ETFile); + +gboolean ET_Undo_File_Data (ET_File *ETFile); +gboolean ET_Redo_File_Data (ET_File *ETFile); +gboolean ET_File_Data_Has_Undo_Data (ET_File *ETFile); +gboolean ET_File_Data_Has_Redo_Data (ET_File *ETFile); + +ET_File *ET_Undo_History_File_Data (void); +ET_File *ET_Redo_History_File_Data (void); +gboolean ET_History_File_List_Has_Undo_Data (void); +gboolean ET_History_File_List_Has_Redo_Data (void); + +gboolean ET_Manage_Changes_Of_File_Data (ET_File *ETFile, File_Name *FileName, File_Tag *FileTag); +void ET_Mark_File_Name_As_Saved (ET_File *ETFile); +void ET_Update_Directory_Name_Into_File_List (gchar* last_path, gchar *new_path); +gboolean ET_File_Name_Convert_Character (gchar *filename_utf8); +gchar *ET_File_Name_Format_Extension (ET_File *ETFile); +gchar *ET_File_Name_Generate (ET_File *ETFile, gchar *new_file_name); +guint ET_Get_Number_Of_Files_In_Directory (gchar *path_utf8); +gchar *ET_Utf8_Validate_Full_String (gchar *string_to_validate); + +gboolean ET_Detect_Changes_Of_File_Tag (File_Tag *FileTag1, File_Tag *FileTag2); + +GList *ET_Sort_File_List (GList *ETFileList, ET_Sorting_Type Sorting_Type); +void ET_Sort_Displayed_File_List (ET_Sorting_Type Sorting_Type); +void ET_Sort_Displayed_File_List_And_Update_UI (ET_Sorting_Type Sorting_Type); +gint ET_Comp_Func_Sort_File_By_Ascending_Filename (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Filename (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Creation_Date (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Creation_Date (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Track_Number (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Track_Number (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Title (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Title (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Artist (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Artist (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Album (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Album (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Year (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Year (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Genre (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Genre (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Comment (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Comment (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Composer (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Composer (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Orig_Artist (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Orig_Artist (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Copyright (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Copyright (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Url (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Url (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_Encoded_By (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_Encoded_By (ET_File *ETFile1, ET_File *ETFile2); + +gint ET_Comp_Func_Sort_File_By_Ascending_File_Type (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_File_Type (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_File_Size (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_File_Size (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_File_Duration (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_File_Duration (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_File_Bitrate (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_File_Bitrate (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Ascending_File_Samplerate (ET_File *ETFile1, ET_File *ETFile2); +gint ET_Comp_Func_Sort_File_By_Descending_File_Samplerate (ET_File *ETFile1, ET_File *ETFile2); + + +/* Functions for debugging */ +void ET_Debug_Print_File (ET_File *ETFile, gchar *file, gint line, gchar *function); +void ET_Debug_Print_File_List (GList *ETFileList, gchar *file, gint line, gchar *function); +void ET_Debug_Print_Artist_Album_List (gchar *file, gint line, gchar *function); +void ET_Debug_Print_Time (gchar *msg); + + +#endif /* __ET_CORE_H__ */ |