From 45df15152777a7fe46387c2b868af8ea00927d70 Mon Sep 17 00:00:00 2001 From: Josh Coalson Date: Thu, 13 Nov 2003 23:34:28 +0000 Subject: [PATCH] better end-of-file/stream checking --- include/OggFLAC/file_decoder.h | 3 ++ include/OggFLAC/seekable_stream_decoder.h | 3 ++ include/OggFLAC/stream_decoder.h | 3 ++ src/libOggFLAC/file_decoder.c | 64 +++++++++++++++++++++++++++---- src/libOggFLAC/seekable_stream_decoder.c | 64 +++++++++++++++++++++++++++---- src/libOggFLAC/stream_decoder.c | 52 ++++++++++++++++++++++--- 6 files changed, 167 insertions(+), 22 deletions(-) diff --git a/include/OggFLAC/file_decoder.h b/include/OggFLAC/file_decoder.h index 093d28b..a96d0b4 100644 --- a/include/OggFLAC/file_decoder.h +++ b/include/OggFLAC/file_decoder.h @@ -77,6 +77,9 @@ typedef enum { OggFLAC__FILE_DECODER_OK = 0, /**< The decoder is in the normal OK state. */ + OggFLAC__FILE_DECODER_END_OF_FILE, + /**< The decoder has reached the end of the file. */ + OggFLAC__FILE_DECODER_OGG_ERROR, /**< An error occurred in the underlying Ogg layer. */ diff --git a/include/OggFLAC/seekable_stream_decoder.h b/include/OggFLAC/seekable_stream_decoder.h index e668ceb..98e5c03 100644 --- a/include/OggFLAC/seekable_stream_decoder.h +++ b/include/OggFLAC/seekable_stream_decoder.h @@ -77,6 +77,9 @@ typedef enum { OggFLAC__SEEKABLE_STREAM_DECODER_OK = 0, /**< The decoder is in the normal OK state. */ + OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM, + /**< The decoder has reached the end of the stream. */ + OggFLAC__SEEKABLE_STREAM_DECODER_OGG_ERROR, /**< An error occurred in the underlying Ogg layer. */ diff --git a/include/OggFLAC/stream_decoder.h b/include/OggFLAC/stream_decoder.h index ddee265..20c8576 100644 --- a/include/OggFLAC/stream_decoder.h +++ b/include/OggFLAC/stream_decoder.h @@ -89,6 +89,9 @@ typedef enum { OggFLAC__STREAM_DECODER_OK = 0, /**< The decoder is in the normal OK state. */ + OggFLAC__STREAM_DECODER_END_OF_STREAM, + /**< The decoder has reached the end of the stream. */ + OggFLAC__STREAM_DECODER_OGG_ERROR, /**< An error occurred in the underlying Ogg layer. */ diff --git a/src/libOggFLAC/file_decoder.c b/src/libOggFLAC/file_decoder.c index 492df0d..71c4f52 100644 --- a/src/libOggFLAC/file_decoder.c +++ b/src/libOggFLAC/file_decoder.c @@ -67,6 +67,7 @@ typedef struct OggFLAC__FileDecoderPrivate { OggFLAC_API const char * const OggFLAC__FileDecoderStateString[] = { "OggFLAC__FILE_DECODER_OK", + "OggFLAC__FILE_DECODER_END_OF_FILE", "OggFLAC__FILE_DECODER_OGG_ERROR", "OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR", "OggFLAC__FILE_DECODER_INVALID_CALLBACK", @@ -410,30 +411,77 @@ OggFLAC_API FLAC__bool OggFLAC__file_decoder_get_decode_position(const OggFLAC__ OggFLAC_API FLAC__bool OggFLAC__file_decoder_process_single(OggFLAC__FileDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__file_decoder_process_single(decoder->private_->FLAC_file_decoder); + + if(FLAC__file_decoder_get_state(decoder->private_->FLAC_file_decoder) == FLAC__FILE_DECODER_END_OF_FILE) + decoder->protected_->state = OggFLAC__FILE_DECODER_END_OF_FILE; + + if(decoder->protected_->state == OggFLAC__FILE_DECODER_END_OF_FILE) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__FILE_DECODER_OK); + + ret = FLAC__file_decoder_process_single(decoder->private_->FLAC_file_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__file_decoder_process_until_end_of_metadata(OggFLAC__FileDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__file_decoder_process_until_end_of_metadata(decoder->private_->FLAC_file_decoder); + + if(FLAC__file_decoder_get_state(decoder->private_->FLAC_file_decoder) == FLAC__FILE_DECODER_END_OF_FILE) + decoder->protected_->state = OggFLAC__FILE_DECODER_END_OF_FILE; + + if(decoder->protected_->state == OggFLAC__FILE_DECODER_END_OF_FILE) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__FILE_DECODER_OK); + + ret = FLAC__file_decoder_process_until_end_of_metadata(decoder->private_->FLAC_file_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__file_decoder_process_until_end_of_file(OggFLAC__FileDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__file_decoder_process_until_end_of_file(decoder->private_->FLAC_file_decoder); + + if(FLAC__file_decoder_get_state(decoder->private_->FLAC_file_decoder) == FLAC__FILE_DECODER_END_OF_FILE) + decoder->protected_->state = OggFLAC__FILE_DECODER_END_OF_FILE; + + if(decoder->protected_->state == OggFLAC__FILE_DECODER_END_OF_FILE) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__FILE_DECODER_OK); + + ret = FLAC__file_decoder_process_until_end_of_file(decoder->private_->FLAC_file_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__file_decoder_seek_absolute(OggFLAC__FileDecoder *decoder, FLAC__uint64 sample) { FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__file_decoder_seek_absolute(decoder->private_->FLAC_file_decoder, sample); + FLAC__ASSERT(decoder->protected_->state == OggFLAC__FILE_DECODER_OK || decoder->protected_->state == OggFLAC__FILE_DECODER_END_OF_FILE); + + if(!FLAC__file_decoder_seek_absolute(decoder->private_->FLAC_file_decoder, sample)) { + decoder->protected_->state = OggFLAC__FILE_DECODER_FLAC_FILE_DECODER_ERROR; + return false; + } + else { + decoder->protected_->state = OggFLAC__FILE_DECODER_OK; + return true; + } } diff --git a/src/libOggFLAC/seekable_stream_decoder.c b/src/libOggFLAC/seekable_stream_decoder.c index c6dbcae..71d8a19 100644 --- a/src/libOggFLAC/seekable_stream_decoder.c +++ b/src/libOggFLAC/seekable_stream_decoder.c @@ -77,6 +77,7 @@ typedef struct OggFLAC__SeekableStreamDecoderPrivate { OggFLAC_API const char * const OggFLAC__SeekableStreamDecoderStateString[] = { "OggFLAC__SEEKABLE_STREAM_DECODER_OK", + "OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM", "OggFLAC__SEEKABLE_STREAM_DECODER_OGG_ERROR", "OggFLAC__SEEKABLE_STREAM_DECODER_FLAC_SEEKABLE_STREAM_DECODER_ERROR", "OggFLAC__SEEKABLE_STREAM_DECODER_READ_ERROR", @@ -503,30 +504,77 @@ OggFLAC_API FLAC__bool OggFLAC__seekable_stream_decoder_reset(OggFLAC__SeekableS OggFLAC_API FLAC__bool OggFLAC__seekable_stream_decoder_process_single(OggFLAC__SeekableStreamDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__seekable_stream_decoder_process_single(decoder->private_->FLAC_seekable_stream_decoder); + + if(FLAC__seekable_stream_decoder_get_state(decoder->private_->FLAC_seekable_stream_decoder) == FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM; + + if(decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_OK); + + ret = FLAC__seekable_stream_decoder_process_single(decoder->private_->FLAC_seekable_stream_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_FLAC_SEEKABLE_STREAM_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__seekable_stream_decoder_process_until_end_of_metadata(OggFLAC__SeekableStreamDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder->private_->FLAC_seekable_stream_decoder); + + if(FLAC__seekable_stream_decoder_get_state(decoder->private_->FLAC_seekable_stream_decoder) == FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM; + + if(decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_OK); + + ret = FLAC__seekable_stream_decoder_process_until_end_of_metadata(decoder->private_->FLAC_seekable_stream_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_FLAC_SEEKABLE_STREAM_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__seekable_stream_decoder_process_until_end_of_stream(OggFLAC__SeekableStreamDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder->private_->FLAC_seekable_stream_decoder); + + if(FLAC__seekable_stream_decoder_get_state(decoder->private_->FLAC_seekable_stream_decoder) == FLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM; + + if(decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_OK); + + ret = FLAC__seekable_stream_decoder_process_until_end_of_stream(decoder->private_->FLAC_seekable_stream_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_FLAC_SEEKABLE_STREAM_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__seekable_stream_decoder_seek_absolute(OggFLAC__SeekableStreamDecoder *decoder, FLAC__uint64 sample) { FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__seekable_stream_decoder_seek_absolute(decoder->private_->FLAC_seekable_stream_decoder, sample); + FLAC__ASSERT(decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_OK || decoder->protected_->state == OggFLAC__SEEKABLE_STREAM_DECODER_END_OF_STREAM); + + if(!FLAC__seekable_stream_decoder_seek_absolute(decoder->private_->FLAC_seekable_stream_decoder, sample)) { + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_FLAC_SEEKABLE_STREAM_DECODER_ERROR; + return false; + } + else { + decoder->protected_->state = OggFLAC__SEEKABLE_STREAM_DECODER_OK; + return true; + } } diff --git a/src/libOggFLAC/stream_decoder.c b/src/libOggFLAC/stream_decoder.c index 1046eb6..6fc6ef5 100644 --- a/src/libOggFLAC/stream_decoder.c +++ b/src/libOggFLAC/stream_decoder.c @@ -69,6 +69,7 @@ typedef struct OggFLAC__StreamDecoderPrivate { OggFLAC_API const char * const OggFLAC__StreamDecoderStateString[] = { "OggFLAC__STREAM_DECODER_OK", + "OggFLAC__STREAM_DECODER_END_OF_STREAM", "OggFLAC__STREAM_DECODER_OGG_ERROR", "OggFLAC__STREAM_DECODER_READ_ERROR", "OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR", @@ -412,23 +413,62 @@ OggFLAC_API FLAC__bool OggFLAC__stream_decoder_reset(OggFLAC__StreamDecoder *dec OggFLAC_API FLAC__bool OggFLAC__stream_decoder_process_single(OggFLAC__StreamDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__stream_decoder_process_single(decoder->private_->FLAC_stream_decoder); + + if(FLAC__seekable_stream_decoder_get_state(decoder->private_->FLAC_stream_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) + decoder->protected_->state = OggFLAC__STREAM_DECODER_END_OF_STREAM; + + if(decoder->protected_->state == OggFLAC__STREAM_DECODER_END_OF_STREAM) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__STREAM_DECODER_OK); + + ret = FLAC__stream_decoder_process_single(decoder->private_->FLAC_stream_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__stream_decoder_process_until_end_of_metadata(OggFLAC__StreamDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__stream_decoder_process_until_end_of_metadata(decoder->private_->FLAC_stream_decoder); + + if(FLAC__seekable_stream_decoder_get_state(decoder->private_->FLAC_stream_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) + decoder->protected_->state = OggFLAC__STREAM_DECODER_END_OF_STREAM; + + if(decoder->protected_->state == OggFLAC__STREAM_DECODER_END_OF_STREAM) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__STREAM_DECODER_OK); + + ret = FLAC__stream_decoder_process_until_end_of_metadata(decoder->private_->FLAC_stream_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; + + return ret; } OggFLAC_API FLAC__bool OggFLAC__stream_decoder_process_until_end_of_stream(OggFLAC__StreamDecoder *decoder) { + FLAC__bool ret; FLAC__ASSERT(0 != decoder); - FLAC__ASSERT(0 != decoder->private_); - return FLAC__stream_decoder_process_until_end_of_stream(decoder->private_->FLAC_stream_decoder); + + if(FLAC__seekable_stream_decoder_get_state(decoder->private_->FLAC_stream_decoder) == FLAC__STREAM_DECODER_END_OF_STREAM) + decoder->protected_->state = OggFLAC__STREAM_DECODER_END_OF_STREAM; + + if(decoder->protected_->state == OggFLAC__STREAM_DECODER_END_OF_STREAM) + return true; + + FLAC__ASSERT(decoder->protected_->state == OggFLAC__STREAM_DECODER_OK); + + ret = FLAC__stream_decoder_process_until_end_of_stream(decoder->private_->FLAC_stream_decoder); + if(!ret) + decoder->protected_->state = OggFLAC__STREAM_DECODER_FLAC_STREAM_DECODER_ERROR; + + return ret; } -- 2.7.4