id3tag.h
上传用户:detong
上传日期:2022-06-22
资源大小:20675k
文件大小:10k
源码类别:

系统编程

开发平台:

Unix_Linux

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