static void log_scratched(void *v, const char *track, const char *user);
static void log_state(void *v, unsigned long state);
static void log_volume(void *v, int l, int r);
+static void log_rescanned(void *v);
/** @brief Callbacks for server state monitoring */
const disorder_eclient_log_callbacks log_callbacks = {
log_removed,
log_scratched,
log_state,
- log_volume
+ log_volume,
+ log_rescanned
};
/** @brief State monitor
/** @brief Update everything */
void all_update(void) {
- queue_update();
- recent_update();
- volume_update();
- added_update();
+ ++suppress_actions;
+ event_raise("queue-changed", 0);
+ event_raise("recent-changed", 0);
+ event_raise("volume-changed", 0);
+ event_raise("added-changed", 0);
+ --suppress_actions;
}
/** @brief Called when the client connects
/** @brief Called when some track is moved within the queue */
static void log_moved(void attribute((unused)) *v,
const char attribute((unused)) *user) {
- queue_update();
+ event_raise("queue-changed", 0);
}
static void log_playing(void attribute((unused)) *v,
/** @brief Called when a track is added to the queue */
static void log_queue(void attribute((unused)) *v,
struct queue_entry attribute((unused)) *q) {
- queue_update();
+ event_raise("queue-changed", 0);
}
/** @brief Called when a track is added to the recently-played list */
static void log_recent_added(void attribute((unused)) *v,
struct queue_entry attribute((unused)) *q) {
- recent_update();
+ event_raise("recent-changed", 0);
}
/** @brief Called when a track is removed from the recently-played list
static void log_removed(void attribute((unused)) *v,
const char attribute((unused)) *id,
const char attribute((unused)) *user) {
-
- queue_update();
+ event_raise("queue-changed", 0);
}
/** @brief Called when the current track is scratched */
const char attribute((unused)) *user) {
}
+/** @brief Map from state bits to state change events */
+static const struct {
+ unsigned long bit;
+ const char *event;
+} state_events[] = {
+ { DISORDER_PLAYING_ENABLED, "enabled-changed" },
+ { DISORDER_RANDOM_ENABLED, "random-changed" },
+ { DISORDER_TRACK_PAUSED, "pause-changed" },
+ { DISORDER_PLAYING, "playing-changed" },
+};
+#define NSTATE_EVENTS (sizeof state_events / sizeof *state_events)
+
/** @brief Called when a state change occurs */
static void log_state(void attribute((unused)) *v,
unsigned long state) {
const struct monitor *m;
unsigned long changes = state ^ last_state;
static int first = 1;
-
+
+ ++suppress_actions;
if(first) {
changes = -1UL;
first = 0;
disorder_eclient_interpret_state(state),
disorder_eclient_interpret_state(changes)));
last_state = state;
+ /* Notify interested parties what has changed */
+ for(unsigned n = 0; n < NSTATE_EVENTS; ++n)
+ if(changes & state_events[n].bit)
+ event_raise(state_events[n].event, 0);
/* Tell anything that cares about the state change */
for(m = monitors; m; m = m->next) {
if(changes & m->mask)
m->callback(m->u);
}
+ --suppress_actions;
}
/** @brief Called when volume changes */
static void log_volume(void attribute((unused)) *v,
int l, int r) {
- if(volume_l != l || volume_r != r) {
+ if(!rtp_supported && (volume_l != l || volume_r != r)) {
volume_l = l;
volume_r = r;
- volume_update();
+ ++suppress_actions;
+ event_raise("volume-changed", 0);
+ --suppress_actions;
}
}
+/** @brief Called when a rescan completes */
+static void log_rescanned(void attribute((unused)) *v) {
+ event_raise("added-changed", 0);
+}
+
/** @brief Add a monitor to the list
* @param callback Function to call
* @param u User data to pass to @p callback