FILE *file;
char *filename; /* == NULL if stdin */
FLAC__SeekableStreamDecoder *seekable_stream_decoder;
- struct {
- FLAC__bool md5_checking;
- } init_values_for_superclass;
} FLAC__FileDecoderPrivate;
/***********************************************************************
return 0;
}
+ decoder->private_->seekable_stream_decoder = FLAC__seekable_stream_decoder_new();
+
+ if(0 == decoder->private_->seekable_stream_decoder) {
+ free(decoder->private_);
+ free(decoder->protected_);
+ free(decoder);
+ return 0;
+ }
+
decoder->protected_->state = FLAC__FILE_DECODER_UNINITIALIZED;
decoder->private_->filename = 0;
decoder->private_->metadata_callback = 0;
decoder->private_->error_callback = 0;
decoder->private_->client_data = 0;
- decoder->private_->init_values_for_superclass.md5_checking = false;
return decoder;
}
FLAC__ASSERT(decoder->protected_ != 0);
FLAC__ASSERT(decoder->private_ != 0);
+ if(decoder->private_->filename != 0)
+ free(decoder->private_->filename);
+
+ if(decoder->private_->seekable_stream_decoder != 0)
+ FLAC__seekable_stream_decoder_delete(decoder->private_->seekable_stream_decoder);
+
free(decoder->private_);
free(decoder->protected_);
free(decoder);
return decoder->protected_->state = FLAC__FILE_DECODER_INVALID_CALLBACK;
decoder->private_->file = 0;
- decoder->private_->seekable_stream_decoder = 0;
if(0 == decoder->private_->filename)
decoder->private_->file = get_binary_stdin_();
if(decoder->private_->file == 0)
return decoder->protected_->state = FLAC__FILE_DECODER_ERROR_OPENING_FILE;
- decoder->private_->seekable_stream_decoder = FLAC__seekable_stream_decoder_new();
-
- if(0 == decoder->private_->seekable_stream_decoder)
- return decoder->protected_->state = FLAC__FILE_DECODER_MEMORY_ALLOCATION_ERROR;
-
FLAC__seekable_stream_decoder_set_read_callback(decoder->private_->seekable_stream_decoder, read_callback_);
FLAC__seekable_stream_decoder_set_seek_callback(decoder->private_->seekable_stream_decoder, seek_callback_);
FLAC__seekable_stream_decoder_set_tell_callback(decoder->private_->seekable_stream_decoder, tell_callback_);
FLAC__seekable_stream_decoder_set_error_callback(decoder->private_->seekable_stream_decoder, error_callback_);
FLAC__seekable_stream_decoder_set_client_data(decoder->private_->seekable_stream_decoder, decoder);
- /*
- * Unfortunately, because of the "_new() ... _set_() ... _init()" order of
- * decoder initialization, settings that are 'inherited' from the superclass
- * have to be passed up this way, because the superclass has not even been
- * created yet when the value is set in the subclass.
- */
- (void)FLAC__seekable_stream_decoder_set_md5_checking(decoder->private_->seekable_stream_decoder, decoder->private_->init_values_for_superclass.md5_checking);
-
if(FLAC__seekable_stream_decoder_init(decoder->private_->seekable_stream_decoder) != FLAC__SEEKABLE_STREAM_DECODER_OK)
return decoder->protected_->state = FLAC__FILE_DECODER_STREAM_DECODER_ERROR; /*@@@ change this to FLAC__FILE_DECODER_SEEKABLE_STREAM_ERROR in next minor-revision */
FLAC__bool FLAC__file_decoder_finish(FLAC__FileDecoder *decoder)
{
- FLAC__bool ok = true;
-
FLAC__ASSERT(decoder != 0);
+
if(decoder->protected_->state == FLAC__FILE_DECODER_UNINITIALIZED)
return true;
+
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
+
if(decoder->private_->file != 0 && decoder->private_->file != stdin)
fclose(decoder->private_->file);
- if(0 != decoder->private_->filename) {
+
+ if(decoder->private_->filename != 0) {
free(decoder->private_->filename);
decoder->private_->filename = 0;
}
- if(decoder->private_->seekable_stream_decoder != 0) {
- ok = FLAC__seekable_stream_decoder_finish(decoder->private_->seekable_stream_decoder);
- FLAC__seekable_stream_decoder_delete(decoder->private_->seekable_stream_decoder);
- }
+
decoder->protected_->state = FLAC__FILE_DECODER_UNINITIALIZED;
- return ok;
+
+ return FLAC__seekable_stream_decoder_finish(decoder->private_->seekable_stream_decoder);
}
FLAC__bool FLAC__file_decoder_set_md5_checking(const FLAC__FileDecoder *decoder, FLAC__bool value)
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
if(decoder->protected_->state != FLAC__FILE_DECODER_UNINITIALIZED)
return false;
- decoder->private_->init_values_for_superclass.md5_checking = value;
- return true;
+ return FLAC__seekable_stream_decoder_set_md5_checking(decoder->private_->seekable_stream_decoder, value);
}
FLAC__bool FLAC__file_decoder_set_filename(const FLAC__FileDecoder *decoder, const char *value)
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
if(decoder->protected_->state != FLAC__FILE_DECODER_UNINITIALIZED)
return false;
return FLAC__seekable_stream_decoder_set_metadata_respond(decoder->private_->seekable_stream_decoder, type);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
if(decoder->protected_->state != FLAC__FILE_DECODER_UNINITIALIZED)
return false;
return FLAC__seekable_stream_decoder_set_metadata_respond_application(decoder->private_->seekable_stream_decoder, id);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
if(decoder->protected_->state != FLAC__FILE_DECODER_UNINITIALIZED)
return false;
return FLAC__seekable_stream_decoder_set_metadata_respond_all(decoder->private_->seekable_stream_decoder);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
if(decoder->protected_->state != FLAC__FILE_DECODER_UNINITIALIZED)
return false;
return FLAC__seekable_stream_decoder_set_metadata_ignore(decoder->private_->seekable_stream_decoder, type);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
if(decoder->protected_->state != FLAC__FILE_DECODER_UNINITIALIZED)
return false;
return FLAC__seekable_stream_decoder_set_metadata_ignore_application(decoder->private_->seekable_stream_decoder, id);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->seekable_stream_decoder != 0);
if(decoder->protected_->state != FLAC__FILE_DECODER_UNINITIALIZED)
return false;
return FLAC__seekable_stream_decoder_set_metadata_ignore_all(decoder->private_->seekable_stream_decoder);
return 0;
}
+ decoder->private_->stream_decoder = FLAC__stream_decoder_new();
+
+ if(0 == decoder->private_->stream_decoder) {
+ free(decoder->private_);
+ free(decoder->protected_);
+ free(decoder);
+ return 0;
+ }
+
decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED;
decoder->private_->read_callback = 0;
FLAC__ASSERT(decoder->protected_ != 0);
FLAC__ASSERT(decoder->private_ != 0);
+ if(decoder->private_->stream_decoder != 0)
+ FLAC__stream_decoder_delete(decoder->private_->stream_decoder);
+
free(decoder->private_);
free(decoder->protected_);
free(decoder);
if(0 == decoder->private_->write_callback || 0 == decoder->private_->metadata_callback || 0 == decoder->private_->error_callback)
return decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_INVALID_CALLBACK;
- decoder->private_->stream_decoder = 0;
decoder->private_->seek_table = 0;
/* We initialize the MD5Context even though we may never use it. This is
*/
MD5Init(&decoder->private_->md5context);
- decoder->private_->stream_decoder = FLAC__stream_decoder_new();
-
- if(0 == decoder->private_->stream_decoder)
- return decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
-
FLAC__stream_decoder_set_read_callback(decoder->private_->stream_decoder, read_callback_);
FLAC__stream_decoder_set_write_callback(decoder->private_->stream_decoder, write_callback_);
FLAC__stream_decoder_set_metadata_callback(decoder->private_->stream_decoder, metadata_callback_);
FLAC__bool md5_failed = false;
FLAC__ASSERT(decoder != 0);
+ FLAC__ASSERT(decoder->private_ != 0);
+ FLAC__ASSERT(decoder->protected_ != 0);
+
if(decoder->protected_->state == FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
return true;
+
+ FLAC__ASSERT(decoder->private_->stream_decoder != 0);
+
/* see the comment in FLAC__seekable_stream_decoder_init() as to why we
* always call MD5Final()
*/
MD5Final(decoder->private_->computed_md5sum, &decoder->private_->md5context);
- if(decoder->private_->stream_decoder != 0) {
- FLAC__stream_decoder_finish(decoder->private_->stream_decoder);
- FLAC__stream_decoder_delete(decoder->private_->stream_decoder);
- }
+
+ FLAC__stream_decoder_finish(decoder->private_->stream_decoder);
+
if(decoder->protected_->md5_checking) {
if(memcmp(decoder->private_->stored_md5sum, decoder->private_->computed_md5sum, 16))
md5_failed = true;
}
+
decoder->protected_->state = FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED;
+
return !md5_failed;
}
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->stream_decoder != 0);
if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
return false;
return FLAC__stream_decoder_set_metadata_respond(decoder->private_->stream_decoder, type);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->stream_decoder != 0);
if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
return false;
return FLAC__stream_decoder_set_metadata_respond_application(decoder->private_->stream_decoder, id);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->stream_decoder != 0);
if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
return false;
return FLAC__stream_decoder_set_metadata_respond_all(decoder->private_->stream_decoder);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->stream_decoder != 0);
if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
return false;
return FLAC__stream_decoder_set_metadata_ignore(decoder->private_->stream_decoder, type);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->stream_decoder != 0);
if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
return false;
return FLAC__stream_decoder_set_metadata_ignore_application(decoder->private_->stream_decoder, id);
FLAC__ASSERT(decoder != 0);
FLAC__ASSERT(decoder->private_ != 0);
FLAC__ASSERT(decoder->protected_ != 0);
+ FLAC__ASSERT(decoder->private_->stream_decoder != 0);
if(decoder->protected_->state != FLAC__SEEKABLE_STREAM_DECODER_UNINITIALIZED)
return false;
return FLAC__stream_decoder_set_metadata_ignore_all(decoder->private_->stream_decoder);