static int event_player(G_GNUC_UNUSED const struct mpd_connection *conn, const struct mpd_song *song, const struct mpd_status *status) { enum mpd_state state; g_assert(status != NULL); state = mpd_status_get_state(status); if (state == MPD_STATE_PAUSE) { song_paused(); return MPDCRON_EVENT_SUCCESS; } else if (state != MPD_STATE_PLAY) song_stopped(); if (was_paused) { if (song != NULL && mpd_song_get_id(song) == last_id) song_continued(); was_paused = false; } /* Submit the previous song */ if (prev != NULL && (song == NULL || mpd_song_get_id(prev) != mpd_song_get_id(song))) song_ended(prev); if (song != NULL) { if (mpd_song_get_id(song) != last_id) { /* New song. */ song_started(song); last_id = mpd_song_get_id(song); } else { /* still playing the previous song */ song_playing(song, mpd_status_get_elapsed_time(status)); } } if (prev != NULL) { mpd_song_free(prev); prev = NULL; } if (song != NULL) { if ((prev = mpd_song_dup(song)) == NULL) { g_critical("mpd_song_dup failed: out of memory"); return MPDCRON_EVENT_UNLOAD; } } return MPDCRON_EVENT_SUCCESS; }
/** * Update: determine MPD's current song and enqueue submissions. */ static gboolean lmc_update(G_GNUC_UNUSED gpointer data) { struct mpd_song *prev; enum mpd_state state; unsigned elapsed = 0; prev = current_song; state = lmc_current(¤t_song, &elapsed); if (state == MPD_STATE_PAUSE) { if (!was_paused) song_paused(); was_paused = true; if (idle_supported) { lmc_schedule_idle(); update_source_id = 0; return false; } return true; } else if (state != MPD_STATE_PLAY) { current_song = NULL; last_id = -1; was_paused = false; } else if (mpd_song_get_tag(current_song, MPD_TAG_ARTIST, 0) == NULL || mpd_song_get_tag(current_song, MPD_TAG_TITLE, 0) == NULL) { if (mpd_song_get_id(current_song) != last_id) { g_message("new song detected with tags missing (%s)\n", mpd_song_get_uri(current_song)); last_id = mpd_song_get_id(current_song); } mpd_song_free(current_song); current_song = NULL; } if (was_paused) { if (current_song != NULL && mpd_song_get_id(current_song) == last_id) song_continued(); was_paused = false; } /* submit the previous song */ if (prev != NULL && (current_song == NULL || mpd_song_get_id(prev) != mpd_song_get_id(current_song))) { song_ended(prev, love); love = false; } if (current_song != NULL) { if (mpd_song_get_id(current_song) != last_id) { /* new song. */ song_started(current_song); last_id = mpd_song_get_id(current_song); } else { /* still playing the previous song */ song_playing(current_song, elapsed); } } if (prev != NULL) mpd_song_free(prev); if (g_mpd == NULL) { lmc_schedule_reconnect(); update_source_id = 0; return false; } if (idle_supported) { lmc_schedule_idle(); update_source_id = 0; return false; } return true; }