summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Ossman <ossman@cendio.se>2006-08-22 16:25:47 +0000
committerPierre Ossman <ossman@cendio.se>2006-08-22 16:25:47 +0000
commitb27ffbec8c815d0efa936063482b9bf0bc312103 (patch)
tree995f4bc5aa59f85267e86ddb9e85df8764341ef0
parentd194604402648fbab61bde3d1106fecb1b82dc83 (diff)
Remove silence generation in solaris module.
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@1326 fefdeb5f-60dc-0310-8127-8f9354f1896f
-rw-r--r--src/modules/module-solaris.c55
1 files 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);