00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef MPD_DECODER_CONTROL_H
00021 #define MPD_DECODER_CONTROL_H
00022
00023 #include "decoder_command.h"
00024 #include "audio_format.h"
00025
00026 #include <glib.h>
00027
00028 #include <assert.h>
00029
00030 enum decoder_state {
00031 DECODE_STATE_STOP = 0,
00032 DECODE_STATE_START,
00033 DECODE_STATE_DECODE,
00034
00041 DECODE_STATE_ERROR,
00042 };
00043
00044 struct decoder_control {
00047 GThread *thread;
00048
00052 GMutex *mutex;
00053
00059 GCond *cond;
00060
00065 GCond *client_cond;
00066
00067 enum decoder_state state;
00068 enum decoder_command command;
00069
00070 bool quit;
00071 bool seek_error;
00072 bool seekable;
00073 double seek_where;
00074
00076 struct audio_format in_audio_format;
00077
00079 struct audio_format out_audio_format;
00080
00086 const struct song *song;
00087
00094 unsigned start_ms;
00095
00103 unsigned end_ms;
00104
00105 float total_time;
00106
00108 struct music_buffer *buffer;
00109
00114 struct music_pipe *pipe;
00115
00116 float replay_gain_db;
00117 float replay_gain_prev_db;
00118 char *mixramp_start;
00119 char *mixramp_end;
00120 char *mixramp_prev_end;
00121 };
00122
00123 G_GNUC_MALLOC
00124 struct decoder_control *
00125 dc_new(GCond *client_cond);
00126
00127 void
00128 dc_free(struct decoder_control *dc);
00129
00133 static inline void
00134 decoder_lock(struct decoder_control *dc)
00135 {
00136 g_mutex_lock(dc->mutex);
00137 }
00138
00142 static inline void
00143 decoder_unlock(struct decoder_control *dc)
00144 {
00145 g_mutex_unlock(dc->mutex);
00146 }
00147
00153 static inline void
00154 decoder_wait(struct decoder_control *dc)
00155 {
00156 g_cond_wait(dc->cond, dc->mutex);
00157 }
00158
00164 static inline void
00165 decoder_signal(struct decoder_control *dc)
00166 {
00167 g_cond_signal(dc->cond);
00168 }
00169
00170 static inline bool
00171 decoder_is_idle(const struct decoder_control *dc)
00172 {
00173 return dc->state == DECODE_STATE_STOP ||
00174 dc->state == DECODE_STATE_ERROR;
00175 }
00176
00177 static inline bool
00178 decoder_is_starting(const struct decoder_control *dc)
00179 {
00180 return dc->state == DECODE_STATE_START;
00181 }
00182
00183 static inline bool
00184 decoder_has_failed(const struct decoder_control *dc)
00185 {
00186 assert(dc->command == DECODE_COMMAND_NONE);
00187
00188 return dc->state == DECODE_STATE_ERROR;
00189 }
00190
00191 static inline bool
00192 decoder_lock_is_idle(struct decoder_control *dc)
00193 {
00194 bool ret;
00195
00196 decoder_lock(dc);
00197 ret = decoder_is_idle(dc);
00198 decoder_unlock(dc);
00199
00200 return ret;
00201 }
00202
00203 static inline bool
00204 decoder_lock_is_starting(struct decoder_control *dc)
00205 {
00206 bool ret;
00207
00208 decoder_lock(dc);
00209 ret = decoder_is_starting(dc);
00210 decoder_unlock(dc);
00211
00212 return ret;
00213 }
00214
00215 static inline bool
00216 decoder_lock_has_failed(struct decoder_control *dc)
00217 {
00218 bool ret;
00219
00220 decoder_lock(dc);
00221 ret = decoder_has_failed(dc);
00222 decoder_unlock(dc);
00223
00224 return ret;
00225 }
00226
00227 static inline const struct song *
00228 decoder_current_song(const struct decoder_control *dc)
00229 {
00230 switch (dc->state) {
00231 case DECODE_STATE_STOP:
00232 case DECODE_STATE_ERROR:
00233 return NULL;
00234
00235 case DECODE_STATE_START:
00236 case DECODE_STATE_DECODE:
00237 return dc->song;
00238 }
00239
00240 assert(false);
00241 return NULL;
00242 }
00243
00254 void
00255 dc_start(struct decoder_control *dc, struct song *song,
00256 unsigned start_ms, unsigned end_ms,
00257 struct music_buffer *buffer, struct music_pipe *pipe);
00258
00259 void
00260 dc_stop(struct decoder_control *dc);
00261
00262 bool
00263 dc_seek(struct decoder_control *dc, double where);
00264
00265 void
00266 dc_quit(struct decoder_control *dc);
00267
00268 void
00269 dc_mixramp_start(struct decoder_control *dc, char *mixramp_start);
00270
00271 void
00272 dc_mixramp_end(struct decoder_control *dc, char *mixramp_end);
00273
00274 void
00275 dc_mixramp_prev_end(struct decoder_control *dc, char *mixramp_prev_end);
00276
00277 #endif