Hey!<br><br>&nbsp; So, I'm clearly doing something wrong, because I've
written a program to view and modify the comment tags in a FLAC file,
which appears to be embedded an Ogg stream.&nbsp; This particular file also
has ID3 headers at the beginning, but I was planning on ignoring those
and fixing them up using some ID3 code later on ...<br><br>&nbsp; Now, to read the comments is quite simple:<br><br>&nbsp; FLAC__metadata_get_tags<div>(fileName, &amp;tagData);<br>&nbsp; ...<br>&nbsp; ..<br>&nbsp; .<br>&nbsp; FLAC__metadata_object_delete(tagData);
<br><br><br><br>&nbsp;
For writing to the file, however, I do something along the following
lines (error code stripped out to keep things shorter), this is pretty much as
the flac documentation suggests:
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = FLAC__metadata_simple_iterator_init(iterator, fileName, FALSE, FALSE);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Zip through the file for the vorbis comment section.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (FLAC__metadata_simple_iterator_get_block_type(iterator) != FLAC__METADATA_TYPE_VORBIS_COMMENT)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = FLAC__metadata_simple_iterator_next(iterator);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Get the current block and write out the new values for it.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; metaData = FLAC__metadata_simple_iterator_get_block(iterator);
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Save the strings out.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [self saveCommentsToIterator: metaData];<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Now, save out the block.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = FLAC__metadata_simple_iterator_set_block(iterator, metaData, TRUE);
<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FLAC__metadata_simple_iterator_delete(metaData);<br><br><br>&nbsp;&nbsp;
the saveCommentsToIterator method just updates the &quot;entry&quot; and &quot;length&quot;
fields of those comment entries in the vorbis_comments that have
changed.&nbsp; (is that perhaps not correct?) .... hexdumping the file after
writing seems to show a new comment block with the appropriate new
values in it ... <br><br>&nbsp; The problem, which the docs hinted at:<br><br>&nbsp; - if the comments are shorter or not much longer:&nbsp; everything works great<br>&nbsp;
- if the comments are much longer:&nbsp; the file appears to be rewritten.&nbsp;
hexdump -C shows that the ID3 header is destroyed (not a problem,
really) and the file now has a 'fLaC' binary signature at the top.&nbsp;
(again, no problem -- other FLAC files appear to have this).
<br><br>&nbsp; This new file, however, cannot be read in by the above code
using FLAC__metadata_get_tags.&nbsp; It barfs internally while trying to
read some metadata chunks from the file (not the first one, either).<br><br>&nbsp;
Any idea why the newly written file cannot be read by my program any
more?&nbsp; Programs that play audio, such as VLC, can still play the FLAC
file just fine ....
<br><br>&nbsp; Any pointers to what I'm doing wrong would be greatly appreciated.<br><br>&nbsp; Thanks,<br></div><span class="sg">&nbsp; marc.</span>