metadata.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:39k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libFLAC++ - Free Lossless Audio Codec library
  2.  * Copyright (C) 2002,2003,2004,2005  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. #ifndef FLACPP__METADATA_H
  32. #define FLACPP__METADATA_H
  33. #include "export.h"
  34. #include "FLAC/metadata.h"
  35. // ===============================================================
  36. //
  37. //  Full documentation for the metadata interface can be found
  38. //  in the C layer in include/FLAC/metadata.h
  39. //
  40. // ===============================================================
  41. /** file include/FLAC++/metadata.h
  42.  *
  43.  *  brief
  44.  *  This module provides classes for creating and manipulating FLAC
  45.  *  metadata blocks in memory, and three progressively more powerful
  46.  *  interfaces for traversing and editing metadata in FLAC files.
  47.  *
  48.  *  See the detailed documentation for each interface in the
  49.  *  link flacpp_metadata metadata endlink module.
  50.  */
  51. /** defgroup flacpp_metadata FLAC++/metadata.h: metadata interfaces
  52.  *  ingroup flacpp
  53.  *
  54.  *  brief
  55.  *  This module provides classes for creating and manipulating FLAC
  56.  *  metadata blocks in memory, and three progressively more powerful
  57.  *  interfaces for traversing and editing metadata in FLAC files.
  58.  *
  59.  *  The behavior closely mimics the C layer interface; be sure to read
  60.  *  the detailed description of the
  61.  *  link flac_metadata C metadata module endlink.
  62.  */
  63. namespace FLAC {
  64. namespace Metadata {
  65. // ============================================================
  66. //
  67. //  Metadata objects
  68. //
  69. // ============================================================
  70. /** defgroup flacpp_metadata_object FLAC++/metadata.h: metadata object classes
  71.  *  ingroup flacpp_metadata
  72.  *
  73.  * This module contains classes representing FLAC metadata
  74.  * blocks in memory.
  75.  *
  76.  * The behavior closely mimics the C layer interface; be
  77.  * sure to read the detailed description of the
  78.  * link flac_metadata_object C metadata object module endlink.
  79.  *
  80.  * Any time a metadata object is constructed or assigned, you
  81.  * should check is_valid() to make sure the underlying
  82.  * ::FLAC__StreamMetadata object was able to be created.
  83.  *
  84.  * warning
  85.  * When the get_*() methods of any metadata object method
  86.  * return you a const pointer, DO NOT disobey and write into it.
  87.  * Always use the set_*() methods.
  88.  *
  89.  * {
  90.  */
  91. /** Base class for all metadata block types.
  92.  */
  93. class FLACPP_API Prototype {
  94. protected:
  95. //@{
  96. /** Constructs a copy of the given object.  This form
  97.  *  always performs a deep copy.
  98.  */
  99. Prototype(const Prototype &);
  100. Prototype(const ::FLAC__StreamMetadata &);
  101. Prototype(const ::FLAC__StreamMetadata *);
  102. //@}
  103. /** Constructs an object with copy control.  When a copy
  104.  *  is c true, behaves identically to
  105.  *  FLAC::Metadata::Prototype::Prototype(const ::FLAC__StreamMetadata *object).
  106.  *  When a copy is c false, the instance takes ownership of
  107.  *  the pointer and the ::FLAC__StreamMetadata object will
  108.  *  be freed by the destructor.
  109.  *
  110.  *  assert
  111.  *    code object != NULL endcode
  112.  */
  113. Prototype(::FLAC__StreamMetadata *object, bool copy);
  114. //@{
  115. /** Assign from another object.  Always performs a deep copy. */
  116. Prototype &operator=(const Prototype &);
  117. Prototype &operator=(const ::FLAC__StreamMetadata &);
  118. Prototype &operator=(const ::FLAC__StreamMetadata *);
  119. //@}
  120. /** Assigns an object with copy control.  See
  121.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  122.  */
  123. Prototype &assign_object(::FLAC__StreamMetadata *object, bool copy);
  124. /** Deletes the underlying ::FLAC__StreamMetadata object.
  125.  */
  126. virtual void clear();
  127. ::FLAC__StreamMetadata *object_;
  128. public:
  129. /** Deletes the underlying ::FLAC__StreamMetadata object.
  130.  */
  131. virtual ~Prototype();
  132. //@{
  133. /** Check for equality, performing a deep compare by following pointers. */
  134. inline bool operator==(const Prototype &) const;
  135. inline bool operator==(const ::FLAC__StreamMetadata &) const;
  136. inline bool operator==(const ::FLAC__StreamMetadata *) const;
  137. //@}
  138. //@{
  139. /** Check for inequality, performing a deep compare by following pointers. */
  140. inline bool operator!=(const Prototype &) const;
  141. inline bool operator!=(const ::FLAC__StreamMetadata &) const;
  142. inline bool operator!=(const ::FLAC__StreamMetadata *) const;
  143. //@}
  144. friend class SimpleIterator;
  145. friend class Iterator;
  146. /** Returns c true if the object was correctly constructed
  147.  *  (i.e. the underlying ::FLAC__StreamMetadata object was
  148.  *  properly allocated), else c false.
  149.  */
  150. inline bool is_valid() const;
  151. /** Returns c true if this block is the last block in a
  152.  *  stream, else c false.
  153.  *
  154.  * assert
  155.  *   code is_valid() endcode
  156.  */
  157. bool get_is_last() const;
  158. /** Returns the type of the block.
  159.  *
  160.  * assert
  161.  *   code is_valid() endcode
  162.  */
  163. ::FLAC__MetadataType get_type() const;
  164. /** Returns the stream length of the metadata block.
  165.  *
  166.  * note
  167.  *   The length does not include the metadata block header,
  168.  *   per spec.
  169.  *
  170.  * assert
  171.  *   code is_valid() endcode
  172.  */
  173. unsigned get_length() const;
  174. /** Sets the "is_last" flag for the block.  When using the iterators
  175.  *  it is not necessary to set this flag; they will do it for you.
  176.  *
  177.  * assert
  178.  *   code is_valid() endcode
  179.  */
  180. void set_is_last(bool);
  181. /** Returns a pointer to the underlying ::FLAC__StreamMetadata
  182.  *  object.  This can be useful for plugging any holes between
  183.  *  the C++ and C interfaces.
  184.  *
  185.  * assert
  186.  *   code is_valid() endcode
  187.  */
  188. inline operator const ::FLAC__StreamMetadata *() const;
  189. private:
  190. /** Private and undefined so you can't use it. */
  191. Prototype();
  192. // These are used only by Iterator
  193. bool is_reference_;
  194. inline void set_reference(bool x) { is_reference_ = x; }
  195. };
  196. #ifdef _MSC_VER
  197. // warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)
  198. #pragma warning ( disable : 4800 )
  199. #endif
  200. inline bool Prototype::operator==(const Prototype &object) const
  201. { return (bool)::FLAC__metadata_object_is_equal(object_, object.object_); }
  202. inline bool Prototype::operator==(const ::FLAC__StreamMetadata &object) const
  203. { return (bool)::FLAC__metadata_object_is_equal(object_, &object); }
  204. inline bool Prototype::operator==(const ::FLAC__StreamMetadata *object) const
  205. { return (bool)::FLAC__metadata_object_is_equal(object_, object); }
  206. #ifdef _MSC_VER
  207. // @@@ how to re-enable?  the following doesn't work
  208. // #pragma warning ( enable : 4800 )
  209. #endif
  210. inline bool Prototype::operator!=(const Prototype &object) const
  211. { return !operator==(object); }
  212. inline bool Prototype::operator!=(const ::FLAC__StreamMetadata &object) const
  213. { return !operator==(object); }
  214. inline bool Prototype::operator!=(const ::FLAC__StreamMetadata *object) const
  215. { return !operator==(object); }
  216. inline bool Prototype::is_valid() const
  217. { return 0 != object_; }
  218. inline Prototype::operator const ::FLAC__StreamMetadata *() const
  219. { return object_; }
  220. /** Create a deep copy of an object and return it. */
  221. FLACPP_API Prototype *clone(const Prototype *);
  222. /** STREAMINFO metadata block.
  223.  *  See <A HREF="../format.html#metadata_block_streaminfo">format specification</A>.
  224.  */
  225. class FLACPP_API StreamInfo : public Prototype {
  226. public:
  227. StreamInfo();
  228. //@{
  229. /** Constructs a copy of the given object.  This form
  230.  *  always performs a deep copy.
  231.  */
  232. inline StreamInfo(const StreamInfo &object): Prototype(object) { }
  233. inline StreamInfo(const ::FLAC__StreamMetadata &object): Prototype(object) { }
  234. inline StreamInfo(const ::FLAC__StreamMetadata *object): Prototype(object) { }
  235. //@}
  236. /** Constructs an object with copy control.  See
  237.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  238.  */
  239. inline StreamInfo(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
  240. ~StreamInfo();
  241. //@{
  242. /** Assign from another object.  Always performs a deep copy. */
  243. inline StreamInfo &operator=(const StreamInfo &object) { Prototype::operator=(object); return *this; }
  244. inline StreamInfo &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
  245. inline StreamInfo &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
  246. //@}
  247. /** Assigns an object with copy control.  See
  248.  *  Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy).
  249.  */
  250. inline StreamInfo &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
  251. //@{
  252. /** Check for equality, performing a deep compare by following pointers. */
  253. inline bool operator==(const StreamInfo &object) const { return Prototype::operator==(object); }
  254. inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
  255. inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
  256. //@}
  257. //@{
  258. /** Check for inequality, performing a deep compare by following pointers. */
  259. inline bool operator!=(const StreamInfo &object) const { return Prototype::operator!=(object); }
  260. inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
  261. inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
  262. //@}
  263. //@{
  264. /** See <A HREF="../format.html#metadata_block_streaminfo">format specification</A>. */
  265. unsigned get_min_blocksize() const;
  266. unsigned get_max_blocksize() const;
  267. unsigned get_min_framesize() const;
  268. unsigned get_max_framesize() const;
  269. unsigned get_sample_rate() const;
  270. unsigned get_channels() const;
  271. unsigned get_bits_per_sample() const;
  272. FLAC__uint64 get_total_samples() const;
  273. const FLAC__byte *get_md5sum() const;
  274. void set_min_blocksize(unsigned value);
  275. void set_max_blocksize(unsigned value);
  276. void set_min_framesize(unsigned value);
  277. void set_max_framesize(unsigned value);
  278. void set_sample_rate(unsigned value);
  279. void set_channels(unsigned value);
  280. void set_bits_per_sample(unsigned value);
  281. void set_total_samples(FLAC__uint64 value);
  282. void set_md5sum(const FLAC__byte value[16]);
  283. //@}
  284. };
  285. /** PADDING metadata block.
  286.  *  See <A HREF="../format.html#metadata_block_padding">format specification</A>.
  287.  */
  288. class FLACPP_API Padding : public Prototype {
  289. public:
  290. Padding();
  291. //@{
  292. /** Constructs a copy of the given object.  This form
  293.  *  always performs a deep copy.
  294.  */
  295. inline Padding(const Padding &object): Prototype(object) { }
  296. inline Padding(const ::FLAC__StreamMetadata &object): Prototype(object) { }
  297. inline Padding(const ::FLAC__StreamMetadata *object): Prototype(object) { }
  298. //@}
  299. /** Constructs an object with copy control.  See
  300.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  301.  */
  302. inline Padding(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
  303. ~Padding();
  304. //@{
  305. /** Assign from another object.  Always performs a deep copy. */
  306. inline Padding &operator=(const Padding &object) { Prototype::operator=(object); return *this; }
  307. inline Padding &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
  308. inline Padding &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
  309. //@}
  310. /** Assigns an object with copy control.  See
  311.  *  Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy).
  312.  */
  313. inline Padding &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
  314. //@{
  315. /** Check for equality, performing a deep compare by following pointers. */
  316. inline bool operator==(const Padding &object) const { return Prototype::operator==(object); }
  317. inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
  318. inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
  319. //@}
  320. //@{
  321. /** Check for inequality, performing a deep compare by following pointers. */
  322. inline bool operator!=(const Padding &object) const { return Prototype::operator!=(object); }
  323. inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
  324. inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
  325. //@}
  326. void set_length(unsigned length);
  327. };
  328. /** APPLICATION metadata block.
  329.  *  See <A HREF="../format.html#metadata_block_application">format specification</A>.
  330.  */
  331. class FLACPP_API Application : public Prototype {
  332. public:
  333. Application();
  334. //
  335. //@{
  336. /** Constructs a copy of the given object.  This form
  337.  *  always performs a deep copy.
  338.  */
  339. inline Application(const Application &object): Prototype(object) { }
  340. inline Application(const ::FLAC__StreamMetadata &object): Prototype(object) { }
  341. inline Application(const ::FLAC__StreamMetadata *object): Prototype(object) { }
  342. //@}
  343. /** Constructs an object with copy control.  See
  344.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  345.  */
  346. inline Application(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
  347. ~Application();
  348. //@{
  349. /** Assign from another object.  Always performs a deep copy. */
  350. inline Application &operator=(const Application &object) { Prototype::operator=(object); return *this; }
  351. inline Application &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
  352. inline Application &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
  353. //@}
  354. /** Assigns an object with copy control.  See
  355.  *  Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy).
  356.  */
  357. inline Application &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
  358. //@{
  359. /** Check for equality, performing a deep compare by following pointers. */
  360. inline bool operator==(const Application &object) const { return Prototype::operator==(object); }
  361. inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
  362. inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
  363. //@}
  364. //@{
  365. /** Check for inequality, performing a deep compare by following pointers. */
  366. inline bool operator!=(const Application &object) const { return Prototype::operator!=(object); }
  367. inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
  368. inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
  369. //@}
  370. const FLAC__byte *get_id() const;
  371. const FLAC__byte *get_data() const;
  372. void set_id(const FLAC__byte value[4]);
  373. //! This form always copies a data
  374. bool set_data(const FLAC__byte *data, unsigned length);
  375. bool set_data(FLAC__byte *data, unsigned length, bool copy);
  376. };
  377. /** SEEKTABLE metadata block.
  378.  *  See <A HREF="../format.html#metadata_block_seektable">format specification</A>.
  379.  */
  380. class FLACPP_API SeekTable : public Prototype {
  381. public:
  382. SeekTable();
  383. //@{
  384. /** Constructs a copy of the given object.  This form
  385.  *  always performs a deep copy.
  386.  */
  387. inline SeekTable(const SeekTable &object): Prototype(object) { }
  388. inline SeekTable(const ::FLAC__StreamMetadata &object): Prototype(object) { }
  389. inline SeekTable(const ::FLAC__StreamMetadata *object): Prototype(object) { }
  390. //@}
  391. /** Constructs an object with copy control.  See
  392.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  393.  */
  394. inline SeekTable(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
  395. ~SeekTable();
  396. //@{
  397. /** Assign from another object.  Always performs a deep copy. */
  398. inline SeekTable &operator=(const SeekTable &object) { Prototype::operator=(object); return *this; }
  399. inline SeekTable &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
  400. inline SeekTable &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
  401. //@}
  402. /** Assigns an object with copy control.  See
  403.  *  Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy).
  404.  */
  405. inline SeekTable &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
  406. //@{
  407. /** Check for equality, performing a deep compare by following pointers. */
  408. inline bool operator==(const SeekTable &object) const { return Prototype::operator==(object); }
  409. inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
  410. inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
  411. //@}
  412. //@{
  413. /** Check for inequality, performing a deep compare by following pointers. */
  414. inline bool operator!=(const SeekTable &object) const { return Prototype::operator!=(object); }
  415. inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
  416. inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
  417. //@}
  418. unsigned get_num_points() const;
  419. ::FLAC__StreamMetadata_SeekPoint get_point(unsigned index) const;
  420. //! See FLAC__metadata_object_seektable_set_point()
  421. void set_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point);
  422. //! See FLAC__metadata_object_seektable_insert_point()
  423. bool insert_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point);
  424. //! See FLAC__metadata_object_seektable_delete_point()
  425. bool delete_point(unsigned index);
  426. //! See FLAC__metadata_object_seektable_is_legal()
  427. bool is_legal() const;
  428. };
  429. /** VORBIS_COMMENT metadata block.
  430.  *  See <A HREF="../format.html#metadata_block_vorbis_comment">format specification</A>.
  431.  */
  432. class FLACPP_API VorbisComment : public Prototype {
  433. public:
  434. /** Convenience class for encapsulating Vorbis comment
  435.  *  entries.  An entry is a vendor string or a comment
  436.  *  field.  In the case of a vendor string, the field
  437.  *  name is undefined; only the field value is relevant.
  438.  *
  439.  *  A a field as used in the methods refers to an
  440.  *  entire 'NAME=VALUE' string; for convenience the
  441.  *  string is NUL-terminated.  A length field is
  442.  *  required in the unlikely event that the value
  443.  *  contains contain embedded NULs.
  444.  *
  445.  *  A a field_name is what is on the left side of the
  446.  *  first '=' in the a field.  By definition it is ASCII
  447.  *  and so is NUL-terminated and does not require a
  448.  *  length to describe it.  a field_name is undefined
  449.  *  for a vendor string entry.
  450.  *
  451.  *  A a field_value is what is on the right side of the
  452.  *  first '=' in the a field.  By definition, this may
  453.  *  contain embedded NULs and so a a field_value_length
  454.  *  is required to describe it.  However in practice,
  455.  *  embedded NULs are not known to be used, so it is
  456.  *  generally safe to treat field values as NUL-
  457.  *  terminated UTF-8 strings.
  458.  *
  459.  *  Always check is_valid() after the constructor or operator=
  460.  *  to make sure memory was properly allocated and that the
  461.  *  Entry conforms to the Vorbis comment specification.
  462.  */
  463. class FLACPP_API Entry {
  464. public:
  465. Entry();
  466. Entry(const char *field, unsigned field_length);
  467. Entry(const char *field); // assumes a field is NUL-terminated
  468. Entry(const char *field_name, const char *field_value, unsigned field_value_length);
  469. Entry(const char *field_name, const char *field_value); // assumes a field_value is NUL-terminated
  470. Entry(const Entry &entry);
  471. Entry &operator=(const Entry &entry);
  472. virtual ~Entry();
  473. virtual bool is_valid() const;
  474. unsigned get_field_length() const;
  475. unsigned get_field_name_length() const;
  476. unsigned get_field_value_length() const;
  477. ::FLAC__StreamMetadata_VorbisComment_Entry get_entry() const;
  478. const char *get_field() const;
  479. const char *get_field_name() const;
  480. const char *get_field_value() const;
  481. bool set_field(const char *field, unsigned field_length);
  482. bool set_field(const char *field); // assumes a field is NUL-terminated
  483. bool set_field_name(const char *field_name);
  484. bool set_field_value(const char *field_value, unsigned field_value_length);
  485. bool set_field_value(const char *field_value); // assumes a field_value is NUL-terminated
  486. protected:
  487. bool is_valid_;
  488. ::FLAC__StreamMetadata_VorbisComment_Entry entry_;
  489. char *field_name_;
  490. unsigned field_name_length_;
  491. char *field_value_;
  492. unsigned field_value_length_;
  493. private:
  494. void zero();
  495. void clear();
  496. void clear_entry();
  497. void clear_field_name();
  498. void clear_field_value();
  499. void construct(const char *field, unsigned field_length);
  500. void construct(const char *field); // assumes a field is NUL-terminated
  501. void construct(const char *field_name, const char *field_value, unsigned field_value_length);
  502. void construct(const char *field_name, const char *field_value); // assumes a field_value is NUL-terminated
  503. void compose_field();
  504. void parse_field();
  505. };
  506. VorbisComment();
  507. //@{
  508. /** Constructs a copy of the given object.  This form
  509.  *  always performs a deep copy.
  510.  */
  511. inline VorbisComment(const VorbisComment &object): Prototype(object) { }
  512. inline VorbisComment(const ::FLAC__StreamMetadata &object): Prototype(object) { }
  513. inline VorbisComment(const ::FLAC__StreamMetadata *object): Prototype(object) { }
  514. //@}
  515. /** Constructs an object with copy control.  See
  516.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  517.  */
  518. inline VorbisComment(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
  519. ~VorbisComment();
  520. //@{
  521. /** Assign from another object.  Always performs a deep copy. */
  522. inline VorbisComment &operator=(const VorbisComment &object) { Prototype::operator=(object); return *this; }
  523. inline VorbisComment &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
  524. inline VorbisComment &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
  525. //@}
  526. /** Assigns an object with copy control.  See
  527.  *  Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy).
  528.  */
  529. inline VorbisComment &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
  530. //@{
  531. /** Check for equality, performing a deep compare by following pointers. */
  532. inline bool operator==(const VorbisComment &object) const { return Prototype::operator==(object); }
  533. inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
  534. inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
  535. //@}
  536. //@{
  537. /** Check for inequality, performing a deep compare by following pointers. */
  538. inline bool operator!=(const VorbisComment &object) const { return Prototype::operator!=(object); }
  539. inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
  540. inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
  541. //@}
  542. unsigned get_num_comments() const;
  543. const FLAC__byte *get_vendor_string() const; // NUL-terminated UTF-8 string
  544. Entry get_comment(unsigned index) const;
  545. //! See FLAC__metadata_object_vorbiscomment_set_vendor_string()
  546. bool set_vendor_string(const FLAC__byte *string); // NUL-terminated UTF-8 string
  547. //! See FLAC__metadata_object_vorbiscomment_set_comment()
  548. bool set_comment(unsigned index, const Entry &entry);
  549. //! See FLAC__metadata_object_vorbiscomment_insert_comment()
  550. bool insert_comment(unsigned index, const Entry &entry);
  551. //! See FLAC__metadata_object_vorbiscomment_append_comment()
  552. bool append_comment(const Entry &entry);
  553. //! See FLAC__metadata_object_vorbiscomment_delete_comment()
  554. bool delete_comment(unsigned index);
  555. };
  556. /** CUESHEET metadata block.
  557.  *  See <A HREF="../format.html#metadata_block_cuesheet">format specification</A>.
  558.  */
  559. class FLACPP_API CueSheet : public Prototype {
  560. public:
  561. /** Convenience class for encapsulating a cue sheet
  562.  *  track.
  563.  *
  564.  *  Always check is_valid() after the constructor or operator=
  565.  *  to make sure memory was properly allocated.
  566.  */
  567. class FLACPP_API Track {
  568. protected:
  569. ::FLAC__StreamMetadata_CueSheet_Track *object_;
  570. public:
  571. Track();
  572. Track(const ::FLAC__StreamMetadata_CueSheet_Track *track);
  573. Track(const Track &track);
  574. Track &operator=(const Track &track);
  575. virtual ~Track();
  576. virtual bool is_valid() const;
  577. inline FLAC__uint64 get_offset() const { return object_->offset; }
  578. inline FLAC__byte get_number() const { return object_->number; }
  579. inline const char *get_isrc() const { return object_->isrc; }
  580. inline unsigned get_type() const { return object_->type; }
  581. inline bool get_pre_emphasis() const { return object_->pre_emphasis; }
  582. inline FLAC__byte get_num_indices() const { return object_->num_indices; }
  583. ::FLAC__StreamMetadata_CueSheet_Index get_index(unsigned i) const;
  584. inline const ::FLAC__StreamMetadata_CueSheet_Track *get_track() const { return object_; }
  585. inline void set_offset(FLAC__uint64 value) { object_->offset = value; }
  586. inline void set_number(FLAC__byte value) { object_->number = value; }
  587. void set_isrc(const char value[12]);
  588. void set_type(unsigned value);
  589. inline void set_pre_emphasis(bool value) { object_->pre_emphasis = value? 1 : 0; }
  590.   void set_index(unsigned i, const ::FLAC__StreamMetadata_CueSheet_Index &index);
  591. //@@@ It's awkward but to insert/delete index points
  592. //@@@ you must use the routines in the CueSheet class.
  593. };
  594. CueSheet();
  595. //@{
  596. /** Constructs a copy of the given object.  This form
  597.  *  always performs a deep copy.
  598.  */
  599. inline CueSheet(const CueSheet &object): Prototype(object) { }
  600. inline CueSheet(const ::FLAC__StreamMetadata &object): Prototype(object) { }
  601. inline CueSheet(const ::FLAC__StreamMetadata *object): Prototype(object) { }
  602. //@}
  603. /** Constructs an object with copy control.  See
  604.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  605.  */
  606. inline CueSheet(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
  607. ~CueSheet();
  608. //@{
  609. /** Assign from another object.  Always performs a deep copy. */
  610. inline CueSheet &operator=(const CueSheet &object) { Prototype::operator=(object); return *this; }
  611. inline CueSheet &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
  612. inline CueSheet &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
  613. //@}
  614. /** Assigns an object with copy control.  See
  615.  *  Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy).
  616.  */
  617. inline CueSheet &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
  618. //@{
  619. /** Check for equality, performing a deep compare by following pointers. */
  620. inline bool operator==(const CueSheet &object) const { return Prototype::operator==(object); }
  621. inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
  622. inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
  623. //@}
  624. //@{
  625. /** Check for inequality, performing a deep compare by following pointers. */
  626. inline bool operator!=(const CueSheet &object) const { return Prototype::operator!=(object); }
  627. inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
  628. inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
  629. //@}
  630. const char *get_media_catalog_number() const;
  631. FLAC__uint64 get_lead_in() const;
  632. bool get_is_cd() const;
  633. unsigned get_num_tracks() const;
  634. Track get_track(unsigned i) const;
  635. void set_media_catalog_number(const char value[128]);
  636. void set_lead_in(FLAC__uint64 value);
  637. void set_is_cd(bool value);
  638. void set_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index);
  639. //! See FLAC__metadata_object_cuesheet_track_insert_index()
  640. bool insert_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index);
  641. //! See FLAC__metadata_object_cuesheet_track_delete_index()
  642. bool delete_index(unsigned track_num, unsigned index_num);
  643. //! See FLAC__metadata_object_cuesheet_set_track()
  644. bool set_track(unsigned i, const Track &track);
  645. //! See FLAC__metadata_object_cuesheet_insert_track()
  646. bool insert_track(unsigned i, const Track &track);
  647. //! See FLAC__metadata_object_cuesheet_delete_track()
  648. bool delete_track(unsigned i);
  649. //! See FLAC__metadata_object_cuesheet_is_legal()
  650. bool is_legal(bool check_cd_da_subset = false, const char **violation = 0) const;
  651. };
  652. /** Opaque metadata block for storing unknown types.
  653.  *  This should not be used unless you know what you are doing;
  654.  *  it is currently used only internally to support forward
  655.  *  compatibility of metadata blocks.
  656.  */
  657. class FLACPP_API Unknown : public Prototype {
  658. public:
  659. Unknown();
  660. //
  661. //@{
  662. /** Constructs a copy of the given object.  This form
  663.  *  always performs a deep copy.
  664.  */
  665. inline Unknown(const Unknown &object): Prototype(object) { }
  666. inline Unknown(const ::FLAC__StreamMetadata &object): Prototype(object) { }
  667. inline Unknown(const ::FLAC__StreamMetadata *object): Prototype(object) { }
  668. //@}
  669. /** Constructs an object with copy control.  See
  670.  *  Prototype(::FLAC__StreamMetadata *object, bool copy).
  671.  */
  672. inline Unknown(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
  673. ~Unknown();
  674. //@{
  675. /** Assign from another object.  Always performs a deep copy. */
  676. inline Unknown &operator=(const Unknown &object) { Prototype::operator=(object); return *this; }
  677. inline Unknown &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
  678. inline Unknown &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
  679. //@}
  680. /** Assigns an object with copy control.  See
  681.  *  Prototype::assign_object(::FLAC__StreamMetadata *object, bool copy).
  682.  */
  683. inline Unknown &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
  684. //@{
  685. /** Check for equality, performing a deep compare by following pointers. */
  686. inline bool operator==(const Unknown &object) const { return Prototype::operator==(object); }
  687. inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
  688. inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
  689. //@}
  690. //@{
  691. /** Check for inequality, performing a deep compare by following pointers. */
  692. inline bool operator!=(const Unknown &object) const { return Prototype::operator!=(object); }
  693. inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
  694. inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
  695. //@}
  696. const FLAC__byte *get_data() const;
  697. //! This form always copies a data
  698. bool set_data(const FLAC__byte *data, unsigned length);
  699. bool set_data(FLAC__byte *data, unsigned length, bool copy);
  700. };
  701. /* } */
  702. /** defgroup flacpp_metadata_level0 FLAC++/metadata.h: metadata level 0 interface
  703.  *  ingroup flacpp_metadata
  704.  *
  705.  *  brief
  706.  *  Level 0 metadata iterators.
  707.  *
  708.  *  See the link flac_metadata_level0 C layer equivalent endlink
  709.  *  for more.
  710.  *
  711.  * {
  712.  */
  713.   //! See FLAC__metadata_get_streaminfo().
  714. FLACPP_API bool get_streaminfo(const char *filename, StreamInfo &streaminfo);
  715.   //! See FLAC__metadata_get_tags().
  716. FLACPP_API bool get_tags(const char *filename, VorbisComment *&tags);
  717. FLACPP_API bool get_tags(const char *filename, VorbisComment &tags);
  718. /* } */
  719. /** defgroup flacpp_metadata_level1 FLAC++/metadata.h: metadata level 1 interface
  720.  *  ingroup flacpp_metadata
  721.  *
  722.  *  brief
  723.  *  Level 1 metadata iterator.
  724.  *
  725.  *  The flow through the iterator in the C++ layer is similar
  726.  *  to the C layer:
  727.  *    - Create a SimpleIterator instance
  728.  *    - Check SimpleIterator::is_valid()
  729.  *    - Call SimpleIterator::init() and check the return
  730.  *    - Traverse and/or edit.  Edits are written to file
  731.  *      immediately.
  732.  *    - Destroy the SimpleIterator instance
  733.  *
  734.  *  The ownership of pointers in the C++ layer follows that in
  735.  *  the C layer, i.e.
  736.  *    - The objects returned by get_block() are yours to
  737.  *      modify, but changes are not reflected in the FLAC file
  738.  *      until you call set_block().  The objects are also
  739.  *      yours to delete; they are not automatically deleted
  740.  *      when passed to set_block() or insert_block_after().
  741.  *
  742.  *  See the link flac_metadata_level1 C layer equivalent endlink
  743.  *  for more.
  744.  *
  745.  * {
  746.  */
  747. /** This class is a wrapper around the FLAC__metadata_simple_iterator
  748.  *  structures and methods; see ::FLAC__Metadata_SimpleIterator.
  749.  */
  750. class FLACPP_API SimpleIterator {
  751. public:
  752. class FLACPP_API Status {
  753. public:
  754. inline Status(::FLAC__Metadata_SimpleIteratorStatus status): status_(status) { }
  755. inline operator ::FLAC__Metadata_SimpleIteratorStatus() const { return status_; }
  756. inline const char *as_cstring() const { return ::FLAC__Metadata_SimpleIteratorStatusString[status_]; }
  757. protected:
  758. ::FLAC__Metadata_SimpleIteratorStatus status_;
  759. };
  760. SimpleIterator();
  761. virtual ~SimpleIterator();
  762. bool init(const char *filename, bool read_only, bool preserve_file_stats);
  763. bool is_valid() const;
  764. Status status();
  765. bool is_writable() const;
  766. bool next();
  767. bool prev();
  768. ::FLAC__MetadataType get_block_type() const;
  769. Prototype *get_block();
  770. bool set_block(Prototype *block, bool use_padding = true);
  771. bool insert_block_after(Prototype *block, bool use_padding = true);
  772. bool delete_block(bool use_padding = true);
  773. protected:
  774. ::FLAC__Metadata_SimpleIterator *iterator_;
  775. void clear();
  776. };
  777. /* } */
  778. /** defgroup flacpp_metadata_level2 FLAC++/metadata.h: metadata level 2 interface
  779.  *  ingroup flacpp_metadata
  780.  *
  781.  *  brief
  782.  *  Level 2 metadata iterator.
  783.  *
  784.  *  The flow through the iterator in the C++ layer is similar
  785.  *  to the C layer:
  786.  *    - Create a Chain instance
  787.  *    - Check Chain::is_valid()
  788.  *    - Call Chain::read() and check the return
  789.  *    - Traverse and/or edit with an Iterator or with
  790.  *      Chain::merge_padding() or Chain::sort_padding()
  791.  *    - Write changes back to FLAC file with Chain::write()
  792.  *    - Destroy the Chain instance
  793.  *
  794.  *  The ownership of pointers in the C++ layer is slightly
  795.  *  different than in the C layer, i.e.
  796.  *    - The objects returned by Iterator::get_block() are NOT
  797.  *      owned by the iterator and should be deleted by the
  798.  *      caller when finished, BUT, when you modify the block,
  799.  *      it will directly edit what's in the chain and you do
  800.  *      not need to call Iterator::set_block().  However the
  801.  *      changes will not be reflected in the FLAC file until
  802.  *      the chain is written with Chain::write().
  803.  *    - When you pass an object to Iterator::set_block(),
  804.  *      Iterator::insert_block_before(), or
  805.  *      Iterator::insert_block_after(), the iterator takes
  806.  *      ownership of the block and it will be deleted by the
  807.  *      chain.
  808.  *
  809.  *  See the link flac_metadata_level2 C layer equivalent endlink
  810.  *  for more.
  811.  *
  812.  * {
  813.  */
  814. /** This class is a wrapper around the FLAC__metadata_chain
  815.  *  structures and methods; see ::FLAC__Metadata_Chain.
  816.  */
  817. class FLACPP_API Chain {
  818. public:
  819. class FLACPP_API Status {
  820. public:
  821. inline Status(::FLAC__Metadata_ChainStatus status): status_(status) { }
  822. inline operator ::FLAC__Metadata_ChainStatus() const { return status_; }
  823. inline const char *as_cstring() const { return ::FLAC__Metadata_ChainStatusString[status_]; }
  824. protected:
  825. ::FLAC__Metadata_ChainStatus status_;
  826. };
  827. Chain();
  828. virtual ~Chain();
  829. friend class Iterator;
  830. bool is_valid() const;
  831. Status status();
  832. bool read(const char *filename);
  833. bool read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks);
  834. bool check_if_tempfile_needed(bool use_padding);
  835. bool write(bool use_padding = true, bool preserve_file_stats = false);
  836. bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks);
  837. bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks, ::FLAC__IOHandle temp_handle, ::FLAC__IOCallbacks temp_callbacks);
  838. void merge_padding();
  839. void sort_padding();
  840. protected:
  841. ::FLAC__Metadata_Chain *chain_;
  842. virtual void clear();
  843. };
  844. /** This class is a wrapper around the FLAC__metadata_iterator
  845.  *  structures and methods; see ::FLAC__Metadata_Iterator.
  846.  */
  847. class FLACPP_API Iterator {
  848. public:
  849. Iterator();
  850. virtual ~Iterator();
  851. bool is_valid() const;
  852. void init(Chain &chain);
  853. bool next();
  854. bool prev();
  855. ::FLAC__MetadataType get_block_type() const;
  856. Prototype *get_block();
  857. bool set_block(Prototype *block);
  858. bool delete_block(bool replace_with_padding);
  859. bool insert_block_before(Prototype *block);
  860. bool insert_block_after(Prototype *block);
  861. protected:
  862. ::FLAC__Metadata_Iterator *iterator_;
  863. virtual void clear();
  864. };
  865. /* } */
  866. }
  867. }
  868. #endif