X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=mood.c;h=ce5c1c7e87fbd76d2ca3599309ce0eb3e0dbd691;hp=9074581c6c8d40741a99c3c1772716381e03f2a4;hb=b3ee0fa979a74e9d7a1497ec5a3ac8fa7cc7472b;hpb=02d818d9e4d816d6decb319b522f0074038e68e2 diff --git a/mood.c b/mood.c index 9074581c..ce5c1c7e 100644 --- a/mood.c +++ b/mood.c @@ -518,40 +518,10 @@ 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; } -/* - * Calls load_mood() and reverts its error value: It returns -E_MOOD_LOADED - * on _success_, and 1 on errors. This way the loop over all moods stops at the - * first valid mood. - */ -static int load_mood_loop_func(struct osl_row *mood_row, void *data) -{ - struct mood **m = data; - int ret = load_mood(mood_row, m); - if (ret < 0) { - if (ret != -E_DUMMY_ROW) - PARA_NOTICE_LOG("invalid mood (%d), trying next mood\n", ret); - return 1; - } - return -E_MOOD_LOADED; -} - -static int load_first_available_mood(struct mood **m) -{ - int ret = osl_rbtree_loop(moods_table, BLOBCOL_NAME, m, - load_mood_loop_func); - if (ret == -E_MOOD_LOADED) /* success */ - return 1; - if (ret < 0) - return ret; /* error */ - PARA_NOTICE_LOG("no valid mood found\n"); - return -E_NO_MOOD; -} - static int check_mood(struct osl_row *mood_row, void *data) { struct para_buffer *pb = data; @@ -933,23 +903,35 @@ 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. * * \param mood_name The name of the mood to open. * - * There are two special cases: If \a mood_name is \a NULL, load the - * first available mood. If \a mood_name is the empty string "", load - * the dummy mood that accepts every audio file and uses a scoring method - * based only on the \a last_played information. + * If \a mood_name is \a NULL, load the dummy mood that accepts every audio file + * and uses a scoring method based only on the \a last_played information. * * If there is already an open mood, it will be closed first. * @@ -967,14 +949,7 @@ int change_current_mood(char *mood_name) .array = NULL }; - if (!mood_name) { - struct mood *m; - ret = load_first_available_mood(&m); - if (ret < 0) - return ret; - destroy_mood(current_mood); - current_mood = m; - } else if (*mood_name) { + if (mood_name) { struct mood *m; struct osl_row *row; struct osl_object obj = { @@ -989,46 +964,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. * @@ -1045,22 +1005,20 @@ static void close_current_mood(void) int reload_current_mood(void) { int ret; - char *mood_name; + char *mood_name = NULL; PARA_NOTICE_LOG("reloading current mood\n"); if (!current_mood) return 1; - mood_name = para_strdup(current_mood->name); + 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) {