X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mood.c;h=fdf8cdce591e6a6de9359d79974c3e6108ffd3ba;hp=56ee1c43b5af30b6da5766e8c1c23ff2a67f40bb;hb=8e2e8dff8f30520c5ba33928992f112a053b920d;hpb=ec17f2a2552856bc5efa8e9dcdb0707b8c7e2694 diff --git a/mood.c b/mood.c index 56ee1c43..fdf8cdce 100644 --- a/mood.c +++ b/mood.c @@ -47,7 +47,8 @@ struct afs_statistics statistics; * * \sa struct mood_method, mood_parser. */ -typedef int mood_score_function(const struct osl_row*, void *); +typedef int mood_score_function(const char *path, const struct afs_info *afsi, + const struct audio_format_info *afhi, const void *data); /** * Pre-process a mood line. @@ -163,19 +164,36 @@ static uint64_t int_sqrt(uint64_t x) return res; } -static int mm_played_rarely_score_function(const struct osl_row *row, - __a_unused void *ignored) +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 (!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; +} + +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, + __a_unused const void *data) { - struct afs_info afsi; unsigned num; - int ret = get_afsi_of_row(row, &afsi); + int ret = get_num_admissible_files(&num); if (ret < 0) return 0; - ret = get_num_admissible_files(&num); - if (ret < 0) - return 0; - if (statistics.num_played_sum - num * afsi.num_played + if (statistics.num_played_sum - num * afsi->num_played > int_sqrt(statistics.num_played_qd * num)) return 100; return -100; @@ -183,20 +201,19 @@ static int mm_played_rarely_score_function(const struct osl_row *row, 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; } -static int mm_name_like_score_function(const struct osl_row *row, void *data) +static int mm_name_like_score_function(const char *path, + __a_unused const struct afs_info *afsi, + __a_unused const struct audio_format_info *afhi, + const void *data) { - char *path; - int ret = get_audio_file_path_of_row(row, &path); - - if (ret < 0) - return 0; - ret = fnmatch(data, path, 0); - return ret? -100 : 100; + if (fnmatch(data, path, 0)) + return -100; + return 100; } static int mm_name_like_parser(const char *arg, void **data) @@ -222,28 +239,40 @@ static int mm_is_set_parser(const char *arg, void **bitnum) return ret; } -static int mm_is_set_score_function(const struct osl_row *row, void *bitnum) +static int mm_is_set_score_function(__a_unused const char *path, + __a_unused const struct afs_info *afsi, + __a_unused const struct audio_format_info *afhi, + const void *data) { - unsigned char *bn = bitnum; - struct afs_info afsi; - int ret = get_afsi_of_row(row, &afsi); - - if (ret < 0) - return 0; - if (afsi.attributes & (1ULL << *bn)) + const unsigned char *bn = data; + if (afsi->attributes & (1ULL << *bn)) return 100; return -100; } -/* returns 1 if row matches score item, -1 otherwise */ +/* returns 1 if row matches score item, negative otherwise */ static int add_item_score(const struct osl_row *row, struct mood_item *item, long *score, long *score_arg_sum) { - int ret = 100; + struct afs_info afsi; + struct audio_format_info afhi; + char *path; + int ret; *score_arg_sum += item->random_score? 100 : PARA_ABS(item->score_arg); + ret = 100; if (item->method) { - ret = item->method->score_function(row, item->parser_data); + ret = get_afsi_of_row(row, &afsi); + if (ret< 0) + return ret; + ret = get_afhi_of_row(row, &afhi); + if (ret< 0) + return ret; + ret = get_audio_file_path_of_row(row, &path); + if (ret< 0) + return ret; + ret = item->method->score_function(path, &afsi, &afhi, + item->parser_data); if ((ret < 0 && !item->logical_not) || (ret >= 0 && item->logical_not)) return -1; /* no match */ } @@ -270,8 +299,6 @@ static int compute_mood_score(const struct osl_row *aft_row, struct mood *m, list_for_each_entry(item, &m->accept_list, mood_item_node) if (add_item_score(aft_row, item, &score, &score_arg_sum) > 0) match = 1; - if (list_empty(&m->accept_list)) - PARA_NOTICE_LOG("accrpt list empty\n"); /* reject if there is no matching entry in the accept list */ if (!match && !list_empty(&m->accept_list)) return -E_NOT_ADMISSIBLE; @@ -283,26 +310,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)