X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=mood.c;h=6b2dfa07617932edda5319248e06b254fa4eabd4;hb=d6af2c473a9f2ae1f582ad44d5ad6eb8bf1ed35a;hp=b65561d582e84a8e12ef57daa8523cce660d878a;hpb=f6f50d03a09d6bc423324206d274336e9905bbb4;p=paraslash.git diff --git a/mood.c b/mood.c index b65561d5..6b2dfa07 100644 --- a/mood.c +++ b/mood.c @@ -1,11 +1,18 @@ +/* + * Copyright (C) 2007 Andre Noll + * + * Licensed under the GPL v2. For licencing details see COPYING. + */ + +/** \file mood.c Paraslash's mood handling functions. */ + #include "para.h" #include "error.h" +#include "afh.h" #include "afs.h" #include "list.h" #include "string.h" -/** \file mood.c Paraslash's mood handling functions. */ - /** * Contains statistical data of the currently admissible audio files. * @@ -235,13 +242,8 @@ static int mm_is_set_score_function(const struct osl_row *row, void *bitnum) return -100; } -static int para_random(unsigned max) -{ - return ((max + 0.0) * (rand() / (RAND_MAX + 1.0))); -} - /* returns 1 if row matches score item, -1 otherwise */ -static int add_item_score(const void *row, struct mood_item *item, long *score, +static int add_item_score(const struct osl_row *row, struct mood_item *item, long *score, long *score_arg_sum) { int ret = 100; @@ -259,28 +261,27 @@ static int add_item_score(const void *row, struct mood_item *item, long *score, return 1; } -static int compute_mood_score(const void *row, long *result) +static int compute_mood_score(const struct osl_row *aft_row, struct mood *m, + long *result) { struct mood_item *item; int match = 0; long score_arg_sum = 0, score = 0; - if (!current_mood) + if (!m) return -E_NO_MOOD; /* reject audio file if it matches any entry in the deny list */ - list_for_each_entry(item, ¤t_mood->deny_list, mood_item_node) - if (add_item_score(row, item, &score, &score_arg_sum) > 0) + list_for_each_entry(item, &m->deny_list, mood_item_node) + if (add_item_score(aft_row, item, &score, &score_arg_sum) > 0) return -E_NOT_ADMISSIBLE; - list_for_each_entry(item, ¤t_mood->accept_list, mood_item_node) - if (add_item_score(row, item, &score, &score_arg_sum) > 0) + 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; /* reject if there is no matching entry in the accept list */ - if (!match && !list_empty(¤t_mood->accept_list)) + if (!match && !list_empty(&m->accept_list)) return -E_NOT_ADMISSIBLE; - list_for_each_entry(item, ¤t_mood->score_list, mood_item_node) { - PARA_INFO_LOG("random: %d\n", para_random(100)); - add_item_score(row, item, &score, &score_arg_sum); - } + list_for_each_entry(item, &m->score_list, mood_item_node) + add_item_score(aft_row, item, &score, &score_arg_sum); if (score_arg_sum) score /= score_arg_sum; *result = score; @@ -364,9 +365,9 @@ enum mood_line_type { * all matching files */ -/* TODO: Use current_mood as private_data*/ -static int parse_mood_line(char *mood_line, __a_unused void *private_data) +static int parse_mood_line(char *mood_line, void *data) { + struct mood *m = data; char **argv; char *delim = " \t"; unsigned num_words; @@ -374,7 +375,6 @@ static int parse_mood_line(char *mood_line, __a_unused void *private_data) int i, ret; enum mood_line_type mlt = ML_INVALID; struct mood_item *mi = NULL; - struct mood *m = current_mood; char *buf = para_strdup(mood_line); num_words = split_args(buf, &argv, delim); @@ -475,7 +475,7 @@ out: return ret; } -static int load_mood(const void *row) +static int load_mood(const struct osl_row *row) { int ret; struct mood *new_mood, *old_mood = current_mood; @@ -492,7 +492,7 @@ static int load_mood(const void *row) new_mood = alloc_new_mood((char*)objs[BLOBCOL_NAME].data); current_mood = new_mood; ret = for_each_line_ro(objs[BLOBCOL_DEF].data, objs[BLOBCOL_DEF].size, - parse_mood_line, NULL); + parse_mood_line, ¤t_mood); osl_close_disk_object(&objs[BLOBCOL_DEF]); if (ret < 0) { PARA_ERROR_LOG("unable to load mood %s: %d\n", @@ -657,7 +657,7 @@ static int del_afs_statistics(const struct osl_row *row) struct admissible_file_info { /** The admissible audio file. */ - void *aft_row; + struct osl_row *aft_row; /** Its score. */ long score; }; @@ -685,7 +685,7 @@ static int add_if_admissible(struct osl_row *aft_row, void *private_data) long score = 0; score = 0; - ret = compute_mood_score(aft_row, &score); + ret = compute_mood_score(aft_row, current_mood, &score); if (ret < 0) return (ret == -E_NOT_ADMISSIBLE)? 1 : ret; if (statistics.num >= aa->size) { @@ -822,7 +822,7 @@ int mood_update_audio_file(const struct osl_row *aft_row, struct afs_info *old_a if (ret < 0) return ret; was_admissible = ret; - ret = compute_mood_score(aft_row, &score); + ret = compute_mood_score(aft_row, current_mood, &score); is_admissible = (ret > 0); if (!was_admissible && !is_admissible) return 1; @@ -846,13 +846,13 @@ int mood_update_audio_file(const struct osl_row *aft_row, struct afs_info *old_a score += compute_num_played_score(&afsi); score += compute_last_played_score(&afsi); score /= 3; - PARA_NOTICE_LOG("score: %li\n", score); + PARA_DEBUG_LOG("score: %li\n", score); percent = (score + 100) / 3; if (percent > 100) percent = 100; else if (percent < 0) percent = 0; - PARA_NOTICE_LOG("re-inserting at %lu%%\n", percent); + PARA_DEBUG_LOG("re-inserting at %lu%%\n", percent); return score_update(aft_row, percent); } @@ -864,10 +864,12 @@ static void log_statistics(void) PARA_NOTICE_LOG("no admissible files\n"); return; } - PARA_NOTICE_LOG("last_played mean: %lli, last_played sigma: %lli\n", - statistics.last_played_sum / n, int_sqrt(statistics.last_played_qd / n)); - PARA_NOTICE_LOG("num_played mean: %lli, num_played sigma: %lli\n", - statistics.num_played_sum / n, int_sqrt(statistics.num_played_qd / n)); + PARA_NOTICE_LOG("last_played mean: %lli, last_played sigma: %llu\n", + (long long int)(statistics.last_played_sum / n), + (long long unsigned)int_sqrt(statistics.last_played_qd / n)); + PARA_NOTICE_LOG("num_played mean: %lli, num_played sigma: %llu\n", + (long long int)statistics.num_played_sum / n, + (long long unsigned)int_sqrt(statistics.num_played_qd / n)); } /**