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

_______________________________________________
flac-dev mailing list
[email protected]
http://lists.xiph.org/mailman/listinfo/flac-dev

Reply via email to