]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 'maint'
authorAndre Noll <maan@tuebingen.mpg.de>
Sat, 29 Aug 2015 10:54:58 +0000 (12:54 +0200)
committerAndre Noll <maan@tuebingen.mpg.de>
Sat, 29 Aug 2015 10:54:58 +0000 (12:54 +0200)
* maint:
  mood: Clear the score table on attribute changes.

1  2 
mood.c

diff --combined mood.c
index 8d171bde93170dd110ffe4d1b480dc313a8c61de,8e6a7665f15e32bc5774c5539358ccaf0bcbc880..94deff4684c5a335d38f5b843e22a4cee7dbc880
--- 1/mood.c
--- 2/mood.c
+++ b/mood.c
@@@ -1,5 -1,5 +1,5 @@@
  /*
 - * Copyright (C) 2007-2013 Andre Noll <maan@systemlinux.org>
 + * Copyright (C) 2007 Andre Noll <maan@tuebingen.mpg.de>
   *
   * Licensed under the GPL v2. For licencing details see COPYING.
   */
@@@ -18,7 -18,6 +18,7 @@@
  #include "ipc.h"
  #include "mm.h"
  #include "sideband.h"
 +#include "mood.h"
  
  /**
   * Contains statistical data of the currently admissible audio files.
@@@ -30,7 -29,7 +30,7 @@@ struct afs_statistics 
        int64_t num_played_sum;
        /** Sum of last played times over all admissible files. */
        int64_t last_played_sum;
 -      /** Quadratic deviation of num played time. */
 +      /** Quadratic deviation of num played count. */
        int64_t num_played_qd;
        /** Quadratic deviation of last played time. */
        int64_t last_played_qd;
@@@ -456,6 -455,19 +456,6 @@@ void mood_check_callback(int fd, __a_un
        free(pb.buf);
  }
  
 -#if 0
 -static unsigned int_log2(uint64_t x)
 -{
 -      unsigned res = 0;
 -
 -      while (x) {
 -              x /= 2;
 -              res++;
 -      }
 -      return res;
 -}
 -#endif
 -
  static int64_t normalized_value(int64_t x, int64_t n, int64_t sum, int64_t qd)
  {
        if (!n || !qd)
        return 100 * (n * x - sum) / (int64_t)int_sqrt(n * qd);
  }
  
 -static long compute_num_played_score(struct afs_info *afsi)
 +static long compute_score(struct afs_info *afsi, long mood_score)
  {
 -      return -normalized_value(afsi->num_played, statistics.num,
 +      mood_score -= normalized_value(afsi->num_played, statistics.num,
                statistics.num_played_sum, statistics.num_played_qd);
 -}
 -
 -static long compute_last_played_score(struct afs_info *afsi)
 -{
 -      return -normalized_value(afsi->last_played, statistics.num,
 +      mood_score -= normalized_value(afsi->last_played, statistics.num,
                statistics.last_played_sum, statistics.last_played_qd);
 -}
 -
 -static long compute_dynamic_score(const struct osl_row *aft_row)
 -{
 -      struct afs_info afsi;
 -      int64_t score, nscore = 0, lscore = 0;
 -      int ret;
 -
 -      ret = get_afsi_of_row(aft_row, &afsi);
 -      if (ret < 0)
 -              return -100;
 -      nscore = compute_num_played_score(&afsi);
 -      lscore = compute_last_played_score(&afsi);
 -      score = nscore + lscore;
 -      return score;
 +      return mood_score / 3;
  }
  
  static int add_afs_statistics(const struct osl_row *row)
@@@ -535,16 -565,16 +535,16 @@@ static int del_afs_statistics(const str
  /**
   * Structure used during mood_open().
   *
 - * At mood open time, we look at each file in the audio file table in order to
 - * determine whether it is admissible. If a file happens to be admissible, its
 - * mood score is computed by calling each relevant mood_score_function. Next,
 - * we update the afs_statistics and add a struct admissible_file_info to a
 - * temporary array.
 + * At mood open time we determine the set of admissible files for the given
 + * mood. The mood score of each admissible file is computed by adding up all
 + * mood item scores. Next, we update the afs statistics and append a struct
 + * admissible_file_info to a temporary array.
   *
 - * If all files have been processed that way, the final score of each
 + * When all files have been processed in this way, the final score of each
   * admissible file is computed by adding the dynamic score (which depends on
 - * the afs_statistics) to the mood score.  Finally, all audio files in the
 - * array are added to the score table and the admissible array is freed.
 + * the afs_statistics and the current time) to the mood score. Finally, all
 + * audio files in the temporary array are added to the score table and the
 + * array is freed.
   *
   * \sa mood_method, admissible_array.
   */
@@@ -661,13 -691,7 +661,13 @@@ static int update_afs_statistics(struc
  
  static int add_to_score_table(const struct osl_row *aft_row, long mood_score)
  {
 -      long score = (compute_dynamic_score(aft_row) + mood_score) / 3;
 +      long score;
 +      struct afs_info afsi;
 +      int ret = get_afsi_of_row(aft_row, &afsi);
 +
 +      if (ret < 0)
 +              return ret;
 +      score = compute_score(&afsi, mood_score);
        return score_add(aft_row, score);
  }
  
@@@ -748,7 -772,9 +748,7 @@@ static int mood_update_audio_file(cons
                if (ret < 0)
                        return ret;
        }
 -      score += compute_num_played_score(&afsi);
 -      score += compute_last_played_score(&afsi);
 -      score /= 3;
 +      score = compute_score(&afsi, score);
        PARA_DEBUG_LOG("score: %li\n", score);
        percent = (score + 100) / 3;
        if (percent > 100)
@@@ -839,7 -865,7 +839,7 @@@ int change_current_mood(char *mood_name
        if (ret < 0)
                return ret;
        log_statistics();
 -      PARA_INFO_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);
@@@ -870,6 -896,9 +870,9 @@@ static int reload_current_mood(void
        int ret;
        char *mood_name = NULL;
  
+       ret = clear_score_table();
+       if (ret < 0)
+               return ret;
        if (!current_mood)
                return 1;
        PARA_NOTICE_LOG("reloading %s\n", current_mood->name?
  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) {
        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: