rtaglib 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +84 -9
- data/README.txt +0 -0
- data/Rakefile +30 -27
- data/{test/data → data}/440Hz-5sec.flac +0 -0
- data/{test/data → data}/440Hz-5sec.mp3 +0 -0
- data/{test/data → data}/440Hz-5sec.mpc +0 -0
- data/{test/data → data}/440Hz-5sec.ogg +0 -0
- data/{test/data → data}/440Hz-5sec.wv +0 -0
- data/data/test_jason.mp3 +0 -0
- data/data/test_jason.ogg +0 -0
- data/ext/Rakefile +10 -0
- data/ext/tagfile/Rakefile.rb +42 -0
- data/ext/tagfile/rake_ext_conf.rb +29 -0
- data/ext/tagfile/tagfile.c +11 -7
- data/ext/taglib/Rakefile.rb +48 -0
- data/ext/taglib/rake_ext_conf.rb +33 -0
- data/ext/taglib/taglib-mswin32/bin/tag.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/tag_c.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/tag_cd.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/tagd.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/taglib-config +55 -0
- data/ext/taglib/taglib-mswin32/include/taglib/apefooter.h +173 -0
- data/ext/taglib/taglib-mswin32/include/taglib/apeitem.h +204 -0
- data/ext/taglib/taglib-mswin32/include/taglib/apetag.h +162 -0
- data/ext/taglib/taglib-mswin32/include/taglib/attachedpictureframe.h +220 -0
- data/ext/taglib/taglib-mswin32/include/taglib/audioproperties.h +110 -0
- data/ext/taglib/taglib-mswin32/include/taglib/commentsframe.h +168 -0
- data/ext/taglib/taglib-mswin32/include/taglib/fileref.h +262 -0
- data/ext/taglib/taglib-mswin32/include/taglib/flacfile.h +201 -0
- data/ext/taglib/taglib-mswin32/include/taglib/flacproperties.h +92 -0
- data/ext/taglib/taglib-mswin32/include/taglib/generalencapsulatedobjectframe.h +174 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v1genres.h +66 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v1tag.h +180 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2extendedheader.h +93 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2footer.h +82 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2frame.h +414 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2framefactory.h +167 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2header.h +175 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2synchdata.h +70 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2tag.h +300 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpcfile.h +175 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpcproperties.h +85 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpegfile.h +277 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpegheader.h +166 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpegproperties.h +118 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggfile.h +112 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggflacfile.h +118 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggpage.h +203 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggpageheader.h +232 -0
- data/ext/taglib/taglib-mswin32/include/taglib/relativevolumeframe.h +274 -0
- data/ext/taglib/taglib-mswin32/include/taglib/speexfile.h +99 -0
- data/ext/taglib/taglib-mswin32/include/taglib/speexproperties.h +89 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tag.h +173 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tag_c.h +288 -0
- data/ext/taglib/taglib-mswin32/include/taglib/taglib.h +177 -0
- data/ext/taglib/taglib-mswin32/include/taglib/taglib_export.h +39 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tbytevector.h +409 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tbytevectorlist.h +91 -0
- data/ext/taglib/taglib-mswin32/include/taglib/textidentificationframe.h +258 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tfile.h +271 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tlist.h +252 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tlist.tcc +316 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tmap.h +200 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tmap.tcc +196 -0
- data/ext/taglib/taglib-mswin32/include/taglib/trueaudiofile.h +180 -0
- data/ext/taglib/taglib-mswin32/include/taglib/trueaudioproperties.h +93 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tstring.h +456 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tstringlist.h +115 -0
- data/ext/taglib/taglib-mswin32/include/taglib/uniquefileidentifierframe.h +113 -0
- data/ext/taglib/taglib-mswin32/include/taglib/unknownframe.h +79 -0
- data/ext/taglib/taglib-mswin32/include/taglib/unsynchronizedlyricsframe.h +157 -0
- data/ext/taglib/taglib-mswin32/include/taglib/urllinkframe.h +172 -0
- data/ext/taglib/taglib-mswin32/include/taglib/vorbisfile.h +118 -0
- data/ext/taglib/taglib-mswin32/include/taglib/vorbisproperties.h +125 -0
- data/ext/taglib/taglib-mswin32/include/taglib/wavpackfile.h +164 -0
- data/ext/taglib/taglib-mswin32/include/taglib/wavpackproperties.h +94 -0
- data/ext/taglib/taglib-mswin32/include/taglib/xingheader.h +100 -0
- data/ext/taglib/taglib-mswin32/include/taglib/xiphcomment.h +202 -0
- data/ext/taglib/taglib-mswin32/lib/pkgconfig/taglib_c.pc +12 -0
- data/ext/taglib/taglib-mswin32/lib/tag.lib +0 -0
- data/ext/taglib/taglib-mswin32/lib/tag_c.lib +0 -0
- data/ext/taglib/taglib_i386-mingw32.source +22645 -0
- data/ext/taglib/taglib_i386-mswin32.source +22645 -0
- data/ext/taglib/{taglib.cxx → taglib_x86_64-linux.source} +508 -75
- data/lib/TagLib.rb +3 -2
- data/lib/TagLib_doc.rb +1532 -1526
- data/lib/rtaglib_mswin32.rb +4 -0
- data/lib/tagfile.rb +6 -0
- data/swig/Doxyfile +0 -0
- data/swig/Rakefile +44 -19
- data/swig/TagLib_doc.rb +2755 -0
- data/swig/make_doc.rb +5 -4
- data/swig/process_cxx.rb +2 -2
- data/swig/rake_ext_conf.rb +33 -0
- data/swig/taglib.i +8 -5
- data/swig/test.rb +47 -39
- data/test/test_read.rb +4 -3
- data/test/test_taglib.rb +47 -39
- data/test/test_write.rb +4 -3
- metadata +96 -20
- data/ext/tagfile/extconf.rb +0 -14
- data/ext/taglib/extconf.rb +0 -22
- data/swig/extconf.rb +0 -22
@@ -0,0 +1,203 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
copyright : (C) 2002 - 2008 by Scott Wheeler
|
3
|
+
email : wheeler@kde.org
|
4
|
+
***************************************************************************/
|
5
|
+
|
6
|
+
/***************************************************************************
|
7
|
+
* This library is free software; you can redistribute it and/or modify *
|
8
|
+
* it under the terms of the GNU Lesser General Public License version *
|
9
|
+
* 2.1 as published by the Free Software Foundation. *
|
10
|
+
* *
|
11
|
+
* This library is distributed in the hope that it will be useful, but *
|
12
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
14
|
+
* Lesser General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU Lesser General Public *
|
17
|
+
* License along with this library; if not, write to the Free Software *
|
18
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
19
|
+
* USA *
|
20
|
+
* *
|
21
|
+
* Alternatively, this file is available under the Mozilla Public *
|
22
|
+
* License Version 1.1. You may obtain a copy of the License at *
|
23
|
+
* http://www.mozilla.org/MPL/ *
|
24
|
+
***************************************************************************/
|
25
|
+
|
26
|
+
#ifndef TAGLIB_OGGPAGE_H
|
27
|
+
#define TAGLIB_OGGPAGE_H
|
28
|
+
|
29
|
+
#include "taglib_export.h"
|
30
|
+
#include "tbytevectorlist.h"
|
31
|
+
|
32
|
+
namespace TagLib {
|
33
|
+
|
34
|
+
namespace Ogg {
|
35
|
+
|
36
|
+
class File;
|
37
|
+
class PageHeader;
|
38
|
+
|
39
|
+
//! An implementation of Ogg pages
|
40
|
+
|
41
|
+
/*!
|
42
|
+
* This is an implementation of the pages that make up an Ogg stream.
|
43
|
+
* This handles parsing pages and breaking them down into packets and handles
|
44
|
+
* the details of packets spanning multiple pages and pages that contiain
|
45
|
+
* multiple packets.
|
46
|
+
*
|
47
|
+
* In most Xiph.org formats the comments are found in the first few packets,
|
48
|
+
* this however is a reasonably complete implementation of Ogg pages that
|
49
|
+
* could potentially be useful for non-meta data purposes.
|
50
|
+
*/
|
51
|
+
|
52
|
+
class TAGLIB_EXPORT Page
|
53
|
+
{
|
54
|
+
public:
|
55
|
+
/*!
|
56
|
+
* Read an Ogg page from the \a file at the position \a pageOffset.
|
57
|
+
*/
|
58
|
+
Page(File *file, long pageOffset);
|
59
|
+
|
60
|
+
virtual ~Page();
|
61
|
+
|
62
|
+
/*!
|
63
|
+
* Returns the page's position within the file (in bytes).
|
64
|
+
*/
|
65
|
+
long fileOffset() const;
|
66
|
+
|
67
|
+
/*!
|
68
|
+
* Returns a pointer to the header for this page. This pointer will become
|
69
|
+
* invalid when the page is deleted.
|
70
|
+
*/
|
71
|
+
const PageHeader *header() const;
|
72
|
+
|
73
|
+
/*!
|
74
|
+
* Returns the index of the first packet wholly or partially contained in
|
75
|
+
* this page.
|
76
|
+
*
|
77
|
+
* \see setFirstPacketIndex()
|
78
|
+
*/
|
79
|
+
int firstPacketIndex() const;
|
80
|
+
|
81
|
+
/*!
|
82
|
+
* Sets the index of the first packet in the page.
|
83
|
+
*
|
84
|
+
* \see firstPacketIndex()
|
85
|
+
*/
|
86
|
+
void setFirstPacketIndex(int index);
|
87
|
+
|
88
|
+
/*!
|
89
|
+
* When checking to see if a page contains a given packet this set of flags
|
90
|
+
* represents the possible values for that packets status in the page.
|
91
|
+
*
|
92
|
+
* \see containsPacket()
|
93
|
+
*/
|
94
|
+
enum ContainsPacketFlags {
|
95
|
+
//! No part of the packet is contained in the page
|
96
|
+
DoesNotContainPacket = 0x0000,
|
97
|
+
//! The packet is wholly contained in the page
|
98
|
+
CompletePacket = 0x0001,
|
99
|
+
//! The page starts with the given packet
|
100
|
+
BeginsWithPacket = 0x0002,
|
101
|
+
//! The page ends with the given packet
|
102
|
+
EndsWithPacket = 0x0004
|
103
|
+
};
|
104
|
+
|
105
|
+
/*!
|
106
|
+
* Checks to see if the specified \a packet is contained in the current
|
107
|
+
* page.
|
108
|
+
*
|
109
|
+
* \see ContainsPacketFlags
|
110
|
+
*/
|
111
|
+
ContainsPacketFlags containsPacket(int index) const;
|
112
|
+
|
113
|
+
/*!
|
114
|
+
* Returns the number of packets (whole or partial) in this page.
|
115
|
+
*/
|
116
|
+
uint packetCount() const;
|
117
|
+
|
118
|
+
/*!
|
119
|
+
* Returns a list of the packets in this page.
|
120
|
+
*
|
121
|
+
* \note Either or both the first and last packets may be only partial.
|
122
|
+
* \see PageHeader::firstPacketContinued()
|
123
|
+
*/
|
124
|
+
ByteVectorList packets() const;
|
125
|
+
|
126
|
+
/*!
|
127
|
+
* Returns the size of the page in bytes.
|
128
|
+
*/
|
129
|
+
int size() const;
|
130
|
+
|
131
|
+
ByteVector render() const;
|
132
|
+
|
133
|
+
/*!
|
134
|
+
* Defines a strategy for pagination, or grouping pages into Ogg packets,
|
135
|
+
* for use with pagination methods.
|
136
|
+
*
|
137
|
+
* \note Yes, I'm aware that this is not a canonical "Strategy Pattern",
|
138
|
+
* the term was simply convenient.
|
139
|
+
*/
|
140
|
+
enum PaginationStrategy {
|
141
|
+
/*!
|
142
|
+
* Attempt to put the specified set of packets into a single Ogg packet.
|
143
|
+
* If the sum of the packet data is greater than will fit into a single
|
144
|
+
* Ogg page -- 65280 bytes -- this will fall back to repagination using
|
145
|
+
* the recommended page sizes.
|
146
|
+
*/
|
147
|
+
SinglePagePerGroup,
|
148
|
+
/*!
|
149
|
+
* Split the packet or group of packets into pages that conform to the
|
150
|
+
* sizes recommended in the Ogg standard.
|
151
|
+
*/
|
152
|
+
Repaginate
|
153
|
+
};
|
154
|
+
|
155
|
+
/*!
|
156
|
+
* Pack \a packets into Ogg pages using the \a strategy for pagination.
|
157
|
+
* The page number indicater inside of the rendered packets will start
|
158
|
+
* with \a firstPage and be incremented for each page rendered.
|
159
|
+
* \a containsLastPacket should be set to true if \a packets contains the
|
160
|
+
* last page in the stream and will set the appropriate flag in the last
|
161
|
+
* rendered Ogg page's header. \a streamSerialNumber should be set to
|
162
|
+
* the serial number for this stream.
|
163
|
+
*
|
164
|
+
* \note The "absolute granule position" is currently always zeroed using
|
165
|
+
* this method as this suffices for the comment headers.
|
166
|
+
*
|
167
|
+
* \warning The pages returned by this method must be deleted by the user.
|
168
|
+
* You can use List<T>::setAutoDelete(true) to set these pages to be
|
169
|
+
* automatically deleted when this list passes out of scope.
|
170
|
+
*
|
171
|
+
* \see PaginationStrategy
|
172
|
+
* \see List::setAutoDelete()
|
173
|
+
*/
|
174
|
+
static List<Page *> paginate(const ByteVectorList &packets,
|
175
|
+
PaginationStrategy strategy,
|
176
|
+
uint streamSerialNumber,
|
177
|
+
int firstPage,
|
178
|
+
bool firstPacketContinued = false,
|
179
|
+
bool lastPacketCompleted = true,
|
180
|
+
bool containsLastPacket = false);
|
181
|
+
|
182
|
+
protected:
|
183
|
+
/*!
|
184
|
+
* Creates an Ogg packet based on the data in \a packets. The page number
|
185
|
+
* for each page will be set to \a pageNumber.
|
186
|
+
*/
|
187
|
+
Page(const ByteVectorList &packets,
|
188
|
+
uint streamSerialNumber,
|
189
|
+
int pageNumber,
|
190
|
+
bool firstPacketContinued = false,
|
191
|
+
bool lastPacketCompleted = true,
|
192
|
+
bool containsLastPacket = false);
|
193
|
+
|
194
|
+
private:
|
195
|
+
Page(const Page &);
|
196
|
+
Page &operator=(const Page &);
|
197
|
+
|
198
|
+
class PagePrivate;
|
199
|
+
PagePrivate *d;
|
200
|
+
};
|
201
|
+
}
|
202
|
+
}
|
203
|
+
#endif
|
@@ -0,0 +1,232 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
copyright : (C) 2002 - 2008 by Scott Wheeler
|
3
|
+
email : wheeler@kde.org
|
4
|
+
***************************************************************************/
|
5
|
+
|
6
|
+
/***************************************************************************
|
7
|
+
* This library is free software; you can redistribute it and/or modify *
|
8
|
+
* it under the terms of the GNU Lesser General Public License version *
|
9
|
+
* 2.1 as published by the Free Software Foundation. *
|
10
|
+
* *
|
11
|
+
* This library is distributed in the hope that it will be useful, but *
|
12
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
14
|
+
* Lesser General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU Lesser General Public *
|
17
|
+
* License along with this library; if not, write to the Free Software *
|
18
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
19
|
+
* USA *
|
20
|
+
* *
|
21
|
+
* Alternatively, this file is available under the Mozilla Public *
|
22
|
+
* License Version 1.1. You may obtain a copy of the License at *
|
23
|
+
* http://www.mozilla.org/MPL/ *
|
24
|
+
***************************************************************************/
|
25
|
+
|
26
|
+
#ifndef TAGLIB_OGGPAGEHEADER_H
|
27
|
+
#define TAGLIB_OGGPAGEHEADER_H
|
28
|
+
|
29
|
+
#include "tlist.h"
|
30
|
+
#include "tbytevector.h"
|
31
|
+
#include "taglib_export.h"
|
32
|
+
|
33
|
+
namespace TagLib {
|
34
|
+
|
35
|
+
namespace Ogg {
|
36
|
+
|
37
|
+
class File;
|
38
|
+
|
39
|
+
//! An implementation of the page headers associated with each Ogg::Page
|
40
|
+
|
41
|
+
/*!
|
42
|
+
* This class implements Ogg page headers which contain the information
|
43
|
+
* about Ogg pages needed to break them into packets which can be passed on
|
44
|
+
* to the codecs.
|
45
|
+
*/
|
46
|
+
|
47
|
+
class TAGLIB_EXPORT PageHeader
|
48
|
+
{
|
49
|
+
public:
|
50
|
+
/*!
|
51
|
+
* Reads a PageHeader from \a file starting at \a pageOffset. The defaults
|
52
|
+
* create a page with no (and as such, invalid) data that must be set
|
53
|
+
* later.
|
54
|
+
*/
|
55
|
+
PageHeader(File *file = 0, long pageOffset = -1);
|
56
|
+
|
57
|
+
/*!
|
58
|
+
* Deletes this instance of the PageHeader.
|
59
|
+
*/
|
60
|
+
virtual ~PageHeader();
|
61
|
+
|
62
|
+
/*!
|
63
|
+
* Returns true if the header parsed properly and is valid.
|
64
|
+
*/
|
65
|
+
bool isValid() const;
|
66
|
+
|
67
|
+
/*!
|
68
|
+
* Ogg pages contain a list of packets (which are used by the contained
|
69
|
+
* codecs). The sizes of these pages is encoded in the page header. This
|
70
|
+
* returns a list of the packet sizes in bytes.
|
71
|
+
*
|
72
|
+
* \see setPacketSizes()
|
73
|
+
*/
|
74
|
+
List<int> packetSizes() const;
|
75
|
+
|
76
|
+
/*!
|
77
|
+
* Sets the sizes of the packets in this page to \a sizes. Internally this
|
78
|
+
* updates the lacing values in the header.
|
79
|
+
*
|
80
|
+
* \see packetSizes()
|
81
|
+
*/
|
82
|
+
void setPacketSizes(const List<int> &sizes);
|
83
|
+
|
84
|
+
/*!
|
85
|
+
* Some packets can be <i>continued</i> across multiple pages. If the
|
86
|
+
* first packet in the current page is a continuation this will return
|
87
|
+
* true. If this is page starts with a new packet this will return false.
|
88
|
+
*
|
89
|
+
* \see lastPacketCompleted()
|
90
|
+
* \see setFirstPacketContinued()
|
91
|
+
*/
|
92
|
+
bool firstPacketContinued() const;
|
93
|
+
|
94
|
+
/*!
|
95
|
+
* Sets the internal flag indicating if the first packet in this page is
|
96
|
+
* continued to \a continued.
|
97
|
+
*
|
98
|
+
* \see firstPacketContinued()
|
99
|
+
*/
|
100
|
+
void setFirstPacketContinued(bool continued);
|
101
|
+
|
102
|
+
/*!
|
103
|
+
* Returns true if the last packet of this page is completely contained in
|
104
|
+
* this page.
|
105
|
+
*
|
106
|
+
* \see firstPacketContinued()
|
107
|
+
* \see setLastPacketCompleted()
|
108
|
+
*/
|
109
|
+
bool lastPacketCompleted() const;
|
110
|
+
|
111
|
+
/*!
|
112
|
+
* Sets the internal flag indicating if the last packet in this page is
|
113
|
+
* complete to \a completed.
|
114
|
+
*
|
115
|
+
* \see lastPacketCompleted()
|
116
|
+
*/
|
117
|
+
void setLastPacketCompleted(bool completed);
|
118
|
+
|
119
|
+
/*!
|
120
|
+
* This returns true if this is the first page of the Ogg (logical) stream.
|
121
|
+
*
|
122
|
+
* \see setFirstPageOfStream()
|
123
|
+
*/
|
124
|
+
bool firstPageOfStream() const;
|
125
|
+
|
126
|
+
/*!
|
127
|
+
* Marks this page as the first page of the Ogg stream.
|
128
|
+
*
|
129
|
+
* \see firstPageOfStream()
|
130
|
+
*/
|
131
|
+
void setFirstPageOfStream(bool first);
|
132
|
+
|
133
|
+
/*!
|
134
|
+
* This returns true if this is the last page of the Ogg (logical) stream.
|
135
|
+
*
|
136
|
+
* \see setLastPageOfStream()
|
137
|
+
*/
|
138
|
+
bool lastPageOfStream() const;
|
139
|
+
|
140
|
+
/*!
|
141
|
+
* Marks this page as the last page of the Ogg stream.
|
142
|
+
*
|
143
|
+
* \see lastPageOfStream()
|
144
|
+
*/
|
145
|
+
void setLastPageOfStream(bool last);
|
146
|
+
|
147
|
+
/*!
|
148
|
+
* A special value of containing the position of the packet to be
|
149
|
+
* interpreted by the codec. In the case of Vorbis this contains the PCM
|
150
|
+
* value and is used to calculate the length of the stream.
|
151
|
+
*
|
152
|
+
* \see setAbsoluteGranularPosition()
|
153
|
+
*/
|
154
|
+
long long absoluteGranularPosition() const;
|
155
|
+
|
156
|
+
/*!
|
157
|
+
* A special value of containing the position of the packet to be
|
158
|
+
* interpreted by the codec. It is only supported here so that it may be
|
159
|
+
* coppied from one page to another.
|
160
|
+
*
|
161
|
+
* \see absoluteGranularPosition()
|
162
|
+
*/
|
163
|
+
void setAbsoluteGranularPosition(long long agp);
|
164
|
+
|
165
|
+
/*!
|
166
|
+
* Every Ogg logical stream is given a random serial number which is common
|
167
|
+
* to every page in that logical stream. This returns the serial number of
|
168
|
+
* the stream associated with this packet.
|
169
|
+
*
|
170
|
+
* \see setStreamSerialNumber()
|
171
|
+
*/
|
172
|
+
uint streamSerialNumber() const;
|
173
|
+
|
174
|
+
/*!
|
175
|
+
* Every Ogg logical stream is given a random serial number which is common
|
176
|
+
* to every page in that logical stream. This sets this pages serial
|
177
|
+
* number. This method should be used when adding new pages to a logical
|
178
|
+
* stream.
|
179
|
+
*
|
180
|
+
* \see streamSerialNumber()
|
181
|
+
*/
|
182
|
+
void setStreamSerialNumber(uint n);
|
183
|
+
|
184
|
+
/*!
|
185
|
+
* Returns the index of the page within the Ogg stream. This helps make it
|
186
|
+
* possible to determine if pages have been lost.
|
187
|
+
*
|
188
|
+
* \see setPageSequenceNumber()
|
189
|
+
*/
|
190
|
+
int pageSequenceNumber() const;
|
191
|
+
|
192
|
+
/*!
|
193
|
+
* Sets the page's position in the stream to \a sequenceNumber.
|
194
|
+
*
|
195
|
+
* \see pageSequenceNumber()
|
196
|
+
*/
|
197
|
+
void setPageSequenceNumber(int sequenceNumber);
|
198
|
+
|
199
|
+
/*!
|
200
|
+
* Returns the complete header size.
|
201
|
+
*/
|
202
|
+
int size() const;
|
203
|
+
|
204
|
+
/*!
|
205
|
+
* Returns the size of the data portion of the page -- i.e. the size of the
|
206
|
+
* page less the header size.
|
207
|
+
*/
|
208
|
+
int dataSize() const;
|
209
|
+
|
210
|
+
/*!
|
211
|
+
* Render the page header to binary data.
|
212
|
+
*
|
213
|
+
* \note The checksum -- bytes 22 - 25 -- will be left empty and must be
|
214
|
+
* filled in when rendering the entire page.
|
215
|
+
*/
|
216
|
+
ByteVector render() const;
|
217
|
+
|
218
|
+
private:
|
219
|
+
PageHeader(const PageHeader &);
|
220
|
+
PageHeader &operator=(const PageHeader &);
|
221
|
+
|
222
|
+
void read();
|
223
|
+
ByteVector lacingValues() const;
|
224
|
+
|
225
|
+
class PageHeaderPrivate;
|
226
|
+
PageHeaderPrivate *d;
|
227
|
+
};
|
228
|
+
|
229
|
+
}
|
230
|
+
}
|
231
|
+
|
232
|
+
#endif
|
@@ -0,0 +1,274 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
copyright : (C) 2002 - 2008 by Scott Wheeler
|
3
|
+
email : wheeler@kde.org
|
4
|
+
***************************************************************************/
|
5
|
+
|
6
|
+
/***************************************************************************
|
7
|
+
* This library is free software; you can redistribute it and/or modify *
|
8
|
+
* it under the terms of the GNU Lesser General Public License version *
|
9
|
+
* 2.1 as published by the Free Software Foundation. *
|
10
|
+
* *
|
11
|
+
* This library is distributed in the hope that it will be useful, but *
|
12
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
14
|
+
* Lesser General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU Lesser General Public *
|
17
|
+
* License along with this library; if not, write to the Free Software *
|
18
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
19
|
+
* USA *
|
20
|
+
* *
|
21
|
+
* Alternatively, this file is available under the Mozilla Public *
|
22
|
+
* License Version 1.1. You may obtain a copy of the License at *
|
23
|
+
* http://www.mozilla.org/MPL/ *
|
24
|
+
***************************************************************************/
|
25
|
+
|
26
|
+
#ifndef TAGLIB_RELATIVEVOLUMEFRAME_H
|
27
|
+
#define TAGLIB_RELATIVEVOLUMEFRAME_H
|
28
|
+
|
29
|
+
#include <tlist.h>
|
30
|
+
#include <id3v2frame.h>
|
31
|
+
#include "taglib_export.h"
|
32
|
+
|
33
|
+
namespace TagLib {
|
34
|
+
|
35
|
+
namespace ID3v2 {
|
36
|
+
|
37
|
+
//! An ID3v2 relative volume adjustment frame implementation
|
38
|
+
|
39
|
+
/*!
|
40
|
+
* This is an implementation of ID3v2 relative volume adjustment. The
|
41
|
+
* presence of this frame makes it possible to specify an increase in volume
|
42
|
+
* for an audio file or specific audio tracks in that file.
|
43
|
+
*
|
44
|
+
* Multiple relative volume adjustment frames may be present in the tag
|
45
|
+
* each with a unique identification and describing volume adjustment for
|
46
|
+
* different channel types.
|
47
|
+
*/
|
48
|
+
|
49
|
+
class TAGLIB_EXPORT RelativeVolumeFrame : public Frame
|
50
|
+
{
|
51
|
+
friend class FrameFactory;
|
52
|
+
|
53
|
+
public:
|
54
|
+
|
55
|
+
/*!
|
56
|
+
* This indicates the type of volume adjustment that should be applied.
|
57
|
+
*/
|
58
|
+
enum ChannelType {
|
59
|
+
//! A type not enumerated below
|
60
|
+
Other = 0x00,
|
61
|
+
//! The master volume for the track
|
62
|
+
MasterVolume = 0x01,
|
63
|
+
//! The front right audio channel
|
64
|
+
FrontRight = 0x02,
|
65
|
+
//! The front left audio channel
|
66
|
+
FrontLeft = 0x03,
|
67
|
+
//! The back right audio channel
|
68
|
+
BackRight = 0x04,
|
69
|
+
//! The back left audio channel
|
70
|
+
BackLeft = 0x05,
|
71
|
+
//! The front center audio channel
|
72
|
+
FrontCentre = 0x06,
|
73
|
+
//! The back center audio channel
|
74
|
+
BackCentre = 0x07,
|
75
|
+
//! The subwoofer audio channel
|
76
|
+
Subwoofer = 0x08
|
77
|
+
};
|
78
|
+
|
79
|
+
//! Struct that stores the relevant values for ID3v2 peak volume
|
80
|
+
|
81
|
+
/*!
|
82
|
+
* The peak volume is described as a series of bits that is padded to fill
|
83
|
+
* a block of bytes. These two values should always be updated in tandem.
|
84
|
+
*/
|
85
|
+
struct PeakVolume
|
86
|
+
{
|
87
|
+
/*!
|
88
|
+
* Constructs an empty peak volume description.
|
89
|
+
*/
|
90
|
+
PeakVolume() : bitsRepresentingPeak(0) {}
|
91
|
+
/*!
|
92
|
+
* The number of bits (in the range of 0 to 255) used to describe the
|
93
|
+
* peak volume.
|
94
|
+
*/
|
95
|
+
unsigned char bitsRepresentingPeak;
|
96
|
+
/*!
|
97
|
+
* The array of bits (represented as a series of bytes) used to describe
|
98
|
+
* the peak volume.
|
99
|
+
*/
|
100
|
+
ByteVector peakVolume;
|
101
|
+
};
|
102
|
+
|
103
|
+
/*!
|
104
|
+
* Constructs a RelativeVolumeFrame. The relevant data should be set
|
105
|
+
* manually.
|
106
|
+
*/
|
107
|
+
RelativeVolumeFrame();
|
108
|
+
|
109
|
+
/*!
|
110
|
+
* Constructs a RelativeVolumeFrame based on the contents of \a data.
|
111
|
+
*/
|
112
|
+
RelativeVolumeFrame(const ByteVector &data);
|
113
|
+
|
114
|
+
/*!
|
115
|
+
* Destroys the RelativeVolumeFrame instance.
|
116
|
+
*/
|
117
|
+
virtual ~RelativeVolumeFrame();
|
118
|
+
|
119
|
+
/*!
|
120
|
+
* Returns the frame's identification.
|
121
|
+
*
|
122
|
+
* \see identification()
|
123
|
+
*/
|
124
|
+
virtual String toString() const;
|
125
|
+
|
126
|
+
/*!
|
127
|
+
* Returns a list of channels with information currently in the frame.
|
128
|
+
*/
|
129
|
+
List<ChannelType> channels() const;
|
130
|
+
|
131
|
+
/*!
|
132
|
+
* \deprecated Always returns master volume.
|
133
|
+
*/
|
134
|
+
ChannelType channelType() const;
|
135
|
+
|
136
|
+
/*!
|
137
|
+
* \deprecated This method no longer has any effect.
|
138
|
+
*/
|
139
|
+
void setChannelType(ChannelType t);
|
140
|
+
|
141
|
+
/*
|
142
|
+
* There was a terrible API goof here, and while this can't be changed to
|
143
|
+
* the way it appears below for binary compaibility reasons, let's at
|
144
|
+
* least pretend that it looks clean.
|
145
|
+
*/
|
146
|
+
|
147
|
+
#ifdef DOXYGEN
|
148
|
+
|
149
|
+
/*!
|
150
|
+
* Returns the relative volume adjustment "index". As indicated by the
|
151
|
+
* ID3v2 standard this is a 16-bit signed integer that reflects the
|
152
|
+
* decibils of adjustment when divided by 512.
|
153
|
+
*
|
154
|
+
* This defaults to returning the value for the master volume channel if
|
155
|
+
* available and returns 0 if the specified channel does not exist.
|
156
|
+
*
|
157
|
+
* \see setVolumeAdjustmentIndex()
|
158
|
+
* \see volumeAjustment()
|
159
|
+
*/
|
160
|
+
short volumeAdjustmentIndex(ChannelType type = MasterVolume) const;
|
161
|
+
|
162
|
+
/*!
|
163
|
+
* Set the volume adjustment to \a index. As indicated by the ID3v2
|
164
|
+
* standard this is a 16-bit signed integer that reflects the decibils of
|
165
|
+
* adjustment when divided by 512.
|
166
|
+
*
|
167
|
+
* By default this sets the value for the master volume.
|
168
|
+
*
|
169
|
+
* \see volumeAdjustmentIndex()
|
170
|
+
* \see setVolumeAjustment()
|
171
|
+
*/
|
172
|
+
void setVolumeAdjustmentIndex(short index, ChannelType type = MasterVolume);
|
173
|
+
|
174
|
+
/*!
|
175
|
+
* Returns the relative volume adjustment in decibels.
|
176
|
+
*
|
177
|
+
* \note Because this is actually stored internally as an "index" to this
|
178
|
+
* value the value returned by this method may not be identical to the
|
179
|
+
* value set using setVolumeAdjustment().
|
180
|
+
*
|
181
|
+
* This defaults to returning the value for the master volume channel if
|
182
|
+
* available and returns 0 if the specified channel does not exist.
|
183
|
+
*
|
184
|
+
* \see setVolumeAdjustment()
|
185
|
+
* \see volumeAdjustmentIndex()
|
186
|
+
*/
|
187
|
+
float volumeAdjustment(ChannelType type = MasterVolume) const;
|
188
|
+
|
189
|
+
/*!
|
190
|
+
* Set the relative volume adjustment in decibels to \a adjustment.
|
191
|
+
*
|
192
|
+
* By default this sets the value for the master volume.
|
193
|
+
*
|
194
|
+
* \note Because this is actually stored internally as an "index" to this
|
195
|
+
* value the value set by this method may not be identical to the one
|
196
|
+
* returned by volumeAdjustment().
|
197
|
+
*
|
198
|
+
* \see setVolumeAdjustment()
|
199
|
+
* \see volumeAdjustmentIndex()
|
200
|
+
*/
|
201
|
+
void setVolumeAdjustment(float adjustment, ChannelType type = MasterVolume);
|
202
|
+
|
203
|
+
/*!
|
204
|
+
* Returns the peak volume (represented as a length and a string of bits).
|
205
|
+
*
|
206
|
+
* This defaults to returning the value for the master volume channel if
|
207
|
+
* available and returns 0 if the specified channel does not exist.
|
208
|
+
*
|
209
|
+
* \see setPeakVolume()
|
210
|
+
*/
|
211
|
+
PeakVolume peakVolume(ChannelType type = MasterVolume) const;
|
212
|
+
|
213
|
+
/*!
|
214
|
+
* Sets the peak volume to \a peak.
|
215
|
+
*
|
216
|
+
* By default this sets the value for the master volume.
|
217
|
+
*
|
218
|
+
* \see peakVolume()
|
219
|
+
*/
|
220
|
+
void setPeakVolume(const PeakVolume &peak, ChannelType type = MasterVolume);
|
221
|
+
|
222
|
+
#else
|
223
|
+
|
224
|
+
// BIC: Combine each of the following pairs of functions (or maybe just
|
225
|
+
// rework this junk altogether).
|
226
|
+
|
227
|
+
short volumeAdjustmentIndex(ChannelType type) const;
|
228
|
+
short volumeAdjustmentIndex() const;
|
229
|
+
|
230
|
+
void setVolumeAdjustmentIndex(short index, ChannelType type);
|
231
|
+
void setVolumeAdjustmentIndex(short index);
|
232
|
+
|
233
|
+
float volumeAdjustment(ChannelType type) const;
|
234
|
+
float volumeAdjustment() const;
|
235
|
+
|
236
|
+
void setVolumeAdjustment(float adjustment, ChannelType type);
|
237
|
+
void setVolumeAdjustment(float adjustment);
|
238
|
+
|
239
|
+
PeakVolume peakVolume(ChannelType type) const;
|
240
|
+
PeakVolume peakVolume() const;
|
241
|
+
|
242
|
+
void setPeakVolume(const PeakVolume &peak, ChannelType type);
|
243
|
+
void setPeakVolume(const PeakVolume &peak);
|
244
|
+
|
245
|
+
#endif
|
246
|
+
|
247
|
+
/*!
|
248
|
+
* Returns the identification for this frame.
|
249
|
+
*/
|
250
|
+
String identification() const;
|
251
|
+
|
252
|
+
/*!
|
253
|
+
* Sets the identification of the frame to \a s. The string
|
254
|
+
* is used to identify the situation and/or device where this
|
255
|
+
* adjustment should apply.
|
256
|
+
*/
|
257
|
+
void setIdentification(const String &s);
|
258
|
+
|
259
|
+
protected:
|
260
|
+
virtual void parseFields(const ByteVector &data);
|
261
|
+
virtual ByteVector renderFields() const;
|
262
|
+
|
263
|
+
private:
|
264
|
+
RelativeVolumeFrame(const ByteVector &data, Header *h);
|
265
|
+
RelativeVolumeFrame(const RelativeVolumeFrame &);
|
266
|
+
RelativeVolumeFrame &operator=(const RelativeVolumeFrame &);
|
267
|
+
|
268
|
+
class RelativeVolumeFramePrivate;
|
269
|
+
RelativeVolumeFramePrivate *d;
|
270
|
+
};
|
271
|
+
|
272
|
+
}
|
273
|
+
}
|
274
|
+
#endif
|