📄 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 + -