X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mood.c;h=b1ee78e4e67faac76be61ee9c09085dfde20972f;hp=c03867c1b86a27551f24c5b97a608f9e1107d2e8;hb=869f0e06ec4e15abc9230c1b2d7615da5250802e;hpb=b0fe6d882dd35b01360a66e130d6714aff7b6a0d diff --git a/mood.c b/mood.c index c03867c1..b1ee78e4 100644 --- a/mood.c +++ b/mood.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2007-2010 Andre Noll + * Copyright (C) 2007-2012 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -79,13 +79,13 @@ struct mood { static struct mood *current_mood; /** - * Rough approximation to sqrt. + * Rough approximation to sqrt. * - * \param x Integer of which to calculate the sqrt. + * \param x Integer of which to calculate the sqrt. * - * \return An integer res with res * res <= x. + * \return An integer res with res * res <= x. */ -static uint64_t int_sqrt(uint64_t x) +__a_const static uint64_t int_sqrt(uint64_t x) { uint64_t op, res, one = 1; op = x; @@ -107,12 +107,16 @@ static uint64_t int_sqrt(uint64_t x) return res; } -/* returns 1 if row matches score item, 0 if not. */ -static int get_item_score(struct mood_item *item, const struct afs_info *afsi, +/* + * Returns true if row matches, false if it does not match. In any case score + * and score_arg_sum are set/increased accordingly. + */ +static bool get_item_score(struct mood_item *item, const struct afs_info *afsi, const struct afh_info *afhi, const char *path, long *score, long *score_arg_sum) { - int ret, match = 1; + int ret; + bool match = true; *score_arg_sum += item->random_score? 100 : PARA_ABS(item->score_arg); ret = 100; @@ -120,7 +124,7 @@ static int get_item_score(struct mood_item *item, const struct afs_info *afsi, ret = item->method->score_function(path, afsi, afhi, item->parser_data); if ((ret < 0 && !item->logical_not) || (ret >= 0 && item->logical_not)) - match = 0; /* no match */ + match = false; } if (item->random_score) *score = PARA_ABS(ret) * para_random(100); @@ -134,7 +138,8 @@ static int compute_mood_score(const struct osl_row *aft_row, struct mood *m, long *result) { struct mood_item *item; - int ret, match = 0; + int ret; + bool match; long score_arg_sum = 0, score = 0, item_score; struct afs_info afsi; struct afh_info afhi; @@ -153,27 +158,29 @@ static int compute_mood_score(const struct osl_row *aft_row, struct mood *m, return ret; /* reject audio file if it matches any entry in the deny list */ list_for_each_entry(item, &m->deny_list, mood_item_node) { - ret = get_item_score(item, &afsi, &afhi, path, &item_score, + match = get_item_score(item, &afsi, &afhi, path, &item_score, &score_arg_sum); - if (ret > 0) /* not admissible */ + if (match) /* not admissible */ return 0; score += item_score; } + match = false; list_for_each_entry(item, &m->accept_list, mood_item_node) { ret = get_item_score(item, &afsi, &afhi, path, &item_score, &score_arg_sum); if (ret == 0) continue; - match = 1; + match = true; score += item_score; } /* reject if there is no matching entry in the accept list */ if (!match && !list_empty(&m->accept_list)) return 0; list_for_each_entry(item, &m->score_list, mood_item_node) { - ret = get_item_score(item, &afsi, &afhi, path, &item_score, + match = get_item_score(item, &afsi, &afhi, path, &item_score, &score_arg_sum); - score += item_score; + if (match) + score += item_score; } if (score_arg_sum) score /= score_arg_sum; @@ -364,8 +371,10 @@ static int load_mood(const struct osl_row *mood_row, struct mood **m) char *mood_name; struct osl_object mood_def; struct mood_line_parser_data mlpd = {.line_num = 0}; - int ret = mood_get_name_and_def_by_row(mood_row, &mood_name, &mood_def); + int ret; + *m = NULL; + ret = mood_get_name_and_def_by_row(mood_row, &mood_name, &mood_def); if (ret < 0) return ret; if (!*mood_name) @@ -422,7 +431,7 @@ out: void mood_check_callback(int fd, __a_unused const struct osl_object *query) { struct para_buffer pb = { - .max_size = SHMMAX, + .max_size = shm_get_shmmax(), .private_data = &fd, .max_size_handler = pass_buffer_as_shm }; @@ -873,7 +882,7 @@ out: * * \sa mood_open(), mood_close(). */ -int reload_current_mood(void) +static int reload_current_mood(void) { int ret; char *mood_name = NULL; @@ -890,9 +899,22 @@ int reload_current_mood(void) return ret; } +/** + * Notification callback for the moods table. + * + * \param event Type of the event just occurred. + * \param pb Unused. + * \param data Its type depends on the event. + * + * This function performs actions required due to the occurrence of the given + * event. Possible actions include reload of the current mood and update of the + * score of an audio file. + */ int moods_event_handler(enum afs_events event, __a_unused struct para_buffer *pb, void *data) { + int ret; + if (!current_mood) return 0; switch (event) { @@ -905,6 +927,10 @@ int moods_event_handler(enum afs_events event, __a_unused struct para_buffer *pb case BLOB_ADD: if (data == moods_table || data == playlists_table) return 1; /* no reload necessary for these */ + ret = clear_score_table(); + if (ret < 0) + PARA_CRIT_LOG("clear score table returned %s\n", + para_strerror(-ret)); return reload_current_mood(); /* these also require reload of the score table */ case ATTRIBUTE_ADD: @@ -926,4 +952,3 @@ int moods_event_handler(enum afs_events event, __a_unused struct para_buffer *pb return 1; } } -