annotate osx/include/id3tag.h @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents cc5d363db385
children
rev   line source
Chris@2 1 /*
Chris@2 2 * libid3tag - ID3 tag manipulation library
Chris@2 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
Chris@2 4 *
Chris@2 5 * This program is free software; you can redistribute it and/or modify
Chris@2 6 * it under the terms of the GNU General Public License as published by
Chris@2 7 * the Free Software Foundation; either version 2 of the License, or
Chris@2 8 * (at your option) any later version.
Chris@2 9 *
Chris@2 10 * This program is distributed in the hope that it will be useful,
Chris@2 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@2 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@2 13 * GNU General Public License for more details.
Chris@2 14 *
Chris@2 15 * You should have received a copy of the GNU General Public License
Chris@2 16 * along with this program; if not, write to the Free Software
Chris@2 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Chris@2 18 *
Chris@2 19 * If you would like to negotiate alternate licensing terms, you may do
Chris@2 20 * so by contacting: Underbit Technologies, Inc. <info@underbit.com>
Chris@2 21 *
Chris@2 22 * $Id: id3tag.h,v 1.17 2004/01/23 23:22:46 rob Exp $
Chris@2 23 */
Chris@2 24
Chris@2 25 # ifndef LIBID3TAG_ID3TAG_H
Chris@2 26 # define LIBID3TAG_ID3TAG_H
Chris@2 27
Chris@2 28 # ifdef __cplusplus
Chris@2 29 extern "C" {
Chris@2 30 # endif
Chris@2 31
Chris@2 32 # define ID3_TAG_VERSION 0x0400
Chris@2 33 # define ID3_TAG_VERSION_MAJOR(x) (((x) >> 8) & 0xff)
Chris@2 34 # define ID3_TAG_VERSION_MINOR(x) (((x) >> 0) & 0xff)
Chris@2 35
Chris@2 36 typedef unsigned char id3_byte_t;
Chris@2 37 typedef unsigned long id3_length_t;
Chris@2 38
Chris@2 39 typedef unsigned long id3_ucs4_t;
Chris@2 40
Chris@2 41 typedef unsigned char id3_latin1_t;
Chris@2 42 typedef unsigned short id3_utf16_t;
Chris@2 43 typedef signed char id3_utf8_t;
Chris@2 44
Chris@2 45 struct id3_tag {
Chris@2 46 unsigned int refcount;
Chris@2 47 unsigned int version;
Chris@2 48 int flags;
Chris@2 49 int extendedflags;
Chris@2 50 int restrictions;
Chris@2 51 int options;
Chris@2 52 unsigned int nframes;
Chris@2 53 struct id3_frame **frames;
Chris@2 54 id3_length_t paddedsize;
Chris@2 55 };
Chris@2 56
Chris@2 57 # define ID3_TAG_QUERYSIZE 10
Chris@2 58
Chris@2 59 /* ID3v1 field frames */
Chris@2 60
Chris@2 61 # define ID3_FRAME_TITLE "TIT2"
Chris@2 62 # define ID3_FRAME_ARTIST "TPE1"
Chris@2 63 # define ID3_FRAME_ALBUM "TALB"
Chris@2 64 # define ID3_FRAME_TRACK "TRCK"
Chris@2 65 # define ID3_FRAME_YEAR "TDRC"
Chris@2 66 # define ID3_FRAME_GENRE "TCON"
Chris@2 67 # define ID3_FRAME_COMMENT "COMM"
Chris@2 68
Chris@2 69 /* special frames */
Chris@2 70
Chris@2 71 # define ID3_FRAME_OBSOLETE "ZOBS" /* with apologies to the French */
Chris@2 72
Chris@2 73 /* tag flags */
Chris@2 74
Chris@2 75 enum {
Chris@2 76 ID3_TAG_FLAG_UNSYNCHRONISATION = 0x80,
Chris@2 77 ID3_TAG_FLAG_EXTENDEDHEADER = 0x40,
Chris@2 78 ID3_TAG_FLAG_EXPERIMENTALINDICATOR = 0x20,
Chris@2 79 ID3_TAG_FLAG_FOOTERPRESENT = 0x10,
Chris@2 80
Chris@2 81 ID3_TAG_FLAG_KNOWNFLAGS = 0xf0
Chris@2 82 };
Chris@2 83
Chris@2 84 /* tag extended flags */
Chris@2 85
Chris@2 86 enum {
Chris@2 87 ID3_TAG_EXTENDEDFLAG_TAGISANUPDATE = 0x40,
Chris@2 88 ID3_TAG_EXTENDEDFLAG_CRCDATAPRESENT = 0x20,
Chris@2 89 ID3_TAG_EXTENDEDFLAG_TAGRESTRICTIONS = 0x10,
Chris@2 90
Chris@2 91 ID3_TAG_EXTENDEDFLAG_KNOWNFLAGS = 0x70
Chris@2 92 };
Chris@2 93
Chris@2 94 /* tag restrictions */
Chris@2 95
Chris@2 96 enum {
Chris@2 97 ID3_TAG_RESTRICTION_TAGSIZE_MASK = 0xc0,
Chris@2 98 ID3_TAG_RESTRICTION_TAGSIZE_128_FRAMES_1_MB = 0x00,
Chris@2 99 ID3_TAG_RESTRICTION_TAGSIZE_64_FRAMES_128_KB = 0x40,
Chris@2 100 ID3_TAG_RESTRICTION_TAGSIZE_32_FRAMES_40_KB = 0x80,
Chris@2 101 ID3_TAG_RESTRICTION_TAGSIZE_32_FRAMES_4_KB = 0xc0
Chris@2 102 };
Chris@2 103
Chris@2 104 enum {
Chris@2 105 ID3_TAG_RESTRICTION_TEXTENCODING_MASK = 0x20,
Chris@2 106 ID3_TAG_RESTRICTION_TEXTENCODING_NONE = 0x00,
Chris@2 107 ID3_TAG_RESTRICTION_TEXTENCODING_LATIN1_UTF8 = 0x20
Chris@2 108 };
Chris@2 109
Chris@2 110 enum {
Chris@2 111 ID3_TAG_RESTRICTION_TEXTSIZE_MASK = 0x18,
Chris@2 112 ID3_TAG_RESTRICTION_TEXTSIZE_NONE = 0x00,
Chris@2 113 ID3_TAG_RESTRICTION_TEXTSIZE_1024_CHARS = 0x08,
Chris@2 114 ID3_TAG_RESTRICTION_TEXTSIZE_128_CHARS = 0x10,
Chris@2 115 ID3_TAG_RESTRICTION_TEXTSIZE_30_CHARS = 0x18
Chris@2 116 };
Chris@2 117
Chris@2 118 enum {
Chris@2 119 ID3_TAG_RESTRICTION_IMAGEENCODING_MASK = 0x04,
Chris@2 120 ID3_TAG_RESTRICTION_IMAGEENCODING_NONE = 0x00,
Chris@2 121 ID3_TAG_RESTRICTION_IMAGEENCODING_PNG_JPEG = 0x04
Chris@2 122 };
Chris@2 123
Chris@2 124 enum {
Chris@2 125 ID3_TAG_RESTRICTION_IMAGESIZE_MASK = 0x03,
Chris@2 126 ID3_TAG_RESTRICTION_IMAGESIZE_NONE = 0x00,
Chris@2 127 ID3_TAG_RESTRICTION_IMAGESIZE_256_256 = 0x01,
Chris@2 128 ID3_TAG_RESTRICTION_IMAGESIZE_64_64 = 0x02,
Chris@2 129 ID3_TAG_RESTRICTION_IMAGESIZE_64_64_EXACT = 0x03
Chris@2 130 };
Chris@2 131
Chris@2 132 /* library options */
Chris@2 133
Chris@2 134 enum {
Chris@2 135 ID3_TAG_OPTION_UNSYNCHRONISATION = 0x0001, /* use unsynchronisation */
Chris@2 136 ID3_TAG_OPTION_COMPRESSION = 0x0002, /* use compression */
Chris@2 137 ID3_TAG_OPTION_CRC = 0x0004, /* use CRC */
Chris@2 138
Chris@2 139 ID3_TAG_OPTION_APPENDEDTAG = 0x0010, /* tag will be appended */
Chris@2 140 ID3_TAG_OPTION_FILEALTERED = 0x0020, /* audio data was altered */
Chris@2 141
Chris@2 142 ID3_TAG_OPTION_ID3V1 = 0x0100 /* render ID3v1/ID3v1.1 tag */
Chris@2 143 };
Chris@2 144
Chris@2 145 struct id3_frame {
Chris@2 146 char id[5];
Chris@2 147 char const *description;
Chris@2 148 unsigned int refcount;
Chris@2 149 int flags;
Chris@2 150 int group_id;
Chris@2 151 int encryption_method;
Chris@2 152 id3_byte_t *encoded;
Chris@2 153 id3_length_t encoded_length;
Chris@2 154 id3_length_t decoded_length;
Chris@2 155 unsigned int nfields;
Chris@2 156 union id3_field *fields;
Chris@2 157 };
Chris@2 158
Chris@2 159 enum {
Chris@2 160 /* frame status flags */
Chris@2 161 ID3_FRAME_FLAG_TAGALTERPRESERVATION = 0x4000,
Chris@2 162 ID3_FRAME_FLAG_FILEALTERPRESERVATION = 0x2000,
Chris@2 163 ID3_FRAME_FLAG_READONLY = 0x1000,
Chris@2 164
Chris@2 165 ID3_FRAME_FLAG_STATUSFLAGS = 0xff00,
Chris@2 166
Chris@2 167 /* frame format flags */
Chris@2 168 ID3_FRAME_FLAG_GROUPINGIDENTITY = 0x0040,
Chris@2 169 ID3_FRAME_FLAG_COMPRESSION = 0x0008,
Chris@2 170 ID3_FRAME_FLAG_ENCRYPTION = 0x0004,
Chris@2 171 ID3_FRAME_FLAG_UNSYNCHRONISATION = 0x0002,
Chris@2 172 ID3_FRAME_FLAG_DATALENGTHINDICATOR = 0x0001,
Chris@2 173
Chris@2 174 ID3_FRAME_FLAG_FORMATFLAGS = 0x00ff,
Chris@2 175
Chris@2 176 ID3_FRAME_FLAG_KNOWNFLAGS = 0x704f
Chris@2 177 };
Chris@2 178
Chris@2 179 enum id3_field_type {
Chris@2 180 ID3_FIELD_TYPE_TEXTENCODING,
Chris@2 181 ID3_FIELD_TYPE_LATIN1,
Chris@2 182 ID3_FIELD_TYPE_LATIN1FULL,
Chris@2 183 ID3_FIELD_TYPE_LATIN1LIST,
Chris@2 184 ID3_FIELD_TYPE_STRING,
Chris@2 185 ID3_FIELD_TYPE_STRINGFULL,
Chris@2 186 ID3_FIELD_TYPE_STRINGLIST,
Chris@2 187 ID3_FIELD_TYPE_LANGUAGE,
Chris@2 188 ID3_FIELD_TYPE_FRAMEID,
Chris@2 189 ID3_FIELD_TYPE_DATE,
Chris@2 190 ID3_FIELD_TYPE_INT8,
Chris@2 191 ID3_FIELD_TYPE_INT16,
Chris@2 192 ID3_FIELD_TYPE_INT24,
Chris@2 193 ID3_FIELD_TYPE_INT32,
Chris@2 194 ID3_FIELD_TYPE_INT32PLUS,
Chris@2 195 ID3_FIELD_TYPE_BINARYDATA
Chris@2 196 };
Chris@2 197
Chris@2 198 enum id3_field_textencoding {
Chris@2 199 ID3_FIELD_TEXTENCODING_ISO_8859_1 = 0x00,
Chris@2 200 ID3_FIELD_TEXTENCODING_UTF_16 = 0x01,
Chris@2 201 ID3_FIELD_TEXTENCODING_UTF_16BE = 0x02,
Chris@2 202 ID3_FIELD_TEXTENCODING_UTF_8 = 0x03
Chris@2 203 };
Chris@2 204
Chris@2 205 union id3_field {
Chris@2 206 enum id3_field_type type;
Chris@2 207 struct {
Chris@2 208 enum id3_field_type type;
Chris@2 209 signed long value;
Chris@2 210 } number;
Chris@2 211 struct {
Chris@2 212 enum id3_field_type type;
Chris@2 213 id3_latin1_t *ptr;
Chris@2 214 } latin1;
Chris@2 215 struct {
Chris@2 216 enum id3_field_type type;
Chris@2 217 unsigned int nstrings;
Chris@2 218 id3_latin1_t **strings;
Chris@2 219 } latin1list;
Chris@2 220 struct {
Chris@2 221 enum id3_field_type type;
Chris@2 222 id3_ucs4_t *ptr;
Chris@2 223 } string;
Chris@2 224 struct {
Chris@2 225 enum id3_field_type type;
Chris@2 226 unsigned int nstrings;
Chris@2 227 id3_ucs4_t **strings;
Chris@2 228 } stringlist;
Chris@2 229 struct {
Chris@2 230 enum id3_field_type type;
Chris@2 231 char value[9];
Chris@2 232 } immediate;
Chris@2 233 struct {
Chris@2 234 enum id3_field_type type;
Chris@2 235 id3_byte_t *data;
Chris@2 236 id3_length_t length;
Chris@2 237 } binary;
Chris@2 238 };
Chris@2 239
Chris@2 240 /* file interface */
Chris@2 241
Chris@2 242 enum id3_file_mode {
Chris@2 243 ID3_FILE_MODE_READONLY = 0,
Chris@2 244 ID3_FILE_MODE_READWRITE
Chris@2 245 };
Chris@2 246
Chris@2 247 struct id3_file *id3_file_open(char const *, enum id3_file_mode);
Chris@2 248 struct id3_file *id3_file_fdopen(int, enum id3_file_mode);
Chris@2 249 int id3_file_close(struct id3_file *);
Chris@2 250
Chris@2 251 struct id3_tag *id3_file_tag(struct id3_file const *);
Chris@2 252
Chris@2 253 int id3_file_update(struct id3_file *);
Chris@2 254
Chris@2 255 /* tag interface */
Chris@2 256
Chris@2 257 struct id3_tag *id3_tag_new(void);
Chris@2 258 void id3_tag_delete(struct id3_tag *);
Chris@2 259
Chris@2 260 unsigned int id3_tag_version(struct id3_tag const *);
Chris@2 261
Chris@2 262 int id3_tag_options(struct id3_tag *, int, int);
Chris@2 263 void id3_tag_setlength(struct id3_tag *, id3_length_t);
Chris@2 264
Chris@2 265 void id3_tag_clearframes(struct id3_tag *);
Chris@2 266
Chris@2 267 int id3_tag_attachframe(struct id3_tag *, struct id3_frame *);
Chris@2 268 int id3_tag_detachframe(struct id3_tag *, struct id3_frame *);
Chris@2 269
Chris@2 270 struct id3_frame *id3_tag_findframe(struct id3_tag const *,
Chris@2 271 char const *, unsigned int);
Chris@2 272
Chris@2 273 signed long id3_tag_query(id3_byte_t const *, id3_length_t);
Chris@2 274
Chris@2 275 struct id3_tag *id3_tag_parse(id3_byte_t const *, id3_length_t);
Chris@2 276 id3_length_t id3_tag_render(struct id3_tag const *, id3_byte_t *);
Chris@2 277
Chris@2 278 /* frame interface */
Chris@2 279
Chris@2 280 struct id3_frame *id3_frame_new(char const *);
Chris@2 281 void id3_frame_delete(struct id3_frame *);
Chris@2 282
Chris@2 283 union id3_field *id3_frame_field(struct id3_frame const *, unsigned int);
Chris@2 284
Chris@2 285 /* field interface */
Chris@2 286
Chris@2 287 enum id3_field_type id3_field_type(union id3_field const *);
Chris@2 288
Chris@2 289 int id3_field_setint(union id3_field *, signed long);
Chris@2 290 int id3_field_settextencoding(union id3_field *, enum id3_field_textencoding);
Chris@2 291 int id3_field_setstrings(union id3_field *, unsigned int, id3_ucs4_t **);
Chris@2 292 int id3_field_addstring(union id3_field *, id3_ucs4_t const *);
Chris@2 293 int id3_field_setlanguage(union id3_field *, char const *);
Chris@2 294 int id3_field_setlatin1(union id3_field *, id3_latin1_t const *);
Chris@2 295 int id3_field_setfulllatin1(union id3_field *, id3_latin1_t const *);
Chris@2 296 int id3_field_setstring(union id3_field *, id3_ucs4_t const *);
Chris@2 297 int id3_field_setfullstring(union id3_field *, id3_ucs4_t const *);
Chris@2 298 int id3_field_setframeid(union id3_field *, char const *);
Chris@2 299 int id3_field_setbinarydata(union id3_field *,
Chris@2 300 id3_byte_t const *, id3_length_t);
Chris@2 301
Chris@2 302 signed long id3_field_getint(union id3_field const *);
Chris@2 303 enum id3_field_textencoding id3_field_gettextencoding(union id3_field const *);
Chris@2 304 id3_latin1_t const *id3_field_getlatin1(union id3_field const *);
Chris@2 305 id3_latin1_t const *id3_field_getfulllatin1(union id3_field const *);
Chris@2 306 id3_ucs4_t const *id3_field_getstring(union id3_field const *);
Chris@2 307 id3_ucs4_t const *id3_field_getfullstring(union id3_field const *);
Chris@2 308 unsigned int id3_field_getnstrings(union id3_field const *);
Chris@2 309 id3_ucs4_t const *id3_field_getstrings(union id3_field const *,
Chris@2 310 unsigned int);
Chris@2 311 char const *id3_field_getframeid(union id3_field const *);
Chris@2 312 id3_byte_t const *id3_field_getbinarydata(union id3_field const *,
Chris@2 313 id3_length_t *);
Chris@2 314
Chris@2 315 /* genre interface */
Chris@2 316
Chris@2 317 id3_ucs4_t const *id3_genre_index(unsigned int);
Chris@2 318 id3_ucs4_t const *id3_genre_name(id3_ucs4_t const *);
Chris@2 319 int id3_genre_number(id3_ucs4_t const *);
Chris@2 320
Chris@2 321 /* ucs4 interface */
Chris@2 322
Chris@2 323 id3_latin1_t *id3_ucs4_latin1duplicate(id3_ucs4_t const *);
Chris@2 324 id3_utf16_t *id3_ucs4_utf16duplicate(id3_ucs4_t const *);
Chris@2 325 id3_utf8_t *id3_ucs4_utf8duplicate(id3_ucs4_t const *);
Chris@2 326
Chris@2 327 void id3_ucs4_putnumber(id3_ucs4_t *, unsigned long);
Chris@2 328 unsigned long id3_ucs4_getnumber(id3_ucs4_t const *);
Chris@2 329
Chris@2 330 /* latin1/utf16/utf8 interfaces */
Chris@2 331
Chris@2 332 id3_ucs4_t *id3_latin1_ucs4duplicate(id3_latin1_t const *);
Chris@2 333 id3_ucs4_t *id3_utf16_ucs4duplicate(id3_utf16_t const *);
Chris@2 334 id3_ucs4_t *id3_utf8_ucs4duplicate(id3_utf8_t const *);
Chris@2 335
Chris@2 336 /* version interface */
Chris@2 337
Chris@2 338 # define ID3_VERSION_MAJOR 0
Chris@2 339 # define ID3_VERSION_MINOR 15
Chris@2 340 # define ID3_VERSION_PATCH 1
Chris@2 341 # define ID3_VERSION_EXTRA " (beta)"
Chris@2 342
Chris@2 343 # define ID3_VERSION_STRINGIZE(str) #str
Chris@2 344 # define ID3_VERSION_STRING(num) ID3_VERSION_STRINGIZE(num)
Chris@2 345
Chris@2 346 # define ID3_VERSION ID3_VERSION_STRING(ID3_VERSION_MAJOR) "." \
Chris@2 347 ID3_VERSION_STRING(ID3_VERSION_MINOR) "." \
Chris@2 348 ID3_VERSION_STRING(ID3_VERSION_PATCH) \
Chris@2 349 ID3_VERSION_EXTRA
Chris@2 350
Chris@2 351 # define ID3_PUBLISHYEAR "2000-2004"
Chris@2 352 # define ID3_AUTHOR "Underbit Technologies, Inc."
Chris@2 353 # define ID3_EMAIL "info@underbit.com"
Chris@2 354
Chris@2 355 extern char const id3_version[];
Chris@2 356 extern char const id3_copyright[];
Chris@2 357 extern char const id3_author[];
Chris@2 358 extern char const id3_build[];
Chris@2 359
Chris@2 360 # ifdef __cplusplus
Chris@2 361 }
Chris@2 362 # endif
Chris@2 363
Chris@2 364 # endif