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