X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mood.c;h=bf6c40e165c52ba762457ae8901537bc6ca2594a;hp=e685fd91c982fd82cd9afa69c3a06932328907a5;hb=133f268fcfef0c524a1612c49d80d39c4ef6616a;hpb=07010f70da6ea0ba9940116eef83abeb02fa8d5d diff --git a/mood.c b/mood.c index e685fd91..bf6c40e1 100644 --- a/mood.c +++ b/mood.c @@ -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. @@ -164,6 +163,23 @@ static uint64_t int_sqrt(uint64_t x) return res; } +static int mm_no_attributes_set_parser(const char *arg, __a_unused void **ignored) +{ + if (arg && *arg) + PARA_WARNING_LOG("ignored junk at eol: %s\n", arg); + return 1; +} + +static int mm_no_attributes_set_score_function(__a_unused const char *path, + const struct afs_info *afsi, + __a_unused const struct audio_format_info *afhi, + __a_unused const void *data) +{ + if (!afsi->attributes) + return 100; + return -100; +} + static int mm_played_rarely_score_function(__a_unused const char *path, const struct afs_info *afsi, __a_unused const struct audio_format_info *afhi, @@ -182,7 +198,7 @@ static int mm_played_rarely_score_function(__a_unused const char *path, static int mm_played_rarely_parser(const char *arg, __a_unused void **ignored) { - if (*arg) + if (arg && *arg) PARA_WARNING_LOG("ignored junk at eol: %s\n", arg); return 1; } @@ -291,26 +307,21 @@ static int compute_mood_score(const struct osl_row *aft_row, struct mood *m, return 1; } +#define DEFINE_MOOD_METHOD(_name) \ +.parser = mm_ ## _name ## _parser, \ +.score_function = mm_ ## _name ## _score_function, \ +.name = #_name + +#define DEFINE_MOOD_METHOD_WITH_CLEANUP(_name) \ + DEFINE_MOOD_METHOD(_name), \ + .cleanup = mm_ ## _name ## _cleanup + static const struct mood_method mood_methods[] = { -{ - .parser = mm_played_rarely_parser, - .score_function = mm_played_rarely_score_function, - .name = "played_rarely" -}, -{ - .parser = mm_is_set_parser, - .score_function = mm_is_set_score_function, - .name = "is_set" -}, -{ - .parser = mm_name_like_parser, - .score_function = mm_name_like_score_function, - .cleanup = mm_name_like_cleanup, - .name = "name_like" -}, -{ - .parser = NULL -} + {DEFINE_MOOD_METHOD(no_attributes_set)}, + {DEFINE_MOOD_METHOD(played_rarely)}, + {DEFINE_MOOD_METHOD(is_set)}, + {DEFINE_MOOD_METHOD_WITH_CLEANUP(name_like)}, + {.parser = NULL} }; static void cleanup_list_entry(struct mood_item *item)