From 4e56b06d635964a424c86c837ca73a47604a0a7b Mon Sep 17 00:00:00 2001 From: Josh Coalson Date: Wed, 15 Aug 2007 05:59:09 +0000 Subject: [PATCH] add FLAC__metadata_simple_iterator_get_application_id() --- doc/html/changelog.html | 2 ++ include/FLAC++/metadata.h | 1 + include/FLAC/metadata.h | 29 ++++++++++++++++++++++++++--- src/libFLAC++/metadata.cpp | 7 +++++++ src/libFLAC/metadata_iterators.c | 27 +++++++++++++++++++++++++++ 5 files changed, 63 insertions(+), 3 deletions(-) diff --git a/doc/html/changelog.html b/doc/html/changelog.html index fb949d7d..d717c7da 100644 --- a/doc/html/changelog.html +++ b/doc/html/changelog.html @@ -121,6 +121,7 @@
  • Added FLAC__metadata_simple_iterator_is_last()
  • Added FLAC__metadata_simple_iterator_get_block_offset()
  • Added FLAC__metadata_simple_iterator_get_block_length()
  • +
  • Added FLAC__metadata_simple_iterator_get_application_id()
  • @@ -129,6 +130,7 @@
  • Added FLAC::Metadata::SimpleIterator::is_last()
  • Added FLAC::Metadata::SimpleIterator::get_block_offset()
  • Added FLAC::Metadata::SimpleIterator::get_block_length()
  • +
  • Added FLAC::Metadata::SimpleIterator::get_application_id()
  • diff --git a/include/FLAC++/metadata.h b/include/FLAC++/metadata.h index abe2defa..8c6a015f 100644 --- a/include/FLAC++/metadata.h +++ b/include/FLAC++/metadata.h @@ -1023,6 +1023,7 @@ namespace FLAC { off_t get_block_offset() const; ///< See FLAC__metadata_simple_iterator_get_block_offset(). ::FLAC__MetadataType get_block_type() const; ///< See FLAC__metadata_simple_iterator_get_block_type(). unsigned get_block_length() const; ///< See FLAC__metadata_simple_iterator_get_block_length(). + bool get_application_id(FLAC__byte *id); ///< See FLAC__metadata_simple_iterator_get_application_id(). Prototype *get_block(); ///< See FLAC__metadata_simple_iterator_get_block(). bool set_block(Prototype *block, bool use_padding = true); ///< See FLAC__metadata_simple_iterator_set_block(). bool insert_block_after(Prototype *block, bool use_padding = true); ///< See FLAC__metadata_simple_iterator_insert_block_after(). diff --git a/include/FLAC/metadata.h b/include/FLAC/metadata.h index 6ee8036f..a8f3d2bc 100644 --- a/include/FLAC/metadata.h +++ b/include/FLAC/metadata.h @@ -472,7 +472,6 @@ FLAC_API FLAC__bool FLAC__metadata_simple_iterator_is_last(const FLAC__Metadata_ * This is the byte offset relative to the beginning of the file of * the current metadata block's header. */ - FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metadata_SimpleIterator *iterator); /** Get the type of the metadata block at the current position. This @@ -487,7 +486,6 @@ FLAC_API off_t FLAC__metadata_simple_iterator_get_block_offset(const FLAC__Metad * \retval FLAC__MetadataType * The type of the metadata block at the current iterator position. */ - FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__Metadata_SimpleIterator *iterator); /*@@@@add to tests*/ @@ -506,9 +504,34 @@ FLAC_API FLAC__MetadataType FLAC__metadata_simple_iterator_get_block_type(const * metadata block header, * i.e. the length of the metadata body that follows the header. */ - FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Metadata_SimpleIterator *iterator); +/*@@@@add to tests*/ +/** Get the application ID of the \c APPLICATION block at the current + * position. This avoids reading the actual block data which can save + * time for large blocks. + * + * \param iterator A pointer to an existing initialized iterator. + * \param id A pointer to a buffer of at least \c 4 bytes where + * the ID will be stored. + * \assert + * \code iterator != NULL \endcode + * \code id != NULL \endcode + * \a iterator has been successfully initialized with + * FLAC__metadata_simple_iterator_init() + * \retval FLAC__bool + * \c true if the ID was successfully read, else \c false, in which + * case you should check FLAC__metadata_simple_iterator_status() to + * find out why. If the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT, then the + * current metadata block is not an \c APPLICATION block. Otherwise + * if the status is + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR or + * \c FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR, an I/O error + * occurred and the iterator can no longer be used. + */ +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id); + /** Get the metadata block at the current position. You can modify the * block but must use FLAC__metadata_simple_iterator_set_block() to * write it back to the FLAC file. diff --git a/src/libFLAC++/metadata.cpp b/src/libFLAC++/metadata.cpp index f5e5ebc2..f03076db 100644 --- a/src/libFLAC++/metadata.cpp +++ b/src/libFLAC++/metadata.cpp @@ -1363,6 +1363,13 @@ namespace FLAC { return ::FLAC__metadata_simple_iterator_get_block_length(iterator_); } + //@@@@ add to tests + bool SimpleIterator::get_application_id(FLAC__byte *id) + { + FLAC__ASSERT(is_valid()); + return (bool)::FLAC__metadata_simple_iterator_get_application_id(iterator_, id); + } + Prototype *SimpleIterator::get_block() { FLAC__ASSERT(is_valid()); diff --git a/src/libFLAC/metadata_iterators.c b/src/libFLAC/metadata_iterators.c index 8272844d..32eef2ff 100644 --- a/src/libFLAC/metadata_iterators.c +++ b/src/libFLAC/metadata_iterators.c @@ -609,6 +609,33 @@ FLAC_API unsigned FLAC__metadata_simple_iterator_get_block_length(const FLAC__Me return iterator->length; } +FLAC_API FLAC__bool FLAC__metadata_simple_iterator_get_application_id(FLAC__Metadata_SimpleIterator *iterator, FLAC__byte *id) +{ + const unsigned id_bytes = FLAC__STREAM_METADATA_APPLICATION_ID_LEN / 8; + + FLAC__ASSERT(0 != iterator); + FLAC__ASSERT(0 != iterator->file); + FLAC__ASSERT(0 != id); + + if(iterator->type != FLAC__METADATA_TYPE_APPLICATION) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT; + return false; + } + + if(fread(id, 1, id_bytes, iterator->file) != id_bytes) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR; + return false; + } + + /* back up */ + if(0 != fseeko(iterator->file, -((int)id_bytes), SEEK_CUR)) { + iterator->status = FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR; + return false; + } + + return true; +} + FLAC_API FLAC__StreamMetadata *FLAC__metadata_simple_iterator_get_block(FLAC__Metadata_SimpleIterator *iterator) { FLAC__StreamMetadata *block = FLAC__metadata_object_new(iterator->type);