DecoderAPI: stop decoder on MPD error
This commit adds the basic infrastructure for reporting bugs from DecoderAPI.cxx via DecoderThread.cxx to DecoderControl.
This commit is contained in:
		| @@ -134,6 +134,10 @@ gcc_pure | ||||
| static DecoderCommand | ||||
| decoder_get_virtual_command(Decoder &decoder) | ||||
| { | ||||
| 	if (decoder.error.IsDefined()) | ||||
| 		/* an error has occurred: stop the decoder plugin */ | ||||
| 		return DecoderCommand::STOP; | ||||
|  | ||||
| 	const DecoderControl &dc = decoder.dc; | ||||
| 	assert(dc.pipe != nullptr); | ||||
|  | ||||
|   | ||||
| @@ -22,6 +22,7 @@ | ||||
|  | ||||
| #include "DecoderCommand.hxx" | ||||
| #include "ReplayGainInfo.hxx" | ||||
| #include "util/Error.hxx" | ||||
|  | ||||
| class PcmConvert; | ||||
| struct DecoderControl; | ||||
| @@ -87,6 +88,12 @@ struct Decoder { | ||||
| 	 */ | ||||
| 	unsigned replay_gain_serial; | ||||
|  | ||||
| 	/** | ||||
| 	 * An error has occurred (in DecoderAPI.cxx), and the plugin | ||||
| 	 * will be asked to stop. | ||||
| 	 */ | ||||
| 	Error error; | ||||
|  | ||||
| 	Decoder(DecoderControl &_dc, bool _initial_seek_pending, Tag *_tag) | ||||
| 		:dc(_dc), | ||||
| 		 convert(nullptr), | ||||
|   | ||||
| @@ -360,7 +360,12 @@ decoder_run_song(DecoderControl &dc, | ||||
|  | ||||
| 	dc.Lock(); | ||||
|  | ||||
| 	if (ret) | ||||
| 	if (decoder.error.IsDefined()) { | ||||
| 		/* copy the Error from sruct Decoder to | ||||
| 		   DecoderControl */ | ||||
| 		dc.state = DecoderState::ERROR; | ||||
| 		dc.error = std::move(decoder.error); | ||||
| 	} else if (ret) | ||||
| 		dc.state = DecoderState::STOP; | ||||
| 	else { | ||||
| 		dc.state = DecoderState::ERROR; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann