[rhythmbox] make random play orders pick an entry when total weight is 0 (bug #580440)
- From: Jonathan Matthew <jmatthew src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [rhythmbox] make random play orders pick an entry when total weight is 0 (bug #580440)
- Date: Fri, 14 Aug 2009 11:58:42 +0000 (UTC)
commit b5d091c1d615c87936a1280b7a74c376e4e8847d
Author: Jonathan Matthew <jonathan d14n org>
Date: Fri Aug 14 21:52:01 2009 +1000
make random play orders pick an entry when total weight is 0 (bug #580440)
If there are entries in the query model, but they all have a weight of
0, it's better to pick one at random than to return nothing. This
specifically fixes single track playlists with random-by-age-and-weight,
but it makes sense in general.
shell/rb-play-order-random.c | 36 ++++++++++++++++++++++++------------
1 files changed, 24 insertions(+), 12 deletions(-)
---
diff --git a/shell/rb-play-order-random.c b/shell/rb-play-order-random.c
index 8c31ed4..d3103ef 100644
--- a/shell/rb-play-order-random.c
+++ b/shell/rb-play-order-random.c
@@ -164,22 +164,24 @@ get_query_model_contents (RBRandomPlayOrder *rorder, RhythmDBQueryModel *model)
double weight = 0.0;
double cumulative_weight = 0.0;
GtkTreeIter iter;
- GArray *result = g_array_new (FALSE, FALSE, sizeof (EntryWeight));
+ GArray *result;
- if (model == NULL)
- return result;
+ if (model == NULL) {
+ return NULL;
+ }
num_entries = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), NULL);
- if (num_entries == 0)
- return result;
-
- g_array_set_size (result, num_entries);
- db = rb_play_order_get_db (RB_PLAY_ORDER (rorder));
+ if (num_entries == 0) {
+ return NULL;
+ }
if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter))
- return result;
+ return NULL;
i = 0;
+ result = g_array_new (FALSE, FALSE, sizeof (EntryWeight));
+ g_array_set_size (result, num_entries);
+ db = rb_play_order_get_db (RB_PLAY_ORDER (rorder));
do {
RhythmDBEntry *entry = rhythmdb_query_model_iter_to_entry (model, &iter);
@@ -274,12 +276,20 @@ rb_random_play_order_pick_entry (RBRandomPlayOrder *rorder)
RhythmDBQueryModel *model;
model = rb_play_order_get_query_model (RB_PLAY_ORDER (rorder));
-
entry_weights = get_query_model_contents (rorder, model);
+ if (entry_weights == NULL) {
+ rb_debug ("nothing to choose from");
+ return NULL;
+ }
total_weight = rb_random_get_total_weight (entry_weights);
- if (total_weight == 0.0)
- return NULL;
+ if (total_weight == 0.0) {
+ low = g_random_int_range (0, entry_weights->len);
+ rb_debug ("total weight is 0; picked entry %d of %d randomly", low, entry_weights->len);
+ entry = g_array_index (entry_weights, EntryWeight, low).entry;
+ g_array_free (entry_weights, TRUE);
+ return entry;
+ }
rnd = g_random_double_range (0, total_weight);
/* Binary search for the entry with cumulative weight closest to but
@@ -293,6 +303,8 @@ rb_random_play_order_pick_entry (RBRandomPlayOrder *rorder)
low = mid;
}
entry = g_array_index (entry_weights, EntryWeight, low).entry;
+ rb_debug ("picked entry %d of %d (total weight %f) for random value %f",
+ low, entry_weights->len, total_weight, rnd);
g_array_free (entry_weights, TRUE);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]