From b27ffbec8c815d0efa936063482b9bf0bc312103 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Tue, 22 Aug 2006 16:25:47 +0000 Subject: Remove silence generation in solaris module. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1326 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/modules/module-solaris.c | 55 +++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/src/modules/module-solaris.c b/src/modules/module-solaris.c index 8eaf6758..90cf010b 100644 --- a/src/modules/module-solaris.c +++ b/src/modules/module-solaris.c @@ -80,11 +80,12 @@ struct userdata { pa_usec_t poll_timeout; pa_signal_event *sig; - pa_memchunk memchunk, silence; + pa_memchunk memchunk; uint32_t frame_size; uint32_t buffer_size; unsigned int written_bytes, read_bytes; + int sink_underflow; int fd; pa_module *module; @@ -119,7 +120,6 @@ static void update_usage(struct userdata *u) { static void do_write(struct userdata *u) { audio_info_t info; int err; - pa_memchunk *memchunk; size_t len; ssize_t r; @@ -145,7 +145,7 @@ static void do_write(struct userdata *u) { if (len > u->buffer_size) len = 0; - if (len == u->buffer_size) + if (!u->sink_underflow && (len == u->buffer_size)) pa_log_debug("Solaris buffer underflow!"); len -= len % u->frame_size; @@ -153,37 +153,39 @@ static void do_write(struct userdata *u) { if (len == 0) return; - memchunk = &u->memchunk; - - if (!memchunk->length) - if (pa_sink_render(u->sink, len, memchunk) < 0) - memchunk = &u->silence; + if (!u->memchunk.length) { + if (pa_sink_render(u->sink, len, &u->memchunk) < 0) { + u->sink_underflow = 1; + return; + } + } + + u->sink_underflow = 0; - assert(memchunk->memblock); - assert(memchunk->memblock->data); - assert(memchunk->length); + assert(u->memchunk.memblock); + assert(u->memchunk.memblock->data); + assert(u->memchunk.length); - if (memchunk->length < len) { - len = memchunk->length; + if (u->memchunk.length < len) { + len = u->memchunk.length; len -= len % u->frame_size; assert(len); } - if ((r = pa_iochannel_write(u->io, (uint8_t*) memchunk->memblock->data + memchunk->index, len)) < 0) { + if ((r = pa_iochannel_write(u->io, + (uint8_t*) u->memchunk.memblock->data + u->memchunk.index, len)) < 0) { pa_log("write() failed: %s", pa_cstrerror(errno)); return; } assert(r % u->frame_size == 0); - if (memchunk != &u->silence) { - u->memchunk.index += r; - u->memchunk.length -= r; - - if (u->memchunk.length <= 0) { - pa_memblock_unref(u->memchunk.memblock); - u->memchunk.memblock = NULL; - } + u->memchunk.index += r; + u->memchunk.length -= r; + + if (u->memchunk.length <= 0) { + pa_memblock_unref(u->memchunk.memblock); + u->memchunk.memblock = NULL; } u->written_bytes += r; @@ -590,14 +592,11 @@ int pa__init(pa_core *c, pa_module*m) { u->frame_size = pa_frame_size(&ss); u->buffer_size = buffer_size; - u->silence.memblock = pa_memblock_new(u->core->mempool, u->silence.length = CHUNK_SIZE); - assert(u->silence.memblock); - pa_silence_memblock(u->silence.memblock, &ss); - u->silence.index = 0; - u->written_bytes = 0; u->read_bytes = 0; + u->sink_underflow = 1; + u->module = m; m->userdata = u; @@ -649,8 +648,6 @@ void pa__done(pa_core *c, pa_module*m) { if (u->memchunk.memblock) pa_memblock_unref(u->memchunk.memblock); - if (u->silence.memblock) - pa_memblock_unref(u->silence.memblock); if (u->sink) { pa_sink_disconnect(u->sink); -- cgit