📄 metadata.h
字号:
/* libFLAC++ - Free Lossless Audio Codec library * Copyright (C) 2002,2003,2004,2005 Josh Coalson * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of the Xiph.org Foundation nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#ifndef FLACPP__METADATA_H#define FLACPP__METADATA_H#include "export.h"#include "FLAC/metadata.h"// ===============================================================//// Full documentation for the metadata interface can be found// in the C layer in include/FLAC/metadata.h//// ===============================================================/** \file include/FLAC++/metadata.h * * \brief * This module provides classes for creating and manipulating FLAC * metadata blocks in memory, and three progressively more powerful * interfaces for traversing and editing metadata in FLAC files. * * See the detailed documentation for each interface in the * \link flacpp_metadata metadata \endlink module. *//** \defgroup flacpp_metadata FLAC++/metadata.h: metadata interfaces * \ingroup flacpp * * \brief * This module provides classes for creating and manipulating FLAC * metadata blocks in memory, and three progressively more powerful * interfaces for traversing and editing metadata in FLAC files. * * The behavior closely mimics the C layer interface; be sure to read * the detailed description of the * \link flac_metadata C metadata module \endlink. */namespace FLAC { namespace Metadata { // ============================================================ // // Metadata objects // // ============================================================ /** \defgroup flacpp_metadata_object FLAC++/metadata.h: metadata object classes * \ingroup flacpp_metadata * * This module contains classes representing FLAC metadata * blocks in memory. * * The behavior closely mimics the C layer interface; be * sure to read the detailed description of the * \link flac_metadata_object C metadata object module \endlink. * * Any time a metadata object is constructed or assigned, you * should check is_valid() to make sure the underlying * ::FLAC__StreamMetadata object was able to be created. * * \warning * When the get_*() methods of any metadata object method * return you a const pointer, DO NOT disobey and write into it. * Always use the set_*() methods. * * \{ */ /** Base class for all metadata block types. */ class FLACPP_API Prototype { protected: //@{ /** Constructs a copy of the given object. This form * always performs a deep copy. */ Prototype(const Prototype &); Prototype(const ::FLAC__StreamMetadata &); Prototype(const ::FLAC__StreamMetadata *); //@} /** Constructs an object with copy control. When \a copy * is \c true, behaves identically to * FLAC::Metadata::Prototype::Prototype(const ::FLAC__StreamMetadata *object). * When \a copy is \c false, the instance takes ownership of * the pointer and the ::FLAC__StreamMetadata object will * be freed by the destructor. * * \assert * \code object != NULL \endcode */ Prototype(::FLAC__StreamMetadata *object, bool copy); //@{ /** Assign from another object. Always performs a deep copy. */ Prototype &operator=(const Prototype &); Prototype &operator=(const ::FLAC__StreamMetadata &); Prototype &operator=(const ::FLAC__StreamMetadata *); //@} /** Assigns an object with copy control. See * Prototype(::FLAC__StreamMetadata *object, bool copy). */ Prototype &assign_object(::FLAC__StreamMetadata *object, bool copy); /** Deletes the underlying ::FLAC__StreamMetadata object. */ virtual void clear(); ::FLAC__StreamMetadata *object_; public: /** Deletes the underlying ::FLAC__StreamMetadata object. */ virtual ~Prototype(); //@{ /** Check for equality, performing a deep compare by following pointers. */ inline bool operator==(const Prototype &) const; inline bool operator==(const ::FLAC__StreamMetadata &) const; inline bool operator==(const ::FLAC__StreamMetadata *) const; //@} //@{ /** Check for inequality, performing a deep compare by following pointers. */ inline bool operator!=(const Prototype &) const; inline bool operator!=(const ::FLAC__StreamMetadata &) const; inline bool operator!=(const ::FLAC__StreamMetadata *) const; //@} friend class SimpleIterator; friend class Iterator; /** Returns \c true if the object was correctly constructed * (i.e. the underlying ::FLAC__StreamMetadata object was * properly allocated), else \c false. */ inline bool is_valid() const; /** Returns \c true if this block is the last block in a * stream, else \c false. * * \assert * \code is_valid() \endcode */ bool get_is_last() const; /** Returns the type of the block. * * \assert * \code is_valid() \endcode */ ::FLAC__MetadataType get_type() const; /** Returns the stream length of the metadata block. * * \note * The length does not include the metadata block header, * per spec. * * \assert * \code is_valid() \endcode */ unsigned get_length() const; /** Sets the "is_last" flag for the block. When using the iterators * it is not necessary to set this flag; they will do it for you. * * \assert * \code is_valid() \endcode */ void set_is_last(bool); /** Returns a pointer to the underlying ::FLAC__StreamMetadata * object. This can be useful for plugging any holes between * the C++ and C interfaces. * * \assert * \code is_valid() \endcode */ inline operator const ::FLAC__StreamMetadata *() const; private: /** Private and undefined so you can't use it. */ Prototype(); // These are used only by Iterator bool is_reference_; inline void set_reference(bool x) { is_reference_ = x; } };#ifdef _MSC_VER// warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)#pragma warning ( disable : 4800 )#endif inline bool Prototype::operator==(const Prototype &object) const { return (bool)::FLAC__metadata_object_is_equal(object_, object.object_); } inline bool Prototype::operator==(const ::FLAC__StreamMetadata &object) const { return (bool)::FLAC__metadata_object_is_equal(object_, &object); } inline bool Prototype::operator==(const ::FLAC__StreamMetadata *object) const { return (bool)::FLAC__metadata_object_is_equal(object_, object); }#ifdef _MSC_VER// @@@ how to re-enable? the following doesn't work// #pragma warning ( enable : 4800 )#endif inline bool Prototype::operator!=(const Prototype &object) const { return !operator==(object); } inline bool Prototype::operator!=(const ::FLAC__StreamMetadata &object) const { return !operator==(object); } inline bool Prototype::operator!=(const ::FLAC__StreamMetadata *object) const { return !operator==(object); } inline bool Prototype::is_valid() const { return 0 != object_; } inline Prototype::operator const ::FLAC__StreamMetadata *() const { return object_; } /** Create a deep copy of an object and return it. */ FLACPP_API Prototype *clone(const Prototype *); /** STREAMINFO metadata block. * See <A HREF="../format.html#metadata_block_streaminfo">format specification</A>. */ class FLACPP_API StreamInfo : public Prototype { public: StreamInfo(); //@{ /** Constructs a copy of the given object. This form * always performs a deep copy. */ inline StreamInfo(const StreamInfo &object): Prototype(object) { } inline StreamInfo(const ::FLAC__StreamMetadata &object): Prototype(object) { } inline StreamInfo(const ::FLAC__StreamMetadata *object): Prototype(object) { } //@} /** Constructs an object with copy control. See * Prototype(::FLAC__StreamMetadata *object, bool copy). */ inline StreamInfo(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { } ~StreamInfo(); //@{ /** Assign from another object. Always performs a deep copy. */ inline StreamInfo &operator=(const StreamInfo &object) { Prototype::operator=(object); return *this; } inline StreamInfo &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; } inline StreamInfo &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; } //@} /** Assigns an object with copy control. See * Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy). */ inline StreamInfo &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; } //@{ /** Check for equality, performing a deep compare by following pointers. */ inline bool operator==(const StreamInfo &object) const { return Prototype::operator==(object); } inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); } inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); } //@} //@{ /** Check for inequality, performing a deep compare by following pointers. */ inline bool operator!=(const StreamInfo &object) const { return Prototype::operator!=(object); } inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); } inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); } //@} //@{ /** See <A HREF="../format.html#metadata_block_streaminfo">format specification</A>. */ unsigned get_min_blocksize() const; unsigned get_max_blocksize() const; unsigned get_min_framesize() const; unsigned get_max_framesize() const; unsigned get_sample_rate() const; unsigned get_channels() const; unsigned get_bits_per_sample() const; FLAC__uint64 get_total_samples() const; const FLAC__byte *get_md5sum() const; void set_min_blocksize(unsigned value); void set_max_blocksize(unsigned value); void set_min_framesize(unsigned value); void set_max_framesize(unsigned value); void set_sample_rate(unsigned value); void set_channels(unsigned value); void set_bits_per_sample(unsigned value); void set_total_samples(FLAC__uint64 value); void set_md5sum(const FLAC__byte value[16]); //@} }; /** PADDING metadata block. * See <A HREF="../format.html#metadata_block_padding">format specification</A>. */ class FLACPP_API Padding : public Prototype { public: Padding(); //@{ /** Constructs a copy of the given object. This form * always performs a deep copy. */ inline Padding(const Padding &object): Prototype(object) { } inline Padding(const ::FLAC__StreamMetadata &object): Prototype(object) { } inline Padding(const ::FLAC__StreamMetadata *object): Prototype(object) { } //@}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -