2002-05-17 06:33:39 +00:00
/* libFLAC++ - Free Lossless Audio Codec library
2004-01-17 04:14:43 +00:00
* Copyright ( C ) 2002 , 2003 , 2004 Josh Coalson
2002-05-17 06:33:39 +00:00
*
2003-01-31 23:34:56 +00:00
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
2002-05-17 06:33:39 +00:00
*
2003-01-31 23:34:56 +00:00
* - Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
2002-05-17 06:33:39 +00:00
*
2003-01-31 23:34:56 +00:00
* - Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
*
* - Neither the name of the Xiph . org Foundation nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* ` ` AS IS ' ' AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
* LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE FOUNDATION OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL ,
* EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO ,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR
* PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING
* NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
2002-05-17 06:33:39 +00:00
*/
# include "FLAC++/metadata.h"
# include "FLAC/assert.h"
2002-05-31 06:20:50 +00:00
# include <stdlib.h> // for malloc(), free()
# include <string.h> // for memcpy() etc.
2002-05-17 06:33:39 +00:00
2004-07-23 05:11:06 +00:00
# ifdef _MSC_VER
// warning C4800: 'int' : forcing to bool 'true' or 'false' (performance warning)
# pragma warning ( disable : 4800 )
# endif
2002-05-17 06:33:39 +00:00
namespace FLAC {
namespace Metadata {
2002-05-22 05:33:29 +00:00
// local utility routines
namespace local {
2002-06-08 04:53:42 +00:00
Prototype * construct_block ( : : FLAC__StreamMetadata * object )
2002-05-22 05:33:29 +00:00
{
Prototype * ret = 0 ;
switch ( object - > type ) {
case FLAC__METADATA_TYPE_STREAMINFO :
ret = new StreamInfo ( object , /*copy=*/ false ) ;
break ;
case FLAC__METADATA_TYPE_PADDING :
ret = new Padding ( object , /*copy=*/ false ) ;
break ;
case FLAC__METADATA_TYPE_APPLICATION :
ret = new Application ( object , /*copy=*/ false ) ;
break ;
case FLAC__METADATA_TYPE_SEEKTABLE :
ret = new SeekTable ( object , /*copy=*/ false ) ;
break ;
case FLAC__METADATA_TYPE_VORBIS_COMMENT :
ret = new VorbisComment ( object , /*copy=*/ false ) ;
break ;
2002-11-16 06:30:30 +00:00
case FLAC__METADATA_TYPE_CUESHEET :
ret = new CueSheet ( object , /*copy=*/ false ) ;
break ;
2002-05-22 05:33:29 +00:00
default :
2003-01-10 05:43:51 +00:00
ret = new Unknown ( object , /*copy=*/ false ) ;
2002-05-22 05:33:29 +00:00
break ;
}
return ret ;
}
} ;
2002-10-16 22:29:47 +00:00
FLACPP_API Prototype * clone ( const Prototype * object )
2002-06-08 04:53:42 +00:00
{
2002-07-27 05:02:11 +00:00
FLAC__ASSERT ( 0 ! = object ) ;
2002-06-08 04:53:42 +00:00
const StreamInfo * streaminfo = dynamic_cast < const StreamInfo * > ( object ) ;
const Padding * padding = dynamic_cast < const Padding * > ( object ) ;
const Application * application = dynamic_cast < const Application * > ( object ) ;
const SeekTable * seektable = dynamic_cast < const SeekTable * > ( object ) ;
const VorbisComment * vorbiscomment = dynamic_cast < const VorbisComment * > ( object ) ;
2002-11-19 06:19:29 +00:00
const CueSheet * cuesheet = dynamic_cast < const CueSheet * > ( object ) ;
2003-01-10 05:43:51 +00:00
const Unknown * unknown = dynamic_cast < const Unknown * > ( object ) ;
2002-06-08 04:53:42 +00:00
if ( 0 ! = streaminfo )
return new StreamInfo ( * streaminfo ) ;
else if ( 0 ! = padding )
return new Padding ( * padding ) ;
else if ( 0 ! = application )
return new Application ( * application ) ;
else if ( 0 ! = seektable )
return new SeekTable ( * seektable ) ;
else if ( 0 ! = vorbiscomment )
return new VorbisComment ( * vorbiscomment ) ;
2002-11-19 06:19:29 +00:00
else if ( 0 ! = cuesheet )
return new CueSheet ( * cuesheet ) ;
2003-01-10 05:43:51 +00:00
else if ( 0 ! = unknown )
return new Unknown ( * unknown ) ;
2002-06-08 04:53:42 +00:00
else {
FLAC__ASSERT ( 0 ) ;
return 0 ;
}
}
2002-05-17 06:33:39 +00:00
//
// Prototype
//
2002-06-08 04:53:42 +00:00
Prototype : : Prototype ( const Prototype & object ) :
object_ ( : : FLAC__metadata_object_clone ( object . object_ ) ) ,
is_reference_ ( false )
{
FLAC__ASSERT ( object . is_valid ( ) ) ;
}
Prototype : : Prototype ( const : : FLAC__StreamMetadata & object ) :
object_ ( : : FLAC__metadata_object_clone ( & object ) ) ,
is_reference_ ( false )
{
}
Prototype : : Prototype ( const : : FLAC__StreamMetadata * object ) :
object_ ( : : FLAC__metadata_object_clone ( object ) ) ,
is_reference_ ( false )
{
FLAC__ASSERT ( 0 ! = object ) ;
}
Prototype : : Prototype ( : : FLAC__StreamMetadata * object , bool copy ) :
object_ ( copy ? : : FLAC__metadata_object_clone ( object ) : object ) ,
is_reference_ ( false )
2002-05-17 06:33:39 +00:00
{
FLAC__ASSERT ( 0 ! = object ) ;
}
Prototype : : ~ Prototype ( )
2002-05-22 05:33:29 +00:00
{
clear ( ) ;
}
void Prototype : : clear ( )
2002-05-17 06:33:39 +00:00
{
2002-06-08 04:53:42 +00:00
if ( 0 ! = object_ & & ! is_reference_ )
2002-05-17 06:33:39 +00:00
FLAC__metadata_object_delete ( object_ ) ;
2002-05-22 05:33:29 +00:00
object_ = 0 ;
}
2005-01-07 01:09:07 +00:00
Prototype & Prototype : : operator = ( const Prototype & object )
2002-05-22 05:33:29 +00:00
{
2002-06-08 04:53:42 +00:00
FLAC__ASSERT ( object . is_valid ( ) ) ;
2002-05-22 05:33:29 +00:00
clear ( ) ;
2002-06-08 04:53:42 +00:00
is_reference_ = false ;
object_ = : : FLAC__metadata_object_clone ( object . object_ ) ;
2005-01-07 01:09:07 +00:00
return * this ;
2002-05-22 05:33:29 +00:00
}
2005-01-07 01:09:07 +00:00
Prototype & Prototype : : operator = ( const : : FLAC__StreamMetadata & object )
2002-05-22 05:33:29 +00:00
{
clear ( ) ;
is_reference_ = false ;
2002-06-08 04:53:42 +00:00
object_ = : : FLAC__metadata_object_clone ( & object ) ;
2005-01-07 01:09:07 +00:00
return * this ;
2002-05-22 05:33:29 +00:00
}
2005-01-07 01:09:07 +00:00
Prototype & Prototype : : operator = ( const : : FLAC__StreamMetadata * object )
2002-05-22 05:33:29 +00:00
{
FLAC__ASSERT ( 0 ! = object ) ;
clear ( ) ;
is_reference_ = false ;
2002-06-08 04:53:42 +00:00
object_ = : : FLAC__metadata_object_clone ( object ) ;
2005-01-07 01:09:07 +00:00
return * this ;
}
Prototype & Prototype : : assign_object ( : : FLAC__StreamMetadata * object , bool copy )
{
FLAC__ASSERT ( 0 ! = object ) ;
clear ( ) ;
object_ = ( copy ? : : FLAC__metadata_object_clone ( object ) : object ) ;
is_reference_ = false ;
return * this ;
2002-05-17 06:33:39 +00:00
}
bool Prototype : : get_is_last ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) object_ - > is_last ;
2002-05-17 06:33:39 +00:00
}
2002-06-08 04:53:42 +00:00
FLAC__MetadataType Prototype : : get_type ( ) const
2002-05-17 06:33:39 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > type ;
}
unsigned Prototype : : get_length ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > length ;
}
2002-06-08 04:53:42 +00:00
void Prototype : : set_is_last ( bool value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
object_ - > is_last = value ;
}
2002-05-31 06:20:50 +00:00
2002-05-17 06:33:39 +00:00
//
// StreamInfo
//
StreamInfo : : StreamInfo ( ) :
Prototype ( FLAC__metadata_object_new ( FLAC__METADATA_TYPE_STREAMINFO ) , /*copy=*/ false )
{ }
StreamInfo : : ~ StreamInfo ( )
{ }
unsigned StreamInfo : : get_min_blocksize ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . min_blocksize ;
}
unsigned StreamInfo : : get_max_blocksize ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . max_blocksize ;
}
unsigned StreamInfo : : get_min_framesize ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . min_framesize ;
}
unsigned StreamInfo : : get_max_framesize ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . max_framesize ;
}
unsigned StreamInfo : : get_sample_rate ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . sample_rate ;
}
unsigned StreamInfo : : get_channels ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . channels ;
}
unsigned StreamInfo : : get_bits_per_sample ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . bits_per_sample ;
}
FLAC__uint64 StreamInfo : : get_total_samples ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . total_samples ;
}
const FLAC__byte * StreamInfo : : get_md5sum ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . stream_info . md5sum ;
}
void StreamInfo : : set_min_blocksize ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value > = FLAC__MIN_BLOCK_SIZE ) ;
FLAC__ASSERT ( value < = FLAC__MAX_BLOCK_SIZE ) ;
object_ - > data . stream_info . min_blocksize = value ;
}
void StreamInfo : : set_max_blocksize ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value > = FLAC__MIN_BLOCK_SIZE ) ;
FLAC__ASSERT ( value < = FLAC__MAX_BLOCK_SIZE ) ;
object_ - > data . stream_info . max_blocksize = value ;
}
void StreamInfo : : set_min_framesize ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value < ( 1u < FLAC__STREAM_METADATA_STREAMINFO_MIN_FRAME_SIZE_LEN ) ) ;
object_ - > data . stream_info . min_framesize = value ;
}
void StreamInfo : : set_max_framesize ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value < ( 1u < FLAC__STREAM_METADATA_STREAMINFO_MAX_FRAME_SIZE_LEN ) ) ;
object_ - > data . stream_info . max_framesize = value ;
}
void StreamInfo : : set_sample_rate ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-07-15 05:24:56 +00:00
FLAC__ASSERT ( FLAC__format_sample_rate_is_valid ( value ) ) ;
2002-05-17 06:33:39 +00:00
object_ - > data . stream_info . sample_rate = value ;
}
void StreamInfo : : set_channels ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value > 0 ) ;
FLAC__ASSERT ( value < = FLAC__MAX_CHANNELS ) ;
object_ - > data . stream_info . channels = value ;
}
void StreamInfo : : set_bits_per_sample ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value > = FLAC__MIN_BITS_PER_SAMPLE ) ;
FLAC__ASSERT ( value < = FLAC__MAX_BITS_PER_SAMPLE ) ;
object_ - > data . stream_info . bits_per_sample = value ;
}
void StreamInfo : : set_total_samples ( FLAC__uint64 value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value < ( 1u < < FLAC__STREAM_METADATA_STREAMINFO_TOTAL_SAMPLES_LEN ) ) ;
object_ - > data . stream_info . total_samples = value ;
}
void StreamInfo : : set_md5sum ( const FLAC__byte value [ 16 ] )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( 0 ! = value ) ;
memcpy ( object_ - > data . stream_info . md5sum , value , 16 ) ;
}
2002-05-31 06:20:50 +00:00
2002-05-17 06:33:39 +00:00
//
// Padding
//
Padding : : Padding ( ) :
Prototype ( FLAC__metadata_object_new ( FLAC__METADATA_TYPE_PADDING ) , /*copy=*/ false )
{ }
Padding : : ~ Padding ( )
{ }
2002-05-31 06:20:50 +00:00
void Padding : : set_length ( unsigned length )
{
FLAC__ASSERT ( is_valid ( ) ) ;
object_ - > length = length ;
}
2002-05-17 06:33:39 +00:00
//
// Application
//
Application : : Application ( ) :
Prototype ( FLAC__metadata_object_new ( FLAC__METADATA_TYPE_APPLICATION ) , /*copy=*/ false )
{ }
Application : : ~ Application ( )
{ }
const FLAC__byte * Application : : get_id ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . application . id ;
}
const FLAC__byte * Application : : get_data ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . application . data ;
}
2002-06-08 04:53:42 +00:00
void Application : : set_id ( const FLAC__byte value [ 4 ] )
2002-05-17 06:33:39 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( 0 ! = value ) ;
memcpy ( object_ - > data . application . id , value , 4 ) ;
}
2002-06-08 04:53:42 +00:00
bool Application : : set_data ( const FLAC__byte * data , unsigned length )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_object_application_set_data ( object_ , ( FLAC__byte * ) data , length , true ) ;
}
2002-05-17 06:33:39 +00:00
bool Application : : set_data ( FLAC__byte * data , unsigned length , bool copy )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_object_application_set_data ( object_ , data , length , copy ) ;
2002-05-17 06:33:39 +00:00
}
2002-05-31 06:20:50 +00:00
2002-05-17 06:33:39 +00:00
//
// SeekTable
//
SeekTable : : SeekTable ( ) :
Prototype ( FLAC__metadata_object_new ( FLAC__METADATA_TYPE_SEEKTABLE ) , /*copy=*/ false )
{ }
SeekTable : : ~ SeekTable ( )
{ }
2002-05-31 06:20:50 +00:00
unsigned SeekTable : : get_num_points ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . seek_table . num_points ;
}
2002-06-08 04:53:42 +00:00
: : FLAC__StreamMetadata_SeekPoint SeekTable : : get_point ( unsigned index ) const
2002-05-31 06:20:50 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < object_ - > data . seek_table . num_points ) ;
return object_ - > data . seek_table . points [ index ] ;
}
2002-06-08 04:53:42 +00:00
void SeekTable : : set_point ( unsigned index , const : : FLAC__StreamMetadata_SeekPoint & point )
2002-05-31 06:20:50 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < object_ - > data . seek_table . num_points ) ;
: : FLAC__metadata_object_seektable_set_point ( object_ , index , point ) ;
}
2002-06-08 04:53:42 +00:00
bool SeekTable : : insert_point ( unsigned index , const : : FLAC__StreamMetadata_SeekPoint & point )
2002-05-31 06:20:50 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < = object_ - > data . seek_table . num_points ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_object_seektable_insert_point ( object_ , index , point ) ;
2002-05-31 06:20:50 +00:00
}
bool SeekTable : : delete_point ( unsigned index )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < object_ - > data . seek_table . num_points ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_object_seektable_delete_point ( object_ , index ) ;
2002-05-31 06:20:50 +00:00
}
2002-06-05 05:56:41 +00:00
bool SeekTable : : is_legal ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_object_seektable_is_legal ( object_ ) ;
}
2002-05-31 06:20:50 +00:00
//
// VorbisComment::Entry
//
VorbisComment : : Entry : : Entry ( )
{
zero ( ) ;
}
VorbisComment : : Entry : : Entry ( const char * field , unsigned field_length )
{
zero ( ) ;
construct ( field , field_length ) ;
}
2004-12-30 00:59:30 +00:00
VorbisComment : : Entry : : Entry ( const char * field )
{
zero ( ) ;
construct ( field ) ;
}
2002-05-31 06:20:50 +00:00
VorbisComment : : Entry : : Entry ( const char * field_name , const char * field_value , unsigned field_value_length )
{
zero ( ) ;
construct ( field_name , field_value , field_value_length ) ;
}
2004-12-30 00:59:30 +00:00
VorbisComment : : Entry : : Entry ( const char * field_name , const char * field_value )
{
zero ( ) ;
construct ( field_name , field_value ) ;
}
2002-05-31 06:20:50 +00:00
VorbisComment : : Entry : : Entry ( const Entry & entry )
{
2002-06-08 04:53:42 +00:00
FLAC__ASSERT ( entry . is_valid ( ) ) ;
2002-05-31 06:20:50 +00:00
zero ( ) ;
2002-06-08 04:53:42 +00:00
construct ( ( const char * ) entry . entry_ . entry , entry . entry_ . length ) ;
2002-05-31 06:20:50 +00:00
}
2005-01-07 01:09:07 +00:00
VorbisComment : : Entry & VorbisComment : : Entry : : operator = ( const Entry & entry )
2002-05-31 06:20:50 +00:00
{
2002-06-08 04:53:42 +00:00
FLAC__ASSERT ( entry . is_valid ( ) ) ;
2002-05-31 06:20:50 +00:00
clear ( ) ;
2002-06-08 04:53:42 +00:00
construct ( ( const char * ) entry . entry_ . entry , entry . entry_ . length ) ;
2005-01-07 01:09:07 +00:00
return * this ;
2002-05-31 06:20:50 +00:00
}
VorbisComment : : Entry : : ~ Entry ( )
{
clear ( ) ;
}
bool VorbisComment : : Entry : : is_valid ( ) const
{
return is_valid_ ;
}
unsigned VorbisComment : : Entry : : get_field_length ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return entry_ . length ;
}
unsigned VorbisComment : : Entry : : get_field_name_length ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return field_name_length_ ;
}
unsigned VorbisComment : : Entry : : get_field_value_length ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return field_value_length_ ;
}
2002-06-08 04:53:42 +00:00
: : FLAC__StreamMetadata_VorbisComment_Entry VorbisComment : : Entry : : get_entry ( ) const
2002-05-31 06:20:50 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
return entry_ ;
}
const char * VorbisComment : : Entry : : get_field ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( const char * ) entry_ . entry ;
}
const char * VorbisComment : : Entry : : get_field_name ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return field_name_ ;
}
const char * VorbisComment : : Entry : : get_field_value ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return field_value_ ;
}
bool VorbisComment : : Entry : : set_field ( const char * field , unsigned field_length )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( 0 ! = field ) ;
2004-12-30 03:41:19 +00:00
if ( ! : : FLAC__format_vorbiscomment_entry_is_legal ( ( const : : FLAC__byte * ) field , field_length ) )
return is_valid_ = false ;
2002-05-31 06:20:50 +00:00
clear_entry ( ) ;
2004-12-30 00:59:30 +00:00
if ( 0 = = ( entry_ . entry = ( FLAC__byte * ) malloc ( field_length + 1 ) ) ) {
2002-05-31 06:20:50 +00:00
is_valid_ = false ;
}
else {
entry_ . length = field_length ;
memcpy ( entry_ . entry , field , field_length ) ;
2004-12-30 00:59:30 +00:00
entry_ . entry [ field_length ] = ' \0 ' ;
2002-06-08 04:53:42 +00:00
( void ) parse_field ( ) ;
2002-05-31 06:20:50 +00:00
}
return is_valid_ ;
}
2004-12-30 00:59:30 +00:00
bool VorbisComment : : Entry : : set_field ( const char * field )
{
return set_field ( field , strlen ( field ) ) ;
}
2002-05-31 06:20:50 +00:00
bool VorbisComment : : Entry : : set_field_name ( const char * field_name )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( 0 ! = field_name ) ;
2004-12-30 03:41:19 +00:00
if ( ! : : FLAC__format_vorbiscomment_entry_name_is_legal ( field_name ) )
return is_valid_ = false ;
2002-05-31 06:20:50 +00:00
clear_field_name ( ) ;
if ( 0 = = ( field_name_ = strdup ( field_name ) ) ) {
is_valid_ = false ;
}
else {
field_name_length_ = strlen ( field_name_ ) ;
compose_field ( ) ;
}
return is_valid_ ;
}
bool VorbisComment : : Entry : : set_field_value ( const char * field_value , unsigned field_value_length )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( 0 ! = field_value ) ;
2004-12-30 03:41:19 +00:00
if ( ! : : FLAC__format_vorbiscomment_entry_value_is_legal ( ( const FLAC__byte * ) field_value , field_value_length ) )
return is_valid_ = false ;
2002-05-31 06:20:50 +00:00
clear_field_value ( ) ;
2004-12-30 00:59:30 +00:00
if ( 0 = = ( field_value_ = ( char * ) malloc ( field_value_length + 1 ) ) ) {
2002-05-31 06:20:50 +00:00
is_valid_ = false ;
}
else {
field_value_length_ = field_value_length ;
memcpy ( field_value_ , field_value , field_value_length ) ;
2004-12-30 00:59:30 +00:00
field_value_ [ field_value_length ] = ' \0 ' ;
2002-05-31 06:20:50 +00:00
compose_field ( ) ;
}
return is_valid_ ;
}
2004-12-30 00:59:30 +00:00
bool VorbisComment : : Entry : : set_field_value ( const char * field_value )
{
return set_field_value ( field_value , strlen ( field_value ) ) ;
}
2002-05-31 06:20:50 +00:00
void VorbisComment : : Entry : : zero ( )
{
2002-06-08 04:53:42 +00:00
is_valid_ = true ;
2002-05-31 06:20:50 +00:00
entry_ . length = 0 ;
entry_ . entry = 0 ;
field_name_ = 0 ;
field_name_length_ = 0 ;
field_value_ = 0 ;
field_value_length_ = 0 ;
}
void VorbisComment : : Entry : : clear ( )
{
clear_entry ( ) ;
clear_field_name ( ) ;
clear_field_value ( ) ;
2002-06-08 04:53:42 +00:00
is_valid_ = true ;
2002-05-31 06:20:50 +00:00
}
void VorbisComment : : Entry : : clear_entry ( )
{
if ( 0 ! = entry_ . entry ) {
free ( entry_ . entry ) ;
entry_ . entry = 0 ;
entry_ . length = 0 ;
}
}
void VorbisComment : : Entry : : clear_field_name ( )
{
if ( 0 ! = field_name_ ) {
free ( field_name_ ) ;
field_name_ = 0 ;
field_name_length_ = 0 ;
}
}
void VorbisComment : : Entry : : clear_field_value ( )
{
if ( 0 ! = field_value_ ) {
free ( field_value_ ) ;
field_value_ = 0 ;
field_value_length_ = 0 ;
}
}
void VorbisComment : : Entry : : construct ( const char * field , unsigned field_length )
{
2002-06-08 04:53:42 +00:00
if ( set_field ( field , field_length ) )
2002-05-31 06:20:50 +00:00
parse_field ( ) ;
}
2004-12-30 00:59:30 +00:00
void VorbisComment : : Entry : : construct ( const char * field )
{
construct ( field , strlen ( field ) ) ;
}
2002-05-31 06:20:50 +00:00
void VorbisComment : : Entry : : construct ( const char * field_name , const char * field_value , unsigned field_value_length )
{
2002-06-08 04:53:42 +00:00
if ( set_field_name ( field_name ) & & set_field_value ( field_value , field_value_length ) )
compose_field ( ) ;
2002-05-31 06:20:50 +00:00
}
2004-12-30 00:59:30 +00:00
void VorbisComment : : Entry : : construct ( const char * field_name , const char * field_value )
{
construct ( field_name , field_value , strlen ( field_value ) ) ;
}
2002-05-31 06:20:50 +00:00
void VorbisComment : : Entry : : compose_field ( )
{
clear_entry ( ) ;
2004-12-30 00:59:30 +00:00
if ( 0 = = ( entry_ . entry = ( FLAC__byte * ) malloc ( field_name_length_ + 1 + field_value_length_ + 1 ) ) ) {
2002-06-08 04:53:42 +00:00
is_valid_ = false ;
2002-05-31 06:20:50 +00:00
}
else {
memcpy ( entry_ . entry , field_name_ , field_name_length_ ) ;
entry_ . length + = field_name_length_ ;
memcpy ( entry_ . entry + entry_ . length , " = " , 1 ) ;
entry_ . length + = 1 ;
2002-06-08 04:53:42 +00:00
memcpy ( entry_ . entry + entry_ . length , field_value_ , field_value_length_ ) ;
2002-05-31 06:20:50 +00:00
entry_ . length + = field_value_length_ ;
2004-12-30 00:59:30 +00:00
entry_ . entry [ entry_ . length ] = ' \0 ' ;
2002-05-31 06:20:50 +00:00
is_valid_ = true ;
}
}
void VorbisComment : : Entry : : parse_field ( )
{
clear_field_name ( ) ;
clear_field_value ( ) ;
const char * p = ( const char * ) memchr ( entry_ . entry , ' = ' , entry_ . length ) ;
2002-06-08 04:53:42 +00:00
if ( 0 = = p )
p = ( const char * ) entry_ . entry + entry_ . length ;
2002-05-31 06:20:50 +00:00
2002-06-08 04:53:42 +00:00
field_name_length_ = p - ( const char * ) entry_ . entry ;
if ( 0 = = ( field_name_ = ( char * ) malloc ( field_name_length_ + 1 ) ) ) { // +1 for the trailing \0
is_valid_ = false ;
2002-05-31 06:20:50 +00:00
return ;
}
memcpy ( field_name_ , entry_ . entry , field_name_length_ ) ;
field_name_ [ field_name_length_ ] = ' \0 ' ;
2002-06-08 04:53:42 +00:00
if ( entry_ . length - field_name_length_ = = 0 ) {
field_value_length_ = 0 ;
if ( 0 = = ( field_value_ = ( char * ) malloc ( 0 ) ) ) {
is_valid_ = false ;
return ;
}
}
else {
field_value_length_ = entry_ . length - field_name_length_ - 1 ;
2004-12-30 00:59:30 +00:00
if ( 0 = = ( field_value_ = ( char * ) malloc ( field_value_length_ + 1 ) ) ) { // +1 for the trailing \0
2002-06-08 04:53:42 +00:00
is_valid_ = false ;
return ;
}
memcpy ( field_value_ , + + p , field_value_length_ ) ;
2004-12-30 00:59:30 +00:00
field_value_ [ field_value_length_ ] = ' \0 ' ;
2002-05-31 06:20:50 +00:00
}
is_valid_ = true ;
}
2002-05-17 06:33:39 +00:00
//
// VorbisComment
//
VorbisComment : : VorbisComment ( ) :
Prototype ( FLAC__metadata_object_new ( FLAC__METADATA_TYPE_VORBIS_COMMENT ) , /*copy=*/ false )
{ }
VorbisComment : : ~ VorbisComment ( )
{ }
2002-05-31 06:20:50 +00:00
unsigned VorbisComment : : get_num_comments ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . vorbis_comment . num_comments ;
}
2004-12-30 03:41:19 +00:00
const FLAC__byte * VorbisComment : : get_vendor_string ( ) const
2002-05-31 06:20:50 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
2004-12-30 03:41:19 +00:00
return object_ - > data . vorbis_comment . vendor_string . entry ;
2002-05-31 06:20:50 +00:00
}
VorbisComment : : Entry VorbisComment : : get_comment ( unsigned index ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < object_ - > data . vorbis_comment . num_comments ) ;
2002-06-08 04:53:42 +00:00
return Entry ( ( const char * ) object_ - > data . vorbis_comment . comments [ index ] . entry , object_ - > data . vorbis_comment . comments [ index ] . length ) ;
2002-05-31 06:20:50 +00:00
}
2004-12-30 03:41:19 +00:00
bool VorbisComment : : set_vendor_string ( const FLAC__byte * string )
2002-05-31 06:20:50 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-08 04:53:42 +00:00
// vendor_string is a special kind of entry
2004-12-30 03:41:19 +00:00
const : : FLAC__StreamMetadata_VorbisComment_Entry vendor_string = { strlen ( ( const char * ) string ) , ( FLAC__byte * ) string } ; // we can cheat on const-ness because we make a copy below:
2002-06-08 04:53:42 +00:00
return ( bool ) : : FLAC__metadata_object_vorbiscomment_set_vendor_string ( object_ , vendor_string , /*copy=*/ true ) ;
2002-05-31 06:20:50 +00:00
}
bool VorbisComment : : set_comment ( unsigned index , const VorbisComment : : Entry & entry )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < object_ - > data . vorbis_comment . num_comments ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_object_vorbiscomment_set_comment ( object_ , index , entry . get_entry ( ) , /*copy=*/ true ) ;
2002-05-31 06:20:50 +00:00
}
bool VorbisComment : : insert_comment ( unsigned index , const VorbisComment : : Entry & entry )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < = object_ - > data . vorbis_comment . num_comments ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_object_vorbiscomment_insert_comment ( object_ , index , entry . get_entry ( ) , /*copy=*/ true ) ;
2002-05-31 06:20:50 +00:00
}
2004-12-30 00:59:30 +00:00
bool VorbisComment : : append_comment ( const VorbisComment : : Entry & entry )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_object_vorbiscomment_append_comment ( object_ , entry . get_entry ( ) , /*copy=*/ true ) ;
}
2002-05-31 06:20:50 +00:00
bool VorbisComment : : delete_comment ( unsigned index )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( index < object_ - > data . vorbis_comment . num_comments ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_object_vorbiscomment_delete_comment ( object_ , index ) ;
2002-05-31 06:20:50 +00:00
}
2002-11-16 06:30:30 +00:00
//
// CueSheet::Track
//
CueSheet : : Track : : Track ( ) :
object_ ( : : FLAC__metadata_object_cuesheet_track_new ( ) )
{ }
CueSheet : : Track : : Track ( const : : FLAC__StreamMetadata_CueSheet_Track * track ) :
object_ ( : : FLAC__metadata_object_cuesheet_track_clone ( track ) )
{ }
CueSheet : : Track : : Track ( const Track & track ) :
object_ ( : : FLAC__metadata_object_cuesheet_track_clone ( track . object_ ) )
{ }
2005-01-07 01:09:07 +00:00
CueSheet : : Track & CueSheet : : Track : : operator = ( const Track & track )
2002-11-16 06:30:30 +00:00
{
2002-12-27 21:05:18 +00:00
if ( 0 ! = object_ )
2002-12-28 07:07:57 +00:00
: : FLAC__metadata_object_cuesheet_track_delete ( object_ ) ;
2002-11-16 06:30:30 +00:00
object_ = : : FLAC__metadata_object_cuesheet_track_clone ( track . object_ ) ;
2005-01-07 01:09:07 +00:00
return * this ;
2002-11-16 06:30:30 +00:00
}
CueSheet : : Track : : ~ Track ( )
{
if ( 0 ! = object_ )
2002-12-28 07:07:57 +00:00
: : FLAC__metadata_object_cuesheet_track_delete ( object_ ) ;
2002-11-16 06:30:30 +00:00
}
bool CueSheet : : Track : : is_valid ( ) const
{
return ( 0 ! = object_ ) ;
}
: : FLAC__StreamMetadata_CueSheet_Index CueSheet : : Track : : get_index ( unsigned i ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( i < object_ - > num_indices ) ;
return object_ - > indices [ i ] ;
}
2002-11-19 06:19:29 +00:00
void CueSheet : : Track : : set_isrc ( const char value [ 12 ] )
2002-11-16 06:30:30 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( 0 ! = value ) ;
memcpy ( object_ - > isrc , value , 12 ) ;
object_ - > isrc [ 12 ] = ' \0 ' ;
}
void CueSheet : : Track : : set_type ( unsigned value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( value < = 1 ) ;
object_ - > type = value ;
}
2002-11-19 06:19:29 +00:00
void CueSheet : : Track : : set_index ( unsigned i , const : : FLAC__StreamMetadata_CueSheet_Index & index )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( i < object_ - > num_indices ) ;
object_ - > indices [ i ] = index ;
}
2002-11-16 06:30:30 +00:00
//
// CueSheet
//
CueSheet : : CueSheet ( ) :
Prototype ( FLAC__metadata_object_new ( FLAC__METADATA_TYPE_CUESHEET ) , /*copy=*/ false )
{ }
CueSheet : : ~ CueSheet ( )
{ }
2002-11-19 06:19:29 +00:00
const char * CueSheet : : get_media_catalog_number ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . cue_sheet . media_catalog_number ;
}
FLAC__uint64 CueSheet : : get_lead_in ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . cue_sheet . lead_in ;
}
2002-12-05 06:37:46 +00:00
bool CueSheet : : get_is_cd ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . cue_sheet . is_cd ? true : false ;
}
2002-11-16 06:30:30 +00:00
unsigned CueSheet : : get_num_tracks ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . cue_sheet . num_tracks ;
}
CueSheet : : Track CueSheet : : get_track ( unsigned i ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( i < object_ - > data . cue_sheet . num_tracks ) ;
return Track ( object_ - > data . cue_sheet . tracks + i ) ;
}
2002-11-19 06:19:29 +00:00
void CueSheet : : set_media_catalog_number ( const char value [ 128 ] )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( 0 ! = value ) ;
memcpy ( object_ - > data . cue_sheet . media_catalog_number , value , 128 ) ;
object_ - > data . cue_sheet . media_catalog_number [ 128 ] = ' \0 ' ;
}
void CueSheet : : set_lead_in ( FLAC__uint64 value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
object_ - > data . cue_sheet . lead_in = value ;
}
2002-12-05 06:37:46 +00:00
void CueSheet : : set_is_cd ( bool value )
{
FLAC__ASSERT ( is_valid ( ) ) ;
object_ - > data . cue_sheet . is_cd = value ;
}
2002-11-19 06:19:29 +00:00
void CueSheet : : set_index ( unsigned track_num , unsigned index_num , const : : FLAC__StreamMetadata_CueSheet_Index & index )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( track_num < object_ - > data . cue_sheet . num_tracks ) ;
FLAC__ASSERT ( index_num < object_ - > data . cue_sheet . tracks [ track_num ] . num_indices ) ;
object_ - > data . cue_sheet . tracks [ track_num ] . indices [ index_num ] = index ;
}
2002-11-16 06:30:30 +00:00
bool CueSheet : : insert_index ( unsigned track_num , unsigned index_num , const : : FLAC__StreamMetadata_CueSheet_Index & index )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( track_num < object_ - > data . cue_sheet . num_tracks ) ;
FLAC__ASSERT ( index_num < = object_ - > data . cue_sheet . tracks [ track_num ] . num_indices ) ;
return ( bool ) : : FLAC__metadata_object_cuesheet_track_insert_index ( object_ , track_num , index_num , index ) ;
}
bool CueSheet : : delete_index ( unsigned track_num , unsigned index_num )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( track_num < object_ - > data . cue_sheet . num_tracks ) ;
FLAC__ASSERT ( index_num < object_ - > data . cue_sheet . tracks [ track_num ] . num_indices ) ;
return ( bool ) : : FLAC__metadata_object_cuesheet_track_delete_index ( object_ , track_num , index_num ) ;
}
bool CueSheet : : set_track ( unsigned i , const CueSheet : : Track & track )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( i < object_ - > data . cue_sheet . num_tracks ) ;
// We can safely const_cast since copy=true
return ( bool ) : : FLAC__metadata_object_cuesheet_set_track ( object_ , i , const_cast < : : FLAC__StreamMetadata_CueSheet_Track * > ( track . get_track ( ) ) , /*copy=*/ true ) ;
}
bool CueSheet : : insert_track ( unsigned i , const CueSheet : : Track & track )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( i < = object_ - > data . cue_sheet . num_tracks ) ;
// We can safely const_cast since copy=true
return ( bool ) : : FLAC__metadata_object_cuesheet_insert_track ( object_ , i , const_cast < : : FLAC__StreamMetadata_CueSheet_Track * > ( track . get_track ( ) ) , /*copy=*/ true ) ;
}
bool CueSheet : : delete_track ( unsigned i )
{
FLAC__ASSERT ( is_valid ( ) ) ;
FLAC__ASSERT ( i < object_ - > data . cue_sheet . num_tracks ) ;
return ( bool ) : : FLAC__metadata_object_cuesheet_delete_track ( object_ , i ) ;
}
bool CueSheet : : is_legal ( bool check_cd_da_subset , const char * * violation ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_object_cuesheet_is_legal ( object_ , check_cd_da_subset , violation ) ;
}
2003-01-10 05:43:51 +00:00
//
// Unknown
//
Unknown : : Unknown ( ) :
Prototype ( FLAC__metadata_object_new ( FLAC__METADATA_TYPE_APPLICATION ) , /*copy=*/ false )
{ }
Unknown : : ~ Unknown ( )
{ }
const FLAC__byte * Unknown : : get_data ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
return object_ - > data . application . data ;
}
bool Unknown : : set_data ( const FLAC__byte * data , unsigned length )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_object_application_set_data ( object_ , ( FLAC__byte * ) data , length , true ) ;
}
bool Unknown : : set_data ( FLAC__byte * data , unsigned length , bool copy )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_object_application_set_data ( object_ , data , length , copy ) ;
}
2002-05-31 06:20:50 +00:00
2002-05-22 05:33:29 +00:00
// ============================================================
//
// Level 0
//
// ============================================================
2002-10-16 22:29:47 +00:00
FLACPP_API bool get_streaminfo ( const char * filename , StreamInfo & streaminfo )
2002-05-22 05:33:29 +00:00
{
FLAC__ASSERT ( 0 ! = filename ) ;
2004-07-30 01:54:29 +00:00
: : FLAC__StreamMetadata object ;
2002-05-22 05:33:29 +00:00
2004-07-30 01:54:29 +00:00
if ( : : FLAC__metadata_get_streaminfo ( filename , & object ) ) {
streaminfo = object ;
return true ;
}
else
return false ;
}
FLACPP_API bool get_tags ( const char * filename , VorbisComment * & tags )
{
FLAC__ASSERT ( 0 ! = filename ) ;
: : FLAC__StreamMetadata * object ;
tags = 0 ;
if ( : : FLAC__metadata_get_tags ( filename , & object ) ) {
tags = new VorbisComment ( object , /*copy=*/ false ) ;
2002-05-22 05:33:29 +00:00
return true ;
}
else
return false ;
}
2005-01-07 01:09:07 +00:00
FLACPP_API bool get_tags ( const char * filename , VorbisComment & tags )
{
FLAC__ASSERT ( 0 ! = filename ) ;
: : FLAC__StreamMetadata * object ;
if ( : : FLAC__metadata_get_tags ( filename , & object ) ) {
tags . assign ( object , /*copy=*/ false ) ;
return true ;
}
else
return false ;
}
2002-05-22 05:33:29 +00:00
// ============================================================
//
// Level 1
//
// ============================================================
SimpleIterator : : SimpleIterator ( ) :
iterator_ ( : : FLAC__metadata_simple_iterator_new ( ) )
{ }
SimpleIterator : : ~ SimpleIterator ( )
{
clear ( ) ;
}
void SimpleIterator : : clear ( )
{
if ( 0 ! = iterator_ )
FLAC__metadata_simple_iterator_delete ( iterator_ ) ;
iterator_ = 0 ;
}
2002-08-30 05:41:31 +00:00
bool SimpleIterator : : init ( const char * filename , bool read_only , bool preserve_file_stats )
2002-05-22 05:33:29 +00:00
{
FLAC__ASSERT ( 0 ! = filename ) ;
FLAC__ASSERT ( is_valid ( ) ) ;
2002-08-30 05:41:31 +00:00
return ( bool ) : : FLAC__metadata_simple_iterator_init ( iterator_ , filename , read_only , preserve_file_stats ) ;
2002-05-22 05:33:29 +00:00
}
bool SimpleIterator : : is_valid ( ) const
{
return 0 ! = iterator_ ;
}
SimpleIterator : : Status SimpleIterator : : status ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return Status ( : : FLAC__metadata_simple_iterator_status ( iterator_ ) ) ;
}
bool SimpleIterator : : is_writable ( ) const
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_simple_iterator_is_writable ( iterator_ ) ;
2002-05-22 05:33:29 +00:00
}
bool SimpleIterator : : next ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_simple_iterator_next ( iterator_ ) ;
2002-05-22 05:33:29 +00:00
}
bool SimpleIterator : : prev ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_simple_iterator_prev ( iterator_ ) ;
2002-05-22 05:33:29 +00:00
}
2002-06-08 04:53:42 +00:00
: : FLAC__MetadataType SimpleIterator : : get_block_type ( ) const
2002-05-22 05:33:29 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
return : : FLAC__metadata_simple_iterator_get_block_type ( iterator_ ) ;
}
Prototype * SimpleIterator : : get_block ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return local : : construct_block ( : : FLAC__metadata_simple_iterator_get_block ( iterator_ ) ) ;
}
bool SimpleIterator : : set_block ( Prototype * block , bool use_padding )
{
FLAC__ASSERT ( 0 ! = block ) ;
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_simple_iterator_set_block ( iterator_ , block - > object_ , use_padding ) ;
2002-05-22 05:33:29 +00:00
}
bool SimpleIterator : : insert_block_after ( Prototype * block , bool use_padding )
{
FLAC__ASSERT ( 0 ! = block ) ;
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_simple_iterator_insert_block_after ( iterator_ , block - > object_ , use_padding ) ;
2002-05-22 05:33:29 +00:00
}
bool SimpleIterator : : delete_block ( bool use_padding )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_simple_iterator_delete_block ( iterator_ , use_padding ) ;
2002-05-22 05:33:29 +00:00
}
// ============================================================
//
// Level 2
//
// ============================================================
Chain : : Chain ( ) :
chain_ ( : : FLAC__metadata_chain_new ( ) )
{ }
Chain : : ~ Chain ( )
{
clear ( ) ;
}
void Chain : : clear ( )
{
if ( 0 ! = chain_ )
FLAC__metadata_chain_delete ( chain_ ) ;
chain_ = 0 ;
}
bool Chain : : is_valid ( ) const
{
return 0 ! = chain_ ;
}
Chain : : Status Chain : : status ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return Status ( : : FLAC__metadata_chain_status ( chain_ ) ) ;
}
bool Chain : : read ( const char * filename )
{
FLAC__ASSERT ( 0 ! = filename ) ;
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_chain_read ( chain_ , filename ) ;
2002-05-22 05:33:29 +00:00
}
2004-07-15 16:22:43 +00:00
bool Chain : : read ( FLAC__IOHandle handle , : : FLAC__IOCallbacks callbacks )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_chain_read_with_callbacks ( chain_ , handle , callbacks ) ;
}
bool Chain : : check_if_tempfile_needed ( bool use_padding )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_chain_check_if_tempfile_needed ( chain_ , use_padding ) ;
}
2002-05-22 05:33:29 +00:00
bool Chain : : write ( bool use_padding , bool preserve_file_stats )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_chain_write ( chain_ , use_padding , preserve_file_stats ) ;
2002-05-22 05:33:29 +00:00
}
2004-07-15 16:22:43 +00:00
bool Chain : : write ( bool use_padding , : : FLAC__IOHandle handle , : : FLAC__IOCallbacks callbacks )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_chain_write_with_callbacks ( chain_ , use_padding , handle , callbacks ) ;
}
bool Chain : : write ( bool use_padding , : : FLAC__IOHandle handle , : : FLAC__IOCallbacks callbacks , : : FLAC__IOHandle temp_handle , : : FLAC__IOCallbacks temp_callbacks )
{
FLAC__ASSERT ( is_valid ( ) ) ;
return ( bool ) : : FLAC__metadata_chain_write_with_callbacks_and_tempfile ( chain_ , use_padding , handle , callbacks , temp_handle , temp_callbacks ) ;
}
2002-05-22 05:33:29 +00:00
void Chain : : merge_padding ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
: : FLAC__metadata_chain_merge_padding ( chain_ ) ;
}
void Chain : : sort_padding ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
: : FLAC__metadata_chain_sort_padding ( chain_ ) ;
}
Iterator : : Iterator ( ) :
iterator_ ( : : FLAC__metadata_iterator_new ( ) )
{ }
Iterator : : ~ Iterator ( )
{
clear ( ) ;
}
void Iterator : : clear ( )
{
if ( 0 ! = iterator_ )
FLAC__metadata_iterator_delete ( iterator_ ) ;
iterator_ = 0 ;
}
bool Iterator : : is_valid ( ) const
{
return 0 ! = iterator_ ;
}
2002-06-10 04:42:35 +00:00
void Iterator : : init ( Chain & chain )
2002-05-22 05:33:29 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-10 04:42:35 +00:00
FLAC__ASSERT ( chain . is_valid ( ) ) ;
: : FLAC__metadata_iterator_init ( iterator_ , chain . chain_ ) ;
2002-05-22 05:33:29 +00:00
}
bool Iterator : : next ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_iterator_next ( iterator_ ) ;
2002-05-22 05:33:29 +00:00
}
bool Iterator : : prev ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_iterator_prev ( iterator_ ) ;
2002-05-22 05:33:29 +00:00
}
2002-08-27 05:46:11 +00:00
: : FLAC__MetadataType Iterator : : get_block_type ( ) const
2002-05-22 05:33:29 +00:00
{
FLAC__ASSERT ( is_valid ( ) ) ;
return : : FLAC__metadata_iterator_get_block_type ( iterator_ ) ;
}
Prototype * Iterator : : get_block ( )
{
FLAC__ASSERT ( is_valid ( ) ) ;
Prototype * block = local : : construct_block ( : : FLAC__metadata_iterator_get_block ( iterator_ ) ) ;
if ( 0 ! = block )
block - > set_reference ( true ) ;
return block ;
}
bool Iterator : : set_block ( Prototype * block )
{
FLAC__ASSERT ( 0 ! = block ) ;
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
bool ret = ( bool ) : : FLAC__metadata_iterator_set_block ( iterator_ , block - > object_ ) ;
2002-05-22 05:33:29 +00:00
if ( ret ) {
block - > set_reference ( true ) ;
delete block ;
}
return ret ;
}
bool Iterator : : delete_block ( bool replace_with_padding )
{
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
return ( bool ) : : FLAC__metadata_iterator_delete_block ( iterator_ , replace_with_padding ) ;
2002-05-22 05:33:29 +00:00
}
bool Iterator : : insert_block_before ( Prototype * block )
{
FLAC__ASSERT ( 0 ! = block ) ;
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
bool ret = ( bool ) : : FLAC__metadata_iterator_insert_block_before ( iterator_ , block - > object_ ) ;
2002-05-22 05:33:29 +00:00
if ( ret ) {
block - > set_reference ( true ) ;
delete block ;
}
return ret ;
}
bool Iterator : : insert_block_after ( Prototype * block )
{
FLAC__ASSERT ( 0 ! = block ) ;
FLAC__ASSERT ( is_valid ( ) ) ;
2002-06-01 06:31:27 +00:00
bool ret = ( bool ) : : FLAC__metadata_iterator_insert_block_after ( iterator_ , block - > object_ ) ;
2002-05-22 05:33:29 +00:00
if ( ret ) {
block - > set_reference ( true ) ;
delete block ;
}
return ret ;
}
2002-05-17 06:33:39 +00:00
} ;
} ;