diff --git a/src/decoder/Bridge.cxx b/src/decoder/Bridge.cxx index 1ded33e6a..3119907c9 100644 --- a/src/decoder/Bridge.cxx +++ b/src/decoder/Bridge.cxx @@ -43,6 +43,26 @@ DecoderBridge::~DecoderBridge() delete decoder_tag; } +bool +DecoderBridge::CheckCancelRead() const +{ + if (error) + /* this translates to DecoderCommand::STOP */ + return true; + + if (dc.command == DecoderCommand::NONE) + return false; + + /* ignore the SEEK command during initialization, the plugin + should handle that after it has initialized successfully */ + if (dc.command == DecoderCommand::SEEK && + (dc.state == DecoderState::START || seeking || + initial_seek_running)) + return false; + + return true; +} + /** * All chunks are full of decoded data; wait for the player to free * one. diff --git a/src/decoder/Bridge.hxx b/src/decoder/Bridge.hxx index 2f0ecf636..49d810633 100644 --- a/src/decoder/Bridge.hxx +++ b/src/decoder/Bridge.hxx @@ -107,6 +107,15 @@ public: ~DecoderBridge(); + /** + * Should be read operation be cancelled? That is the case when the + * player thread has sent a command such as "STOP". + * + * Caller must lock the #DecoderControl object. + */ + gcc_pure + bool CheckCancelRead() const; + /** * Returns the current chunk the decoder writes to, or allocates a new * chunk if there is none. diff --git a/src/decoder/DecoderAPI.cxx b/src/decoder/DecoderAPI.cxx index 83a5fdf6d..a1dc335af 100644 --- a/src/decoder/DecoderAPI.cxx +++ b/src/decoder/DecoderAPI.cxx @@ -264,25 +264,7 @@ gcc_pure static inline bool decoder_check_cancel_read(const DecoderBridge *bridge) { - if (bridge == nullptr) - return false; - - if (bridge->error) - /* this translates to DecoderCommand::STOP */ - return true; - - const DecoderControl &dc = bridge->dc; - if (dc.command == DecoderCommand::NONE) - return false; - - /* ignore the SEEK command during initialization, the plugin - should handle that after it has initialized successfully */ - if (dc.command == DecoderCommand::SEEK && - (dc.state == DecoderState::START || bridge->seeking || - bridge->initial_seek_running)) - return false; - - return true; + return bridge != nullptr && bridge->CheckCancelRead(); } size_t