diff 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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Input/mpg123/id3_tag.c	Fri Oct 28 22:58:11 2005 -0700
@@ -0,0 +1,134 @@
+/*********************************************************************
+ * 
+ *    Copyright (C) 1999-2000,  Espen Skoglund
+ *    Department of Computer Science, University of Tromsų
+ * 
+ * Filename:      id3_tag.c
+ * Description:   Code for handling ID3 tags.
+ * Author:        Espen Skoglund <espensk@stud.cs.uit.no>
+ * Created at:    Tue Feb  9 21:13:19 1999
+ *                
+ * $Id: id3_tag.c,v 1.6 2004/07/20 21:47:22 descender Exp $
+ * 
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ * 
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ * 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *                
+ ********************************************************************/
+#include <glib.h>
+
+#include "xmms-id3.h"
+#include "id3_header.h"
+
+
+/*
+ * Function id3_init_tag (id3)
+ *
+ *    Initialize an empty ID3 tag.
+ *
+ */
+void
+id3_init_tag(struct id3_tag *id3)
+{
+    /*
+     * Initialize header.
+     */
+    id3->id3_version = 3;
+    id3->id3_revision = 0;
+    id3->id3_flags = ID3_THFLAG_USYNC | ID3_THFLAG_EXP;
+    id3->id3_tagsize = 0;
+
+    id3->id3_altered = 1;
+    id3->id3_newtag = 1;
+    id3->id3_pos = 0;
+
+    /*
+     * Initialize frames.
+     */
+    id3->id3_frame = NULL;
+}
+
+
+/*
+ * Function id3_read_tag (id3)
+ *
+ *    Read the ID3 tag from the input stream.  The start of the tag
+ *    must be positioned in the next tag in the stream.  Return 0 upon
+ *    success, or -1 if an error occured.
+ *
+ */
+int
+id3_read_tag(struct id3_tag *id3)
+{
+    char *buf;
+
+    /*
+     * We know that the tag will be at least this big.
+     *
+     * tag header + "ID3"
+     */
+    id3->id3_tagsize = ID3_TAGHDR_SIZE + 3;
+
+    if (!(id3->id3_oflags & ID3_OPENF_NOCHK)) {
+        /*
+         * Check if we have a valid ID3 tag.
+         */
+        char *id = id3->id3_read(id3, NULL, 3);
+        if (id == NULL)
+            return -1;
+
+        if (id[0] != 'I' || id[1] != 'D' || id[2] != '3') {
+            /*
+             * ID3 tag was not detected.
+             */
+            id3->id3_seek(id3, -3);
+            return -1;
+        }
+    }
+
+    /*
+     * Read ID3 tag-header.
+     */
+    buf = id3->id3_read(id3, NULL, ID3_TAGHDR_SIZE);
+    if (buf == NULL)
+        return -1;
+
+    id3->id3_version = buf[0];
+    id3->id3_revision = buf[1];
+    id3->id3_flags = buf[2];
+    id3->id3_tagsize = ID3_GET_SIZE28(buf[3], buf[4], buf[5], buf[6]);
+    id3->id3_newtag = 0;
+    id3->id3_pos = 0;
+
+    if (id3->id3_version < 2 || id3->id3_version > 4)
+        return -1;
+
+    /*
+     * Parse extended header.
+     */
+    if (id3->id3_flags & ID3_THFLAG_EXT) {
+        buf = id3->id3_read(id3, NULL, ID3_EXTHDR_SIZE);
+        if (buf == NULL)
+            return -1;
+    }
+
+    /*
+     * Parse frames.
+     */
+    while (id3->id3_pos < id3->id3_tagsize) {
+        if (id3_read_frame(id3) == -1)
+            return -1;
+    }
+
+    return 0;
+}