1 /* -*- linux-c -*- 2 Copyright (C) 2007 Tom Szilagyi 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software 16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17 18 $Id: metadata.h 1295 2014-05-04 22:07:31Z tszilagyi $ 19 */ 20 21 #ifndef AQUALUNG_METADATA_H 22 #define AQUALUNG_METADATA_H 23 24 #include <config.h> 25 26 #include <glib.h> 27 28 #include "common.h" 29 30 31 G_BEGIN_DECLS 32 33 /* tag (and pseudo-tag) types */ 34 #define META_TAG_NULL 0x000 35 #define META_TAG_ID3v1 0x001 36 #define META_TAG_ID3v2 0x002 37 #define META_TAG_APE 0x004 38 #define META_TAG_OXC 0x008 39 #define META_TAG_FLAC_APIC 0x010 40 #define META_TAG_MPC_RGDATA 0x020 41 #define META_TAG_GEN_STREAM 0x040 42 #define META_TAG_MPEGSTREAM 0x080 43 #define META_TAG_MODINFO 0x100 44 45 #define META_TAG_MAX 0x100 46 47 #define META_N_TAGS 8 /* NULL and MODINFO are pseudo-tags */ 48 49 /* frame types -- string, integer, float, binary */ 50 51 /* string types (most basic ones) */ 52 #define META_FIELD_TITLE 0x01 53 #define META_FIELD_ARTIST 0x02 54 #define META_FIELD_ALBUM 0x03 55 #define META_FIELD_DATE 0x04 56 #define META_FIELD_GENRE 0x05 57 #define META_FIELD_COMMENT 0x06 58 59 /* string types added for OXC */ 60 #define META_FIELD_PERFORMER 0x07 61 #define META_FIELD_DESCRIPTION 0x08 62 #define META_FIELD_ORGANIZATION 0x09 63 #define META_FIELD_LOCATION 0x0a 64 #define META_FIELD_CONTACT 0x0b 65 #define META_FIELD_LICENSE 0x0c 66 #define META_FIELD_COPYRIGHT 0x0d 67 #define META_FIELD_ISRC 0x0e 68 #define META_FIELD_VERSION 0x0f 69 70 /* string types added for APE */ 71 #define META_FIELD_SUBTITLE 0x10 72 #define META_FIELD_DEBUT_ALBUM 0x11 73 #define META_FIELD_PUBLISHER 0x12 74 #define META_FIELD_CONDUCTOR 0x13 75 #define META_FIELD_COMPOSER 0x14 76 #define META_FIELD_PRIGHT 0x15 77 #define META_FIELD_FILE 0x16 78 #define META_FIELD_ISBN 0x17 79 #define META_FIELD_CATALOG 0x18 80 #define META_FIELD_LC 0x19 81 #define META_FIELD_RECORD_DATE 0x1a 82 #define META_FIELD_RECORD_LOC 0x1b 83 #define META_FIELD_MEDIA 0x1c 84 #define META_FIELD_INDEX 0x1d 85 #define META_FIELD_RELATED 0x1e 86 #define META_FIELD_ABSTRACT 0x1f 87 #define META_FIELD_LANGUAGE 0x20 88 #define META_FIELD_BIBLIOGRAPHY 0x21 89 #define META_FIELD_INTROPLAY 0x22 90 91 /* string types added for ID3v2 */ 92 #define META_FIELD_TBPM 0x30 93 #define META_FIELD_TDEN 0x31 94 #define META_FIELD_TDLY 0x32 95 #define META_FIELD_TDOR 0x33 96 #define META_FIELD_TDRL 0x34 97 #define META_FIELD_TDTG 0x35 98 #define META_FIELD_TENC 0x36 99 #define META_FIELD_T_E_X_T 0x37 100 #define META_FIELD_TFLT 0x38 101 #define META_FIELD_TIPL 0x39 102 #define META_FIELD_TIT1 0x3a 103 #define META_FIELD_TKEY 0x3b 104 #define META_FIELD_TLEN 0x3c 105 #define META_FIELD_TMCL 0x3d 106 #define META_FIELD_TMOO 0x3e 107 #define META_FIELD_TOAL 0x3f 108 #define META_FIELD_TOFN 0x40 109 #define META_FIELD_TOLY 0x41 110 #define META_FIELD_TOPE 0x42 111 #define META_FIELD_TOWN 0x43 112 #define META_FIELD_TPE2 0x44 113 #define META_FIELD_TPE4 0x45 114 #define META_FIELD_TPOS 0x46 115 #define META_FIELD_TPRO 0x47 116 #define META_FIELD_TRSN 0x48 117 #define META_FIELD_TRSO 0x49 118 #define META_FIELD_TSOA 0x4a 119 #define META_FIELD_TSOP 0x4b 120 #define META_FIELD_TSOT 0x4c 121 #define META_FIELD_TSSE 0x4d 122 #define META_FIELD_TSST 0x4e 123 #define META_FIELD_TXXX 0x4f 124 #define META_FIELD_WCOM 0x50 125 #define META_FIELD_WCOP 0x51 126 #define META_FIELD_WOAF 0x52 127 #define META_FIELD_WOAR 0x53 128 #define META_FIELD_WOAS 0x54 129 #define META_FIELD_WORS 0x55 130 #define META_FIELD_WPAY 0x56 131 #define META_FIELD_WPUB 0x57 132 #define META_FIELD_WXXX 0x58 133 134 /* misc. string types */ 135 #define META_FIELD_VENDOR 0x60 136 #define META_FIELD_ICY_NAME 0x61 137 #define META_FIELD_ICY_DESCR 0x62 138 #define META_FIELD_ICY_GENRE 0x63 139 #define META_FIELD_OTHER 0xff 140 141 /* integer types */ 142 #define META_FIELD_TRACKNO 0x0100 143 #define META_FIELD_DISC 0x0200 144 #define META_FIELD_EAN_UPC 0x0300 145 146 /* float types */ 147 #define META_FIELD_RVA2 0x010000 148 #define META_FIELD_RG_REFLOUDNESS 0x020000 149 #define META_FIELD_RG_TRACK_GAIN 0x030000 150 #define META_FIELD_RG_TRACK_PEAK 0x040000 151 #define META_FIELD_RG_ALBUM_GAIN 0x050000 152 #define META_FIELD_RG_ALBUM_PEAK 0x060000 153 154 /* binary types */ 155 #define META_FIELD_APIC 0x01000000 156 #define META_FIELD_GEOB 0x02000000 157 #define META_FIELD_MODINFO 0x03000000 158 #define META_FIELD_HIDDEN 0x04000000 159 160 161 #define META_FIELD_TEXT(f) ((f)&0xff) 162 #define META_FIELD_INT(f) ((f)&0xff00) 163 #define META_FIELD_FLOAT(f) ((f)&0xff0000) 164 #define META_FIELD_BIN(f) ((f)&0xff000000) 165 166 /* field flags */ 167 #define META_FIELD_UNIQUE 0x01 /* only one instance is permitted */ 168 #define META_FIELD_MANDATORY 0x02 /* field cannot be removed */ 169 #define META_FIELD_LOCATOR 0x80 /* field_val is only a locator to the actual content */ 170 171 typedef struct _meta_frame_t { 172 int tag; /* one of META_TAG_*, owner tag of this frame */ 173 int type; /* one of META_FIELD_* */ 174 int flags; 175 char * field_name; 176 char * field_val; /* UTF8 */ 177 int int_val; 178 float float_val; 179 void * data; 180 int length; 181 void * source; /* source widget in File info dialog */ 182 struct _meta_frame_t * next; 183 } meta_frame_t; 184 185 typedef struct { 186 int writable; 187 int valid_tags; /* tags that are valid (but may not be actually present) */ 188 meta_frame_t * root; /* linked list */ 189 void * fdec; /* optional; points to the owner fdec */ 190 } metadata_t; 191 192 193 /* type of META_FIELD_MODINFO */ 194 #ifdef HAVE_MOD 195 typedef struct _mod_info { 196 char title[MAXLEN]; 197 int active; 198 int type; 199 unsigned int samples; 200 unsigned int instruments; 201 unsigned int patterns; 202 unsigned int channels; 203 } mod_info; 204 #endif /* HAVE_MOD */ 205 206 207 /* data model functions */ 208 char * meta_get_tagname(int tag); 209 int meta_tag_from_name(char * name); 210 211 int meta_get_fieldname(int type, char ** str); 212 int meta_get_fieldname_embedded(int tag, int type, char ** str); 213 char * meta_get_field_parsefmt(int type); 214 char * meta_get_field_renderfmt(int type); 215 int meta_frame_type_from_name(char * name); 216 int meta_frame_type_from_embedded_name(int tag, char * name); 217 GSList * meta_get_possible_fields(int tag); 218 int meta_get_default_flags(int tag, int type); 219 void metadata_add_mandatory_frames(metadata_t * meta, int tag); 220 void metadata_clone_frame(metadata_t * meta, meta_frame_t * frame); 221 222 223 /* object methods */ 224 metadata_t * metadata_new(void); 225 void metadata_free(metadata_t * meta); 226 227 meta_frame_t * meta_frame_new(void); 228 void meta_frame_free(meta_frame_t * meta_frame); 229 230 void metadata_add_frame(metadata_t * meta, meta_frame_t * frame); 231 void metadata_remove_frame(metadata_t * meta, meta_frame_t * frame); 232 233 234 /* helper functions */ 235 meta_frame_t * metadata_get_frame_by_type(metadata_t * meta, 236 int type, meta_frame_t * root); 237 meta_frame_t * metadata_get_frame_by_tag(metadata_t * meta, 238 int tag, meta_frame_t * root); 239 meta_frame_t * metadata_get_frame_by_tag_and_type(metadata_t * meta, 240 int tag, int type, 241 meta_frame_t * root); 242 meta_frame_t * metadata_add_frame_from_keyval(metadata_t * meta, int tag, 243 char * key, char * val); 244 245 246 metadata_t * metadata_from_mpeg_stream_data(char * str); 247 248 metadata_t * metadata_clone(metadata_t * meta, int tags); 249 250 251 /* low-level utils */ 252 guint32 meta_read_int32(unsigned char * buf); 253 guint64 meta_read_int64(unsigned char * buf); 254 void meta_write_int32(guint32 val, unsigned char * buf); 255 void meta_write_int64(guint64 val, unsigned char * buf); 256 257 258 /* debug functions */ 259 void metadata_dump(metadata_t * meta); 260 void meta_dump_frame(meta_frame_t * frame); 261 262 G_END_DECLS 263 264 265 #endif /* AQUALUNG_METADATA_H */ 266