annotate Input/mpg123/id3_tag.c @ 33:8c64ae514525 trunk

[svn] Remove dead libvisual dir.
author nenolod
date Wed, 26 Oct 2005 00:41:18 -0700
parents cb178e5ad177
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1 /*********************************************************************
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
2 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
3 * Copyright (C) 1999-2000, Espen Skoglund
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
4 * Department of Computer Science, University of Tromsų
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
5 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
6 * Filename: id3_tag.c
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
7 * Description: Code for handling ID3 tags.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
8 * Author: Espen Skoglund <espensk@stud.cs.uit.no>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
9 * Created at: Tue Feb 9 21:13:19 1999
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
10 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
11 * $Id: id3_tag.c,v 1.6 2004/07/20 21:47:22 descender Exp $
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
12 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
13 * This program is free software; you can redistribute it and/or
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
14 * modify it under the terms of the GNU General Public License
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
15 * as published by the Free Software Foundation; either version 2
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
16 * of the License, or (at your option) any later version.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
17 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
18 * This program is distributed in the hope that it will be useful,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
21 * GNU General Public License for more details.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
22 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
23 * You should have received a copy of the GNU General Public License
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
24 * along with this program; if not, write to the Free Software
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
25 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
26 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
27 ********************************************************************/
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
28 #include <glib.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
29
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
30 #include "xmms-id3.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
31 #include "id3_header.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
32
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
33
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
34 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
35 * Function id3_init_tag (id3)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
36 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
37 * Initialize an empty ID3 tag.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
38 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
39 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
40 void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
41 id3_init_tag(struct id3_tag *id3)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
42 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
43 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
44 * Initialize header.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
45 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
46 id3->id3_version = 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
47 id3->id3_revision = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
48 id3->id3_flags = ID3_THFLAG_USYNC | ID3_THFLAG_EXP;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
49 id3->id3_tagsize = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
50
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
51 id3->id3_altered = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
52 id3->id3_newtag = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
53 id3->id3_pos = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
54
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
55 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
56 * Initialize frames.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
57 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
58 id3->id3_frame = NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
59 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
60
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
61
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
62 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
63 * Function id3_read_tag (id3)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
64 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
65 * Read the ID3 tag from the input stream. The start of the tag
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
66 * must be positioned in the next tag in the stream. Return 0 upon
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
67 * success, or -1 if an error occured.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
68 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
69 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
70 int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
71 id3_read_tag(struct id3_tag *id3)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
72 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
73 char *buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
74
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
75 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
76 * We know that the tag will be at least this big.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
77 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
78 * tag header + "ID3"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
79 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
80 id3->id3_tagsize = ID3_TAGHDR_SIZE + 3;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
81
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
82 if (!(id3->id3_oflags & ID3_OPENF_NOCHK)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
83 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
84 * Check if we have a valid ID3 tag.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
85 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
86 char *id = id3->id3_read(id3, NULL, 3);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
87 if (id == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
88 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
89
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
90 if (id[0] != 'I' || id[1] != 'D' || id[2] != '3') {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
91 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
92 * ID3 tag was not detected.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
93 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
94 id3->id3_seek(id3, -3);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
95 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
96 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
97 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
98
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
99 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
100 * Read ID3 tag-header.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
101 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
102 buf = id3->id3_read(id3, NULL, ID3_TAGHDR_SIZE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
103 if (buf == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
104 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
105
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
106 id3->id3_version = buf[0];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
107 id3->id3_revision = buf[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
108 id3->id3_flags = buf[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
109 id3->id3_tagsize = ID3_GET_SIZE28(buf[3], buf[4], buf[5], buf[6]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
110 id3->id3_newtag = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
111 id3->id3_pos = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
112
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
113 if (id3->id3_version < 2 || id3->id3_version > 4)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
114 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
115
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
116 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
117 * Parse extended header.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
118 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
119 if (id3->id3_flags & ID3_THFLAG_EXT) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
120 buf = id3->id3_read(id3, NULL, ID3_EXTHDR_SIZE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
121 if (buf == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
122 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
123 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
124
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
125 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
126 * Parse frames.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
127 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
128 while (id3->id3_pos < id3->id3_tagsize) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
129 if (id3_read_frame(id3) == -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
130 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
131 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
132
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
133 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
134 }