decoder/flac: eliminate the remaining "gotos"
https://www.xkcd.com/292/
This commit is contained in:
		| @@ -319,6 +319,48 @@ flac_decoder_loop(struct flac_data *data, FLAC__StreamDecoder *flac_dec, | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static FLAC__StreamDecoderInitStatus | ||||||
|  | stream_init_oggflac(FLAC__StreamDecoder *flac_dec, struct flac_data *data) | ||||||
|  | { | ||||||
|  | #if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT > 7 | ||||||
|  | 	return FLAC__stream_decoder_init_ogg_stream(flac_dec, | ||||||
|  | 						    flac_read_cb, | ||||||
|  | 						    flac_seek_cb, | ||||||
|  | 						    flac_tell_cb, | ||||||
|  | 						    flac_length_cb, | ||||||
|  | 						    flac_eof_cb, | ||||||
|  | 						    flac_write_cb, | ||||||
|  | 						    flacMetadata, | ||||||
|  | 						    flac_error_cb, | ||||||
|  | 						    data); | ||||||
|  | #else | ||||||
|  | 	(void)flac_dec; | ||||||
|  | 	(void)data; | ||||||
|  |  | ||||||
|  | 	return FLAC__STREAM_DECODER_INIT_STATUS_ERROR; | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static FLAC__StreamDecoderInitStatus | ||||||
|  | stream_init_flac(FLAC__StreamDecoder *flac_dec, struct flac_data *data) | ||||||
|  | { | ||||||
|  | 	return FLAC__stream_decoder_init_stream(flac_dec, | ||||||
|  | 						flac_read_cb, flac_seek_cb, | ||||||
|  | 						flac_tell_cb, flac_length_cb, | ||||||
|  | 						flac_eof_cb, flac_write_cb, | ||||||
|  | 						flacMetadata, | ||||||
|  | 						flac_error_cb, | ||||||
|  | 						data); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static FLAC__StreamDecoderInitStatus | ||||||
|  | stream_init(FLAC__StreamDecoder *flac_dec, struct flac_data *data, bool is_ogg) | ||||||
|  | { | ||||||
|  | 	return is_ogg | ||||||
|  | 		? stream_init_oggflac(flac_dec, data) | ||||||
|  | 		: stream_init_flac(flac_dec, data); | ||||||
|  | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| flac_decode_internal(struct decoder * decoder, | flac_decode_internal(struct decoder * decoder, | ||||||
| 		     struct input_stream *input_stream, | 		     struct input_stream *input_stream, | ||||||
| @@ -326,7 +368,6 @@ flac_decode_internal(struct decoder * decoder, | |||||||
| { | { | ||||||
| 	FLAC__StreamDecoder *flac_dec; | 	FLAC__StreamDecoder *flac_dec; | ||||||
| 	struct flac_data data; | 	struct flac_data data; | ||||||
| 	const char *err = NULL; |  | ||||||
|  |  | ||||||
| 	flac_dec = flac_decoder_new(); | 	flac_dec = flac_decoder_new(); | ||||||
| 	if (flac_dec == NULL) | 	if (flac_dec == NULL) | ||||||
| @@ -335,42 +376,15 @@ flac_decode_internal(struct decoder * decoder, | |||||||
| 	flac_data_init(&data, decoder, input_stream); | 	flac_data_init(&data, decoder, input_stream); | ||||||
| 	data.tag = tag_new(); | 	data.tag = tag_new(); | ||||||
|  |  | ||||||
| 	if (is_ogg) { | 	FLAC__StreamDecoderInitStatus status = | ||||||
|  | 		stream_init(flac_dec, &data, is_ogg); | ||||||
|  | 	if (status != FLAC__STREAM_DECODER_INIT_STATUS_OK) { | ||||||
|  | 		flac_data_deinit(&data); | ||||||
|  | 		FLAC__stream_decoder_delete(flac_dec); | ||||||
| #if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT > 7 | #if defined(FLAC_API_VERSION_CURRENT) && FLAC_API_VERSION_CURRENT > 7 | ||||||
| 		FLAC__StreamDecoderInitStatus status = | 		g_warning("%s", FLAC__StreamDecoderInitStatusString[status]); | ||||||
| 			FLAC__stream_decoder_init_ogg_stream(flac_dec, |  | ||||||
| 							     flac_read_cb, |  | ||||||
| 							     flac_seek_cb, |  | ||||||
| 							     flac_tell_cb, |  | ||||||
| 							     flac_length_cb, |  | ||||||
| 							     flac_eof_cb, |  | ||||||
| 							     flac_write_cb, |  | ||||||
| 							     flacMetadata, |  | ||||||
| 							     flac_error_cb, |  | ||||||
| 							     (void *)&data); |  | ||||||
| 		if (status != FLAC__STREAM_DECODER_INIT_STATUS_OK) { |  | ||||||
| 			err = "doing Ogg init()"; |  | ||||||
| 			goto fail; |  | ||||||
| 		} |  | ||||||
| #else |  | ||||||
| 		goto fail; |  | ||||||
| #endif | #endif | ||||||
| 	} else { | 		return; | ||||||
| 		FLAC__StreamDecoderInitStatus status = |  | ||||||
| 			FLAC__stream_decoder_init_stream(flac_dec, |  | ||||||
| 							 flac_read_cb, |  | ||||||
| 							 flac_seek_cb, |  | ||||||
| 							 flac_tell_cb, |  | ||||||
| 							 flac_length_cb, |  | ||||||
| 							 flac_eof_cb, |  | ||||||
| 							 flac_write_cb, |  | ||||||
| 							 flacMetadata, |  | ||||||
| 							 flac_error_cb, |  | ||||||
| 							 (void *)&data); |  | ||||||
| 		if (status != FLAC__STREAM_DECODER_INIT_STATUS_OK) { |  | ||||||
| 			err = "doing init()"; |  | ||||||
| 			goto fail; |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if (!flac_decoder_initialize(&data, flac_dec, 0)) { | 	if (!flac_decoder_initialize(&data, flac_dec, 0)) { | ||||||
| @@ -381,12 +395,8 @@ flac_decode_internal(struct decoder * decoder, | |||||||
|  |  | ||||||
| 	flac_decoder_loop(&data, flac_dec, 0, 0); | 	flac_decoder_loop(&data, flac_dec, 0, 0); | ||||||
|  |  | ||||||
| fail: |  | ||||||
| 	flac_data_deinit(&data); | 	flac_data_deinit(&data); | ||||||
| 	FLAC__stream_decoder_delete(flac_dec); | 	FLAC__stream_decoder_delete(flac_dec); | ||||||
|  |  | ||||||
| 	if (err) |  | ||||||
| 		g_warning("%s\n", err); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| @@ -418,8 +428,11 @@ oggflac_tag_dup(const char *file) | |||||||
| 	FLAC__StreamMetadata *block; | 	FLAC__StreamMetadata *block; | ||||||
| 	FLAC__Metadata_Chain *chain = FLAC__metadata_chain_new(); | 	FLAC__Metadata_Chain *chain = FLAC__metadata_chain_new(); | ||||||
|  |  | ||||||
| 	if (!(FLAC__metadata_chain_read_ogg(chain, file))) | 	if (!(FLAC__metadata_chain_read_ogg(chain, file))) { | ||||||
| 		goto out; | 		FLAC__metadata_chain_delete(chain); | ||||||
|  | 		return NULL; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	it = FLAC__metadata_iterator_new(); | 	it = FLAC__metadata_iterator_new(); | ||||||
| 	FLAC__metadata_iterator_init(it, chain); | 	FLAC__metadata_iterator_init(it, chain); | ||||||
|  |  | ||||||
| @@ -437,7 +450,6 @@ oggflac_tag_dup(const char *file) | |||||||
| 		ret = NULL; | 		ret = NULL; | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| out: |  | ||||||
| 	FLAC__metadata_chain_delete(chain); | 	FLAC__metadata_chain_delete(chain); | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann