annotate src/libid3tag/file.c @ 3753:22d71f986b86

export AudDRCT API.
author William Pitcock <nenolod@atheme.org>
date Sun, 14 Oct 2007 17:47:13 -0500
parents fa3d2a62a066
children bb709f82068b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
1 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
2 * libid3tag - ID3 tag manipulation library
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
4 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
8 * (at your option) any later version.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
9 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
13 * GNU General Public License for more details.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
14 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
16 * along with this program; if not, write to the Free Software
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
18 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
19 * $Id: file.c,v 1.21 2004/01/23 09:41:32 rob Exp $
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
20 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
21
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
22 # ifdef HAVE_CONFIG_H
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
23 # include "config.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
24 # endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
25
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
26 # include "global.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
27
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
28 # include <stdio.h>
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
29 # include <stdlib.h>
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
30 # include <string.h>
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
31
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
32 # ifdef HAVE_UNISTD_H
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
33 # include <unistd.h>
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
34 # endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
35
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
36 # ifdef HAVE_ASSERT_H
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
37 # include <assert.h>
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
38 # endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
39
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
40 # include "id3tag.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
41 # include "file.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
42 # include "tag.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
43 # include "field.h"
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
44
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
45 #define AUDACIOUS 1
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
46 //#undef AUDACIOUS
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
47
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
48 #ifdef AUDACIOUS
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
49 #include <audacious/plugin.h>
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
50 #else
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
51 #define VFSFile FILE
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
52 #define aud_vfs_fopen fopen
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
53 #define aud_vfs_fclose fclose
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
54 #define aud_vfs_fseek fseek
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
55 #define aud_vfs_ftell ftell
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
56 #define aud_vfs_rewind rewind
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
57 #define aud_vfs_fread fread
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
58 #define aud_vfs_fwrite fwrite
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
59 #define aud_vfs_truncate(x, y) ftruncate((fileno(x)), (y))
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
60 #endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
61
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
62 struct filetag {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
63 struct id3_tag *tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
64 unsigned long location;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
65 id3_length_t length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
66 };
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
67
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
68 struct id3_file {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
69 VFSFile *iofile;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
70 enum id3_file_mode mode;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
71 char *path;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
72
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
73 int flags;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
74
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
75 struct id3_tag *primary;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
76
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
77 unsigned int ntags;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
78 struct filetag *tags;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
79 };
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
80
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
81 enum {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
82 ID3_FILE_FLAG_ID3V1 = 0x0001
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
83 };
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
84
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
85 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
86 * NAME: query_tag()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
87 * DESCRIPTION: check for a tag at a file's current position
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
88 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
89 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
90 signed long query_tag(VFSFile *iofile)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
91 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
92 int save_position;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
93 id3_byte_t query[ID3_TAG_QUERYSIZE];
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
94 signed long size;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
95
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
96 save_position = aud_vfs_ftell(iofile);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
97 if (save_position == -1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
98 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
99
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
100 size = id3_tag_query(query, aud_vfs_fread(query, 1, sizeof(query), iofile));
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
101
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
102 if(aud_vfs_fseek(iofile, save_position, SEEK_SET) == -1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
103 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
104
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
105 return size;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
106 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
107
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
108 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
109 * NAME: read_tag()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
110 * DESCRIPTION: read and parse a tag at a file's current position
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
111 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
112 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
113 struct id3_tag *read_tag(VFSFile *iofile, id3_length_t size)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
114 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
115 id3_byte_t *data;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
116 struct id3_tag *tag = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
117
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
118 data = malloc(size);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
119 if (data) {
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
120 if (aud_vfs_fread(data, size, 1, iofile) == 1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
121 tag = id3_tag_parse(data, size);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
122
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
123 free(data);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
124 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
125
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
126 return tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
127 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
128
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
129 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
130 * NAME: update_primary()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
131 * DESCRIPTION: update the primary tag with data from a new tag
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
132 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
133 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
134 int update_primary(struct id3_tag *tag, struct id3_tag const *new)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
135 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
136 unsigned int i;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
137 struct id3_frame *frame;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
138
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
139 if (new) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
140 if (!(new->extendedflags & ID3_TAG_EXTENDEDFLAG_TAGISANUPDATE))
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
141 id3_tag_clearframes(tag);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
142
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
143 i = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
144 while ((frame = id3_tag_findframe(new, 0, i++))) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
145 if (id3_tag_attachframe(tag, frame) == -1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
146 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
147 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
148 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
149
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
150 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
151 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
152
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
153 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
154 * NAME: tag_compare()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
155 * DESCRIPTION: tag sort function for qsort()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
156 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
157 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
158 int tag_compare(const void *a, const void *b)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
159 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
160 struct filetag const *tag1 = a, *tag2 = b;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
161
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
162 if (tag1->location < tag2->location)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
163 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
164 else if (tag1->location > tag2->location)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
165 return +1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
166
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
167 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
168 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
169
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
170 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
171 * NAME: add_filetag()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
172 * DESCRIPTION: add a new file tag entry
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
173 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
174 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
175 int add_filetag(struct id3_file *file, struct filetag const *filetag)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
176 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
177 struct filetag *tags;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
178
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
179 tags = realloc(file->tags, (file->ntags + 1) * sizeof(*tags));
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
180 if (tags == 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
181 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
182
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
183 file->tags = tags;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
184 file->tags[file->ntags++] = *filetag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
185
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
186 /* sort tags by location */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
187
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
188 if (file->ntags > 1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
189 qsort(file->tags, file->ntags, sizeof(file->tags[0]), tag_compare);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
190
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
191 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
192 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
193
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
194 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
195 * NAME: del_filetag()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
196 * DESCRIPTION: delete a file tag entry
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
197 */
3693
13bd2580ec18 Fix two gcc warnings.
Jonathan Schleifer <js@h3c.de>
parents: 2563
diff changeset
198 /*
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
199 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
200 void del_filetag(struct id3_file *file, unsigned int index)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
201 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
202 assert(index < file->ntags);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
203
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
204 while (index < file->ntags - 1) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
205 file->tags[index] = file->tags[index + 1];
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
206 ++index;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
207 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
208
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
209 --file->ntags;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
210 }
3693
13bd2580ec18 Fix two gcc warnings.
Jonathan Schleifer <js@h3c.de>
parents: 2563
diff changeset
211 */
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
212
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
213 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
214 * NAME: add_tag()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
215 * DESCRIPTION: read, parse, and add a tag to a file structure
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
216 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
217 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
218 struct id3_tag *add_tag(struct id3_file *file, id3_length_t length)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
219 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
220 long location;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
221 unsigned int i;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
222 struct filetag filetag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
223 struct id3_tag *tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
224
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
225 location = aud_vfs_ftell(file->iofile);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
226 if (location == -1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
227 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
228
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
229 /* check for duplication/overlap */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
230 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
231 unsigned long begin1, end1, begin2, end2;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
232
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
233 begin1 = location;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
234 end1 = begin1 + length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
235
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
236 for (i = 0; i < file->ntags; ++i) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
237 begin2 = file->tags[i].location;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
238 end2 = begin2 + file->tags[i].length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
239
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
240 if (begin1 == begin2 && end1 == end2)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
241 return file->tags[i].tag; /* duplicate */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
242
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
243 if (begin1 < end2 && end1 > begin2)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
244 return 0; /* overlap */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
245 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
246 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
247
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
248 tag = read_tag(file->iofile, length);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
249
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
250 filetag.tag = tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
251 filetag.location = location;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
252 filetag.length = length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
253
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
254 if (add_filetag(file, &filetag) == -1 ||
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
255 update_primary(file->primary, tag) == -1) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
256 if (tag)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
257 id3_tag_delete(tag);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
258 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
259 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
260
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
261 if (tag)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
262 id3_tag_addref(tag);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
263
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
264 return tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
265 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
266
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
267 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
268 * NAME: search_tags()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
269 * DESCRIPTION: search for tags in a file
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
270 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
271 //static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
272 int search_tags(struct id3_file *file)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
273 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
274 int save_position;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
275 signed long size;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
276
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
277 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
278 * save the current seek position
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
279 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
280 * We also verify the stream is seekable by calling fsetpos(), since
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
281 * fgetpos() alone is not reliable enough for this purpose.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
282 *
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
283 * [Apparently not even fsetpos() is sufficient under Win32.]
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
284 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
285
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
286 // if (fgetpos(file->iofile, &save_position) == -1 ||
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
287 // fsetpos(file->iofile, &save_position) == -1)
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
288 // if (save_position = aud_vfs_ftell(file->iofile) == -1 ||
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
289 // aud_vfs_fseek(file->iofile, save_position, SEEK_SET) == -1)
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
290 if((save_position = aud_vfs_ftell(file->iofile)) == -1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
291 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
292
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
293 /* look for an ID3v1 tag */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
294
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
295 if (aud_vfs_fseek(file->iofile, -128, SEEK_END) == 0) {
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
296 size = query_tag(file->iofile);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
297 if (size > 0) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
298 struct id3_tag const *tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
299
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
300 tag = add_tag(file, size);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
301
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
302 /* if this is indeed an ID3v1 tag, mark the file so */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
303
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
304 if (tag && (ID3_TAG_VERSION_MAJOR(id3_tag_version(tag)) == 1))
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
305 file->flags |= ID3_FILE_FLAG_ID3V1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
306 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
307 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
308
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
309 /* look for a tag at the beginning of the file */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
310
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
311 aud_vfs_rewind(file->iofile);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
312
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
313 size = query_tag(file->iofile);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
314 if (size > 0) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
315 struct id3_tag const *tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
316 struct id3_frame const *frame;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
317
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
318 tag = add_tag(file, size);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
319
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
320 /* locate tags indicated by SEEK frames */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
321
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
322 while (tag && (frame = id3_tag_findframe(tag, "SEEK", 0))) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
323 long seek;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
324
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
325 seek = id3_field_getint(id3_frame_field(frame, 0));
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
326 if (seek < 0 || aud_vfs_fseek(file->iofile, seek, SEEK_CUR) == -1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
327 break;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
328
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
329 size = query_tag(file->iofile);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
330 tag = (size > 0) ? add_tag(file, size) : 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
331 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
332 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
333
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
334 /* look for a tag at the end of the file (before any ID3v1 tag) */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
335
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
336 if (aud_vfs_fseek(file->iofile, ((file->flags & ID3_FILE_FLAG_ID3V1) ? -128 : 0) +
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
337 -10, SEEK_END) == 0) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
338 size = query_tag(file->iofile);
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
339 if (size < 0 && aud_vfs_fseek(file->iofile, size, SEEK_CUR) == 0) {
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
340 size = query_tag(file->iofile);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
341 if (size > 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
342 add_tag(file, size);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
343 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
344 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
345
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
346 #ifndef AUDACIOUS
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
347 clearerr(file->iofile);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
348 #endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
349
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
350 /* restore seek position */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
351
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
352 if (aud_vfs_fseek(file->iofile, save_position, SEEK_SET) == -1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
353 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
354
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
355 /* set primary tag options and target padded length for convenience */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
356
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
357 if ((file->ntags > 0 && !(file->flags & ID3_FILE_FLAG_ID3V1)) ||
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
358 (file->ntags > 1 && (file->flags & ID3_FILE_FLAG_ID3V1))) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
359 if (file->tags[0].location == 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
360 id3_tag_setlength(file->primary, file->tags[0].length);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
361 else
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
362 id3_tag_options(file->primary, ID3_TAG_OPTION_APPENDEDTAG, ~0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
363 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
364
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
365 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
366 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
367
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
368 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
369 * NAME: finish_file()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
370 * DESCRIPTION: release memory associated with a file
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
371 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
372 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
373 void finish_file(struct id3_file *file)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
374 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
375 unsigned int i;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
376
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
377 if (file->path)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
378 free(file->path);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
379
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
380 if (file->primary) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
381 id3_tag_delref(file->primary);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
382 id3_tag_delete(file->primary);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
383 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
384
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
385 for (i = 0; i < file->ntags; ++i) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
386 struct id3_tag *tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
387
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
388 tag = file->tags[i].tag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
389 if (tag) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
390 id3_tag_delref(tag);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
391 id3_tag_delete(tag);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
392 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
393 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
394
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
395 if (file->tags)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
396 free(file->tags);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
397
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
398 free(file);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
399 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
400
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
401 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
402 * NAME: new_file()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
403 * DESCRIPTION: create a new file structure and load tags
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
404 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
405 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
406 struct id3_file *new_file(VFSFile *iofile, enum id3_file_mode mode,
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
407 char const *path)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
408 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
409 struct id3_file *file;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
410
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
411 file = malloc(sizeof(*file));
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
412 if (file == 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
413 goto fail;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
414
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
415 file->iofile = iofile;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
416 file->mode = mode;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
417 file->path = path ? strdup(path) : 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
418
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
419 file->flags = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
420
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
421 file->ntags = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
422 file->tags = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
423
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
424 file->primary = id3_tag_new();
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
425 if (file->primary == 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
426 goto fail;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
427
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
428 id3_tag_addref(file->primary);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
429
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
430 /* load tags from the file */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
431
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
432 if (search_tags(file) == -1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
433 goto fail;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
434
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
435 id3_tag_options(file->primary, ID3_TAG_OPTION_ID3V1,
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
436 (file->flags & ID3_FILE_FLAG_ID3V1) ? ~0 : 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
437
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
438 if (0) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
439 fail:
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
440 if (file) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
441 finish_file(file);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
442 file = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
443 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
444 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
445
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
446 return file;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
447 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
448
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
449
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
450 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
451 * NAME: file->open()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
452 * DESCRIPTION: open a file given its pathname
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
453 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
454 struct id3_file *id3_file_open(char const *path, enum id3_file_mode mode)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
455 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
456 VFSFile *iofile;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
457 struct id3_file *file;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
458
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
459 assert(path);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
460
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
461 iofile = aud_vfs_fopen(path, (mode == ID3_FILE_MODE_READWRITE) ? "r+b" : "rb");
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
462 if (iofile == 0){
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
463 printf("id3_file_open: iofile failed\n");
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
464 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
465 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
466 file = new_file(iofile, mode, path);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
467 if (file == 0){
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
468 printf("id3_file_open: file failed\n");
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
469 aud_vfs_fclose(iofile);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
470 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
471
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
472 return file;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
473 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
474
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
475 /*
2563
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
476 * NAME: file->vfsopen()
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
477 * DESCRIPTION: open a file given its vfs
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
478 */
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
479 struct id3_file *id3_file_vfsopen(VFSFile *iofile, enum id3_file_mode mode)
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
480 {
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
481 struct id3_file *file;
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
482 glong curpos;
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
483 gchar *path;
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
484
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
485 assert(iofile);
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
486
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
487 path = iofile->uri;
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
488
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
489 aud_vfs_dup(iofile);
2563
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
490
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
491 curpos = aud_vfs_ftell(iofile);
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
492 aud_vfs_fseek(iofile, 0, SEEK_SET);
2563
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
493
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
494 file = new_file(iofile, mode, path);
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
495 if (file == 0){
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
496 printf("id3_file_vfsopen: file failed\n");
2563
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
497 }
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
498
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
499 aud_vfs_fseek(iofile, curpos, SEEK_SET);
2563
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
500
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
501 return file;
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
502 }
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
503
bdd0ee5888e0 [svn] - add support for opening id3 tags from a live vfs handle.
nenolod
parents: 2558
diff changeset
504 /*
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
505 * NAME: file->fdopen()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
506 * DESCRIPTION: open a file using an existing file descriptor
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
507 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
508 #ifndef AUDACIOUS
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
509 struct id3_file *id3_file_fdopen(int fd, enum id3_file_mode mode)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
510 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
511 # if 1 || defined(HAVE_UNISTD_H)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
512 VFSFile *iofile;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
513 struct id3_file *file;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
514
2558
d4ecf0a91222 [svn] - vfs layer doesn't provide fdopen.
yaz
parents: 2554
diff changeset
515 iofile = fdopen(fd, (mode == ID3_FILE_MODE_READWRITE) ? "r+b" : "rb");
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
516 if (iofile == 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
517 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
518
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
519 file = new_file(iofile, mode, 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
520 if (file == 0) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
521 int save_fd;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
522
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
523 /* close iofile without closing fd */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
524
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
525 save_fd = dup(fd);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
526
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
527 fclose(iofile);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
528
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
529 dup2(save_fd, fd);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
530 close(save_fd);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
531 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
532
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
533 return file;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
534 # else
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
535 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
536 # endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
537 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
538 #endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
539
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
540 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
541 * NAME: file->close()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
542 * DESCRIPTION: close a file and delete its associated tags
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
543 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
544 int id3_file_close(struct id3_file *file)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
545 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
546 int result = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
547
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
548 assert(file);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
549
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
550 if (aud_vfs_fclose(file->iofile) == EOF)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
551 result = -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
552
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
553 finish_file(file);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
554
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
555 return result;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
556 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
557
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
558 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
559 * NAME: file->tag()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
560 * DESCRIPTION: return the primary tag structure for a file
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
561 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
562 struct id3_tag *id3_file_tag(struct id3_file const *file)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
563 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
564 assert(file);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
565
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
566 return file->primary;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
567 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
568
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
569 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
570 * NAME: v1_write()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
571 * DESCRIPTION: write ID3v1 tag modifications to a file
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
572 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
573 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
574 int v1_write(struct id3_file *file,
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
575 id3_byte_t const *data, id3_length_t length)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
576 {
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
577 // assert(!data || length == 128);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
578
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
579 if (data) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
580 long location;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
581
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
582 if (aud_vfs_fseek(file->iofile, (file->flags & ID3_FILE_FLAG_ID3V1) ? -128 : 0,
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
583 SEEK_END) == -1 ||
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
584 (location = aud_vfs_ftell(file->iofile)) == -1 ||
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
585 #ifdef AUDACIOUS
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
586 aud_vfs_fwrite(data, 128, 1, file->iofile) != 1 )
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
587 #else
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
588 aud_vfs_fwrite(data, 128, 1, file->iofile) != 1 ||
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
589 fflush(file->iofile) == EOF) //XXX
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
590 #endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
591 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
592
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
593 /* add file tag reference */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
594
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
595 if (!(file->flags & ID3_FILE_FLAG_ID3V1)) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
596 struct filetag filetag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
597
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
598 filetag.tag = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
599 filetag.location = location;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
600 filetag.length = 128;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
601
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
602 if (add_filetag(file, &filetag) == -1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
603 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
604
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
605 file->flags |= ID3_FILE_FLAG_ID3V1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
606 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
607 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
608 # if defined(HAVE_FTRUNCATE)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
609 else if (file->flags & ID3_FILE_FLAG_ID3V1) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
610 long length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
611
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
612 if (aud_vfs_fseek(file->iofile, 0, SEEK_END) == -1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
613 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
614
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
615 length = aud_vfs_ftell(file->iofile);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
616 if (length == -1 ||
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
617 (length >= 0 && length < 128))
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
618 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
619
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
620 if (aud_vfs_truncate(file->iofile, length - 128) == -1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
621 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
622
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
623 /* delete file tag reference */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
624
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
625 del_filetag(file, file->ntags - 1);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
626
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
627 file->flags &= ~ID3_FILE_FLAG_ID3V1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
628 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
629 # endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
630
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
631 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
632 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
633
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
634 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
635 * NAME: v2_write()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
636 * DESCRIPTION: write ID3v2 tag modifications to a file
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
637 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
638 static
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
639 int v2_write(struct id3_file *file,
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
640 id3_byte_t const *data, id3_length_t length)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
641 {
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
642 // assert(!data || length > 0);
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
643
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
644 // delete tag request
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
645 if(!data && length == 0){
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
646 int file_size;
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
647 int remainder_size;
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
648 char *remainder;
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
649
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
650 /* read in the remainder of the file */
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
651 aud_vfs_fseek(file->iofile, 0, SEEK_END);
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
652 file_size = aud_vfs_ftell(file->iofile);
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
653 remainder_size = file_size - file->tags[0].location - file->tags[0].length;
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
654 remainder = (char*)malloc(remainder_size);
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
655
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
656 if (aud_vfs_fseek(file->iofile, file->tags[0].location + file->tags[0].length, SEEK_SET) == -1 ||
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
657 aud_vfs_fread(remainder, remainder_size, 1, file->iofile) != 1) {
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
658 free(remainder);
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
659 return -1;
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
660 }
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
661
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
662 /* write the remainder where the old tag was */
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
663 if (aud_vfs_fseek(file->iofile, file->tags[0].location, SEEK_SET) == -1 ||
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
664 aud_vfs_fwrite(remainder, remainder_size, 1, file->iofile) != 1) {
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
665 free(remainder);
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
666 return -1;
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
667 }
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
668
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
669 free(remainder);
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
670
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
671 /* flush the FILE */
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
672 #ifndef AUDACIOUS
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
673 if (fflush(file->iofile) == EOF)
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
674 return -1;
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
675 #endif
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
676 /* truncate if required */
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
677 if (aud_vfs_ftell(file->iofile) < file_size)
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
678 aud_vfs_truncate(file->iofile, aud_vfs_ftell(file->iofile));
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
679
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
680 }
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
681
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
682 // append a new id3v2 tag to the file which doesn't have any tag or only have v1tag.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
683 if(data &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
684 ((file->ntags == 0) || // no tag
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
685 (file->ntags == 1 && (file->flags & ID3_FILE_FLAG_ID3V1))) ) { // only v1 tag exists
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
686
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
687 struct filetag filetag;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
688
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
689 printf("append v2tag\n");
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
690
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
691 filetag.tag = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
692 filetag.location = 0; // begining of the file.
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
693 filetag.length = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
694
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
695 if(add_filetag(file, &filetag) == -1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
696 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
697
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
698 if(file->ntags == 1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
699 file->flags = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
700 if(file->ntags == 2)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
701 file->flags |= ID3_FILE_FLAG_ID3V1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
702 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
703
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
704 if (!data
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
705 || (!(file->ntags == 1 && !(file->flags & ID3_FILE_FLAG_ID3V1)) &&
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
706 !(file->ntags == 2 && (file->flags & ID3_FILE_FLAG_ID3V1)))) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
707 /* no v2 tag. nothing to do */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
708 goto done;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
709 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
710
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
711 if (file->tags[0].length == length) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
712 /* easy special case: rewrite existing tag in-place */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
713
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
714 if (aud_vfs_fseek(file->iofile, file->tags[0].location, SEEK_SET) == -1 ||
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
715 #ifdef AUDACIOUS
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
716 aud_vfs_fwrite(data, length, 1, file->iofile) != 1)
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
717 #else
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
718 aud_vfs_fwrite(data, length, 1, file->iofile) != 1 ||
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
719 fflush(file->iofile) == EOF)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
720 #endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
721 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
722
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
723 goto done;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
724 } else {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
725 /* the new tag has a different size */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
726 int file_size;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
727 int remainder_size;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
728 char *remainder;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
729
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
730 /* read in the remainder of the file */
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
731 aud_vfs_fseek(file->iofile, 0, SEEK_END);
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
732 file_size = aud_vfs_ftell(file->iofile);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
733 remainder_size = file_size - file->tags[0].location - file->tags[0].length;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
734 remainder = (char*)malloc(remainder_size);
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
735 if (aud_vfs_fseek(file->iofile, file->tags[0].location + file->tags[0].length, SEEK_SET) == -1 ||
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
736 aud_vfs_fread(remainder, remainder_size, 1, file->iofile) != 1) {
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
737 free(remainder);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
738 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
739 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
740
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
741 /* write the tag where the old one was */
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
742 if (aud_vfs_fseek(file->iofile, file->tags[0].location, SEEK_SET) == -1 ||
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
743 aud_vfs_fwrite(data, length, 1, file->iofile) != 1) {
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
744 free(remainder);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
745 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
746 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
747
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
748 /* write the reaminder */
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
749 if (aud_vfs_fwrite(remainder, remainder_size, 1, file->iofile) != 1) {
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
750 free(remainder);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
751 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
752 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
753
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
754 free(remainder);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
755
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
756 /* flush the FILE */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
757 #ifndef AUDACIOUS
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
758 if (fflush(file->iofile) == EOF)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
759 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
760 #endif
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
761 /* truncate if required */
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
762 if (aud_vfs_ftell(file->iofile) < file_size)
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
763 aud_vfs_truncate(file->iofile, aud_vfs_ftell(file->iofile));
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
764 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
765
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
766 done:
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
767 return 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
768 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
769
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
770 /*
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
771 * NAME: file->update()
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
772 * DESCRIPTION: rewrite tag(s) to a file
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
773 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
774 int id3_file_update(struct id3_file *file)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
775 {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
776 int options, result = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
777 id3_length_t v1size = 0, v2size = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
778 id3_byte_t id3v1_data[128], *id3v1 = 0, *id3v2 = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
779
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
780 assert(file);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
781
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
782 if (file->mode != ID3_FILE_MODE_READWRITE)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
783 return -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
784
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
785 options = id3_tag_options(file->primary, 0, 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
786
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
787 /* render ID3v1 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
788
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
789 if (options & ID3_TAG_OPTION_ID3V1) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
790 v1size = id3_tag_render(file->primary, 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
791 if (v1size) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
792 assert(v1size == sizeof(id3v1_data));
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
793
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
794 v1size = id3_tag_render(file->primary, id3v1_data);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
795 if (v1size) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
796 assert(v1size == sizeof(id3v1_data));
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
797 id3v1 = id3v1_data;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
798 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
799 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
800 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
801
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
802 /* render ID3v2 */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
803
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
804 id3_tag_options(file->primary, ID3_TAG_OPTION_ID3V1, 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
805
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
806 v2size = id3_tag_render(file->primary, 0);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
807 if (v2size) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
808 id3v2 = malloc(v2size);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
809 if (id3v2 == 0)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
810 goto fail;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
811
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
812 v2size = id3_tag_render(file->primary, id3v2);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
813 if (v2size == 0) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
814 free(id3v2);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
815 id3v2 = 0;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
816 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
817 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
818
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
819 /* write tags */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
820
2513
1e6d2d719876 [svn] - delete id3 tag feature has been added.
yaz
parents: 2503
diff changeset
821 if (v2_write(file, id3v2, v2size) == -1 &&
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
822 v1_write(file, id3v1, v1size) == -1)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
823 goto fail;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
824
3704
fa3d2a62a066 use vtable functors for VFS access
William Pitcock <nenolod@atheme.org>
parents: 3693
diff changeset
825 aud_vfs_rewind(file->iofile);
2503
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
826
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
827 /* update file tags array? ... */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
828
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
829 if (0) {
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
830 fail:
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
831 result = -1;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
832 }
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
833
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
834 /* clean up; restore tag options */
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
835
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
836 if (id3v2)
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
837 free(id3v2);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
838
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
839 id3_tag_options(file->primary, ~0, options);
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
840
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
841 return result;
10692383c103 [svn] first try for libid3tag integration. this improved libid3tag supports vfs operations and is capable of adding id3v2 tag to files which doesn't have id3v2 tag ever.
yaz
parents:
diff changeset
842 }