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().
----------------------------------------------
- audiod improvements and fixes.
+ - buffer tree robustness improvements.
+ - cleanup of the mood subsystem.
----------------------------------------
0.5.0 (2013-08-23) "invertible validity"
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:
/**
* 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
* 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);
list_del(&ch->node);
}
assert(list_empty(&btrn->children));
- btrn->parent = NULL;
+ *btrnp = NULL;
}
/**
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;
}
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);
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" ])
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)
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;
}
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;
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));