Add RVA2 tag support to MPD
[mpd-mk/avuton.git] / src / tag.h
blobc1c7d7e9a98985bafa312256fbf3bbee04bc85c4
1 /* the Music Player Daemon (MPD)
2 * Copyright (C) 2003-2007 by Warren Dukes (warren.dukes@gmail.com)
3 * This project's homepage is: http://www.musicpd.org
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.
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 * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #ifndef MPD_TAG_H
20 #define MPD_TAG_H
22 #include "gcc.h"
24 #include <stdint.h>
25 #include <stddef.h>
26 #include <stdbool.h>
27 #include <string.h>
29 enum tag_type {
30 TAG_ITEM_ARTIST,
31 TAG_ITEM_ALBUM,
32 TAG_ITEM_TITLE,
33 TAG_ITEM_TRACK,
34 TAG_ITEM_NAME,
35 TAG_ITEM_GENRE,
36 TAG_ITEM_DATE,
37 TAG_ITEM_COMPOSER,
38 TAG_ITEM_PERFORMER,
39 TAG_ITEM_COMMENT,
40 TAG_ITEM_DISC,
41 TAG_NUM_OF_ITEM_TYPES
44 extern const char *mpdTagItemKeys[];
46 struct tag_item {
47 enum tag_type type;
48 char value[sizeof(long)];
49 } mpd_packed;
51 struct tag {
52 int time;
53 struct tag_item **items;
54 uint8_t numOfItems;
57 struct tag *tag_ape_load(const char *file);
59 struct tag *tag_new(void);
61 void tag_lib_init(void);
63 void tag_clear_items_by_type(struct tag *tag, enum tag_type itemType);
65 void tag_free(struct tag *tag);
67 /**
68 * Gives an optional hint to the tag library that we will now add
69 * several tag items; this is used by the library to optimize memory
70 * allocation. Only one tag may be in this state, and this tag must
71 * not have any items yet. You must call tag_end_add() when you are
72 * done.
74 void tag_begin_add(struct tag *tag);
76 /**
77 * Finishes the operation started with tag_begin_add().
79 void tag_end_add(struct tag *tag);
81 void tag_add_item_n(struct tag *tag, enum tag_type itemType,
82 const char *value, size_t len);
84 static inline void tag_add_item(struct tag *tag, enum tag_type itemType,
85 const char *value)
87 tag_add_item_n(tag, itemType, value, strlen(value));
90 struct tag *tag_dup(const struct tag *tag);
92 /**
93 * Returns true if the tag contains no items. This ignores the "time"
94 * attribute.
96 static inline bool
97 tag_is_empty(const struct tag *tag)
99 return tag->numOfItems == 0;
103 * Checks whether the tag contains one or more items with
104 * the specified type.
106 bool tag_has_type(const struct tag *tag, enum tag_type type);
108 int tag_equal(const struct tag *tag1, const struct tag *tag2);
110 #endif