Hi! I've been using a little C++ program I've written to encode flac
files. The program does this in the usual way (I think), by inheriting a class
from FLAC::Encoder::File, and passing it chunks of raw samples through
process_interleaved()... Anyway, the program works beautifully, and I've now
decided to try and add some metadata to the encoded flacs. Eventually, there
will be vorbis comments, but right now I'm just trying to add a seektable.
From some code examples I've managed to get it working using the libFLAC C
API like this:
FLAC__StreamMetadata *md[1];
md[0] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE); // THIS
LEAKS
FLAC__metadata_object_seektable_template_append_spaced_points(md[0], 13,
d_bytestotal / 4);
FLAC__metadata_object_seektable_template_sort(md[0], true);
set_metadata(md, 1);
Now, I have several questions:
1. Most importantly: How can I get this to work with the libFLAC++ API? Do I not
_need_ the template-methods, and are they not missing from the C++ API? I've
also tried getting just half the metadata code from the C++ API and using the C
API for the template-functions, like this:
FLAC::Metadata::Prototype *md[1];
FLAC__StreamMetadata *seektable =
FLAC__metadata_object_new(FLAC__METADATA_TYPE_SEEKTABLE);
FLAC__metadata_object_seektable_template_append_spaced_points(seektable, 13,
d_bytestotal / 4);
FLAC__metadata_object_seektable_template_sort(seektable, true);
md[0] = new FLAC::Metadata::SeekTable(seektable);
set_metadata(md, 1);
But that does not seem to work. Checking md[0]->type(), and
md[0]->is_valid() and md[0]->is_legal() all return expected values, but
the resulting flac has no seektable, but instead a 0-length metadata block of
type 56 (UNKNOWN). So what am I doing wrong? And can I get rid of the C API
calls altogether? Also, as you can see I'm arbitrarily creating 13
seekpoints, this is just for testing. But what is a good amount of seekpoints,
how does the official flac binary determine a default?
2. I noticed while reading the source that all FLAC::Metadata::Prototype child
classes have default constructors, that seem to do what you'd expect. They
are not mentioned in the API docs (for example:
http://flac.sourceforge.net/api/classFLAC_1_1Metadata_1_1SeekTable.html). Can
this be considered a bug?
3. Assuming the FLAC__metadata_object_seektable_template_* functions are
necessary for creating a proper seektable, and that these functions don't
exist in the C++ API, would it be appreciated if I wrote some wrappers for these
functions as members of the FLAC::Metadata::Seektable class? I'm assuming
these functions would just be one-liners, so I should be capable and willing to
do that. The same goes for all other FLAC__metadata_object_* functions not
already wrapped in the appropriate FLAC::Metadata::Prototype children.
Sorry for the long message... but thanks for reading!
bepaald