X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=alsa_writer.c;h=da02ac28a5f7e2e84b94d29900b793c611963b5c;hb=b680e18c069fef1a03b83a5f906c994e1ab063a1;hp=7dab4585d46d221d46692409173d8046e9ab392d;hpb=9337bed6e84a4068e750fb6597646b45778eeba7;p=paraslash.git diff --git a/alsa_writer.c b/alsa_writer.c index 7dab4585..da02ac28 100644 --- a/alsa_writer.c +++ b/alsa_writer.c @@ -170,24 +170,24 @@ static int alsa_write_post_select(struct sched *s, struct writer_node *wn) { struct private_alsa_data *pad = wn->private_data; struct writer_node_group *wng = wn->wng; - size_t frames = *wng->loaded / pad->bytes_per_frame; + size_t frames = (*wng->loaded - wn->written) / pad->bytes_per_frame; snd_pcm_sframes_t ret; - unsigned char *data = (unsigned char*)wng->buf; + unsigned char *data = (unsigned char*)wng->buf + wn->written; struct timeval tv; // PARA_INFO_LOG("%zd frames\n", frames); if (!frames) { if (*wng->input_eof) - ret = *wng->loaded; - return 0; + wn->written = *wng->loaded; + return 1; } if (tv_diff(&s->now, &pad->next_chunk, NULL) < 0) - return 0; + return 1; ret = snd_pcm_writei(pad->handle, data, frames); if (ret == -EPIPE) { PARA_WARNING_LOG("%s", "EPIPE\n"); snd_pcm_prepare(pad->handle); - return 0; + return 1; } if (ret < 0) { PARA_WARNING_LOG("%s", "ALSA ERROR\n"); @@ -196,7 +196,8 @@ static int alsa_write_post_select(struct sched *s, struct writer_node *wn) ms2tv(pad->buffer_time / 4000, &tv); // ms2tv(1, &tv); tv_add(&s->now, &tv, &pad->next_chunk); - return ret * pad->bytes_per_frame; + wn->written += ret * pad->bytes_per_frame; + return 1; } static void alsa_close(struct writer_node *wn)