X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mood.c;h=9074581c6c8d40741a99c3c1772716381e03f2a4;hp=64cfe835ece10c98210613f57a1178fceaaee121;hb=4cb470633b0fbcd5e374008b1c001b1e9ca6cf8d;hpb=53d503ce75eb1d9439cfb75053d3cff4cbca6ff9 diff --git a/mood.c b/mood.c index 64cfe835..9074581c 100644 --- a/mood.c +++ b/mood.c @@ -852,13 +852,13 @@ static int delete_from_statistics_and_score_table(const struct osl_row *aft_row) * * \return Positive on success, negative on errors. * - * \sa score_delete(), mood_update_audio_file(). + * \sa score_delete(). */ -int mood_delete_audio_file(const struct osl_row *aft_row) +static int mood_delete_audio_file(const struct osl_row *aft_row) { int ret; - ret = row_belongs_to_score_table(aft_row); + ret = row_belongs_to_score_table(aft_row, NULL); if (ret < 0) return ret; if (!ret) /* not admissible, nothing to do */ @@ -877,15 +877,17 @@ int mood_delete_audio_file(const struct osl_row *aft_row) * * \return Positive on success, negative on errors. */ -int mood_update_audio_file(const struct osl_row *aft_row, struct afs_info *old_afsi) +static int mood_update_audio_file(const struct osl_row *aft_row, + struct afs_info *old_afsi) { long score, percent; int ret, is_admissible, was_admissible = 0; struct afs_info afsi; + unsigned rank; if (!current_mood) return 1; /* nothing to do */ - ret = row_belongs_to_score_table(aft_row); + ret = row_belongs_to_score_table(aft_row, &rank); if (ret < 0) return ret; was_admissible = ret; @@ -919,7 +921,7 @@ int mood_update_audio_file(const struct osl_row *aft_row, struct afs_info *old_a percent = 100; else if (percent < 0) percent = 0; - PARA_DEBUG_LOG("re-inserting at %lu%%\n", percent); + PARA_DEBUG_LOG("moving from rank %u to %lu%%\n", rank, percent); return score_update(aft_row, percent); } @@ -1045,12 +1047,52 @@ int reload_current_mood(void) int ret; char *mood_name; + PARA_NOTICE_LOG("reloading current mood\n"); if (!current_mood) return 1; -// score_close(0); mood_name = para_strdup(current_mood->name); close_current_mood(); + ret = clear_score_table(); + if (ret < 0) + return ret; ret = change_current_mood(mood_name); free(mood_name); return ret; } + +int moods_event_handler(enum afs_events event, struct para_buffer *pb, + void *data) +{ + switch(event) { + /* + * The three blob events might change the set of admissible files, + * so we must reload the score list. + */ + case BLOB_RENAME: + case BLOB_REMOVE: + case BLOB_ADD: + if (data == moods_table || data == playlists_table) + return 1; /* no reload necessary for these */ + return reload_current_mood(); + /* these also require reload of the score table */ + case ATTRIBUTE_ADD: + case ATTRIBUTE_REMOVE: + case ATTRIBUTE_RENAME: + return reload_current_mood(); + /* changes to the aft only require to re-examine the audio file */ + case AFSI_CHANGE: { + struct afsi_change_event_data *aced = data; + return mood_update_audio_file(aced->aft_row, aced->old_afsi); + } + case AFHI_CHANGE: + case AUDIO_FILE_RENAME: + case AUDIO_FILE_ADD: + return mood_update_audio_file(data, NULL); + case AUDIO_FILE_REMOVE: + return mood_delete_audio_file(data); + default: + return 1; + } + return 1; +} +