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