X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mood.c;h=4988c685490a32a61fcb1077a090388a1bed0ac3;hp=fd82ba4abb2b6419c3519fe3ec1ed29075912910;hb=d9f939fe8a68267a62b68546b17e1ec9a34aab0b;hpb=8d45d703078c89bb89804dacb6706f0c563ac4c6;ds=sidebyside diff --git a/mood.c b/mood.c index fd82ba4a..4988c685 100644 --- a/mood.c +++ b/mood.c @@ -47,7 +47,7 @@ struct afs_statistics statistics; * \sa struct mood_method, mood_parser. */ typedef int mood_score_function(const char *path, const struct afs_info *afsi, - const struct audio_format_info *afhi, const void *data); + const struct afh_info *afhi, const void *data); /** * Pre-process a mood line. @@ -172,7 +172,7 @@ static int mm_no_attributes_set_parser(const char *arg, __a_unused void **ignore 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 struct afh_info *afhi, __a_unused const void *data) { if (!afsi->attributes) @@ -182,7 +182,7 @@ static int mm_no_attributes_set_score_function(__a_unused const char *path, 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 struct afh_info *afhi, __a_unused const void *data) { unsigned num; @@ -205,7 +205,7 @@ static int mm_played_rarely_parser(const char *arg, __a_unused void **ignored) 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, + __a_unused const struct afh_info *afhi, const void *data) { if (fnmatch(data, path, 0)) @@ -238,7 +238,7 @@ static int mm_is_set_parser(const char *arg, 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, + __a_unused const struct afh_info *afhi, const void *data) { const unsigned char *bn = data; @@ -252,7 +252,7 @@ static int add_item_score(const struct osl_row *row, struct mood_item *item, lon long *score_arg_sum) { struct afs_info afsi; - struct audio_format_info afhi; + struct afh_info afhi; char *path; int ret; @@ -372,8 +372,11 @@ enum mood_line_type { ML_SCORE }; +/** Data passed to the parser of a mood line. */ struct mood_line_parser_data { + /** The mood this mood line belongs to. */ struct mood *m; + /** The line number in the mood definition. */ unsigned line_num; }; @@ -419,11 +422,13 @@ static int parse_mood_line(char *mood_line, void *data) w++; if (!*w) goto out; - if (!strcmp(*w, "with")) { - w++; - if (!*w) - goto out; - } + if (strcmp(*w, "with")) + goto check_for_if; + w++; + if (!*w) + goto out; + if (strcmp(*w, "score")) + goto out; } if (mlt == ML_SCORE || !strcmp(*w, "score")) { ret = -E_MOOD_SYNTAX; @@ -446,6 +451,7 @@ static int parse_mood_line(char *mood_line, void *data) w++; if (!*w) goto out; +check_for_if: if (!strcmp(*w, "if")) { ret = -E_MOOD_SYNTAX; w++; @@ -518,7 +524,6 @@ static int load_mood(const struct osl_row *mood_row, struct mood **m) destroy_mood(mlpd.m); return ret; } - PARA_INFO_LOG("loaded mood %s\n", mlpd.m->name); *m = mlpd.m; return 1; } @@ -904,14 +909,28 @@ static void log_statistics(void) PARA_NOTICE_LOG("no admissible files\n"); return; } - PARA_NOTICE_LOG("last_played mean: %lli, last_played sigma: %llu\n", + PARA_INFO_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", + PARA_INFO_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)); } +/** + * Close the current mood. + * + * Free all resources of the current mood which were allocated during + * mood_open(). + */ +void close_current_mood(void) +{ + destroy_mood(current_mood); + current_mood = NULL; + memset(&statistics, 0, sizeof(statistics)); +} + + /** * Change the current mood. * @@ -951,46 +970,31 @@ int change_current_mood(char *mood_name) ret = load_mood(row, &m); if (ret < 0) return ret; - destroy_mood(current_mood); + close_current_mood(); current_mood = m; } else { - destroy_mood(current_mood); + close_current_mood(); current_mood = alloc_new_mood("dummy"); } aa.m = current_mood; - PARA_NOTICE_LOG("loaded mood %s\n", current_mood->name); - PARA_INFO_LOG("%s\n", "computing statistics of admissible files"); + PARA_NOTICE_LOG("computing statistics of admissible files\n"); ret = audio_file_loop(&aa, add_if_admissible); if (ret < 0) return ret; log_statistics(); - PARA_NOTICE_LOG("%d admissible files \n", statistics.num); + PARA_INFO_LOG("%d admissible files \n", statistics.num); for (i = 0; i < statistics.num; i++) { struct admissible_file_info *a = aa.array + i; ret = add_to_score_table(a->aft_row, a->score); if (ret < 0) goto out; } - PARA_NOTICE_LOG("score add complete\n"); - ret = 1; + PARA_NOTICE_LOG("loaded mood %s\n", current_mood->name); + ret = statistics.num; out: free(aa.array); return ret; } - -/** - * Close the current mood. - * - * Free all resources of the current mood which were allocated during - * mood_open(). - */ -static void close_current_mood(void) -{ - destroy_mood(current_mood); - current_mood = NULL; - memset(&statistics, 0, sizeof(statistics)); -} - /** * Close and re-open the current mood. * @@ -1015,15 +1019,12 @@ int reload_current_mood(void) if (current_mood->name) mood_name = para_strdup(current_mood->name); close_current_mood(); - ret = clear_score_table(); - if (ret < 0) - return ret; ret = change_current_mood(mood_name); free(mood_name); return ret; } -int moods_event_handler(enum afs_events event, struct para_buffer *pb, +int moods_event_handler(enum afs_events event, __a_unused struct para_buffer *pb, void *data) { switch(event) {