The old code passed a pointer to the row of the audio file table to the
mood scoring functions. The scoring functions had to obtain the afsi,
afhi, path from that row pointer. Thus, at mood load time, the afsi,
afhi, path was extracted N times for each audio file if there are N
mood lines that used this info.
This patch changes the mood scoring functions so that they take
three pointers to afsi, afhi, path instead of the row pointer.
add_item_score(), the single caller of the mood scoring functions,
provides these pointers, i.e. they get extracted from the row pointer
only once per audio file.
This is still not optimal as most scoring functions use only one of
the three pointers. But let's not over-engineer the thing.
int load_afsi(struct afs_info *afsi, struct osl_object *obj);
void save_afsi(struct afs_info *afsi, struct osl_object *obj);
int get_afsi_of_row(const struct osl_row *row, struct afs_info *afsi);
int load_afsi(struct afs_info *afsi, struct osl_object *obj);
void save_afsi(struct afs_info *afsi, struct osl_object *obj);
int get_afsi_of_row(const struct osl_row *row, struct afs_info *afsi);
+int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi);
int get_audio_file_path_of_row(const struct osl_row *row, char **path);
int get_afsi_object_of_row(const struct osl_row *row, struct osl_object *obj);
int audio_file_loop(void *private_data, osl_rbtree_loop_func *func);
int get_audio_file_path_of_row(const struct osl_row *row, char **path);
int get_afsi_object_of_row(const struct osl_row *row, struct osl_object *obj);
int audio_file_loop(void *private_data, osl_rbtree_loop_func *func);
*
* \sa get_chunk_table_of_row().
*/
*
* \sa get_chunk_table_of_row().
*/
-static int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi)
+int get_afhi_of_row(const struct osl_row *row, struct audio_format_info *afhi)
{
struct osl_object obj;
int ret = osl_get_object(audio_file_table, row, AFTCOL_AFHI,
{
struct osl_object obj;
int ret = osl_get_object(audio_file_table, row, AFTCOL_AFHI,
*
* \sa struct mood_method, mood_parser.
*/
*
* \sa struct mood_method, mood_parser.
*/
-typedef int mood_score_function(const struct osl_row*, void *);
+typedef int mood_score_function(const char *path, const struct afs_info *afsi,
+ const struct audio_format_info *afhi, const void *data);
/**
* Pre-process a mood line.
/**
* Pre-process a mood line.
-static int mm_played_rarely_score_function(const struct osl_row *row,
- __a_unused void *ignored)
+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 void *data)
- int ret = get_afsi_of_row(row, &afsi);
+ int ret = get_num_admissible_files(&num);
- ret = get_num_admissible_files(&num);
- if (ret < 0)
- return 0;
- if (statistics.num_played_sum - num * afsi.num_played
+ if (statistics.num_played_sum - num * afsi->num_played
> int_sqrt(statistics.num_played_qd * num))
return 100;
return -100;
> int_sqrt(statistics.num_played_qd * num))
return 100;
return -100;
-static int mm_name_like_score_function(const struct osl_row *row, void *data)
+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,
+ const void *data)
- char *path;
- int ret = get_audio_file_path_of_row(row, &path);
-
- if (ret < 0)
- return 0;
- ret = fnmatch(data, path, 0);
- return ret? -100 : 100;
+ if (fnmatch(data, path, 0))
+ return -100;
+ return 100;
}
static int mm_name_like_parser(const char *arg, void **data)
}
static int mm_name_like_parser(const char *arg, void **data)
-static int mm_is_set_score_function(const struct osl_row *row, 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,
+ const void *data)
- unsigned char *bn = bitnum;
- struct afs_info afsi;
- int ret = get_afsi_of_row(row, &afsi);
-
- if (ret < 0)
- return 0;
- if (afsi.attributes & (1ULL << *bn))
+ const unsigned char *bn = data;
+ if (afsi->attributes & (1ULL << *bn))
return 100;
return -100;
}
return 100;
return -100;
}
-/* returns 1 if row matches score item, -1 otherwise */
+/* returns 1 if row matches score item, negative otherwise */
static int add_item_score(const struct osl_row *row, struct mood_item *item, long *score,
long *score_arg_sum)
{
static int add_item_score(const struct osl_row *row, struct mood_item *item, long *score,
long *score_arg_sum)
{
+ struct afs_info afsi;
+ struct audio_format_info afhi;
+ char *path;
+ int ret;
*score_arg_sum += item->random_score? 100 : PARA_ABS(item->score_arg);
*score_arg_sum += item->random_score? 100 : PARA_ABS(item->score_arg);
- ret = item->method->score_function(row, item->parser_data);
+ ret = get_afsi_of_row(row, &afsi);
+ if (ret< 0)
+ return ret;
+ ret = get_afhi_of_row(row, &afhi);
+ if (ret< 0)
+ return ret;
+ ret = get_audio_file_path_of_row(row, &path);
+ if (ret< 0)
+ return ret;
+ ret = item->method->score_function(path, &afsi, &afhi,
+ item->parser_data);
if ((ret < 0 && !item->logical_not) || (ret >= 0 && item->logical_not))
return -1; /* no match */
}
if ((ret < 0 && !item->logical_not) || (ret >= 0 && item->logical_not))
return -1; /* no match */
}
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;
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;
- if (list_empty(&m->accept_list))
- PARA_NOTICE_LOG("accrpt list empty\n");
/* reject if there is no matching entry in the accept list */
if (!match && !list_empty(&m->accept_list))
return -E_NOT_ADMISSIBLE;
/* reject if there is no matching entry in the accept list */
if (!match && !list_empty(&m->accept_list))
return -E_NOT_ADMISSIBLE;