Mercurial > hg > sv-dependency-builds
comparison win32-mingw/include/FLAC++/metadata.h @ 5:e582a1ccd5fe
Add more mingw builds
author | Chris Cannam |
---|---|
date | Wed, 20 Mar 2013 14:01:32 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
4:e13257ea84a4 | 5:e582a1ccd5fe |
---|---|
1 /* libFLAC++ - Free Lossless Audio Codec library | |
2 * Copyright (C) 2002,2003,2004,2005,2006,2007 Josh Coalson | |
3 * | |
4 * Redistribution and use in source and binary forms, with or without | |
5 * modification, are permitted provided that the following conditions | |
6 * are met: | |
7 * | |
8 * - Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * | |
11 * - Redistributions in binary form must reproduce the above copyright | |
12 * notice, this list of conditions and the following disclaimer in the | |
13 * documentation and/or other materials provided with the distribution. | |
14 * | |
15 * - Neither the name of the Xiph.org Foundation nor the names of its | |
16 * contributors may be used to endorse or promote products derived from | |
17 * this software without specific prior written permission. | |
18 * | |
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR | |
23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
26 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
27 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
28 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
29 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
30 */ | |
31 | |
32 #ifndef FLACPP__METADATA_H | |
33 #define FLACPP__METADATA_H | |
34 | |
35 #include "export.h" | |
36 | |
37 #include "FLAC/metadata.h" | |
38 | |
39 // =============================================================== | |
40 // | |
41 // Full documentation for the metadata interface can be found | |
42 // in the C layer in include/FLAC/metadata.h | |
43 // | |
44 // =============================================================== | |
45 | |
46 /** \file include/FLAC++/metadata.h | |
47 * | |
48 * \brief | |
49 * This module provides classes for creating and manipulating FLAC | |
50 * metadata blocks in memory, and three progressively more powerful | |
51 * interfaces for traversing and editing metadata in FLAC files. | |
52 * | |
53 * See the detailed documentation for each interface in the | |
54 * \link flacpp_metadata metadata \endlink module. | |
55 */ | |
56 | |
57 /** \defgroup flacpp_metadata FLAC++/metadata.h: metadata interfaces | |
58 * \ingroup flacpp | |
59 * | |
60 * \brief | |
61 * This module provides classes for creating and manipulating FLAC | |
62 * metadata blocks in memory, and three progressively more powerful | |
63 * interfaces for traversing and editing metadata in FLAC files. | |
64 * | |
65 * The behavior closely mimics the C layer interface; be sure to read | |
66 * the detailed description of the | |
67 * \link flac_metadata C metadata module \endlink. Note that like the | |
68 * C layer, currently only the Chain interface (level 2) supports Ogg | |
69 * FLAC files, and it is read-only i.e. no writing back changed | |
70 * metadata to file. | |
71 */ | |
72 | |
73 | |
74 namespace FLAC { | |
75 namespace Metadata { | |
76 | |
77 // ============================================================ | |
78 // | |
79 // Metadata objects | |
80 // | |
81 // ============================================================ | |
82 | |
83 /** \defgroup flacpp_metadata_object FLAC++/metadata.h: metadata object classes | |
84 * \ingroup flacpp_metadata | |
85 * | |
86 * This module contains classes representing FLAC metadata | |
87 * blocks in memory. | |
88 * | |
89 * The behavior closely mimics the C layer interface; be | |
90 * sure to read the detailed description of the | |
91 * \link flac_metadata_object C metadata object module \endlink. | |
92 * | |
93 * Any time a metadata object is constructed or assigned, you | |
94 * should check is_valid() to make sure the underlying | |
95 * ::FLAC__StreamMetadata object was able to be created. | |
96 * | |
97 * \warning | |
98 * When the get_*() methods of any metadata object method | |
99 * return you a const pointer, DO NOT disobey and write into it. | |
100 * Always use the set_*() methods. | |
101 * | |
102 * \{ | |
103 */ | |
104 | |
105 /** Base class for all metadata block types. | |
106 * See the \link flacpp_metadata_object overview \endlink for more. | |
107 */ | |
108 class FLACPP_API Prototype { | |
109 protected: | |
110 //@{ | |
111 /** Constructs a copy of the given object. This form | |
112 * always performs a deep copy. | |
113 */ | |
114 Prototype(const Prototype &); | |
115 Prototype(const ::FLAC__StreamMetadata &); | |
116 Prototype(const ::FLAC__StreamMetadata *); | |
117 //@} | |
118 | |
119 /** Constructs an object with copy control. When \a copy | |
120 * is \c true, behaves identically to | |
121 * FLAC::Metadata::Prototype::Prototype(const ::FLAC__StreamMetadata *object). | |
122 * When \a copy is \c false, the instance takes ownership of | |
123 * the pointer and the ::FLAC__StreamMetadata object will | |
124 * be freed by the destructor. | |
125 * | |
126 * \assert | |
127 * \code object != NULL \endcode | |
128 */ | |
129 Prototype(::FLAC__StreamMetadata *object, bool copy); | |
130 | |
131 //@{ | |
132 /** Assign from another object. Always performs a deep copy. */ | |
133 Prototype &operator=(const Prototype &); | |
134 Prototype &operator=(const ::FLAC__StreamMetadata &); | |
135 Prototype &operator=(const ::FLAC__StreamMetadata *); | |
136 //@} | |
137 | |
138 /** Assigns an object with copy control. See | |
139 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
140 */ | |
141 Prototype &assign_object(::FLAC__StreamMetadata *object, bool copy); | |
142 | |
143 /** Deletes the underlying ::FLAC__StreamMetadata object. | |
144 */ | |
145 virtual void clear(); | |
146 | |
147 ::FLAC__StreamMetadata *object_; | |
148 public: | |
149 /** Deletes the underlying ::FLAC__StreamMetadata object. | |
150 */ | |
151 virtual ~Prototype(); | |
152 | |
153 //@{ | |
154 /** Check for equality, performing a deep compare by following pointers. | |
155 */ | |
156 inline bool operator==(const Prototype &) const; | |
157 inline bool operator==(const ::FLAC__StreamMetadata &) const; | |
158 inline bool operator==(const ::FLAC__StreamMetadata *) const; | |
159 //@} | |
160 | |
161 //@{ | |
162 /** Check for inequality, performing a deep compare by following pointers. */ | |
163 inline bool operator!=(const Prototype &) const; | |
164 inline bool operator!=(const ::FLAC__StreamMetadata &) const; | |
165 inline bool operator!=(const ::FLAC__StreamMetadata *) const; | |
166 //@} | |
167 | |
168 friend class SimpleIterator; | |
169 friend class Iterator; | |
170 | |
171 /** Returns \c true if the object was correctly constructed | |
172 * (i.e. the underlying ::FLAC__StreamMetadata object was | |
173 * properly allocated), else \c false. | |
174 */ | |
175 inline bool is_valid() const; | |
176 | |
177 /** Returns \c true if this block is the last block in a | |
178 * stream, else \c false. | |
179 * | |
180 * \assert | |
181 * \code is_valid() \endcode | |
182 */ | |
183 bool get_is_last() const; | |
184 | |
185 /** Returns the type of the block. | |
186 * | |
187 * \assert | |
188 * \code is_valid() \endcode | |
189 */ | |
190 ::FLAC__MetadataType get_type() const; | |
191 | |
192 /** Returns the stream length of the metadata block. | |
193 * | |
194 * \note | |
195 * The length does not include the metadata block header, | |
196 * per spec. | |
197 * | |
198 * \assert | |
199 * \code is_valid() \endcode | |
200 */ | |
201 unsigned get_length() const; | |
202 | |
203 /** Sets the "is_last" flag for the block. When using the iterators | |
204 * it is not necessary to set this flag; they will do it for you. | |
205 * | |
206 * \assert | |
207 * \code is_valid() \endcode | |
208 */ | |
209 void set_is_last(bool); | |
210 | |
211 /** Returns a pointer to the underlying ::FLAC__StreamMetadata | |
212 * object. This can be useful for plugging any holes between | |
213 * the C++ and C interfaces. | |
214 * | |
215 * \assert | |
216 * \code is_valid() \endcode | |
217 */ | |
218 inline operator const ::FLAC__StreamMetadata *() const; | |
219 private: | |
220 /** Private and undefined so you can't use it. */ | |
221 Prototype(); | |
222 | |
223 // These are used only by Iterator | |
224 bool is_reference_; | |
225 inline void set_reference(bool x) { is_reference_ = x; } | |
226 }; | |
227 | |
228 #ifdef _MSC_VER | |
229 // warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning) | |
230 #pragma warning ( disable : 4800 ) | |
231 #endif | |
232 | |
233 inline bool Prototype::operator==(const Prototype &object) const | |
234 { return (bool)::FLAC__metadata_object_is_equal(object_, object.object_); } | |
235 | |
236 inline bool Prototype::operator==(const ::FLAC__StreamMetadata &object) const | |
237 { return (bool)::FLAC__metadata_object_is_equal(object_, &object); } | |
238 | |
239 inline bool Prototype::operator==(const ::FLAC__StreamMetadata *object) const | |
240 { return (bool)::FLAC__metadata_object_is_equal(object_, object); } | |
241 | |
242 #ifdef _MSC_VER | |
243 // @@@ how to re-enable? the following doesn't work | |
244 // #pragma warning ( enable : 4800 ) | |
245 #endif | |
246 | |
247 inline bool Prototype::operator!=(const Prototype &object) const | |
248 { return !operator==(object); } | |
249 | |
250 inline bool Prototype::operator!=(const ::FLAC__StreamMetadata &object) const | |
251 { return !operator==(object); } | |
252 | |
253 inline bool Prototype::operator!=(const ::FLAC__StreamMetadata *object) const | |
254 { return !operator==(object); } | |
255 | |
256 inline bool Prototype::is_valid() const | |
257 { return 0 != object_; } | |
258 | |
259 inline Prototype::operator const ::FLAC__StreamMetadata *() const | |
260 { return object_; } | |
261 | |
262 /** Create a deep copy of an object and return it. */ | |
263 FLACPP_API Prototype *clone(const Prototype *); | |
264 | |
265 | |
266 /** STREAMINFO metadata block. | |
267 * See the \link flacpp_metadata_object overview \endlink for more, | |
268 * and the <A HREF="../format.html#metadata_block_streaminfo">format specification</A>. | |
269 */ | |
270 class FLACPP_API StreamInfo : public Prototype { | |
271 public: | |
272 StreamInfo(); | |
273 | |
274 //@{ | |
275 /** Constructs a copy of the given object. This form | |
276 * always performs a deep copy. | |
277 */ | |
278 inline StreamInfo(const StreamInfo &object): Prototype(object) { } | |
279 inline StreamInfo(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
280 inline StreamInfo(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
281 //@} | |
282 | |
283 /** Constructs an object with copy control. See | |
284 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
285 */ | |
286 inline StreamInfo(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
287 | |
288 ~StreamInfo(); | |
289 | |
290 //@{ | |
291 /** Assign from another object. Always performs a deep copy. */ | |
292 inline StreamInfo &operator=(const StreamInfo &object) { Prototype::operator=(object); return *this; } | |
293 inline StreamInfo &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
294 inline StreamInfo &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
295 //@} | |
296 | |
297 /** Assigns an object with copy control. See | |
298 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
299 */ | |
300 inline StreamInfo &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
301 | |
302 //@{ | |
303 /** Check for equality, performing a deep compare by following pointers. */ | |
304 inline bool operator==(const StreamInfo &object) const { return Prototype::operator==(object); } | |
305 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
306 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
307 //@} | |
308 | |
309 //@{ | |
310 /** Check for inequality, performing a deep compare by following pointers. */ | |
311 inline bool operator!=(const StreamInfo &object) const { return Prototype::operator!=(object); } | |
312 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
313 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
314 //@} | |
315 | |
316 //@{ | |
317 /** See <A HREF="../format.html#metadata_block_streaminfo">format specification</A>. */ | |
318 unsigned get_min_blocksize() const; | |
319 unsigned get_max_blocksize() const; | |
320 unsigned get_min_framesize() const; | |
321 unsigned get_max_framesize() const; | |
322 unsigned get_sample_rate() const; | |
323 unsigned get_channels() const; | |
324 unsigned get_bits_per_sample() const; | |
325 FLAC__uint64 get_total_samples() const; | |
326 const FLAC__byte *get_md5sum() const; | |
327 | |
328 void set_min_blocksize(unsigned value); | |
329 void set_max_blocksize(unsigned value); | |
330 void set_min_framesize(unsigned value); | |
331 void set_max_framesize(unsigned value); | |
332 void set_sample_rate(unsigned value); | |
333 void set_channels(unsigned value); | |
334 void set_bits_per_sample(unsigned value); | |
335 void set_total_samples(FLAC__uint64 value); | |
336 void set_md5sum(const FLAC__byte value[16]); | |
337 //@} | |
338 }; | |
339 | |
340 /** PADDING metadata block. | |
341 * See the \link flacpp_metadata_object overview \endlink for more, | |
342 * and the <A HREF="../format.html#metadata_block_padding">format specification</A>. | |
343 */ | |
344 class FLACPP_API Padding : public Prototype { | |
345 public: | |
346 Padding(); | |
347 | |
348 //@{ | |
349 /** Constructs a copy of the given object. This form | |
350 * always performs a deep copy. | |
351 */ | |
352 inline Padding(const Padding &object): Prototype(object) { } | |
353 inline Padding(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
354 inline Padding(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
355 //@} | |
356 | |
357 /** Constructs an object with copy control. See | |
358 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
359 */ | |
360 inline Padding(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
361 | |
362 ~Padding(); | |
363 | |
364 //@{ | |
365 /** Assign from another object. Always performs a deep copy. */ | |
366 inline Padding &operator=(const Padding &object) { Prototype::operator=(object); return *this; } | |
367 inline Padding &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
368 inline Padding &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
369 //@} | |
370 | |
371 /** Assigns an object with copy control. See | |
372 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
373 */ | |
374 inline Padding &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
375 | |
376 //@{ | |
377 /** Check for equality, performing a deep compare by following pointers. */ | |
378 inline bool operator==(const Padding &object) const { return Prototype::operator==(object); } | |
379 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
380 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
381 //@} | |
382 | |
383 //@{ | |
384 /** Check for inequality, performing a deep compare by following pointers. */ | |
385 inline bool operator!=(const Padding &object) const { return Prototype::operator!=(object); } | |
386 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
387 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
388 //@} | |
389 | |
390 void set_length(unsigned length); | |
391 }; | |
392 | |
393 /** APPLICATION metadata block. | |
394 * See the \link flacpp_metadata_object overview \endlink for more, | |
395 * and the <A HREF="../format.html#metadata_block_application">format specification</A>. | |
396 */ | |
397 class FLACPP_API Application : public Prototype { | |
398 public: | |
399 Application(); | |
400 // | |
401 //@{ | |
402 /** Constructs a copy of the given object. This form | |
403 * always performs a deep copy. | |
404 */ | |
405 inline Application(const Application &object): Prototype(object) { } | |
406 inline Application(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
407 inline Application(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
408 //@} | |
409 | |
410 /** Constructs an object with copy control. See | |
411 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
412 */ | |
413 inline Application(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
414 | |
415 ~Application(); | |
416 | |
417 //@{ | |
418 /** Assign from another object. Always performs a deep copy. */ | |
419 inline Application &operator=(const Application &object) { Prototype::operator=(object); return *this; } | |
420 inline Application &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
421 inline Application &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
422 //@} | |
423 | |
424 /** Assigns an object with copy control. See | |
425 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
426 */ | |
427 inline Application &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
428 | |
429 //@{ | |
430 /** Check for equality, performing a deep compare by following pointers. */ | |
431 inline bool operator==(const Application &object) const { return Prototype::operator==(object); } | |
432 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
433 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
434 //@} | |
435 | |
436 //@{ | |
437 /** Check for inequality, performing a deep compare by following pointers. */ | |
438 inline bool operator!=(const Application &object) const { return Prototype::operator!=(object); } | |
439 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
440 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
441 //@} | |
442 | |
443 const FLAC__byte *get_id() const; | |
444 const FLAC__byte *get_data() const; | |
445 | |
446 void set_id(const FLAC__byte value[4]); | |
447 //! This form always copies \a data | |
448 bool set_data(const FLAC__byte *data, unsigned length); | |
449 bool set_data(FLAC__byte *data, unsigned length, bool copy); | |
450 }; | |
451 | |
452 /** SEEKTABLE metadata block. | |
453 * See the \link flacpp_metadata_object overview \endlink for more, | |
454 * and the <A HREF="../format.html#metadata_block_seektable">format specification</A>. | |
455 */ | |
456 class FLACPP_API SeekTable : public Prototype { | |
457 public: | |
458 SeekTable(); | |
459 | |
460 //@{ | |
461 /** Constructs a copy of the given object. This form | |
462 * always performs a deep copy. | |
463 */ | |
464 inline SeekTable(const SeekTable &object): Prototype(object) { } | |
465 inline SeekTable(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
466 inline SeekTable(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
467 //@} | |
468 | |
469 /** Constructs an object with copy control. See | |
470 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
471 */ | |
472 inline SeekTable(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
473 | |
474 ~SeekTable(); | |
475 | |
476 //@{ | |
477 /** Assign from another object. Always performs a deep copy. */ | |
478 inline SeekTable &operator=(const SeekTable &object) { Prototype::operator=(object); return *this; } | |
479 inline SeekTable &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
480 inline SeekTable &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
481 //@} | |
482 | |
483 /** Assigns an object with copy control. See | |
484 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
485 */ | |
486 inline SeekTable &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
487 | |
488 //@{ | |
489 /** Check for equality, performing a deep compare by following pointers. */ | |
490 inline bool operator==(const SeekTable &object) const { return Prototype::operator==(object); } | |
491 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
492 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
493 //@} | |
494 | |
495 //@{ | |
496 /** Check for inequality, performing a deep compare by following pointers. */ | |
497 inline bool operator!=(const SeekTable &object) const { return Prototype::operator!=(object); } | |
498 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
499 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
500 //@} | |
501 | |
502 unsigned get_num_points() const; | |
503 ::FLAC__StreamMetadata_SeekPoint get_point(unsigned index) const; | |
504 | |
505 //! See FLAC__metadata_object_seektable_set_point() | |
506 void set_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point); | |
507 | |
508 //! See FLAC__metadata_object_seektable_insert_point() | |
509 bool insert_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point); | |
510 | |
511 //! See FLAC__metadata_object_seektable_delete_point() | |
512 bool delete_point(unsigned index); | |
513 | |
514 //! See FLAC__metadata_object_seektable_is_legal() | |
515 bool is_legal() const; | |
516 }; | |
517 | |
518 /** VORBIS_COMMENT metadata block. | |
519 * See the \link flacpp_metadata_object overview \endlink for more, | |
520 * and the <A HREF="../format.html#metadata_block_vorbis_comment">format specification</A>. | |
521 */ | |
522 class FLACPP_API VorbisComment : public Prototype { | |
523 public: | |
524 /** Convenience class for encapsulating Vorbis comment | |
525 * entries. An entry is a vendor string or a comment | |
526 * field. In the case of a vendor string, the field | |
527 * name is undefined; only the field value is relevant. | |
528 * | |
529 * A \a field as used in the methods refers to an | |
530 * entire 'NAME=VALUE' string; for convenience the | |
531 * string is NUL-terminated. A length field is | |
532 * required in the unlikely event that the value | |
533 * contains contain embedded NULs. | |
534 * | |
535 * A \a field_name is what is on the left side of the | |
536 * first '=' in the \a field. By definition it is ASCII | |
537 * and so is NUL-terminated and does not require a | |
538 * length to describe it. \a field_name is undefined | |
539 * for a vendor string entry. | |
540 * | |
541 * A \a field_value is what is on the right side of the | |
542 * first '=' in the \a field. By definition, this may | |
543 * contain embedded NULs and so a \a field_value_length | |
544 * is required to describe it. However in practice, | |
545 * embedded NULs are not known to be used, so it is | |
546 * generally safe to treat field values as NUL- | |
547 * terminated UTF-8 strings. | |
548 * | |
549 * Always check is_valid() after the constructor or operator= | |
550 * to make sure memory was properly allocated and that the | |
551 * Entry conforms to the Vorbis comment specification. | |
552 */ | |
553 class FLACPP_API Entry { | |
554 public: | |
555 Entry(); | |
556 | |
557 Entry(const char *field, unsigned field_length); | |
558 Entry(const char *field); // assumes \a field is NUL-terminated | |
559 | |
560 Entry(const char *field_name, const char *field_value, unsigned field_value_length); | |
561 Entry(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated | |
562 | |
563 Entry(const Entry &entry); | |
564 | |
565 Entry &operator=(const Entry &entry); | |
566 | |
567 virtual ~Entry(); | |
568 | |
569 virtual bool is_valid() const; ///< Returns \c true iff object was properly constructed. | |
570 | |
571 unsigned get_field_length() const; | |
572 unsigned get_field_name_length() const; | |
573 unsigned get_field_value_length() const; | |
574 | |
575 ::FLAC__StreamMetadata_VorbisComment_Entry get_entry() const; | |
576 const char *get_field() const; | |
577 const char *get_field_name() const; | |
578 const char *get_field_value() const; | |
579 | |
580 bool set_field(const char *field, unsigned field_length); | |
581 bool set_field(const char *field); // assumes \a field is NUL-terminated | |
582 bool set_field_name(const char *field_name); | |
583 bool set_field_value(const char *field_value, unsigned field_value_length); | |
584 bool set_field_value(const char *field_value); // assumes \a field_value is NUL-terminated | |
585 protected: | |
586 bool is_valid_; | |
587 ::FLAC__StreamMetadata_VorbisComment_Entry entry_; | |
588 char *field_name_; | |
589 unsigned field_name_length_; | |
590 char *field_value_; | |
591 unsigned field_value_length_; | |
592 private: | |
593 void zero(); | |
594 void clear(); | |
595 void clear_entry(); | |
596 void clear_field_name(); | |
597 void clear_field_value(); | |
598 void construct(const char *field, unsigned field_length); | |
599 void construct(const char *field); // assumes \a field is NUL-terminated | |
600 void construct(const char *field_name, const char *field_value, unsigned field_value_length); | |
601 void construct(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated | |
602 void compose_field(); | |
603 void parse_field(); | |
604 }; | |
605 | |
606 VorbisComment(); | |
607 | |
608 //@{ | |
609 /** Constructs a copy of the given object. This form | |
610 * always performs a deep copy. | |
611 */ | |
612 inline VorbisComment(const VorbisComment &object): Prototype(object) { } | |
613 inline VorbisComment(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
614 inline VorbisComment(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
615 //@} | |
616 | |
617 /** Constructs an object with copy control. See | |
618 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
619 */ | |
620 inline VorbisComment(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
621 | |
622 ~VorbisComment(); | |
623 | |
624 //@{ | |
625 /** Assign from another object. Always performs a deep copy. */ | |
626 inline VorbisComment &operator=(const VorbisComment &object) { Prototype::operator=(object); return *this; } | |
627 inline VorbisComment &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
628 inline VorbisComment &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
629 //@} | |
630 | |
631 /** Assigns an object with copy control. See | |
632 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
633 */ | |
634 inline VorbisComment &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
635 | |
636 //@{ | |
637 /** Check for equality, performing a deep compare by following pointers. */ | |
638 inline bool operator==(const VorbisComment &object) const { return Prototype::operator==(object); } | |
639 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
640 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
641 //@} | |
642 | |
643 //@{ | |
644 /** Check for inequality, performing a deep compare by following pointers. */ | |
645 inline bool operator!=(const VorbisComment &object) const { return Prototype::operator!=(object); } | |
646 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
647 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
648 //@} | |
649 | |
650 unsigned get_num_comments() const; | |
651 const FLAC__byte *get_vendor_string() const; // NUL-terminated UTF-8 string | |
652 Entry get_comment(unsigned index) const; | |
653 | |
654 //! See FLAC__metadata_object_vorbiscomment_set_vendor_string() | |
655 bool set_vendor_string(const FLAC__byte *string); // NUL-terminated UTF-8 string | |
656 | |
657 //! See FLAC__metadata_object_vorbiscomment_set_comment() | |
658 bool set_comment(unsigned index, const Entry &entry); | |
659 | |
660 //! See FLAC__metadata_object_vorbiscomment_insert_comment() | |
661 bool insert_comment(unsigned index, const Entry &entry); | |
662 | |
663 //! See FLAC__metadata_object_vorbiscomment_append_comment() | |
664 bool append_comment(const Entry &entry); | |
665 | |
666 //! See FLAC__metadata_object_vorbiscomment_delete_comment() | |
667 bool delete_comment(unsigned index); | |
668 }; | |
669 | |
670 /** CUESHEET metadata block. | |
671 * See the \link flacpp_metadata_object overview \endlink for more, | |
672 * and the <A HREF="../format.html#metadata_block_cuesheet">format specification</A>. | |
673 */ | |
674 class FLACPP_API CueSheet : public Prototype { | |
675 public: | |
676 /** Convenience class for encapsulating a cue sheet | |
677 * track. | |
678 * | |
679 * Always check is_valid() after the constructor or operator= | |
680 * to make sure memory was properly allocated. | |
681 */ | |
682 class FLACPP_API Track { | |
683 protected: | |
684 ::FLAC__StreamMetadata_CueSheet_Track *object_; | |
685 public: | |
686 Track(); | |
687 Track(const ::FLAC__StreamMetadata_CueSheet_Track *track); | |
688 Track(const Track &track); | |
689 Track &operator=(const Track &track); | |
690 | |
691 virtual ~Track(); | |
692 | |
693 virtual bool is_valid() const; ///< Returns \c true iff object was properly constructed. | |
694 | |
695 | |
696 inline FLAC__uint64 get_offset() const { return object_->offset; } | |
697 inline FLAC__byte get_number() const { return object_->number; } | |
698 inline const char *get_isrc() const { return object_->isrc; } | |
699 inline unsigned get_type() const { return object_->type; } | |
700 inline bool get_pre_emphasis() const { return object_->pre_emphasis; } | |
701 | |
702 inline FLAC__byte get_num_indices() const { return object_->num_indices; } | |
703 ::FLAC__StreamMetadata_CueSheet_Index get_index(unsigned i) const; | |
704 | |
705 inline const ::FLAC__StreamMetadata_CueSheet_Track *get_track() const { return object_; } | |
706 | |
707 inline void set_offset(FLAC__uint64 value) { object_->offset = value; } | |
708 inline void set_number(FLAC__byte value) { object_->number = value; } | |
709 void set_isrc(const char value[12]); | |
710 void set_type(unsigned value); | |
711 inline void set_pre_emphasis(bool value) { object_->pre_emphasis = value? 1 : 0; } | |
712 | |
713 void set_index(unsigned i, const ::FLAC__StreamMetadata_CueSheet_Index &index); | |
714 //@@@ It's awkward but to insert/delete index points | |
715 //@@@ you must use the routines in the CueSheet class. | |
716 }; | |
717 | |
718 CueSheet(); | |
719 | |
720 //@{ | |
721 /** Constructs a copy of the given object. This form | |
722 * always performs a deep copy. | |
723 */ | |
724 inline CueSheet(const CueSheet &object): Prototype(object) { } | |
725 inline CueSheet(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
726 inline CueSheet(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
727 //@} | |
728 | |
729 /** Constructs an object with copy control. See | |
730 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
731 */ | |
732 inline CueSheet(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
733 | |
734 ~CueSheet(); | |
735 | |
736 //@{ | |
737 /** Assign from another object. Always performs a deep copy. */ | |
738 inline CueSheet &operator=(const CueSheet &object) { Prototype::operator=(object); return *this; } | |
739 inline CueSheet &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
740 inline CueSheet &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
741 //@} | |
742 | |
743 /** Assigns an object with copy control. See | |
744 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
745 */ | |
746 inline CueSheet &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
747 | |
748 //@{ | |
749 /** Check for equality, performing a deep compare by following pointers. */ | |
750 inline bool operator==(const CueSheet &object) const { return Prototype::operator==(object); } | |
751 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
752 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
753 //@} | |
754 | |
755 //@{ | |
756 /** Check for inequality, performing a deep compare by following pointers. */ | |
757 inline bool operator!=(const CueSheet &object) const { return Prototype::operator!=(object); } | |
758 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
759 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
760 //@} | |
761 | |
762 const char *get_media_catalog_number() const; | |
763 FLAC__uint64 get_lead_in() const; | |
764 bool get_is_cd() const; | |
765 | |
766 unsigned get_num_tracks() const; | |
767 Track get_track(unsigned i) const; | |
768 | |
769 void set_media_catalog_number(const char value[128]); | |
770 void set_lead_in(FLAC__uint64 value); | |
771 void set_is_cd(bool value); | |
772 | |
773 void set_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index); | |
774 | |
775 //! See FLAC__metadata_object_cuesheet_track_insert_index() | |
776 bool insert_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index); | |
777 | |
778 //! See FLAC__metadata_object_cuesheet_track_delete_index() | |
779 bool delete_index(unsigned track_num, unsigned index_num); | |
780 | |
781 //! See FLAC__metadata_object_cuesheet_set_track() | |
782 bool set_track(unsigned i, const Track &track); | |
783 | |
784 //! See FLAC__metadata_object_cuesheet_insert_track() | |
785 bool insert_track(unsigned i, const Track &track); | |
786 | |
787 //! See FLAC__metadata_object_cuesheet_delete_track() | |
788 bool delete_track(unsigned i); | |
789 | |
790 //! See FLAC__metadata_object_cuesheet_is_legal() | |
791 bool is_legal(bool check_cd_da_subset = false, const char **violation = 0) const; | |
792 | |
793 //! See FLAC__metadata_object_cuesheet_calculate_cddb_id() | |
794 FLAC__uint32 calculate_cddb_id() const; | |
795 }; | |
796 | |
797 /** PICTURE metadata block. | |
798 * See the \link flacpp_metadata_object overview \endlink for more, | |
799 * and the <A HREF="../format.html#metadata_block_picture">format specification</A>. | |
800 */ | |
801 class FLACPP_API Picture : public Prototype { | |
802 public: | |
803 Picture(); | |
804 | |
805 //@{ | |
806 /** Constructs a copy of the given object. This form | |
807 * always performs a deep copy. | |
808 */ | |
809 inline Picture(const Picture &object): Prototype(object) { } | |
810 inline Picture(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
811 inline Picture(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
812 //@} | |
813 | |
814 /** Constructs an object with copy control. See | |
815 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
816 */ | |
817 inline Picture(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
818 | |
819 ~Picture(); | |
820 | |
821 //@{ | |
822 /** Assign from another object. Always performs a deep copy. */ | |
823 inline Picture &operator=(const Picture &object) { Prototype::operator=(object); return *this; } | |
824 inline Picture &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
825 inline Picture &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
826 //@} | |
827 | |
828 /** Assigns an object with copy control. See | |
829 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
830 */ | |
831 inline Picture &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
832 | |
833 //@{ | |
834 /** Check for equality, performing a deep compare by following pointers. */ | |
835 inline bool operator==(const Picture &object) const { return Prototype::operator==(object); } | |
836 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
837 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
838 //@} | |
839 | |
840 //@{ | |
841 /** Check for inequality, performing a deep compare by following pointers. */ | |
842 inline bool operator!=(const Picture &object) const { return Prototype::operator!=(object); } | |
843 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
844 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
845 //@} | |
846 | |
847 ::FLAC__StreamMetadata_Picture_Type get_type() const; | |
848 const char *get_mime_type() const; // NUL-terminated printable ASCII string | |
849 const FLAC__byte *get_description() const; // NUL-terminated UTF-8 string | |
850 FLAC__uint32 get_width() const; | |
851 FLAC__uint32 get_height() const; | |
852 FLAC__uint32 get_depth() const; | |
853 FLAC__uint32 get_colors() const; ///< a return value of \c 0 means true-color, i.e. 2^depth colors | |
854 FLAC__uint32 get_data_length() const; | |
855 const FLAC__byte *get_data() const; | |
856 | |
857 void set_type(::FLAC__StreamMetadata_Picture_Type type); | |
858 | |
859 //! See FLAC__metadata_object_picture_set_mime_type() | |
860 bool set_mime_type(const char *string); // NUL-terminated printable ASCII string | |
861 | |
862 //! See FLAC__metadata_object_picture_set_description() | |
863 bool set_description(const FLAC__byte *string); // NUL-terminated UTF-8 string | |
864 | |
865 void set_width(FLAC__uint32 value) const; | |
866 void set_height(FLAC__uint32 value) const; | |
867 void set_depth(FLAC__uint32 value) const; | |
868 void set_colors(FLAC__uint32 value) const; ///< a value of \c 0 means true-color, i.e. 2^depth colors | |
869 | |
870 //! See FLAC__metadata_object_picture_set_data() | |
871 bool set_data(const FLAC__byte *data, FLAC__uint32 data_length); | |
872 }; | |
873 | |
874 /** Opaque metadata block for storing unknown types. | |
875 * This should not be used unless you know what you are doing; | |
876 * it is currently used only internally to support forward | |
877 * compatibility of metadata blocks. | |
878 * See the \link flacpp_metadata_object overview \endlink for more, | |
879 */ | |
880 class FLACPP_API Unknown : public Prototype { | |
881 public: | |
882 Unknown(); | |
883 // | |
884 //@{ | |
885 /** Constructs a copy of the given object. This form | |
886 * always performs a deep copy. | |
887 */ | |
888 inline Unknown(const Unknown &object): Prototype(object) { } | |
889 inline Unknown(const ::FLAC__StreamMetadata &object): Prototype(object) { } | |
890 inline Unknown(const ::FLAC__StreamMetadata *object): Prototype(object) { } | |
891 //@} | |
892 | |
893 /** Constructs an object with copy control. See | |
894 * Prototype(::FLAC__StreamMetadata *object, bool copy). | |
895 */ | |
896 inline Unknown(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } | |
897 | |
898 ~Unknown(); | |
899 | |
900 //@{ | |
901 /** Assign from another object. Always performs a deep copy. */ | |
902 inline Unknown &operator=(const Unknown &object) { Prototype::operator=(object); return *this; } | |
903 inline Unknown &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } | |
904 inline Unknown &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } | |
905 //@} | |
906 | |
907 /** Assigns an object with copy control. See | |
908 * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). | |
909 */ | |
910 inline Unknown &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } | |
911 | |
912 //@{ | |
913 /** Check for equality, performing a deep compare by following pointers. */ | |
914 inline bool operator==(const Unknown &object) const { return Prototype::operator==(object); } | |
915 inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } | |
916 inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } | |
917 //@} | |
918 | |
919 //@{ | |
920 /** Check for inequality, performing a deep compare by following pointers. */ | |
921 inline bool operator!=(const Unknown &object) const { return Prototype::operator!=(object); } | |
922 inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } | |
923 inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } | |
924 //@} | |
925 | |
926 const FLAC__byte *get_data() const; | |
927 | |
928 //! This form always copies \a data | |
929 bool set_data(const FLAC__byte *data, unsigned length); | |
930 bool set_data(FLAC__byte *data, unsigned length, bool copy); | |
931 }; | |
932 | |
933 /* \} */ | |
934 | |
935 | |
936 /** \defgroup flacpp_metadata_level0 FLAC++/metadata.h: metadata level 0 interface | |
937 * \ingroup flacpp_metadata | |
938 * | |
939 * \brief | |
940 * Level 0 metadata iterators. | |
941 * | |
942 * See the \link flac_metadata_level0 C layer equivalent \endlink | |
943 * for more. | |
944 * | |
945 * \{ | |
946 */ | |
947 | |
948 FLACPP_API bool get_streaminfo(const char *filename, StreamInfo &streaminfo); ///< See FLAC__metadata_get_streaminfo(). | |
949 | |
950 FLACPP_API bool get_tags(const char *filename, VorbisComment *&tags); ///< See FLAC__metadata_get_tags(). | |
951 FLACPP_API bool get_tags(const char *filename, VorbisComment &tags); ///< See FLAC__metadata_get_tags(). | |
952 | |
953 FLACPP_API bool get_cuesheet(const char *filename, CueSheet *&cuesheet); ///< See FLAC__metadata_get_cuesheet(). | |
954 FLACPP_API bool get_cuesheet(const char *filename, CueSheet &cuesheet); ///< See FLAC__metadata_get_cuesheet(). | |
955 | |
956 FLACPP_API bool get_picture(const char *filename, Picture *&picture, ::FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); ///< See FLAC__metadata_get_picture(). | |
957 FLACPP_API bool get_picture(const char *filename, Picture &picture, ::FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors); ///< See FLAC__metadata_get_picture(). | |
958 | |
959 /* \} */ | |
960 | |
961 | |
962 /** \defgroup flacpp_metadata_level1 FLAC++/metadata.h: metadata level 1 interface | |
963 * \ingroup flacpp_metadata | |
964 * | |
965 * \brief | |
966 * Level 1 metadata iterator. | |
967 * | |
968 * The flow through the iterator in the C++ layer is similar | |
969 * to the C layer: | |
970 * - Create a SimpleIterator instance | |
971 * - Check SimpleIterator::is_valid() | |
972 * - Call SimpleIterator::init() and check the return | |
973 * - Traverse and/or edit. Edits are written to file | |
974 * immediately. | |
975 * - Destroy the SimpleIterator instance | |
976 * | |
977 * The ownership of pointers in the C++ layer follows that in | |
978 * the C layer, i.e. | |
979 * - The objects returned by get_block() are yours to | |
980 * modify, but changes are not reflected in the FLAC file | |
981 * until you call set_block(). The objects are also | |
982 * yours to delete; they are not automatically deleted | |
983 * when passed to set_block() or insert_block_after(). | |
984 * | |
985 * See the \link flac_metadata_level1 C layer equivalent \endlink | |
986 * for more. | |
987 * | |
988 * \{ | |
989 */ | |
990 | |
991 /** This class is a wrapper around the FLAC__metadata_simple_iterator | |
992 * structures and methods; see the | |
993 * \link flacpp_metadata_level1 usage guide \endlink and | |
994 * ::FLAC__Metadata_SimpleIterator. | |
995 */ | |
996 class FLACPP_API SimpleIterator { | |
997 public: | |
998 /** This class is a wrapper around FLAC__Metadata_SimpleIteratorStatus. | |
999 */ | |
1000 class FLACPP_API Status { | |
1001 public: | |
1002 inline Status(::FLAC__Metadata_SimpleIteratorStatus status): status_(status) { } | |
1003 inline operator ::FLAC__Metadata_SimpleIteratorStatus() const { return status_; } | |
1004 inline const char *as_cstring() const { return ::FLAC__Metadata_SimpleIteratorStatusString[status_]; } | |
1005 protected: | |
1006 ::FLAC__Metadata_SimpleIteratorStatus status_; | |
1007 }; | |
1008 | |
1009 SimpleIterator(); | |
1010 virtual ~SimpleIterator(); | |
1011 | |
1012 bool is_valid() const; ///< Returns \c true iff object was properly constructed. | |
1013 | |
1014 bool init(const char *filename, bool read_only, bool preserve_file_stats); ///< See FLAC__metadata_simple_iterator_init(). | |
1015 | |
1016 Status status(); ///< See FLAC__metadata_simple_iterator_status(). | |
1017 bool is_writable() const; ///< See FLAC__metadata_simple_iterator_is_writable(). | |
1018 | |
1019 bool next(); ///< See FLAC__metadata_simple_iterator_next(). | |
1020 bool prev(); ///< See FLAC__metadata_simple_iterator_prev(). | |
1021 bool is_last() const; ///< See FLAC__metadata_simple_iterator_is_last(). | |
1022 | |
1023 off_t get_block_offset() const; ///< See FLAC__metadata_simple_iterator_get_block_offset(). | |
1024 ::FLAC__MetadataType get_block_type() const; ///< See FLAC__metadata_simple_iterator_get_block_type(). | |
1025 unsigned get_block_length() const; ///< See FLAC__metadata_simple_iterator_get_block_length(). | |
1026 bool get_application_id(FLAC__byte *id); ///< See FLAC__metadata_simple_iterator_get_application_id(). | |
1027 Prototype *get_block(); ///< See FLAC__metadata_simple_iterator_get_block(). | |
1028 bool set_block(Prototype *block, bool use_padding = true); ///< See FLAC__metadata_simple_iterator_set_block(). | |
1029 bool insert_block_after(Prototype *block, bool use_padding = true); ///< See FLAC__metadata_simple_iterator_insert_block_after(). | |
1030 bool delete_block(bool use_padding = true); ///< See FLAC__metadata_simple_iterator_delete_block(). | |
1031 | |
1032 protected: | |
1033 ::FLAC__Metadata_SimpleIterator *iterator_; | |
1034 void clear(); | |
1035 }; | |
1036 | |
1037 /* \} */ | |
1038 | |
1039 | |
1040 /** \defgroup flacpp_metadata_level2 FLAC++/metadata.h: metadata level 2 interface | |
1041 * \ingroup flacpp_metadata | |
1042 * | |
1043 * \brief | |
1044 * Level 2 metadata iterator. | |
1045 * | |
1046 * The flow through the iterator in the C++ layer is similar | |
1047 * to the C layer: | |
1048 * - Create a Chain instance | |
1049 * - Check Chain::is_valid() | |
1050 * - Call Chain::read() and check the return | |
1051 * - Traverse and/or edit with an Iterator or with | |
1052 * Chain::merge_padding() or Chain::sort_padding() | |
1053 * - Write changes back to FLAC file with Chain::write() | |
1054 * - Destroy the Chain instance | |
1055 * | |
1056 * The ownership of pointers in the C++ layer is slightly | |
1057 * different than in the C layer, i.e. | |
1058 * - The objects returned by Iterator::get_block() are NOT | |
1059 * owned by the iterator and should be deleted by the | |
1060 * caller when finished, BUT, when you modify the block, | |
1061 * it will directly edit what's in the chain and you do | |
1062 * not need to call Iterator::set_block(). However the | |
1063 * changes will not be reflected in the FLAC file until | |
1064 * the chain is written with Chain::write(). | |
1065 * - When you pass an object to Iterator::set_block(), | |
1066 * Iterator::insert_block_before(), or | |
1067 * Iterator::insert_block_after(), the iterator takes | |
1068 * ownership of the block and it will be deleted by the | |
1069 * chain. | |
1070 * | |
1071 * See the \link flac_metadata_level2 C layer equivalent \endlink | |
1072 * for more. | |
1073 * | |
1074 * \{ | |
1075 */ | |
1076 | |
1077 /** This class is a wrapper around the FLAC__metadata_chain | |
1078 * structures and methods; see the | |
1079 * \link flacpp_metadata_level2 usage guide \endlink and | |
1080 * ::FLAC__Metadata_Chain. | |
1081 */ | |
1082 class FLACPP_API Chain { | |
1083 public: | |
1084 /** This class is a wrapper around FLAC__Metadata_ChainStatus. | |
1085 */ | |
1086 class FLACPP_API Status { | |
1087 public: | |
1088 inline Status(::FLAC__Metadata_ChainStatus status): status_(status) { } | |
1089 inline operator ::FLAC__Metadata_ChainStatus() const { return status_; } | |
1090 inline const char *as_cstring() const { return ::FLAC__Metadata_ChainStatusString[status_]; } | |
1091 protected: | |
1092 ::FLAC__Metadata_ChainStatus status_; | |
1093 }; | |
1094 | |
1095 Chain(); | |
1096 virtual ~Chain(); | |
1097 | |
1098 friend class Iterator; | |
1099 | |
1100 bool is_valid() const; ///< Returns \c true iff object was properly constructed. | |
1101 | |
1102 Status status(); ///< See FLAC__metadata_chain_status(). | |
1103 | |
1104 bool read(const char *filename, bool is_ogg = false); ///< See FLAC__metadata_chain_read(), FLAC__metadata_chain_read_ogg(). | |
1105 bool read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, bool is_ogg = false); ///< See FLAC__metadata_chain_read_with_callbacks(), FLAC__metadata_chain_read_ogg_with_callbacks(). | |
1106 | |
1107 bool check_if_tempfile_needed(bool use_padding); ///< See FLAC__metadata_chain_check_if_tempfile_needed(). | |
1108 | |
1109 bool write(bool use_padding = true, bool preserve_file_stats = false); ///< See FLAC__metadata_chain_write(). | |
1110 bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks); ///< See FLAC__metadata_chain_write_with_callbacks(). | |
1111 bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks, ::FLAC__IOHandle temp_handle, ::FLAC__IOCallbacks temp_callbacks); ///< See FLAC__metadata_chain_write_with_callbacks_and_tempfile(). | |
1112 | |
1113 void merge_padding(); ///< See FLAC__metadata_chain_merge_padding(). | |
1114 void sort_padding(); ///< See FLAC__metadata_chain_sort_padding(). | |
1115 | |
1116 protected: | |
1117 ::FLAC__Metadata_Chain *chain_; | |
1118 virtual void clear(); | |
1119 }; | |
1120 | |
1121 /** This class is a wrapper around the FLAC__metadata_iterator | |
1122 * structures and methods; see the | |
1123 * \link flacpp_metadata_level2 usage guide \endlink and | |
1124 * ::FLAC__Metadata_Iterator. | |
1125 */ | |
1126 class FLACPP_API Iterator { | |
1127 public: | |
1128 Iterator(); | |
1129 virtual ~Iterator(); | |
1130 | |
1131 bool is_valid() const; ///< Returns \c true iff object was properly constructed. | |
1132 | |
1133 | |
1134 void init(Chain &chain); ///< See FLAC__metadata_iterator_init(). | |
1135 | |
1136 bool next(); ///< See FLAC__metadata_iterator_next(). | |
1137 bool prev(); ///< See FLAC__metadata_iterator_prev(). | |
1138 | |
1139 ::FLAC__MetadataType get_block_type() const; ///< See FLAC__metadata_iterator_get_block_type(). | |
1140 Prototype *get_block(); ///< See FLAC__metadata_iterator_get_block(). | |
1141 bool set_block(Prototype *block); ///< See FLAC__metadata_iterator_set_block(). | |
1142 bool delete_block(bool replace_with_padding); ///< See FLAC__metadata_iterator_delete_block(). | |
1143 bool insert_block_before(Prototype *block); ///< See FLAC__metadata_iterator_insert_block_before(). | |
1144 bool insert_block_after(Prototype *block); ///< See FLAC__metadata_iterator_insert_block_after(). | |
1145 | |
1146 protected: | |
1147 ::FLAC__Metadata_Iterator *iterator_; | |
1148 virtual void clear(); | |
1149 }; | |
1150 | |
1151 /* \} */ | |
1152 | |
1153 } | |
1154 } | |
1155 | |
1156 #endif |