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);