X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mood.c;h=a8d87cde122c9bc03d6cab301695fe97bf2896e8;hp=fdf8cdce591e6a6de9359d79974c3e6108ffd3ba;hb=c2ac39f76d245816a919d94790672fb66e9a7253;hpb=8e2e8dff8f30520c5ba33928992f112a053b920d diff --git a/mood.c b/mood.c index fdf8cdce..a8d87cde 100644 --- a/mood.c +++ b/mood.c @@ -9,10 +9,10 @@ #include #include "para.h" #include "error.h" +#include "string.h" #include "afh.h" #include "afs.h" #include "list.h" -#include "string.h" /** * Contains statistical data of the currently admissible audio files. @@ -36,11 +36,10 @@ struct afs_statistics statistics; /** * Assign scores according to a mood_method. * - * Each mood_method has its own mood_score_function. The first parameter passed - * to that function is a pointer to a row of the audio file table. It - * determines the audio file for which a score is to be assigned. The second - * argument depends on the mood method this function is used for. It usually is - * the argument given at the end of a mood line. + * Each mood_method has its own mood_score_function. The first three parameters + * passed to that function are informations about the audio file whose score is + * to be computed. The data argument depends on the mood method this function + * is used for. It usually is the argument given at the end of a mood line. * * Mood score functions must return values between -100 and +100 inclusively. * Boolean score functions should always return either -100 or +100. @@ -176,8 +175,6 @@ static int mm_no_attributes_set_score_function(__a_unused const char *path, __a_unused const struct audio_format_info *afhi, __a_unused const void *data) { - if (!strcmp(path, "/home/mp3/checked/dvd_08/cd_52/Sade__Paradise.mp3")) - PARA_NOTICE_LOG("%s: %llu\n", path, afsi->attributes); if (!afsi->attributes) return 100; return -100; @@ -855,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 */ @@ -880,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; @@ -922,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); } @@ -1023,7 +1022,7 @@ out: * Free all resources of the current mood which were allocated during * mood_open(). */ -void close_current_mood(void) +static void close_current_mood(void) { destroy_mood(current_mood); current_mood = NULL; @@ -1050,10 +1049,34 @@ int reload_current_mood(void) if (!current_mood) return 1; - score_shutdown(0); mood_name = para_strdup(current_mood->name); close_current_mood(); 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) { + case ATTRIBUTE_ADD: + case ATTRIBUTE_REMOVE: + case ATTRIBUTE_RENAME: + return reload_current_mood(); + 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; +} +