FLAC  1.3.0
metadata.h
Go to the documentation of this file.
1 /* libFLAC++ - Free Lossless Audio Codec library
2  * Copyright (C) 2002-2009 Josh Coalson
3  * Copyright (C) 2011-2013 Xiph.Org Foundation
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * - Redistributions of source code must retain the above copyright
10  * notice, this list of conditions and the following disclaimer.
11  *
12  * - Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  *
16  * - Neither the name of the Xiph.org Foundation nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 #ifndef FLACPP__METADATA_H
34 #define FLACPP__METADATA_H
35 
36 #include "export.h"
37 
38 #include "FLAC/metadata.h"
39 
40 // ===============================================================
41 //
42 // Full documentation for the metadata interface can be found
43 // in the C layer in include/FLAC/metadata.h
44 //
45 // ===============================================================
46 
75 namespace FLAC {
76  namespace Metadata {
77 
78  // ============================================================
79  //
80  // Metadata objects
81  //
82  // ============================================================
83 
109  class FLACPP_API Prototype {
110  protected:
112 
115  Prototype(const Prototype &);
116  Prototype(const ::FLAC__StreamMetadata &);
117  Prototype(const ::FLAC__StreamMetadata *);
119 
130  Prototype(::FLAC__StreamMetadata *object, bool copy);
131 
133 
134  Prototype &operator=(const Prototype &);
135  Prototype &operator=(const ::FLAC__StreamMetadata &);
136  Prototype &operator=(const ::FLAC__StreamMetadata *);
138 
142  Prototype &assign_object(::FLAC__StreamMetadata *object, bool copy);
143 
146  virtual void clear();
147 
148  ::FLAC__StreamMetadata *object_;
149  public:
152  virtual ~Prototype();
153 
155 
157  inline bool operator==(const Prototype &) const;
158  inline bool operator==(const ::FLAC__StreamMetadata &) const;
159  inline bool operator==(const ::FLAC__StreamMetadata *) const;
161 
163 
164  inline bool operator!=(const Prototype &) const;
165  inline bool operator!=(const ::FLAC__StreamMetadata &) const;
166  inline bool operator!=(const ::FLAC__StreamMetadata *) const;
168 
169  friend class SimpleIterator;
170  friend class Iterator;
171 
176  inline bool is_valid() const;
177 
184  bool get_is_last() const;
185 
191  ::FLAC__MetadataType get_type() const;
192 
202  unsigned get_length() const;
203 
210  void set_is_last(bool);
211 
219  inline operator const ::FLAC__StreamMetadata *() const;
220  private:
222  Prototype();
223 
224  // These are used only by Iterator
225  bool is_reference_;
226  inline void set_reference(bool x) { is_reference_ = x; }
227  };
228 
229 #ifdef _MSC_VER
230 // warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)
231 #pragma warning ( disable : 4800 )
232 #endif
233 
234  inline bool Prototype::operator==(const Prototype &object) const
235  { return (bool)::FLAC__metadata_object_is_equal(object_, object.object_); }
236 
237  inline bool Prototype::operator==(const ::FLAC__StreamMetadata &object) const
238  { return (bool)::FLAC__metadata_object_is_equal(object_, &object); }
239 
240  inline bool Prototype::operator==(const ::FLAC__StreamMetadata *object) const
241  { return (bool)::FLAC__metadata_object_is_equal(object_, object); }
242 
243 #ifdef _MSC_VER
244 // @@@ how to re-enable? the following doesn't work
245 // #pragma warning ( enable : 4800 )
246 #endif
247 
248  inline bool Prototype::operator!=(const Prototype &object) const
249  { return !operator==(object); }
250 
251  inline bool Prototype::operator!=(const ::FLAC__StreamMetadata &object) const
252  { return !operator==(object); }
253 
254  inline bool Prototype::operator!=(const ::FLAC__StreamMetadata *object) const
255  { return !operator==(object); }
256 
257  inline bool Prototype::is_valid() const
258  { return 0 != object_; }
259 
260  inline Prototype::operator const ::FLAC__StreamMetadata *() const
261  { return object_; }
262 
264  FLACPP_API Prototype *clone(const Prototype *);
265 
266 
271  class FLACPP_API StreamInfo : public Prototype {
272  public:
273  StreamInfo();
274 
276 
279  inline StreamInfo(const StreamInfo &object): Prototype(object) { }
280  inline StreamInfo(const ::FLAC__StreamMetadata &object): Prototype(object) { }
281  inline StreamInfo(const ::FLAC__StreamMetadata *object): Prototype(object) { }
283 
287  inline StreamInfo(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
288 
289  ~StreamInfo();
290 
292 
293  inline StreamInfo &operator=(const StreamInfo &object) { Prototype::operator=(object); return *this; }
294  inline StreamInfo &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
295  inline StreamInfo &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
297 
301  inline StreamInfo &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
302 
304 
305  inline bool operator==(const StreamInfo &object) const { return Prototype::operator==(object); }
306  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
307  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
309 
311 
312  inline bool operator!=(const StreamInfo &object) const { return Prototype::operator!=(object); }
313  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
314  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
316 
318 
319  unsigned get_min_blocksize() const;
320  unsigned get_max_blocksize() const;
321  unsigned get_min_framesize() const;
322  unsigned get_max_framesize() const;
323  unsigned get_sample_rate() const;
324  unsigned get_channels() const;
325  unsigned get_bits_per_sample() const;
326  FLAC__uint64 get_total_samples() const;
327  const FLAC__byte *get_md5sum() const;
328 
329  void set_min_blocksize(unsigned value);
330  void set_max_blocksize(unsigned value);
331  void set_min_framesize(unsigned value);
332  void set_max_framesize(unsigned value);
333  void set_sample_rate(unsigned value);
334  void set_channels(unsigned value);
335  void set_bits_per_sample(unsigned value);
336  void set_total_samples(FLAC__uint64 value);
337  void set_md5sum(const FLAC__byte value[16]);
339  };
340 
345  class FLACPP_API Padding : public Prototype {
346  public:
347  Padding();
348 
350 
353  inline Padding(const Padding &object): Prototype(object) { }
354  inline Padding(const ::FLAC__StreamMetadata &object): Prototype(object) { }
355  inline Padding(const ::FLAC__StreamMetadata *object): Prototype(object) { }
357 
361  inline Padding(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
362 
365  Padding(unsigned length);
366 
367  ~Padding();
368 
370 
371  inline Padding &operator=(const Padding &object) { Prototype::operator=(object); return *this; }
372  inline Padding &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
373  inline Padding &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
375 
379  inline Padding &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
380 
382 
383  inline bool operator==(const Padding &object) const { return Prototype::operator==(object); }
384  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
385  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
387 
389 
390  inline bool operator!=(const Padding &object) const { return Prototype::operator!=(object); }
391  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
392  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
394 
397  void set_length(unsigned length);
398  };
399 
404  class FLACPP_API Application : public Prototype {
405  public:
406  Application();
407  //
409 
412  inline Application(const Application &object): Prototype(object) { }
413  inline Application(const ::FLAC__StreamMetadata &object): Prototype(object) { }
414  inline Application(const ::FLAC__StreamMetadata *object): Prototype(object) { }
416 
420  inline Application(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
421 
422  ~Application();
423 
425 
426  inline Application &operator=(const Application &object) { Prototype::operator=(object); return *this; }
427  inline Application &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
428  inline Application &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
430 
434  inline Application &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
435 
437 
438  inline bool operator==(const Application &object) const { return Prototype::operator==(object); }
439  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
440  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
442 
444 
445  inline bool operator!=(const Application &object) const { return Prototype::operator!=(object); }
446  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
447  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
449 
450  const FLAC__byte *get_id() const;
451  const FLAC__byte *get_data() const;
452 
453  void set_id(const FLAC__byte value[4]);
455  bool set_data(const FLAC__byte *data, unsigned length);
456  bool set_data(FLAC__byte *data, unsigned length, bool copy);
457  };
458 
463  class FLACPP_API SeekTable : public Prototype {
464  public:
465  SeekTable();
466 
468 
471  inline SeekTable(const SeekTable &object): Prototype(object) { }
472  inline SeekTable(const ::FLAC__StreamMetadata &object): Prototype(object) { }
473  inline SeekTable(const ::FLAC__StreamMetadata *object): Prototype(object) { }
475 
479  inline SeekTable(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
480 
481  ~SeekTable();
482 
484 
485  inline SeekTable &operator=(const SeekTable &object) { Prototype::operator=(object); return *this; }
486  inline SeekTable &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
487  inline SeekTable &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
489 
493  inline SeekTable &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
494 
496 
497  inline bool operator==(const SeekTable &object) const { return Prototype::operator==(object); }
498  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
499  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
501 
503 
504  inline bool operator!=(const SeekTable &object) const { return Prototype::operator!=(object); }
505  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
506  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
508 
509  unsigned get_num_points() const;
510  ::FLAC__StreamMetadata_SeekPoint get_point(unsigned index) const;
511 
513  bool resize_points(unsigned new_num_points);
514 
516  void set_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point);
517 
519  bool insert_point(unsigned index, const ::FLAC__StreamMetadata_SeekPoint &point);
520 
522  bool delete_point(unsigned index);
523 
525  bool is_legal() const;
526 
528  bool template_append_placeholders(unsigned num);
529 
531  bool template_append_point(FLAC__uint64 sample_number);
532 
534  bool template_append_points(FLAC__uint64 sample_numbers[], unsigned num);
535 
537  bool template_append_spaced_points(unsigned num, FLAC__uint64 total_samples);
538 
540  bool template_append_spaced_points_by_samples(unsigned samples, FLAC__uint64 total_samples);
541 
543  bool template_sort(bool compact);
544  };
545 
550  class FLACPP_API VorbisComment : public Prototype {
551  public:
581  class FLACPP_API Entry {
582  public:
583  Entry();
584 
585  Entry(const char *field, unsigned field_length);
586  Entry(const char *field); // assumes \a field is NUL-terminated
587 
588  Entry(const char *field_name, const char *field_value, unsigned field_value_length);
589  Entry(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated
590 
591  Entry(const Entry &entry);
592 
593  Entry &operator=(const Entry &entry);
594 
595  virtual ~Entry();
596 
597  virtual bool is_valid() const;
598 
599  unsigned get_field_length() const;
600  unsigned get_field_name_length() const;
601  unsigned get_field_value_length() const;
602 
604  const char *get_field() const;
605  const char *get_field_name() const;
606  const char *get_field_value() const;
607 
608  bool set_field(const char *field, unsigned field_length);
609  bool set_field(const char *field); // assumes \a field is NUL-terminated
610  bool set_field_name(const char *field_name);
611  bool set_field_value(const char *field_value, unsigned field_value_length);
612  bool set_field_value(const char *field_value); // assumes \a field_value is NUL-terminated
613  protected:
614  bool is_valid_;
616  char *field_name_;
617  unsigned field_name_length_;
618  char *field_value_;
619  unsigned field_value_length_;
620  private:
621  void zero();
622  void clear();
623  void clear_entry();
624  void clear_field_name();
625  void clear_field_value();
626  void construct(const char *field, unsigned field_length);
627  void construct(const char *field); // assumes \a field is NUL-terminated
628  void construct(const char *field_name, const char *field_value, unsigned field_value_length);
629  void construct(const char *field_name, const char *field_value); // assumes \a field_value is NUL-terminated
630  void compose_field();
631  void parse_field();
632  };
633 
634  VorbisComment();
635 
637 
640  inline VorbisComment(const VorbisComment &object): Prototype(object) { }
641  inline VorbisComment(const ::FLAC__StreamMetadata &object): Prototype(object) { }
642  inline VorbisComment(const ::FLAC__StreamMetadata *object): Prototype(object) { }
644 
648  inline VorbisComment(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
649 
650  ~VorbisComment();
651 
653 
654  inline VorbisComment &operator=(const VorbisComment &object) { Prototype::operator=(object); return *this; }
655  inline VorbisComment &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
656  inline VorbisComment &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
658 
662  inline VorbisComment &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
663 
665 
666  inline bool operator==(const VorbisComment &object) const { return Prototype::operator==(object); }
667  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
668  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
670 
672 
673  inline bool operator!=(const VorbisComment &object) const { return Prototype::operator!=(object); }
674  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
675  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
677 
678  unsigned get_num_comments() const;
679  const FLAC__byte *get_vendor_string() const; // NUL-terminated UTF-8 string
680  Entry get_comment(unsigned index) const;
681 
683  bool set_vendor_string(const FLAC__byte *string); // NUL-terminated UTF-8 string
684 
686  bool resize_comments(unsigned new_num_comments);
687 
689  bool set_comment(unsigned index, const Entry &entry);
690 
692  bool insert_comment(unsigned index, const Entry &entry);
693 
695  bool append_comment(const Entry &entry);
696 
698  bool replace_comment(const Entry &entry, bool all);
699 
701  bool delete_comment(unsigned index);
702 
704  int find_entry_from(unsigned offset, const char *field_name);
705 
707  int remove_entry_matching(const char *field_name);
708 
710  int remove_entries_matching(const char *field_name);
711  };
712 
717  class FLACPP_API CueSheet : public Prototype {
718  public:
725  class FLACPP_API Track {
726  protected:
728  public:
729  Track();
730  Track(const ::FLAC__StreamMetadata_CueSheet_Track *track);
731  Track(const Track &track);
732  Track &operator=(const Track &track);
733 
734  virtual ~Track();
735 
736  virtual bool is_valid() const;
737 
738 
739  inline FLAC__uint64 get_offset() const { return object_->offset; }
740  inline FLAC__byte get_number() const { return object_->number; }
741  inline const char *get_isrc() const { return object_->isrc; }
742  inline unsigned get_type() const { return object_->type; }
743  inline bool get_pre_emphasis() const { return object_->pre_emphasis; }
744 
745  inline FLAC__byte get_num_indices() const { return object_->num_indices; }
746  ::FLAC__StreamMetadata_CueSheet_Index get_index(unsigned i) const;
747 
748  inline const ::FLAC__StreamMetadata_CueSheet_Track *get_track() const { return object_; }
749 
750  inline void set_offset(FLAC__uint64 value) { object_->offset = value; }
751  inline void set_number(FLAC__byte value) { object_->number = value; }
752  void set_isrc(const char value[12]);
753  void set_type(unsigned value);
754  inline void set_pre_emphasis(bool value) { object_->pre_emphasis = value? 1 : 0; }
755 
756  void set_index(unsigned i, const ::FLAC__StreamMetadata_CueSheet_Index &index);
757  //@@@ It's awkward but to insert/delete index points
758  //@@@ you must use the routines in the CueSheet class.
759  };
760 
761  CueSheet();
762 
764 
767  inline CueSheet(const CueSheet &object): Prototype(object) { }
768  inline CueSheet(const ::FLAC__StreamMetadata &object): Prototype(object) { }
769  inline CueSheet(const ::FLAC__StreamMetadata *object): Prototype(object) { }
771 
775  inline CueSheet(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
776 
777  ~CueSheet();
778 
780 
781  inline CueSheet &operator=(const CueSheet &object) { Prototype::operator=(object); return *this; }
782  inline CueSheet &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
783  inline CueSheet &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
785 
789  inline CueSheet &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
790 
792 
793  inline bool operator==(const CueSheet &object) const { return Prototype::operator==(object); }
794  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
795  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
797 
799 
800  inline bool operator!=(const CueSheet &object) const { return Prototype::operator!=(object); }
801  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
802  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
804 
805  const char *get_media_catalog_number() const;
806  FLAC__uint64 get_lead_in() const;
807  bool get_is_cd() const;
808 
809  unsigned get_num_tracks() const;
810  Track get_track(unsigned i) const;
811 
812  void set_media_catalog_number(const char value[128]);
813  void set_lead_in(FLAC__uint64 value);
814  void set_is_cd(bool value);
815 
816  void set_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index);
817 
819  bool resize_indices(unsigned track_num, unsigned new_num_indices);
820 
822  bool insert_index(unsigned track_num, unsigned index_num, const ::FLAC__StreamMetadata_CueSheet_Index &index);
823 
825  bool insert_blank_index(unsigned track_num, unsigned index_num);
826 
828  bool delete_index(unsigned track_num, unsigned index_num);
829 
831  bool resize_tracks(unsigned new_num_tracks);
832 
834  bool set_track(unsigned i, const Track &track);
835 
837  bool insert_track(unsigned i, const Track &track);
838 
840  bool insert_blank_track(unsigned i);
841 
843  bool delete_track(unsigned i);
844 
846  bool is_legal(bool check_cd_da_subset = false, const char **violation = 0) const;
847 
849  FLAC__uint32 calculate_cddb_id() const;
850  };
851 
856  class FLACPP_API Picture : public Prototype {
857  public:
858  Picture();
859 
861 
864  inline Picture(const Picture &object): Prototype(object) { }
865  inline Picture(const ::FLAC__StreamMetadata &object): Prototype(object) { }
866  inline Picture(const ::FLAC__StreamMetadata *object): Prototype(object) { }
868 
872  inline Picture(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
873 
874  ~Picture();
875 
877 
878  inline Picture &operator=(const Picture &object) { Prototype::operator=(object); return *this; }
879  inline Picture &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
880  inline Picture &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
882 
886  inline Picture &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
887 
889 
890  inline bool operator==(const Picture &object) const { return Prototype::operator==(object); }
891  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
892  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
894 
896 
897  inline bool operator!=(const Picture &object) const { return Prototype::operator!=(object); }
898  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
899  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
901 
902  ::FLAC__StreamMetadata_Picture_Type get_type() const;
903  const char *get_mime_type() const; // NUL-terminated printable ASCII string
904  const FLAC__byte *get_description() const; // NUL-terminated UTF-8 string
905  FLAC__uint32 get_width() const;
906  FLAC__uint32 get_height() const;
907  FLAC__uint32 get_depth() const;
908  FLAC__uint32 get_colors() const;
909  FLAC__uint32 get_data_length() const;
910  const FLAC__byte *get_data() const;
911 
912  void set_type(::FLAC__StreamMetadata_Picture_Type type);
913 
915  bool set_mime_type(const char *string); // NUL-terminated printable ASCII string
916 
918  bool set_description(const FLAC__byte *string); // NUL-terminated UTF-8 string
919 
920  void set_width(FLAC__uint32 value) const;
921  void set_height(FLAC__uint32 value) const;
922  void set_depth(FLAC__uint32 value) const;
923  void set_colors(FLAC__uint32 value) const;
924 
926  bool set_data(const FLAC__byte *data, FLAC__uint32 data_length);
927 
929  bool is_legal(const char **violation);
930  };
931 
938  class FLACPP_API Unknown : public Prototype {
939  public:
940  Unknown();
941  //
943 
946  inline Unknown(const Unknown &object): Prototype(object) { }
947  inline Unknown(const ::FLAC__StreamMetadata &object): Prototype(object) { }
948  inline Unknown(const ::FLAC__StreamMetadata *object): Prototype(object) { }
950 
954  inline Unknown(::FLAC__StreamMetadata *object, bool copy): Prototype(object, copy) { }
955 
956  ~Unknown();
957 
959 
960  inline Unknown &operator=(const Unknown &object) { Prototype::operator=(object); return *this; }
961  inline Unknown &operator=(const ::FLAC__StreamMetadata &object) { Prototype::operator=(object); return *this; }
962  inline Unknown &operator=(const ::FLAC__StreamMetadata *object) { Prototype::operator=(object); return *this; }
964 
968  inline Unknown &assign(::FLAC__StreamMetadata *object, bool copy) { Prototype::assign_object(object, copy); return *this; }
969 
971 
972  inline bool operator==(const Unknown &object) const { return Prototype::operator==(object); }
973  inline bool operator==(const ::FLAC__StreamMetadata &object) const { return Prototype::operator==(object); }
974  inline bool operator==(const ::FLAC__StreamMetadata *object) const { return Prototype::operator==(object); }
976 
978 
979  inline bool operator!=(const Unknown &object) const { return Prototype::operator!=(object); }
980  inline bool operator!=(const ::FLAC__StreamMetadata &object) const { return Prototype::operator!=(object); }
981  inline bool operator!=(const ::FLAC__StreamMetadata *object) const { return Prototype::operator!=(object); }
983 
984  const FLAC__byte *get_data() const;
985 
987  bool set_data(const FLAC__byte *data, unsigned length);
988  bool set_data(FLAC__byte *data, unsigned length, bool copy);
989  };
990 
991  /* \} */
992 
993 
1006  FLACPP_API bool get_streaminfo(const char *filename, StreamInfo &streaminfo);
1007 
1008  FLACPP_API bool get_tags(const char *filename, VorbisComment *&tags);
1009  FLACPP_API bool get_tags(const char *filename, VorbisComment &tags);
1010 
1011  FLACPP_API bool get_cuesheet(const char *filename, CueSheet *&cuesheet);
1012  FLACPP_API bool get_cuesheet(const char *filename, CueSheet &cuesheet);
1013 
1014  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);
1015  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);
1016 
1017  /* \} */
1018 
1019 
1054  class FLACPP_API SimpleIterator {
1055  public:
1058  class FLACPP_API Status {
1059  public:
1060  inline Status(::FLAC__Metadata_SimpleIteratorStatus status): status_(status) { }
1061  inline operator ::FLAC__Metadata_SimpleIteratorStatus() const { return status_; }
1062  inline const char *as_cstring() const { return ::FLAC__Metadata_SimpleIteratorStatusString[status_]; }
1063  protected:
1065  };
1066 
1067  SimpleIterator();
1068  virtual ~SimpleIterator();
1069 
1070  bool is_valid() const;
1071 
1072  bool init(const char *filename, bool read_only, bool preserve_file_stats);
1073 
1074  Status status();
1075  bool is_writable() const;
1076 
1077  bool next();
1078  bool prev();
1079  bool is_last() const;
1080 
1081  off_t get_block_offset() const;
1082  ::FLAC__MetadataType get_block_type() const;
1083  unsigned get_block_length() const;
1084  bool get_application_id(FLAC__byte *id);
1085  Prototype *get_block();
1086  bool set_block(Prototype *block, bool use_padding = true);
1087  bool insert_block_after(Prototype *block, bool use_padding = true);
1088  bool delete_block(bool use_padding = true);
1089 
1090  protected:
1092  void clear();
1093  };
1094 
1095  /* \} */
1096 
1097 
1140  class FLACPP_API Chain {
1141  public:
1144  class FLACPP_API Status {
1145  public:
1146  inline Status(::FLAC__Metadata_ChainStatus status): status_(status) { }
1147  inline operator ::FLAC__Metadata_ChainStatus() const { return status_; }
1148  inline const char *as_cstring() const { return ::FLAC__Metadata_ChainStatusString[status_]; }
1149  protected:
1151  };
1152 
1153  Chain();
1154  virtual ~Chain();
1155 
1156  friend class Iterator;
1157 
1158  bool is_valid() const;
1159 
1160  Status status();
1161 
1162  bool read(const char *filename, bool is_ogg = false);
1163  bool read(FLAC__IOHandle handle, FLAC__IOCallbacks callbacks, bool is_ogg = false);
1164 
1165  bool check_if_tempfile_needed(bool use_padding);
1166 
1167  bool write(bool use_padding = true, bool preserve_file_stats = false);
1168  bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks);
1169  bool write(bool use_padding, ::FLAC__IOHandle handle, ::FLAC__IOCallbacks callbacks, ::FLAC__IOHandle temp_handle, ::FLAC__IOCallbacks temp_callbacks);
1170 
1171  void merge_padding();
1172  void sort_padding();
1173 
1174  protected:
1175  ::FLAC__Metadata_Chain *chain_;
1176  virtual void clear();
1177  };
1178 
1184  class FLACPP_API Iterator {
1185  public:
1186  Iterator();
1187  virtual ~Iterator();
1188 
1189  bool is_valid() const;
1190 
1191 
1192  void init(Chain &chain);
1193 
1194  bool next();
1195  bool prev();
1196 
1197  ::FLAC__MetadataType get_block_type() const;
1198  Prototype *get_block();
1199  bool set_block(Prototype *block);
1200  bool delete_block(bool replace_with_padding);
1201  bool insert_block_before(Prototype *block);
1202  bool insert_block_after(Prototype *block);
1203 
1204  protected:
1205  ::FLAC__Metadata_Iterator *iterator_;
1206  virtual void clear();
1207  };
1208 
1209  /* \} */
1210 
1211  }
1212 }
1213 
1214 #endif
FLAC__byte number
Definition: format.h:668
bool operator!=(const Application &object) const
Definition: metadata.h:445
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:974
Application & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:434
CueSheet(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:769
StreamInfo(const StreamInfo &object)
Definition: metadata.h:279
unsigned pre_emphasis
Definition: format.h:677
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:446
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:440
Definition: metadata.h:856
VorbisComment(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:641
Prototype & operator=(const Prototype &)
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:891
Application(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:413
Definition: metadata.h:1054
CueSheet & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:789
bool get_cuesheet(const char *filename, CueSheet &cuesheet)
See FLAC__metadata_get_cuesheet().
StreamInfo & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:301
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:802
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:505
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:899
Padding & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:372
bool get_tags(const char *filename, VorbisComment &tags)
See FLAC__metadata_get_tags().
Definition: decoder.h:78
bool operator!=(const CueSheet &object) const
Definition: metadata.h:800
bool operator!=(const VorbisComment &object) const
Definition: metadata.h:673
This module provides functions for creating and manipulating FLAC metadata blocks in memory...
CueSheet & operator=(const CueSheet &object)
Definition: metadata.h:781
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:447
Unknown & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:962
Definition: callback.h:170
Picture(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:872
Definition: metadata.h:345
const char *const FLAC__Metadata_SimpleIteratorStatusString[]
Unknown(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:948
Padding & operator=(const Padding &object)
Definition: metadata.h:371
VorbisComment(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:648
StreamInfo & operator=(const StreamInfo &object)
Definition: metadata.h:293
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:795
Picture & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:879
StreamInfo(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:287
VorbisComment(const VorbisComment &object)
Definition: metadata.h:640
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:392
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:674
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:980
Unknown(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:954
bool operator!=(const Unknown &object) const
Definition: metadata.h:979
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:439
Application & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:427
SeekTable & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:486
unsigned type
Definition: format.h:674
bool operator!=(const SeekTable &object) const
Definition: metadata.h:504
StreamInfo(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:280
Definition: format.h:664
Padding & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:379
Padding & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:373
StreamInfo & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:295
Picture & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:886
bool operator==(const Unknown &object) const
Definition: metadata.h:972
Prototype * clone(const Prototype *)
Definition: format.h:645
Unknown(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:947
bool operator!=(const StreamInfo &object) const
Definition: metadata.h:312
Picture & operator=(const Picture &object)
Definition: metadata.h:878
FLAC__bool FLAC__metadata_object_is_equal(const FLAC__StreamMetadata *block1, const FLAC__StreamMetadata *block2)
Unknown & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:968
CueSheet & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:783
Definition: metadata.h:550
Prototype & assign_object(::FLAC__StreamMetadata *object, bool copy)
bool operator==(const CueSheet &object) const
Definition: metadata.h:793
Definition: metadata.h:1140
SeekTable & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:493
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:391
CueSheet(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:768
FLAC__byte num_indices
Definition: format.h:680
Padding(const Padding &object)
Definition: metadata.h:353
Picture & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:880
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:981
StreamInfo & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:294
This module contains #defines and symbols for exporting function calls, and providing version informa...
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:313
Unknown(const Unknown &object)
Definition: metadata.h:946
struct FLAC__Metadata_Chain FLAC__Metadata_Chain
Definition: metadata.h:714
Definition: format.h:832
Application & operator=(const Application &object)
Definition: metadata.h:426
bool get_streaminfo(const char *filename, StreamInfo &streaminfo)
See FLAC__metadata_get_streaminfo().
Padding(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:354
Definition: metadata.h:581
SeekTable(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:472
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:973
Definition: metadata.h:1144
const char *const FLAC__Metadata_ChainStatusString[]
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:668
VorbisComment(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:642
Application(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:420
Definition: metadata.h:1058
bool operator==(const Padding &object) const
Definition: metadata.h:383
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:307
bool operator==(const Picture &object) const
Definition: metadata.h:890
CueSheet(const CueSheet &object)
Definition: metadata.h:767
Application(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:414
bool is_valid() const
Definition: metadata.h:257
Definition: metadata.h:271
StreamInfo(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:281
FLAC__MetadataType
Definition: format.h:489
struct FLAC__Metadata_Iterator FLAC__Metadata_Iterator
Definition: metadata.h:719
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:499
Picture(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:866
Definition: format.h:622
VorbisComment & assign(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:662
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:498
Picture(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:865
SeekTable(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:473
Picture(const Picture &object)
Definition: metadata.h:864
Definition: metadata.h:725
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:314
void * FLAC__IOHandle
Definition: callback.h:89
CueSheet(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:775
char isrc[13]
Definition: format.h:671
SeekTable(const SeekTable &object)
Definition: metadata.h:471
FLAC__StreamMetadata_Picture_Type
Definition: format.h:730
struct FLAC__Metadata_SimpleIterator FLAC__Metadata_SimpleIterator
Definition: metadata.h:303
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:675
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:385
VorbisComment & operator=(const VorbisComment &object)
Definition: metadata.h:654
bool operator==(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:892
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:794
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:801
Definition: metadata.h:717
bool operator!=(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:898
bool operator!=(const Prototype &) const
Definition: metadata.h:248
FLAC__uint64 offset
Definition: format.h:665
Definition: metadata.h:1184
bool operator==(const VorbisComment &object) const
Definition: metadata.h:666
Definition: metadata.h:109
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:306
Padding(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:361
Unknown & operator=(const Unknown &object)
Definition: metadata.h:960
VorbisComment & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:656
Padding(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:355
Application(const Application &object)
Definition: metadata.h:412
SeekTable & operator=(const SeekTable &object)
Definition: metadata.h:485
CueSheet & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:782
FLAC__Metadata_SimpleIteratorStatus
Definition: metadata.h:309
Definition: metadata.h:463
bool operator==(const Application &object) const
Definition: metadata.h:438
Unknown & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:961
bool operator==(const StreamInfo &object) const
Definition: metadata.h:305
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:384
Definition: metadata.h:938
Application & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:428
Definition: format.h:572
bool operator!=(const Picture &object) const
Definition: metadata.h:897
VorbisComment & operator=(const ::FLAC__StreamMetadata &object)
Definition: metadata.h:655
FLAC__Metadata_ChainStatus
Definition: metadata.h:721
Definition: metadata.h:404
bool operator!=(const Padding &object) const
Definition: metadata.h:390
SeekTable & operator=(const ::FLAC__StreamMetadata *object)
Definition: metadata.h:487
bool operator!=(const ::FLAC__StreamMetadata *object) const
Definition: metadata.h:506
bool operator==(const Prototype &) const
Definition: metadata.h:234
bool get_picture(const char *filename, Picture &picture,::FLAC__StreamMetadata_Picture_Type type, const char *mime_type, const FLAC__byte *description, unsigned max_width, unsigned max_height, unsigned max_depth, unsigned max_colors)
See FLAC__metadata_get_picture().
SeekTable(::FLAC__StreamMetadata *object, bool copy)
Definition: metadata.h:479
bool operator==(const SeekTable &object) const
Definition: metadata.h:497
bool operator==(const ::FLAC__StreamMetadata &object) const
Definition: metadata.h:667