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