contents moved into metadata interface
[flac.git] / include / FLAC / metadata.h
1 /* libFLAC - Free Lossless Audio Codec library
2  * Copyright (C) 2001,2002  Josh Coalson
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA  02111-1307, USA.
18  */
19
20 #ifndef FLAC__METADATA_H
21 #define FLAC__METADATA_H
22
23 #include "format.h"
24
25 /******************************************************************************
26         (For an example of how all these routines are used, see the source
27         code for the unit tests in src/test_unit/metadata_*.c, or metaflac
28         in src/metaflac/)
29 ******************************************************************************/
30
31 /******************************************************************************
32         This module provides read and write access to FLAC file metadata at
33         three increasing levels of complexity:
34
35         level 0:
36         read-only access to the STREAMINFO block.
37
38         level 1:
39         read-write access to all metadata blocks.  This level is write-
40         efficient in most cases (more on this later), and uses less memory
41         than level 2.
42
43         level 2:
44         read-write access to all metadata blocks.  This level is write-
45         efficient in all cases, but uses more memory since all metadata for
46         the whole file is read into memory and manipulated before writing
47         out again.
48
49         What do we mean by efficient?  When writing metadata back to a FLAC
50         file it is possible to grow or shrink the metadata such that the entire
51         file must be rewritten.  However, if the size remains the same during
52         changes or PADDING blocks are utilized, only the metadata needs to be
53         overwritten, which is much faster.
54
55         Efficient means the whole file is rewritten at most one time, and only
56         when necessary.  Level 1 is not efficient only in the case that you
57         cause more than one metadata block to grow or shrink beyond what can
58         be accomodated by padding.  In this case you should probably use level
59         2, which allows you to edit all the metadata for a file in memory and
60         write it out all at once.
61
62         All levels know how to skip over and not disturb an ID3v2 tag at the
63         front of the file.
64 ******************************************************************************/
65
66 /******************************************************************************
67         After the three interfaces, methods for creating and manipulating
68         the various metadata blocks are defined.  Unless you will be using
69         level 1 or 2 to modify existing metadata you will not need these.
70 ******************************************************************************/
71
72 #ifdef __cplusplus
73 extern "C" {
74 #endif
75
76
77 /***********************************************************************
78  * level 0
79  * ---------------------------------------------------------------------
80  * Only one routine to read the STREAMINFO.  Skips any ID3v2 tag at the
81  * head of the file.  Useful for file-based player plugins.
82  *
83  * Provide the address of a FLAC__StreamMetaData_StreamInfo object to
84  * fill.
85  */
86
87 FLAC__bool FLAC__metadata_get_streaminfo(const char *filename, FLAC__StreamMetaData_StreamInfo *streaminfo);
88
89
90 /***********************************************************************
91  * level 1
92  * ---------------------------------------------------------------------
93  * The general usage of this interface is:
94  *
95  * Create an iterator using FLAC__metadata_simple_iterator_new()
96  * Attach it to a file using FLAC__metadata_simple_iterator_init() and check
97  *    the exit code.  Call FLAC__metadata_simple_iterator_is_writable() to
98  *    see if the file is writable, or read-only access is allowed.
99  * Use _next() and _prev() to move around the blocks.  This is does not
100  *    read the actual blocks themselves.  _next() is relatively fast.
101  *    _prev() is slower since it needs to search forward from the front
102  *    of the file.
103  * Use _get_block_type() or _get_block() to access the actual data at
104  *    the current iterator position.  The returned object is yours to
105  *    modify and free.
106  * Use _set_block() to write a modified block back.  You must have write
107  *    permission to the original file.  Make sure to read the whole
108  *    comment to _set_block() below.
109  * Use _insert_block_after() to add new blocks.  Use the object creation
110  *    functions from the end of this header file to generate new objects.
111  * Use _delete_block() to remove the block currently referred to by the
112  *    iterator, or replace it with padding.
113  * Destroy the iterator with FLAC__metadata_simple_iterator_delete()
114  *    when finished.
115  *
116  * NOTE: The FLAC file remains open the whole time between _init() and
117  *       _delete(), so make sure you are not altering the file during
118  *       this time.
119  *
120  * NOTE: Do not modify the is_last, length, or type fields of returned
121  *       FLAC__MetaDataType objects.  These are managed automatically.
122  *
123  * NOTE: If any of the modification functions (_set_block, _delete_block,
124  *       _insert_block_after, etc) return false, you should delete the
125  *       iterator as it may no longer be valid.
126  */
127
128 /*
129  * opaque structure definition
130  */
131 struct FLAC__MetaData_SimpleIterator;
132 typedef struct FLAC__MetaData_SimpleIterator FLAC__MetaData_SimpleIterator;
133
134 typedef enum {
135         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK = 0,
136         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ILLEGAL_INPUT,
137         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_ERROR_OPENING_FILE,
138         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_A_FLAC_FILE,
139         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_NOT_WRITABLE,
140         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_BAD_METADATA,
141         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_READ_ERROR,
142         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_SEEK_ERROR,
143         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_WRITE_ERROR,
144         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_RENAME_ERROR,
145         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_UNLINK_ERROR,
146         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_MEMORY_ALLOCATION_ERROR,
147         FLAC__METADATA_SIMPLE_ITERATOR_STATUS_INTERNAL_ERROR
148 } FLAC__MetaData_SimpleIteratorStatus;
149 extern const char *FLAC__MetaData_SimpleIteratorStatusString[];
150
151 /*
152  * Constructor/destructor
153  */
154 FLAC__MetaData_SimpleIterator *FLAC__metadata_simple_iterator_new();
155 void FLAC__metadata_simple_iterator_delete(FLAC__MetaData_SimpleIterator *iterator);
156
157 /*
158  * Get the current status of the iterator.  Call this after a function
159  * returns false to get the reason for the error.  Also resets the status
160  * to FLAC__METADATA_SIMPLE_ITERATOR_STATUS_OK
161  */
162 FLAC__MetaData_SimpleIteratorStatus FLAC__metadata_simple_iterator_status(FLAC__MetaData_SimpleIterator *iterator);
163
164 /*
165  * Initialize the iterator to point to the first metadata block in the
166  * given FLAC file.  If 'preserve_file_stats' is true, the owner and
167  * modification time will be preserved even if the FLAC file is written.
168  */
169 FLAC__bool FLAC__metadata_simple_iterator_init(FLAC__MetaData_SimpleIterator *iterator, const char *filename, FLAC__bool preserve_file_stats);
170
171 /*
172  * Returns true if the FLAC file is writable.  If false, calls to
173  * FLAC__metadata_simple_iterator_set_block() and
174  * FLAC__metadata_simple_iterator_insert_block_after() will fail.
175  */
176 FLAC__bool FLAC__metadata_simple_iterator_is_writable(const FLAC__MetaData_SimpleIterator *iterator);
177
178 /*
179  * These move the iterator forwards or backwards, returning false if
180  * already at the end.
181  */
182 FLAC__bool FLAC__metadata_simple_iterator_next(FLAC__MetaData_SimpleIterator *iterator);
183 FLAC__bool FLAC__metadata_simple_iterator_prev(FLAC__MetaData_SimpleIterator *iterator);
184
185 /*
186  * Get the type of the metadata block at the current position.  This
187  * avoids reading the actual block data which can save time for large
188  * blocks.
189  */
190 FLAC__MetaDataType FLAC__metadata_simple_iterator_get_block_type(const FLAC__MetaData_SimpleIterator *iterator);
191
192 /*
193  * Get the metadata block at the current position.  You can modify the
194  * block but must use FLAC__metadata_simple_iterator_set_block() to
195  * write it back to the FLAC file.
196  *
197  * You must call FLAC__metadata_object_delete() on the returned object
198  * when you are finished with it.
199  */
200 FLAC__StreamMetaData *FLAC__metadata_simple_iterator_get_block(FLAC__MetaData_SimpleIterator *iterator);
201
202 /*
203  * Write a block back to the FLAC file.  This function tries to be
204  * as efficient as possible; how the block is actually written is
205  * shown by the following:
206  *
207  * Existing block is a STREAMINFO block and the new block is a
208  * STREAMINFO block: the new block is written in place.  Make sure
209  * you know what you're doing when changing the values of a
210  * STREAMINFO block.
211  *
212  * Existing block is a STREAMINFO block and the new block is a
213  * not a STREAMINFO block: this is an error since the first block
214  * must be a STREAMINFO block.  Returns false without altering the
215  * file.
216  *
217  * Existing block is not a STREAMINFO block and the new block is a
218  * STREAMINFO block: this is an error since there may be only one
219  * STREAMINFO block.  Returns false without altering the file.
220  *
221  * Existing block and new block are the same length: the existing
222  * block will be replaced by the new block, written in place.
223  *
224  * Existing block is longer than new block: if use_padding is true,
225  * the existing block will be overwritten in place with the new
226  * block followed by a PADDING block, if possible, to make the total
227  * size the same as the existing block.  Remember that a padding
228  * block requires at least four bytes so if the difference in size
229  * between the new block and existing block is less than that, the
230  * entire file will have to be rewritten, using the new block's
231  * exact size.  If use_padding is false, the entire file will be
232  * rewritten, replacing the existing block by the new block.
233  *
234  * Existing block is shorter than new block: if use_padding is true,
235  * the function will try and expand the new block into the following
236  * PADDING block, if it exists and doing so won't shrink the PADDING
237  * block to less than 4 bytes.  If there is no following PADDING
238  * block, or it will shrink to less than 4 bytes, or use_padding is
239  * false, the entire file is rewritten, replacing the existing block
240  * with the new block.  Note that in this case any following PADDING
241  * block is preserved as is.
242  *
243  * After writing the block, the iterator will remain in the same
244  * place, i.e. pointing to the new block.
245  */
246 FLAC__bool FLAC__metadata_simple_iterator_set_block(FLAC__MetaData_SimpleIterator *iterator, FLAC__StreamMetaData *block, FLAC__bool use_padding);
247
248 /*
249  * This is similar to FLAC__metadata_simple_iterator_set_block()
250  * except that instead of writing over an existing block, it appends
251  * a block after the existing block.  'use_padding' is again used to
252  * tell the function to try an expand into following padding in an
253  * attempt to avoid rewriting the entire file.
254  *
255  * This function will fail and return false if given a STREAMINFO
256  * block.
257  *
258  * After writing the block, the iterator will be pointing to the
259  * new block.
260  */
261 FLAC__bool FLAC__metadata_simple_iterator_insert_block_after(FLAC__MetaData_SimpleIterator *iterator, FLAC__StreamMetaData *block, FLAC__bool use_padding);
262
263 /*
264  * Deletes the block at the current position.  This will cause the
265  * entire FLAC file to be rewritten, unless 'use_padding' is true,
266  * in which case the block will be replaced by an equal-sized PADDING
267  * block.  The iterator will be left pointing to the block before the
268  * one just deleted.
269  *
270  * You may not delete the STREAMINFO block.
271  */
272 FLAC__bool FLAC__metadata_simple_iterator_delete_block(FLAC__MetaData_SimpleIterator *iterator, FLAC__bool use_padding);
273
274
275 /***********************************************************************
276  * level 2
277  * ---------------------------------------------------------------------
278  * The general usage of this interface is:
279  *
280  * Create a new chain using FLAC__metadata_chain_new().  A chain is a
281  *    linked list of metadata blocks.
282  * Read all metadata into the the chain from a FLAC file using
283  *    FLAC__metadata_chain_read() and check the status.
284  * Optionally, consolidate the padding using
285  *    FLAC__metadata_chain_merge_padding() or
286  *    FLAC__metadata_chain_sort_padding().
287  * Create a new iterator using FLAC__metadata_iterator_new()
288  * Initialize the iterator to point to the first element in the chain
289  *    using FLAC__metadata_iterator_init()
290  * Traverse the chain using FLAC__metadata_iterator_next/prev().
291  * Get a block for reading or modification using
292  *    FLAC__metadata_iterator_get_block().  The pointer to the object
293  *    inside the chain is returned, so the block is yours to modify.
294  *    Changes will be reflected in the FLAC file when you write the
295  *    chain.  You can also add and delete blocks (see functions below).
296  * When done, write out the chain using FLAC__metadata_chain_write().
297  *    Make sure to read the whole comment to the function below.
298  * Delete the chain using FLAC__metadata_chain_delete().
299  *
300  * NOTE: Even though the FLAC file is not open while the chain is being
301  *       manipulated, you must not alter the file externally during
302  *       this time.  The chain assumes the FLAC file will not change
303  *       between the time of FLAC__metadata_chain_read() and
304  *       FLAC__metadata_chain_write().
305  *
306  * NOTE: Do not modify the is_last, length, or type fields of returned
307  *       FLAC__MetaDataType objects.  These are managed automatically.
308  *
309  * NOTE: The metadata objects returned by _get_bloca()k are owned by the
310  *       chain; do not FLAC__metadata_object_delete() them.  In the
311  *       same way, blocks passed to _set_block() become owned by the
312  *       chain and will be deleted when the chain is deleted.
313  */
314
315 /*
316  * opaque structure definitions
317  */
318 struct FLAC__MetaData_Chain;
319 typedef struct FLAC__MetaData_Chain FLAC__MetaData_Chain;
320 struct FLAC__MetaData_Iterator;
321 typedef struct FLAC__MetaData_Iterator FLAC__MetaData_Iterator;
322
323 typedef enum {
324         FLAC__METADATA_CHAIN_STATUS_OK = 0,
325         FLAC__METADATA_CHAIN_STATUS_ILLEGAL_INPUT,
326         FLAC__METADATA_CHAIN_STATUS_ERROR_OPENING_FILE,
327         FLAC__METADATA_CHAIN_STATUS_NOT_A_FLAC_FILE,
328         FLAC__METADATA_CHAIN_STATUS_NOT_WRITABLE,
329         FLAC__METADATA_CHAIN_STATUS_BAD_METADATA,
330         FLAC__METADATA_CHAIN_STATUS_READ_ERROR,
331         FLAC__METADATA_CHAIN_STATUS_SEEK_ERROR,
332         FLAC__METADATA_CHAIN_STATUS_WRITE_ERROR,
333         FLAC__METADATA_CHAIN_STATUS_RENAME_ERROR,
334         FLAC__METADATA_CHAIN_STATUS_UNLINK_ERROR,
335         FLAC__METADATA_CHAIN_STATUS_MEMORY_ALLOCATION_ERROR,
336         FLAC__METADATA_CHAIN_STATUS_INTERNAL_ERROR
337 } FLAC__MetaData_ChainStatus;
338 extern const char *FLAC__MetaData_ChainStatusString[];
339
340 /*********** FLAC__MetaData_Chain ***********/
341
342 /*
343  * Constructor/destructor
344  */
345 FLAC__MetaData_Chain *FLAC__metadata_chain_new();
346 void FLAC__metadata_chain_delete(FLAC__MetaData_Chain *chain);
347
348 /*
349  * Get the current status of the chain.  Call this after a function
350  * returns false to get the reason for the error.  Also resets the status
351  * to FLAC__METADATA_CHAIN_STATUS_OK
352  */
353 FLAC__MetaData_ChainStatus FLAC__metadata_chain_status(FLAC__MetaData_Chain *chain);
354
355 /*
356  * Read all metadata into the chain
357  */
358 FLAC__bool FLAC__metadata_chain_read(FLAC__MetaData_Chain *chain, const char *filename);
359
360 /*
361  * Write all metadata out to the FLAC file.  This function tries to be as
362  * efficient as possible; how the metadata is actually written is shown by
363  * the following:
364  *
365  * If the current chain is the same size as the existing metadata, the new
366  * data is written in place.
367  *
368  * If the current chain is longer than the existing metadata, and
369  * 'use_padding' is true, and the last block is a PADDING block of
370  * sufficient length, the function will truncate the final padding block
371  * so that the overall size of the metadata is the same as the existing
372  * metadata, and then just rewrite the metadata.  Otherwise, if not all of
373  * the above conditions are met, the entire FLAC file must be rewritten.
374  * If you want to use padding this way it is a good idea to call
375  * FLAC__metadata_chain_sort_padding() first so that you have the maximum
376  * amount of padding to work with, unless you need to preserve ordering
377  * of the PADDING blocks for some reason.
378  *
379  * If the current chain is shorter than the existing metadata, and
380  * use_padding is true, and the final block is a PADDING block, the padding
381  * is extended to make the overall size the same as the existing data.  If
382  * use_padding is true and the last block is not a PADDING block, a new
383  * PADDING block is added to the end of the new data to make it the same
384  * size as the existing data (if possible, see the note to
385  * FLAC__metadata_simple_iterator_set_block() about the four byte limit)
386  * and the new data is written in place.  If none of the above apply or
387  * use_padding is false, the entire FLAC file is rewritten.
388  *
389  * If 'preserve_file_stats' is true, the owner and modification time will
390  * be preserved even if the FLAC file is written.
391  */
392 FLAC__bool FLAC__metadata_chain_write(FLAC__MetaData_Chain *chain, FLAC__bool use_padding, FLAC__bool preserve_file_stats);
393
394 /*
395  * This function will merge adjacent PADDING blocks into a single block.
396  *
397  * NOTE: this function does not write to the FLAC file, it only
398  * modifies the chain.
399  *
400  * NOTE: Any iterator on the current chain will become invalid after this
401  * call.  You should delete the iterator and get a new one.
402  */
403 void FLAC__metadata_chain_merge_padding(FLAC__MetaData_Chain *chain);
404
405 /*
406  * This function will move all PADDING blocks to the end on the metadata,
407  * then merge them into a single block.
408  *
409  * NOTE: this function does not write to the FLAC file, it only
410  * modifies the chain.
411  *
412  * NOTE: Any iterator on the current chain will become invalid after this
413  * call.  You should delete the iterator and get a new one.
414  */
415 void FLAC__metadata_chain_sort_padding(FLAC__MetaData_Chain *chain);
416
417
418 /*********** FLAC__MetaData_Iterator ***********/
419
420 /*
421  * Constructor/destructor
422  */
423 FLAC__MetaData_Iterator *FLAC__metadata_iterator_new();
424 void FLAC__metadata_iterator_delete(FLAC__MetaData_Iterator *iterator);
425
426 /*
427  * Initialize the iterator to point to the first metadata block in the
428  * given chain.
429  */
430 void FLAC__metadata_iterator_init(FLAC__MetaData_Iterator *iterator, FLAC__MetaData_Chain *chain);
431
432 /*
433  * These move the iterator forwards or backwards, returning false if
434  * already at the end.
435  */
436 FLAC__bool FLAC__metadata_iterator_next(FLAC__MetaData_Iterator *iterator);
437 FLAC__bool FLAC__metadata_iterator_prev(FLAC__MetaData_Iterator *iterator);
438
439 /*
440  * Get the type of the metadata block at the current position.
441  */
442 FLAC__MetaDataType FLAC__metadata_iterator_get_block_type(const FLAC__MetaData_Iterator *iterator);
443
444 /*
445  * Get the metadata block at the current position.  You can modify
446  * the block in place but must write the chain before the changes
447  * are reflected to the FLAC file.  You do not need to call
448  * FLAC__metadata_iterator_set_block() to reflect the changes;
449  * the pointer returned by FLAC__metadata_iterator_get_block()
450  * points directly into the chain.
451  *
452  * Do not call FLAC__metadata_object_delete() on the returned object;
453  * to delete a block use FLAC__metadata_iterator_delete_block().
454  */
455 FLAC__StreamMetaData *FLAC__metadata_iterator_get_block(FLAC__MetaData_Iterator *iterator);
456
457 /*
458  * Set the metadata block at the current position, replacing the existing
459  * block.  The new block passed in becomes owned by the chain and will be
460  * deleted when the chain is deleted.
461  */
462 FLAC__bool FLAC__metadata_iterator_set_block(FLAC__MetaData_Iterator *iterator, FLAC__StreamMetaData *block);
463
464 /*
465  * Removes the current block from the chain.  If replace_with_padding is
466  * true, the block will instead be replaced with a padding block of equal
467  * size.  You can not delete the STREAMINFO block.  The iterator will be
468  * left pointing to the block before the one just 'deleted', even if
469  * 'replace_with_padding' is true.
470  */
471 FLAC__bool FLAC__metadata_iterator_delete_block(FLAC__MetaData_Iterator *iterator, FLAC__bool replace_with_padding);
472
473 /*
474  * Insert a new block before or after the current block.  You cannot
475  * insert a block before the first STREAMINFO block.  You cannot
476  * insert a STREAMINFO block as there can be only one, the one that
477  * already exists at the head when you read in a chain.  The iterator
478  * will be left pointing to the new block.
479  */
480 FLAC__bool FLAC__metadata_iterator_insert_block_before(FLAC__MetaData_Iterator *iterator, FLAC__StreamMetaData *block);
481 FLAC__bool FLAC__metadata_iterator_insert_block_after(FLAC__MetaData_Iterator *iterator, FLAC__StreamMetaData *block);
482
483
484 /******************************************************************************
485         The following are methods for manipulating the defined block types.
486         Since many are variable length we have to be careful about the memory
487         management.  We decree that all pointers to data in the object are
488         owned by the object and memory-managed by the object.
489
490         Use the _new and _delete functions to create all instances.  When
491         using the _set_ functions to set pointers to data, set 'copy' to true
492         to have the function make it's own copy of the data, or to false to
493         give the object ownership of your data.  In the latter case your pointer
494         must be freeable by free() and will be free()d when the object is
495         FLAC__metadata_object_delete()d.  It is legal to pass a null pointer
496         as the data pointer to a _set_ function as long as then length argument
497         is 0 and the copy argument is 'false'.
498
499         The _new and _copy function will return NULL in the case of a memory
500         allocation error, otherwise a new object.  The _set_ functions return
501         false in the case of a memory allocation error.
502
503         We don't have the convenience of C++ here, so note that the library
504         relies on you to keep the types straight.  In other words, if you pass,
505         for example, a FLAC__StreamMetaData* that represents a STREAMINFO block
506         to FLAC__metadata_object_application_set_data(), you will get an
507         assertion failure.
508
509         There is no need to recalculate the length field on metadata blocks
510         you have modified.  They will be calculated automatically before they
511         are written back to a file.
512 ******************************************************************************/
513
514
515 /******************************************************************
516  * Common to all the types derived from FLAC__StreamMetaData:
517  */
518 FLAC__StreamMetaData *FLAC__metadata_object_new(FLAC__MetaDataType type);
519 FLAC__StreamMetaData *FLAC__metadata_object_copy(const FLAC__StreamMetaData *object);
520 void FLAC__metadata_object_delete(FLAC__StreamMetaData *object);
521
522 /******************************************************************
523  * FLAC__StreamMetaData_Application
524  * ----------------------------------------------------------------
525  * Note: 'length' is in bytes.
526  */
527 FLAC__bool FLAC__metadata_object_application_set_data(FLAC__StreamMetaData *object, FLAC__byte *data, unsigned length, FLAC__bool copy);
528
529 /******************************************************************
530  * FLAC__StreamMetaData_SeekPoint
531  * ----------------------------------------------------------------
532  * @@@@  You can
533  * use the _resize function to alter it.  If the size shrinks,
534  * elements will truncated; if it grows, new placeholder points
535  * will be added to the end.
536  */
537
538 /******************************************************************
539  * FLAC__StreamMetaData_SeekTable
540  */
541 FLAC__bool FLAC__metadata_object_seektable_resize_points(FLAC__StreamMetaData *object, unsigned new_num_points);
542 void FLAC__metadata_object_seektable_set_point(FLAC__StreamMetaData *object, unsigned point_num, FLAC__StreamMetaData_SeekPoint point);
543 FLAC__bool FLAC__metadata_object_seektable_insert_point(FLAC__StreamMetaData *object, unsigned point_num, FLAC__StreamMetaData_SeekPoint point);
544 FLAC__bool FLAC__metadata_object_seektable_delete_point(FLAC__StreamMetaData *object, unsigned point_num);
545
546 /******************************************************************
547  * FLAC__StreamMetaData_VorbisComment
548  */
549 FLAC__bool FLAC__metadata_object_vorbiscomment_set_vendor_string(FLAC__StreamMetaData *object, FLAC__StreamMetaData_VorbisComment_Entry entry, FLAC__bool copy);
550 FLAC__bool FLAC__metadata_object_vorbiscomment_resize_comments(FLAC__StreamMetaData *object, unsigned new_num_comments);
551 FLAC__bool FLAC__metadata_object_vorbiscomment_set_comment(FLAC__StreamMetaData *object, unsigned comment_num, FLAC__StreamMetaData_VorbisComment_Entry entry, FLAC__bool copy);
552 FLAC__bool FLAC__metadata_object_vorbiscomment_insert_comment(FLAC__StreamMetaData *object, unsigned comment_num, FLAC__StreamMetaData_VorbisComment_Entry entry, FLAC__bool copy);
553 FLAC__bool FLAC__metadata_object_vorbiscomment_delete_comment(FLAC__StreamMetaData *object, unsigned comment_num);
554
555 #ifdef __cplusplus
556 }
557 #endif
558
559 #endif