diff options
author | Max Kellermann <max@duempel.org> | 2008-11-08 15:48:00 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2008-11-08 15:48:00 +0100 |
commit | 72eba30cf442994c732c135cb77c917f534ff1d7 (patch) | |
tree | 43cdc79105e4cea79296274bca00f67dfd636cb7 /src/decoder_control.h | |
parent | 8cbdc2667e6f4f3713c329ae21aa3d8ae73fab24 (diff) | |
download | mpd-72eba30cf442994c732c135cb77c917f534ff1d7.tar.gz mpd-72eba30cf442994c732c135cb77c917f534ff1d7.tar.xz mpd-72eba30cf442994c732c135cb77c917f534ff1d7.zip |
decoder: converted dc.error to a dc.state value
The player did not care about the exact error value, it only checked
whether an error has occured. This could fit well into
decoder_control.state - introduce a new state "DECODE_STATE_ERROR".
Diffstat (limited to 'src/decoder_control.h')
-rw-r--r-- | src/decoder_control.h | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/decoder_control.h b/src/decoder_control.h index c710d3038..e9fa449e6 100644 --- a/src/decoder_control.h +++ b/src/decoder_control.h @@ -25,19 +25,23 @@ #include "audio_format.h" #include "notify.h" +#include <assert.h> + #define DECODE_TYPE_FILE 0 #define DECODE_TYPE_URL 1 enum decoder_state { DECODE_STATE_STOP = 0, DECODE_STATE_START, - DECODE_STATE_DECODE -}; - -enum decoder_error { - DECODE_ERROR_NOERROR = 0, - DECODE_ERROR_UNKTYPE, - DECODE_ERROR_FILE, + DECODE_STATE_DECODE, + + /** + * The last "START" command failed, because there was an I/O + * error or because no decoder was able to decode the file. + * This state will only come after START; once the state has + * turned to DECODE, by definition no such error can occur. + */ + DECODE_STATE_ERROR, }; struct decoder_control { @@ -45,7 +49,6 @@ struct decoder_control { volatile enum decoder_state state; volatile enum decoder_command command; - volatile enum decoder_error error; bool seek_error; bool seekable; volatile double seek_where; @@ -69,7 +72,8 @@ void dc_deinit(void); static inline bool decoder_is_idle(void) { - return dc.state == DECODE_STATE_STOP && + return (dc.state == DECODE_STATE_STOP || + dc.state == DECODE_STATE_ERROR) && dc.command != DECODE_COMMAND_START; } @@ -79,14 +83,28 @@ static inline bool decoder_is_starting(void) dc.state == DECODE_STATE_START; } +static inline bool decoder_has_failed(void) +{ + assert(dc.command == DECODE_COMMAND_NONE); + + return dc.state == DECODE_STATE_ERROR; +} + static inline struct song * decoder_current_song(void) { - if (dc.state == DECODE_STATE_STOP || - dc.error != DECODE_ERROR_NOERROR) + switch (dc.state) { + case DECODE_STATE_STOP: + case DECODE_STATE_ERROR: return NULL; - return dc.current_song; + case DECODE_STATE_START: + case DECODE_STATE_DECODE: + return dc.current_song; + } + + assert(false); + return NULL; } void |