annotate Plugins/Input/mpg123/id3_tag.c @ 61:fa848bd484d8 trunk

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