From: Andre Noll Date: Thu, 5 Nov 2009 21:43:03 +0000 (+0100) Subject: Merge branch 'maint' X-Git-Tag: v0.4.0~5 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=a4eb244ecdf9aaa0f167b3c91d3e276bde99d681;hp=-c Merge branch 'maint' --- a4eb244ecdf9aaa0f167b3c91d3e276bde99d681 diff --combined oss_write.c index 9ec85560,3ef0d9e8..7edd486f --- a/oss_write.c +++ b/oss_write.c @@@ -6,7 -6,6 +6,7 @@@ /** \file oss_write.c Paraslash's oss output plugin. */ +#include #include #include #include @@@ -48,13 -47,13 +48,13 @@@ static int oss_pre_select(struct sched struct private_oss_write_data *powd = wn->private_data; struct writer_node_group *wng = wn->wng; - if (!*wng->loaded) + if (*wng->loaded - wn->written < powd->bytes_per_frame) return 0; para_fd_set(powd->fd, &s->wfds, &s->max_fileno); return 1; } - static int oss_post_select(__a_unused struct sched *s, - struct writer_node *wn) + + static int oss_post_select(struct sched *s, struct writer_node *wn) { int ret; struct private_oss_write_data *powd = wn->private_data; diff --combined write_common.c index 5eb6b796,2dca309c..3f6c0bbe --- a/write_common.c +++ b/write_common.c @@@ -6,8 -6,6 +6,8 @@@ /** \file write_common.c common functions of para_audiod and para_write */ +#include + #include "para.h" #include "string.h" #include "list.h" @@@ -22,7 -20,7 +22,7 @@@ const char *writer_names[] ={WRITER_NAM /** the array of supported writers */ struct writer writers[NUM_SUPPORTED_WRITERS] = {WRITER_ARRAY}; - static void wng_pre_select(__a_unused struct sched *s, struct task *t) + static void wng_pre_select(struct sched *s, struct task *t) { struct writer_node_group *g = container_of(t, struct writer_node_group, task); int i; @@@ -36,13 -34,25 +36,25 @@@ if (t->error < 0) return; } + /* + * Force a minimal delay if something was written during the previous + * call to wng_post_select(). This is necessary because the filter + * chain might still have data for us which it couldn't convert during + * the previous run due to its buffer size constraints. In this case we + * do not want to wait until the next input data arrives as this could + * lead to buffer underruns. + */ + if (g->last_written == 0) + return; + s->timeout.tv_sec = 0; + s->timeout.tv_usec = 1; } static void wng_post_select(struct sched *s, struct task *t) { struct writer_node_group *g = container_of(t, struct writer_node_group, task); int i; - size_t min_written = 0; + size_t min_written = 0, max_written = 0; FOR_EACH_WRITER_NODE(i, g) { struct writer_node *wn = &g->writer_nodes[i]; @@@ -54,7 -64,9 +66,9 @@@ min_written = wn->written; else min_written = PARA_MIN(min_written, wn->written); + max_written = PARA_MAX(max_written, wn->written); } + g->last_written = max_written; //PARA_INFO_LOG("loaded: %zd, min_written: %zd bytes\n", *g->loaded, min_written); if (min_written) { *g->loaded -= min_written;