revamp decoder process calls
diff --git a/src/libFLAC/stream_decoder.c b/src/libFLAC/stream_decoder.c
index 1eb2d9a..540ae48 100644
--- a/src/libFLAC/stream_decoder.c
+++ b/src/libFLAC/stream_decoder.c
@@ -258,7 +258,10 @@
 	}
 #endif
 
-	return decoder->protected_->state = FLAC__STREAM_DECODER_SEARCH_FOR_METADATA;
+	if(!FLAC__stream_decoder_reset(decoder))
+		return decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
+
+	return decoder->protected_->state;
 }
 
 void FLAC__stream_decoder_finish(FLAC__StreamDecoder *decoder)
@@ -528,95 +531,23 @@
 	return true;
 }
 
-FLAC__bool FLAC__stream_decoder_process_whole_stream(FLAC__StreamDecoder *decoder)
-{
-	FLAC__bool dummy;
-	FLAC__ASSERT(0 != decoder);
-
-	if(decoder->protected_->state == FLAC__STREAM_DECODER_END_OF_STREAM)
-		return true;
-
-	FLAC__ASSERT(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA);
-
-	if(!FLAC__stream_decoder_reset(decoder)) {
-		decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-
-	while(1) {
-		switch(decoder->protected_->state) {
-			case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
-				if(!find_metadata_(decoder))
-					return false; /* above function sets the status for us */
-				break;
-			case FLAC__STREAM_DECODER_READ_METADATA:
-				if(!read_metadata_(decoder))
-					return false; /* above function sets the status for us */
-				break;
-			case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
-				if(!frame_sync_(decoder))
-					return true; /* above function sets the status for us */
-				break;
-			case FLAC__STREAM_DECODER_READ_FRAME:
-				if(!read_frame_(decoder, &dummy))
-					return false; /* above function sets the status for us */
-				break;
-			case FLAC__STREAM_DECODER_END_OF_STREAM:
-			case FLAC__STREAM_DECODER_ABORTED:
-				return true;
-			default:
-				FLAC__ASSERT(0);
-		}
-	}
-}
-
-FLAC__bool FLAC__stream_decoder_process_metadata(FLAC__StreamDecoder *decoder)
-{
-	FLAC__ASSERT(0 != decoder);
-
-	if(decoder->protected_->state == FLAC__STREAM_DECODER_END_OF_STREAM)
-		return true;
-
-	FLAC__ASSERT(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA);
-
-	if(!FLAC__stream_decoder_reset(decoder)) {
-		decoder->protected_->state = FLAC__STREAM_DECODER_MEMORY_ALLOCATION_ERROR;
-		return false;
-	}
-
-	while(1) {
-		switch(decoder->protected_->state) {
-			case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
-				if(!find_metadata_(decoder))
-					return false; /* above function sets the status for us */
-				break;
-			case FLAC__STREAM_DECODER_READ_METADATA:
-				if(!read_metadata_(decoder))
-					return false; /* above function sets the status for us */
-				break;
-			case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
-			case FLAC__STREAM_DECODER_READ_FRAME:
-			case FLAC__STREAM_DECODER_END_OF_STREAM:
-			case FLAC__STREAM_DECODER_ABORTED:
-				return true;
-			default:
-				FLAC__ASSERT(0);
-		}
-	}
-}
-
-FLAC__bool FLAC__stream_decoder_process_one_frame(FLAC__StreamDecoder *decoder)
+FLAC__bool FLAC__stream_decoder_process_single(FLAC__StreamDecoder *decoder)
 {
 	FLAC__bool got_a_frame;
 	FLAC__ASSERT(0 != decoder);
-
-	if(decoder->protected_->state == FLAC__STREAM_DECODER_END_OF_STREAM)
-		return true;
-
-	FLAC__ASSERT(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC);
+	FLAC__ASSERT(0 != decoder->protected_);
 
 	while(1) {
 		switch(decoder->protected_->state) {
+			case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
+				if(!find_metadata_(decoder))
+					return false; /* above function sets the status for us */
+				break;
+			case FLAC__STREAM_DECODER_READ_METADATA:
+				if(!read_metadata_(decoder))
+					return false; /* above function sets the status for us */
+				else
+					return true;
 			case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
 				if(!frame_sync_(decoder))
 					return true; /* above function sets the status for us */
@@ -632,22 +563,54 @@
 				return true;
 			default:
 				FLAC__ASSERT(0);
+				return false;
 		}
 	}
 }
 
-FLAC__bool FLAC__stream_decoder_process_remaining_frames(FLAC__StreamDecoder *decoder)
+FLAC__bool FLAC__stream_decoder_process_until_end_of_metadata(FLAC__StreamDecoder *decoder)
 {
-	FLAC__bool dummy;
 	FLAC__ASSERT(0 != decoder);
-
-	if(decoder->protected_->state == FLAC__STREAM_DECODER_END_OF_STREAM)
-		return true;
-
-	FLAC__ASSERT(decoder->protected_->state == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC);
+	FLAC__ASSERT(0 != decoder->protected_);
 
 	while(1) {
 		switch(decoder->protected_->state) {
+			case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
+				if(!find_metadata_(decoder))
+					return false; /* above function sets the status for us */
+				break;
+			case FLAC__STREAM_DECODER_READ_METADATA:
+				if(!read_metadata_(decoder))
+					return false; /* above function sets the status for us */
+				break;
+			case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
+			case FLAC__STREAM_DECODER_READ_FRAME:
+			case FLAC__STREAM_DECODER_END_OF_STREAM:
+			case FLAC__STREAM_DECODER_ABORTED:
+				return true;
+			default:
+				FLAC__ASSERT(0);
+				return false;
+		}
+	}
+}
+
+FLAC__bool FLAC__stream_decoder_process_until_end_of_stream(FLAC__StreamDecoder *decoder)
+{
+	FLAC__bool dummy;
+	FLAC__ASSERT(0 != decoder);
+	FLAC__ASSERT(0 != decoder->protected_);
+
+	while(1) {
+		switch(decoder->protected_->state) {
+			case FLAC__STREAM_DECODER_SEARCH_FOR_METADATA:
+				if(!find_metadata_(decoder))
+					return false; /* above function sets the status for us */
+				break;
+			case FLAC__STREAM_DECODER_READ_METADATA:
+				if(!read_metadata_(decoder))
+					return false; /* above function sets the status for us */
+				break;
 			case FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC:
 				if(!frame_sync_(decoder))
 					return true; /* above function sets the status for us */
@@ -661,6 +624,7 @@
 				return true;
 			default:
 				FLAC__ASSERT(0);
+				return false;
 		}
 	}
 }