From: Andre Noll Date: Sun, 1 Dec 2013 00:14:37 +0000 (+0100) Subject: Merge branch 't/mood_cleanups' X-Git-Tag: v0.5.1~6 X-Git-Url: http://git.tuebingen.mpg.de/?a=commitdiff_plain;h=3055dabe9c91c9dfaa517ebbb65a9aae5946d018;hp=6bcd10bc4ada11a04bc2b7425afe5a8855592cd2;p=paraslash.git Merge branch 't/mood_cleanups' Cooking since 2011-10-13, seems to be fine. 6bcd10 mood: Deduplicate score formula. f24778 mood: Combine compute_num_played_score() and compute_last_played_score(). 62a968 mood: Don't open-code compute_dynamic_score(). 2c85cd mood: Don't add files without valid information to the score table. 5e9ded mood: Simplify compute_dynamic_score(). ab9f71 mood.c: Remove unused int_log2(). --- diff --git a/NEWS b/NEWS index d1155022..980f613a 100644 --- a/NEWS +++ b/NEWS @@ -6,6 +6,8 @@ NEWS ---------------------------------------------- - audiod improvements and fixes. + - buffer tree robustness improvements. + - cleanup of the mood subsystem. ---------------------------------------- 0.5.0 (2013-08-23) "invertible validity" diff --git a/amp_filter.c b/amp_filter.c index dddc0a85..b0f36872 100644 --- a/amp_filter.c +++ b/amp_filter.c @@ -73,7 +73,7 @@ static int amp_post_select(__a_unused struct sched *s, struct task *t) bool inplace = btr_inplace_ok(btrn); if (pad->amp == 0) { /* no amplification */ - btr_splice_out_node(btrn); + btr_splice_out_node(&fn->btrn); return -E_AMP_ZERO_AMP; } next_buffer: diff --git a/buffer_tree.c b/buffer_tree.c index b1eeb036..56ab2b24 100644 --- a/buffer_tree.c +++ b/buffer_tree.c @@ -835,7 +835,7 @@ size_t btr_get_input_queue_size(struct btr_node *btrn) /** * Remove a node from the buffer tree, reconnecting parent and children. * - * \param btrn The node to splice out. + * \param btrnp The node to splice out. * * This function is used by buffer tree nodes that do not exist during the * whole lifetime of the buffer tree. Unlike btr_remove_node(), calling @@ -843,9 +843,9 @@ size_t btr_get_input_queue_size(struct btr_node *btrn) * but reconnects the buffer tree by making all child nodes of \a btrn children * of the parent of \a btrn. */ -void btr_splice_out_node(struct btr_node *btrn) +void btr_splice_out_node(struct btr_node **btrnp) { - struct btr_node *ch, *tmp; + struct btr_node *btrn = *btrnp, *ch, *tmp; assert(btrn); PARA_NOTICE_LOG("splicing out %s\n", btrn->name); @@ -862,7 +862,7 @@ void btr_splice_out_node(struct btr_node *btrn) list_del(&ch->node); } assert(list_empty(&btrn->children)); - btrn->parent = NULL; + *btrnp = NULL; } /** @@ -1203,21 +1203,20 @@ int btr_node_status(struct btr_node *btrn, size_t min_iqs, size_t iqs; assert(btrn); - if (type != BTR_NT_LEAF) { - if (btr_no_children(btrn)) - return -E_BTR_NO_CHILD; - if (btr_get_output_queue_size(btrn) > BTRN_MAX_PENDING) - return 0; - } - if (type != BTR_NT_ROOT) { - if (btr_eof(btrn)) - return -E_BTR_EOF; - iqs = btr_get_input_queue_size(btrn); - if (iqs == 0) /* we have a parent, because not eof */ - return 0; - if (iqs < min_iqs && !btr_no_parent(btrn)) - return 0; - } + if (type != BTR_NT_LEAF && btr_no_children(btrn)) + return -E_BTR_NO_CHILD; + if (type != BTR_NT_ROOT && btr_eof(btrn)) + return -E_BTR_EOF; + + if (btr_get_output_queue_size(btrn) > BTRN_MAX_PENDING) + return 0; + if (type == BTR_NT_ROOT) + return 1; + iqs = btr_get_input_queue_size(btrn); + if (iqs == 0) /* we have a parent, because not eof */ + return 0; + if (iqs < min_iqs && !btr_no_parent(btrn)) + return 0; return 1; } diff --git a/buffer_tree.h b/buffer_tree.h index 20dcd62d..6127dd92 100644 --- a/buffer_tree.h +++ b/buffer_tree.h @@ -192,7 +192,7 @@ size_t btr_next_buffer(struct btr_node *btrn, char **bufp); size_t btr_next_buffer_omit(struct btr_node *btrn, size_t omit, char **bufp); void btr_consume(struct btr_node *btrn, size_t numbytes); int btr_exec_up(struct btr_node *btrn, const char *command, char **value_result); -void btr_splice_out_node(struct btr_node *btrn); +void btr_splice_out_node(struct btr_node **btrnp); void btr_pushdown(struct btr_node *btrn); void *btr_context(struct btr_node *btrn); void btr_merge(struct btr_node *btrn, size_t dest_size); diff --git a/configure.ac b/configure.ac index 73e97997..85d30886 100644 --- a/configure.ac +++ b/configure.ac @@ -694,7 +694,7 @@ if test "$have_ogg" = "yes"; then CPPFLAGS="$CPPFLAGS $opus_cppflags" fi if test -n "$with_opus_libs"; then - speex_libs="-L$with_opus_libs" + opus_libs="-L$with_opus_libs" LDFLAGS="$LDFLAGS $opus_libs" fi AC_CHECK_LIB([opus], [opus_multistream_decode], [], [ have_opus="no" ]) diff --git a/play.c b/play.c index 6eed58ab..01125ab6 100644 --- a/play.c +++ b/play.c @@ -431,7 +431,7 @@ static int load_next_file(struct play_task *pt) int ret; again: - if (pt->rq == CRT_NONE || pt->rq == CRT_FILE_CHANGE) { + if (pt->rq == CRT_NONE) { pt->start_chunk = 0; ret = next_valid_file(pt); if (ret < 0) diff --git a/prebuffer_filter.c b/prebuffer_filter.c index 655c981b..f4ef76e2 100644 --- a/prebuffer_filter.c +++ b/prebuffer_filter.c @@ -70,7 +70,7 @@ static int prebuffer_post_select(__a_unused struct sched *s, struct task *t) return 0; if (iqs < conf->size_arg) return 0; - btr_splice_out_node(fn->btrn); + btr_splice_out_node(&fn->btrn); return -E_PREBUFFER_SUCCESS; } diff --git a/server.c b/server.c index 36af088e..70d9137e 100644 --- a/server.c +++ b/server.c @@ -388,6 +388,9 @@ static int command_post_select(struct sched *s, struct task *t) goto out; } if (child_pid) { + /* avoid problems with non-fork-safe PRNGs */ + unsigned char buf[16]; + get_random_bytes_or_die(buf, sizeof(buf)); close(new_fd); /* parent keeps accepting connections */ return 0; diff --git a/wav_filter.c b/wav_filter.c index 83b81fb2..eaef1f5c 100644 --- a/wav_filter.c +++ b/wav_filter.c @@ -113,7 +113,7 @@ static int wav_post_select(__a_unused struct sched *s, struct task *t) ret = -E_WAV_SUCCESS; err: if (ret == -E_WAV_SUCCESS) - btr_splice_out_node(btrn); + btr_splice_out_node(&fn->btrn); else { btr_remove_node(&fn->btrn); PARA_ERROR_LOG("%s\n", para_strerror(-ret));