cannam@86: cannam@86: cannam@86: FLAC: include/FLAC++/metadata.h Source File cannam@86: cannam@86: cannam@86: cannam@86:
Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members
cannam@86: cannam@86:

metadata.h

Go to the documentation of this file.
00001 /* libFLAC++ - Free Lossless Audio Codec library
cannam@86: 00002  * Copyright (C) 2002,2003,2004,2005,2006,2007  Josh Coalson
cannam@86: 00003  *
cannam@86: 00004  * Redistribution and use in source and binary forms, with or without
cannam@86: 00005  * modification, are permitted provided that the following conditions
cannam@86: 00006  * are met:
cannam@86: 00007  *
cannam@86: 00008  * - Redistributions of source code must retain the above copyright
cannam@86: 00009  * notice, this list of conditions and the following disclaimer.
cannam@86: 00010  *
cannam@86: 00011  * - Redistributions in binary form must reproduce the above copyright
cannam@86: 00012  * notice, this list of conditions and the following disclaimer in the
cannam@86: 00013  * documentation and/or other materials provided with the distribution.
cannam@86: 00014  *
cannam@86: 00015  * - Neither the name of the Xiph.org Foundation nor the names of its
cannam@86: 00016  * contributors may be used to endorse or promote products derived from
cannam@86: 00017  * this software without specific prior written permission.
cannam@86: 00018  *
cannam@86: 00019  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
cannam@86: 00020  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
cannam@86: 00021  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
cannam@86: 00022  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
cannam@86: 00023  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
cannam@86: 00024  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
cannam@86: 00025  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
cannam@86: 00026  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
cannam@86: 00027  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
cannam@86: 00028  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
cannam@86: 00029  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
cannam@86: 00030  */
cannam@86: 00031 
cannam@86: 00032 #ifndef FLACPP__METADATA_H
cannam@86: 00033 #define FLACPP__METADATA_H
cannam@86: 00034 
cannam@86: 00035 #include "export.h"
cannam@86: 00036 
cannam@86: 00037 #include "FLAC/metadata.h"
cannam@86: 00038 
cannam@86: 00039 // ===============================================================
cannam@86: 00040 //
cannam@86: 00041 //  Full documentation for the metadata interface can be found
cannam@86: 00042 //  in the C layer in include/FLAC/metadata.h
cannam@86: 00043 //
cannam@86: 00044 // ===============================================================
cannam@86: 00045 
cannam@86: 00074 namespace FLAC {
cannam@86: 00075     namespace Metadata {
cannam@86: 00076 
cannam@86: 00077         // ============================================================
cannam@86: 00078         //
cannam@86: 00079         //  Metadata objects
cannam@86: 00080         //
cannam@86: 00081         // ============================================================
cannam@86: 00082 
cannam@86: 00108         class FLACPP_API Prototype {
cannam@86: 00109         protected:
cannam@86: 00111 
cannam@86: 00114             Prototype(const Prototype &);
cannam@86: 00115             Prototype(const ::FLAC__StreamMetadata &);
cannam@86: 00116             Prototype(const ::FLAC__StreamMetadata *);
cannam@86: 00118 
cannam@86: 00129             Prototype(::FLAC__StreamMetadata *object, bool copy);
cannam@86: 00130 
cannam@86: 00132 
cannam@86: 00133             Prototype &operator=(const Prototype &);
cannam@86: 00134             Prototype &operator=(const ::FLAC__StreamMetadata &);
cannam@86: 00135             Prototype &operator=(const ::FLAC__StreamMetadata *);
cannam@86: 00137 
cannam@86: 00141             Prototype &assign_object(::FLAC__StreamMetadata *object, bool copy);
cannam@86: 00142 
cannam@86: 00145             virtual void clear();
cannam@86: 00146 
cannam@86: 00147             ::FLAC__StreamMetadata *object_;
cannam@86: 00148         public:
cannam@86: 00151             virtual ~Prototype();
cannam@86: 00152 
cannam@86: 00154 
cannam@86: 00156             inline bool operator==(const Prototype &) const;
cannam@86: 00157             inline bool operator==(const ::FLAC__StreamMetadata &) const;
cannam@86: 00158             inline bool operator==(const ::FLAC__StreamMetadata *) const;
cannam@86: 00160 
cannam@86: 00162 
cannam@86: 00163             inline bool operator!=(const Prototype &) const;
cannam@86: 00164             inline bool operator!=(const ::FLAC__StreamMetadata &) const;
cannam@86: 00165             inline bool operator!=(const ::FLAC__StreamMetadata *) const;
cannam@86: 00167 
cannam@86: 00168             friend class SimpleIterator;
cannam@86: 00169             friend class Iterator;
cannam@86: 00170 
cannam@86: 00175             inline bool is_valid() const;
cannam@86: 00176 
cannam@86: 00183             bool get_is_last() const;
cannam@86: 00184 
cannam@86: 00190 			::FLAC__MetadataType get_type() const;
cannam@86: 00191 
cannam@86: 00201             unsigned get_length() const;
cannam@86: 00202 
cannam@86: 00209             void set_is_last(bool);
cannam@86: 00210 
cannam@86: 00218             inline operator const ::FLAC__StreamMetadata *() const;
cannam@86: 00219         private:
cannam@86: 00221             Prototype();
cannam@86: 00222 
cannam@86: 00223             // These are used only by Iterator
cannam@86: 00224             bool is_reference_;
cannam@86: 00225             inline void set_reference(bool x) { is_reference_ = x; }
cannam@86: 00226         };
cannam@86: 00227 
cannam@86: 00228 #ifdef _MSC_VER
cannam@86: 00229 // warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)
cannam@86: 00230 #pragma warning ( disable : 4800 )
cannam@86: 00231 #endif
cannam@86: 00232 
cannam@86: 00233         inline bool Prototype::operator==(const Prototype &object) const
cannam@86: 00234         { return (bool)::FLAC__metadata_object_is_equal(object_, object.object_); }
cannam@86: 00235 
cannam@86: 00236         inline bool Prototype::operator==(const ::FLAC__StreamMetadata &object) const
cannam@86: 00237         { return (bool)::FLAC__metadata_object_is_equal(object_, &object); }
cannam@86: 00238 
cannam@86: 00239         inline bool Prototype::operator==(const ::FLAC__StreamMetadata *object) const
cannam@86: 00240         { return (bool)::FLAC__metadata_object_is_equal(object_, object); }
cannam@86: 00241 
cannam@86: 00242 #ifdef _MSC_VER
cannam@86: 00243 // @@@ how to re-enable?  the following doesn't work
cannam@86: 00244 // #pragma warning ( enable : 4800 )
cannam@86: 00245 #endif
cannam@86: 00246 
cannam@86: 00247         inline bool Prototype::operator!=(const Prototype &object) const
cannam@86: 00248         { return !operator==(object); }
cannam@86: 00249 
cannam@86: 00250         inline bool Prototype::operator!=(const ::FLAC__StreamMetadata &object) const
cannam@86: 00251         { return !operator==(object); }
cannam@86: 00252 
cannam@86: 00253         inline bool Prototype::operator!=(const ::FLAC__StreamMetadata *object) const
cannam@86: 00254         { return !operator==(object); }
cannam@86: 00255 
cannam@86: 00256         inline bool Prototype::is_valid() const
cannam@86: 00257         { return 0 != object_; }
cannam@86: 00258 
cannam@86: 00259         inline Prototype::operator const ::FLAC__StreamMetadata *() const
cannam@86: 00260         { return object_; }
cannam@86: 00261 
cannam@86: 00263         FLACPP_API Prototype *clone(const Prototype *);
cannam@86: 00264 
cannam@86: 00265 
cannam@86: 00270         class FLACPP_API StreamInfo : public Prototype {
cannam@86: 00271         public:
cannam@86: 00272             StreamInfo();
cannam@86: 00273 
cannam@86: 00275 
cannam@86: 00278             inline StreamInfo(const StreamInfo &object): Prototype(object) { }
cannam@86: 00279             inline StreamInfo(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00280             inline StreamInfo(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00282 
cannam@86: 00286             inline StreamInfo(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00287 
cannam@86: 00288             ~StreamInfo();
cannam@86: 00289 
cannam@86: 00291 
cannam@86: 00292             inline StreamInfo &operator=(const StreamInfo &object) { Prototype::operator=(object); return *this; }
cannam@86: 00293             inline StreamInfo &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00294             inline StreamInfo &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00296 
cannam@86: 00300             inline StreamInfo &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00301 
cannam@86: 00303 
cannam@86: 00304             inline bool operator==(const StreamInfo &object) const { return Prototype::operator==(object); }
cannam@86: 00305             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00306             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00308 
cannam@86: 00310 
cannam@86: 00311             inline bool operator!=(const StreamInfo &object) const { return Prototype::operator!=(object); }
cannam@86: 00312             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00313             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00315 
cannam@86: 00317 
cannam@86: 00318             unsigned get_min_blocksize() const;
cannam@86: 00319             unsigned get_max_blocksize() const;
cannam@86: 00320             unsigned get_min_framesize() const;
cannam@86: 00321             unsigned get_max_framesize() const;
cannam@86: 00322             unsigned get_sample_rate() const;
cannam@86: 00323             unsigned get_channels() const;
cannam@86: 00324             unsigned get_bits_per_sample() const;
cannam@86: 00325             FLAC__uint64 get_total_samples() const;
cannam@86: 00326             const FLAC__byte *get_md5sum() const;
cannam@86: 00327 
cannam@86: 00328             void set_min_blocksize(unsigned value);
cannam@86: 00329             void set_max_blocksize(unsigned value);
cannam@86: 00330             void set_min_framesize(unsigned value);
cannam@86: 00331             void set_max_framesize(unsigned value);
cannam@86: 00332             void set_sample_rate(unsigned value);
cannam@86: 00333             void set_channels(unsigned value);
cannam@86: 00334             void set_bits_per_sample(unsigned value);
cannam@86: 00335             void set_total_samples(FLAC__uint64 value);
cannam@86: 00336             void set_md5sum(const FLAC__byte value[16]);
cannam@86: 00338         };
cannam@86: 00339 
cannam@86: 00344         class FLACPP_API Padding : public Prototype {
cannam@86: 00345         public:
cannam@86: 00346             Padding();
cannam@86: 00347 
cannam@86: 00349 
cannam@86: 00352             inline Padding(const Padding &object): Prototype(object) { }
cannam@86: 00353             inline Padding(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00354             inline Padding(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00356 
cannam@86: 00360             inline Padding(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00361 
cannam@86: 00362             ~Padding();
cannam@86: 00363 
cannam@86: 00365 
cannam@86: 00366             inline Padding &operator=(const Padding &object) { Prototype::operator=(object); return *this; }
cannam@86: 00367             inline Padding &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00368             inline Padding &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00370 
cannam@86: 00374             inline Padding &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00375 
cannam@86: 00377 
cannam@86: 00378             inline bool operator==(const Padding &object) const { return Prototype::operator==(object); }
cannam@86: 00379             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00380             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00382 
cannam@86: 00384 
cannam@86: 00385             inline bool operator!=(const Padding &object) const { return Prototype::operator!=(object); }
cannam@86: 00386             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00387             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00389 
cannam@86: 00390             void set_length(unsigned length);
cannam@86: 00391         };
cannam@86: 00392 
cannam@86: 00397         class FLACPP_API Application : public Prototype {
cannam@86: 00398         public:
cannam@86: 00399             Application();
cannam@86: 00400             //
cannam@86: 00402 
cannam@86: 00405             inline Application(const Application &object): Prototype(object) { }
cannam@86: 00406             inline Application(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00407             inline Application(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00409 
cannam@86: 00413             inline Application(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00414 
cannam@86: 00415             ~Application();
cannam@86: 00416 
cannam@86: 00418 
cannam@86: 00419             inline Application &operator=(const Application &object) { Prototype::operator=(object); return *this; }
cannam@86: 00420             inline Application &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00421             inline Application &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00423 
cannam@86: 00427             inline Application &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00428 
cannam@86: 00430 
cannam@86: 00431             inline bool operator==(const Application &object) const { return Prototype::operator==(object); }
cannam@86: 00432             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00433             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00435 
cannam@86: 00437 
cannam@86: 00438             inline bool operator!=(const Application &object) const { return Prototype::operator!=(object); }
cannam@86: 00439             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00440             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00442 
cannam@86: 00443             const FLAC__byte *get_id() const;
cannam@86: 00444             const FLAC__byte *get_data() const;
cannam@86: 00445 
cannam@86: 00446             void set_id(const FLAC__byte value[4]);
cannam@86: 00448             bool set_data(const FLAC__byte *data, unsigned length);
cannam@86: 00449             bool set_data(FLAC__byte *data, unsigned length, bool copy);
cannam@86: 00450         };
cannam@86: 00451 
cannam@86: 00456         class FLACPP_API SeekTable : public Prototype {
cannam@86: 00457         public:
cannam@86: 00458             SeekTable();
cannam@86: 00459 
cannam@86: 00461 
cannam@86: 00464             inline SeekTable(const SeekTable &object): Prototype(object) { }
cannam@86: 00465             inline SeekTable(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00466             inline SeekTable(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00468 
cannam@86: 00472             inline SeekTable(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00473 
cannam@86: 00474             ~SeekTable();
cannam@86: 00475 
cannam@86: 00477 
cannam@86: 00478             inline SeekTable &operator=(const SeekTable &object) { Prototype::operator=(object); return *this; }
cannam@86: 00479             inline SeekTable &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00480             inline SeekTable &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00482 
cannam@86: 00486             inline SeekTable &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00487 
cannam@86: 00489 
cannam@86: 00490             inline bool operator==(const SeekTable &object) const { return Prototype::operator==(object); }
cannam@86: 00491             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00492             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00494 
cannam@86: 00496 
cannam@86: 00497             inline bool operator!=(const SeekTable &object) const { return Prototype::operator!=(object); }
cannam@86: 00498             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00499             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00501 
cannam@86: 00502             unsigned get_num_points() const;
cannam@86: 00503             ::FLAC__StreamMetadata_SeekPoint get_point(unsigned index) const;
cannam@86: 00504 
cannam@86: 00506             void set_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point);
cannam@86: 00507 
cannam@86: 00509             bool insert_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point);
cannam@86: 00510 
cannam@86: 00512             bool delete_point(unsigned index);
cannam@86: 00513 
cannam@86: 00515             bool is_legal() const;
cannam@86: 00516         };
cannam@86: 00517 
cannam@86: 00522         class FLACPP_API VorbisComment : public Prototype {
cannam@86: 00523         public:
cannam@86: 00553             class FLACPP_API Entry {
cannam@86: 00554             public:
cannam@86: 00555                 Entry();
cannam@86: 00556 
cannam@86: 00557                 Entry(const char *field, unsigned field_length);
cannam@86: 00558                 Entry(const char *field); // assumes \a field is NUL-terminated
cannam@86: 00559 
cannam@86: 00560                 Entry(const char *field_name, const char *field_value, unsigned field_value_length);
cannam@86: 00561                 Entry(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated
cannam@86: 00562 
cannam@86: 00563                 Entry(const Entry &entry);
cannam@86: 00564 
cannam@86: 00565                 Entry &operator=(const Entry &entry);
cannam@86: 00566 
cannam@86: 00567                 virtual ~Entry();
cannam@86: 00568 
cannam@86: 00569                 virtual bool is_valid() const; 
cannam@86: 00570 
cannam@86: 00571                 unsigned get_field_length() const;
cannam@86: 00572                 unsigned get_field_name_length() const;
cannam@86: 00573                 unsigned get_field_value_length() const;
cannam@86: 00574 
cannam@86: 00575                 ::FLAC__StreamMetadata_VorbisComment_Entry get_entry() const;
cannam@86: 00576                 const char *get_field() const;
cannam@86: 00577                 const char *get_field_name() const;
cannam@86: 00578                 const char *get_field_value() const;
cannam@86: 00579 
cannam@86: 00580                 bool set_field(const char *field, unsigned field_length);
cannam@86: 00581                 bool set_field(const char *field); // assumes \a field is NUL-terminated
cannam@86: 00582                 bool set_field_name(const char *field_name);
cannam@86: 00583                 bool set_field_value(const char *field_value, unsigned field_value_length);
cannam@86: 00584                 bool set_field_value(const char *field_value); // assumes \a field_value is NUL-terminated
cannam@86: 00585             protected:
cannam@86: 00586                 bool is_valid_;
cannam@86: 00587                 ::FLAC__StreamMetadata_VorbisComment_Entry entry_;
cannam@86: 00588                 char *field_name_;
cannam@86: 00589                 unsigned field_name_length_;
cannam@86: 00590                 char *field_value_;
cannam@86: 00591                 unsigned field_value_length_;
cannam@86: 00592             private:
cannam@86: 00593                 void zero();
cannam@86: 00594                 void clear();
cannam@86: 00595                 void clear_entry();
cannam@86: 00596                 void clear_field_name();
cannam@86: 00597                 void clear_field_value();
cannam@86: 00598                 void construct(const char *field, unsigned field_length);
cannam@86: 00599                 void construct(const char *field); // assumes \a field is NUL-terminated
cannam@86: 00600                 void construct(const char *field_name, const char *field_value, unsigned field_value_length);
cannam@86: 00601                 void construct(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated
cannam@86: 00602                 void compose_field();
cannam@86: 00603                 void parse_field();
cannam@86: 00604             };
cannam@86: 00605 
cannam@86: 00606             VorbisComment();
cannam@86: 00607 
cannam@86: 00609 
cannam@86: 00612             inline VorbisComment(const VorbisComment &object): Prototype(object) { }
cannam@86: 00613             inline VorbisComment(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00614             inline VorbisComment(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00616 
cannam@86: 00620             inline VorbisComment(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00621 
cannam@86: 00622             ~VorbisComment();
cannam@86: 00623 
cannam@86: 00625 
cannam@86: 00626             inline VorbisComment &operator=(const VorbisComment &object) { Prototype::operator=(object); return *this; }
cannam@86: 00627             inline VorbisComment &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00628             inline VorbisComment &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00630 
cannam@86: 00634             inline VorbisComment &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00635 
cannam@86: 00637 
cannam@86: 00638             inline bool operator==(const VorbisComment &object) const { return Prototype::operator==(object); }
cannam@86: 00639             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00640             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00642 
cannam@86: 00644 
cannam@86: 00645             inline bool operator!=(const VorbisComment &object) const { return Prototype::operator!=(object); }
cannam@86: 00646             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00647             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00649 
cannam@86: 00650             unsigned get_num_comments() const;
cannam@86: 00651             const FLAC__byte *get_vendor_string() const; // NUL-terminated UTF-8 string
cannam@86: 00652             Entry get_comment(unsigned index) const;
cannam@86: 00653 
cannam@86: 00655             bool set_vendor_string(const FLAC__byte *string); // NUL-terminated UTF-8 string
cannam@86: 00656 
cannam@86: 00658             bool set_comment(unsigned index, const Entry &entry);
cannam@86: 00659 
cannam@86: 00661             bool insert_comment(unsigned index, const Entry &entry);
cannam@86: 00662 
cannam@86: 00664             bool append_comment(const Entry &entry);
cannam@86: 00665 
cannam@86: 00667             bool delete_comment(unsigned index);
cannam@86: 00668         };
cannam@86: 00669 
cannam@86: 00674         class FLACPP_API CueSheet : public Prototype {
cannam@86: 00675         public:
cannam@86: 00682             class FLACPP_API Track {
cannam@86: 00683             protected:
cannam@86: 00684                 ::FLAC__StreamMetadata_CueSheet_Track *object_;
cannam@86: 00685             public:
cannam@86: 00686                 Track();
cannam@86: 00687                 Track(const ::FLAC__StreamMetadata_CueSheet_Track *track);
cannam@86: 00688                 Track(const Track &track);
cannam@86: 00689                 Track &operator=(const Track &track);
cannam@86: 00690 
cannam@86: 00691                 virtual ~Track();
cannam@86: 00692 
cannam@86: 00693                 virtual bool is_valid() const; 
cannam@86: 00694 
cannam@86: 00695 
cannam@86: 00696                 inline FLAC__uint64 get_offset() const { return object_->offset; }
cannam@86: 00697                 inline FLAC__byte get_number() const { return object_->number; }
cannam@86: 00698                 inline const char *get_isrc() const { return object_->isrc; }
cannam@86: 00699                 inline unsigned get_type() const { return object_->type; }
cannam@86: 00700                 inline bool get_pre_emphasis() const { return object_->pre_emphasis; }
cannam@86: 00701 
cannam@86: 00702                 inline FLAC__byte get_num_indices() const { return object_->num_indices; }
cannam@86: 00703                 ::FLAC__StreamMetadata_CueSheet_Index get_index(unsigned i) const;
cannam@86: 00704 
cannam@86: 00705                 inline const ::FLAC__StreamMetadata_CueSheet_Track *get_track() const { return object_; }
cannam@86: 00706 
cannam@86: 00707                 inline void set_offset(FLAC__uint64 value) { object_->offset = value; }
cannam@86: 00708                 inline void set_number(FLAC__byte value) { object_->number = value; }
cannam@86: 00709                 void set_isrc(const char value[12]);
cannam@86: 00710                 void set_type(unsigned value);
cannam@86: 00711                 inline void set_pre_emphasis(bool value) { object_->pre_emphasis = value? 1 : 0; }
cannam@86: 00712 
cannam@86: 00713                 void set_index(unsigned i, const ::FLAC__StreamMetadata_CueSheet_Index &index);
cannam@86: 00714                 //@@@ It's awkward but to insert/delete index points
cannam@86: 00715                 //@@@ you must use the routines in the CueSheet class.
cannam@86: 00716             };
cannam@86: 00717 
cannam@86: 00718             CueSheet();
cannam@86: 00719 
cannam@86: 00721 
cannam@86: 00724             inline CueSheet(const CueSheet &object): Prototype(object) { }
cannam@86: 00725             inline CueSheet(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00726             inline CueSheet(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00728 
cannam@86: 00732             inline CueSheet(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00733 
cannam@86: 00734             ~CueSheet();
cannam@86: 00735 
cannam@86: 00737 
cannam@86: 00738             inline CueSheet &operator=(const CueSheet &object) { Prototype::operator=(object); return *this; }
cannam@86: 00739             inline CueSheet &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00740             inline CueSheet &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00742 
cannam@86: 00746             inline CueSheet &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00747 
cannam@86: 00749 
cannam@86: 00750             inline bool operator==(const CueSheet &object) const { return Prototype::operator==(object); }
cannam@86: 00751             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00752             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00754 
cannam@86: 00756 
cannam@86: 00757             inline bool operator!=(const CueSheet &object) const { return Prototype::operator!=(object); }
cannam@86: 00758             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00759             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00761 
cannam@86: 00762             const char *get_media_catalog_number() const;
cannam@86: 00763             FLAC__uint64 get_lead_in() const;
cannam@86: 00764             bool get_is_cd() const;
cannam@86: 00765 
cannam@86: 00766             unsigned get_num_tracks() const;
cannam@86: 00767             Track get_track(unsigned i) const;
cannam@86: 00768 
cannam@86: 00769             void set_media_catalog_number(const char value[128]);
cannam@86: 00770             void set_lead_in(FLAC__uint64 value);
cannam@86: 00771             void set_is_cd(bool value);
cannam@86: 00772 
cannam@86: 00773             void set_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index);
cannam@86: 00774 
cannam@86: 00776             bool insert_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index);
cannam@86: 00777 
cannam@86: 00779             bool delete_index(unsigned track_num, unsigned index_num);
cannam@86: 00780 
cannam@86: 00782             bool set_track(unsigned i, const Track &track);
cannam@86: 00783 
cannam@86: 00785             bool insert_track(unsigned i, const Track &track);
cannam@86: 00786 
cannam@86: 00788             bool delete_track(unsigned i);
cannam@86: 00789 
cannam@86: 00791             bool is_legal(bool check_cd_da_subset = false, const char **violation = 0) const;
cannam@86: 00792 
cannam@86: 00794             FLAC__uint32 calculate_cddb_id() const;
cannam@86: 00795         };
cannam@86: 00796 
cannam@86: 00801         class FLACPP_API Picture : public Prototype {
cannam@86: 00802         public:
cannam@86: 00803             Picture();
cannam@86: 00804 
cannam@86: 00806 
cannam@86: 00809             inline Picture(const Picture &object): Prototype(object) { }
cannam@86: 00810             inline Picture(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00811             inline Picture(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00813 
cannam@86: 00817             inline Picture(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00818 
cannam@86: 00819             ~Picture();
cannam@86: 00820 
cannam@86: 00822 
cannam@86: 00823             inline Picture &operator=(const Picture &object) { Prototype::operator=(object); return *this; }
cannam@86: 00824             inline Picture &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00825             inline Picture &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00827 
cannam@86: 00831             inline Picture &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00832 
cannam@86: 00834 
cannam@86: 00835             inline bool operator==(const Picture &object) const { return Prototype::operator==(object); }
cannam@86: 00836             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00837             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00839 
cannam@86: 00841 
cannam@86: 00842             inline bool operator!=(const Picture &object) const { return Prototype::operator!=(object); }
cannam@86: 00843             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00844             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00846 
cannam@86: 00847 			::FLAC__StreamMetadata_Picture_Type get_type() const;
cannam@86: 00848             const char *get_mime_type() const; // NUL-terminated printable ASCII string
cannam@86: 00849             const FLAC__byte *get_description() const; // NUL-terminated UTF-8 string
cannam@86: 00850             FLAC__uint32 get_width() const;
cannam@86: 00851             FLAC__uint32 get_height() const;
cannam@86: 00852             FLAC__uint32 get_depth() const;
cannam@86: 00853             FLAC__uint32 get_colors() const; 
cannam@86: 00854             FLAC__uint32 get_data_length() const;
cannam@86: 00855             const FLAC__byte *get_data() const;
cannam@86: 00856 
cannam@86: 00857             void set_type(::FLAC__StreamMetadata_Picture_Type type);
cannam@86: 00858 
cannam@86: 00860             bool set_mime_type(const char *string); // NUL-terminated printable ASCII string
cannam@86: 00861 
cannam@86: 00863             bool set_description(const FLAC__byte *string); // NUL-terminated UTF-8 string
cannam@86: 00864 
cannam@86: 00865             void set_width(FLAC__uint32 value) const;
cannam@86: 00866             void set_height(FLAC__uint32 value) const;
cannam@86: 00867             void set_depth(FLAC__uint32 value) const;
cannam@86: 00868             void set_colors(FLAC__uint32 value) const; 
cannam@86: 00869 
cannam@86: 00871             bool set_data(const FLAC__byte *data, FLAC__uint32 data_length);
cannam@86: 00872         };
cannam@86: 00873 
cannam@86: 00880         class FLACPP_API Unknown : public Prototype {
cannam@86: 00881         public:
cannam@86: 00882             Unknown();
cannam@86: 00883             //
cannam@86: 00885 
cannam@86: 00888             inline Unknown(const Unknown &object): Prototype(object) { }
cannam@86: 00889             inline Unknown(const ::FLAC__StreamMetadata &object): Prototype(object) { }
cannam@86: 00890             inline Unknown(const ::FLAC__StreamMetadata *object): Prototype(object) { }
cannam@86: 00892 
cannam@86: 00896             inline Unknown(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
cannam@86: 00897 
cannam@86: 00898             ~Unknown();
cannam@86: 00899 
cannam@86: 00901 
cannam@86: 00902             inline Unknown &operator=(const Unknown &object) { Prototype::operator=(object); return *this; }
cannam@86: 00903             inline Unknown &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
cannam@86: 00904             inline Unknown &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
cannam@86: 00906 
cannam@86: 00910             inline Unknown &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
cannam@86: 00911 
cannam@86: 00913 
cannam@86: 00914             inline bool operator==(const Unknown &object) const { return Prototype::operator==(object); }
cannam@86: 00915             inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
cannam@86: 00916             inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
cannam@86: 00918 
cannam@86: 00920 
cannam@86: 00921             inline bool operator!=(const Unknown &object) const { return Prototype::operator!=(object); }
cannam@86: 00922             inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
cannam@86: 00923             inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
cannam@86: 00925 
cannam@86: 00926             const FLAC__byte *get_data() const;
cannam@86: 00927 
cannam@86: 00929             bool set_data(const FLAC__byte *data, unsigned length);
cannam@86: 00930             bool set_data(FLAC__byte *data, unsigned length, bool copy);
cannam@86: 00931         };
cannam@86: 00932 
cannam@86: 00933         /* \} */
cannam@86: 00934 
cannam@86: 00935 
cannam@86: 00948         FLACPP_API bool get_streaminfo(const char *filename, StreamInfo &streaminfo); 
cannam@86: 00949 
cannam@86: 00950         FLACPP_API bool get_tags(const char *filename, VorbisComment *&tags); 
cannam@86: 00951         FLACPP_API bool get_tags(const char *filename, VorbisComment &tags); 
cannam@86: 00952 
cannam@86: 00953         FLACPP_API bool get_cuesheet(const char *filename, CueSheet *&cuesheet); 
cannam@86: 00954         FLACPP_API bool get_cuesheet(const char *filename, CueSheet &cuesheet); 
cannam@86: 00955 
cannam@86: 00956         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); 
cannam@86: 00957         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); 
cannam@86: 00958 
cannam@86: 00959         /* \} */
cannam@86: 00960 
cannam@86: 00961 
cannam@86: 00996         class FLACPP_API SimpleIterator {
cannam@86: 00997         public:
cannam@86: 01000             class FLACPP_API Status {
cannam@86: 01001             public:
cannam@86: 01002                 inline Status(::FLAC__Metadata_SimpleIteratorStatus status): status_(status) { }
cannam@86: 01003                 inline operator ::FLAC__Metadata_SimpleIteratorStatus() const { return status_; }
cannam@86: 01004                 inline const char *as_cstring() const { return ::FLAC__Metadata_SimpleIteratorStatusString[status_]; }
cannam@86: 01005             protected:
cannam@86: 01006 				::FLAC__Metadata_SimpleIteratorStatus status_;
cannam@86: 01007             };
cannam@86: 01008 
cannam@86: 01009             SimpleIterator();
cannam@86: 01010             virtual ~SimpleIterator();
cannam@86: 01011 
cannam@86: 01012             bool is_valid() const; 
cannam@86: 01013 
cannam@86: 01014             bool init(const char *filename, bool read_only, bool preserve_file_stats); 
cannam@86: 01015 
cannam@86: 01016             Status status();                                                    
cannam@86: 01017             bool is_writable() const;                                           
cannam@86: 01018 
cannam@86: 01019             bool next();                                                        
cannam@86: 01020             bool prev();                                                        
cannam@86: 01021             bool is_last() const;                                               
cannam@86: 01022 
cannam@86: 01023             off_t get_block_offset() const;                                     
cannam@86: 01024 			::FLAC__MetadataType get_block_type() const;                        
cannam@86: 01025             unsigned get_block_length() const;                                  
cannam@86: 01026             bool get_application_id(FLAC__byte *id);                            
cannam@86: 01027             Prototype *get_block();                                             
cannam@86: 01028             bool set_block(Prototype *block, bool use_padding = true);          
cannam@86: 01029             bool insert_block_after(Prototype *block, bool use_padding = true); 
cannam@86: 01030             bool delete_block(bool use_padding = true);                         
cannam@86: 01031 
cannam@86: 01032         protected:
cannam@86: 01033 			::FLAC__Metadata_SimpleIterator *iterator_;
cannam@86: 01034             void clear();
cannam@86: 01035         };
cannam@86: 01036 
cannam@86: 01037         /* \} */
cannam@86: 01038 
cannam@86: 01039 
cannam@86: 01082         class FLACPP_API Chain {
cannam@86: 01083         public:
cannam@86: 01086             class FLACPP_API Status {
cannam@86: 01087             public:
cannam@86: 01088                 inline Status(::FLAC__Metadata_ChainStatus status): status_(status) { }
cannam@86: 01089                 inline operator ::FLAC__Metadata_ChainStatus() const { return status_; }
cannam@86: 01090                 inline const char *as_cstring() const { return ::FLAC__Metadata_ChainStatusString[status_]; }
cannam@86: 01091             protected:
cannam@86: 01092 				::FLAC__Metadata_ChainStatus status_;
cannam@86: 01093             };
cannam@86: 01094 
cannam@86: 01095             Chain();
cannam@86: 01096             virtual ~Chain();
cannam@86: 01097 
cannam@86: 01098             friend class Iterator;
cannam@86: 01099 
cannam@86: 01100             bool is_valid() const; 
cannam@86: 01101 
cannam@86: 01102             Status status();                                                
cannam@86: 01103 
cannam@86: 01104             bool read(const char *filename, bool is_ogg = false);                                
cannam@86: 01105             bool read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, bool is_ogg = false);  
cannam@86: 01106 
cannam@86: 01107             bool check_if_tempfile_needed(bool use_padding);                
cannam@86: 01108 
cannam@86: 01109             bool write(bool use_padding = true, bool preserve_file_stats = false); 
cannam@86: 01110             bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks); 
cannam@86: 01111             bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks, ::FLAC__IOHandle temp_handle, ::FLAC__IOCallbacks temp_callbacks); 
cannam@86: 01112 
cannam@86: 01113             void merge_padding();                                           
cannam@86: 01114             void sort_padding();                                            
cannam@86: 01115 
cannam@86: 01116         protected:
cannam@86: 01117 			::FLAC__Metadata_Chain *chain_;
cannam@86: 01118             virtual void clear();
cannam@86: 01119         };
cannam@86: 01120 
cannam@86: 01126         class FLACPP_API Iterator {
cannam@86: 01127         public:
cannam@86: 01128             Iterator();
cannam@86: 01129             virtual ~Iterator();
cannam@86: 01130 
cannam@86: 01131             bool is_valid() const; 
cannam@86: 01132 
cannam@86: 01133 
cannam@86: 01134             void init(Chain &chain);                       
cannam@86: 01135 
cannam@86: 01136             bool next();                                   
cannam@86: 01137             bool prev();                                   
cannam@86: 01138 
cannam@86: 01139 			::FLAC__MetadataType get_block_type() const;   
cannam@86: 01140             Prototype *get_block();                        
cannam@86: 01141             bool set_block(Prototype *block);              
cannam@86: 01142             bool delete_block(bool replace_with_padding);  
cannam@86: 01143             bool insert_block_before(Prototype *block);    
cannam@86: 01144             bool insert_block_after(Prototype *block);     
cannam@86: 01145 
cannam@86: 01146         protected:
cannam@86: 01147 			::FLAC__Metadata_Iterator *iterator_;
cannam@86: 01148             virtual void clear();
cannam@86: 01149         };
cannam@86: 01150 
cannam@86: 01151         /* \} */
cannam@86: 01152 
cannam@86: 01153     }
cannam@86: 01154 }
cannam@86: 01155 
cannam@86: 01156 #endif
cannam@86: 
cannam@86:
cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: cannam@86: