mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-04 13:29:59 -05:00
Tweaks for the solaris module. The sound system requires complete frames
to be written. Also, the sample counter can magically go backwards sometimes, causing havoc with our buffer handling. git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@762 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
989fa585b2
commit
e4b53b2bad
1 changed files with 20 additions and 11 deletions
|
|
@ -70,7 +70,7 @@ struct userdata {
|
||||||
|
|
||||||
pa_memchunk memchunk, silence;
|
pa_memchunk memchunk, silence;
|
||||||
|
|
||||||
uint32_t sample_size;
|
uint32_t frame_size;
|
||||||
uint32_t buffer_size;
|
uint32_t buffer_size;
|
||||||
unsigned int written_bytes, read_bytes;
|
unsigned int written_bytes, read_bytes;
|
||||||
|
|
||||||
|
|
@ -127,12 +127,18 @@ static void do_write(struct userdata *u) {
|
||||||
* by not filling it more than u->buffer_size.
|
* by not filling it more than u->buffer_size.
|
||||||
*/
|
*/
|
||||||
len = u->buffer_size;
|
len = u->buffer_size;
|
||||||
len -= u->written_bytes - (info.play.samples * u->sample_size);
|
len -= u->written_bytes - (info.play.samples * u->frame_size);
|
||||||
|
|
||||||
|
/* The sample counter can sometimes go backwards :( */
|
||||||
|
if (len > u->buffer_size)
|
||||||
|
len = 0;
|
||||||
|
|
||||||
if (len == u->buffer_size)
|
if (len == u->buffer_size)
|
||||||
pa_log_debug(__FILE__": Solaris buffer underflow!");
|
pa_log_debug(__FILE__": Solaris buffer underflow!");
|
||||||
|
|
||||||
if (len < u->sample_size)
|
len -= len % u->frame_size;
|
||||||
|
|
||||||
|
if (len == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
memchunk = &u->memchunk;
|
memchunk = &u->memchunk;
|
||||||
|
|
@ -145,17 +151,20 @@ static void do_write(struct userdata *u) {
|
||||||
assert(memchunk->memblock->data);
|
assert(memchunk->memblock->data);
|
||||||
assert(memchunk->length);
|
assert(memchunk->length);
|
||||||
|
|
||||||
if (memchunk->length < len)
|
if (memchunk->length < len) {
|
||||||
len = memchunk->length;
|
len = 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*) memchunk->memblock->data + memchunk->index, len)) < 0) {
|
||||||
pa_log(__FILE__": write() failed: %s", strerror(errno));
|
pa_log(__FILE__": write() failed: %s", strerror(errno));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (memchunk == &u->silence)
|
assert(r % u->frame_size == 0);
|
||||||
assert(r % u->sample_size == 0);
|
|
||||||
else {
|
if (memchunk != &u->silence) {
|
||||||
u->memchunk.index += r;
|
u->memchunk.index += r;
|
||||||
u->memchunk.length -= r;
|
u->memchunk.length -= r;
|
||||||
|
|
||||||
|
|
@ -264,7 +273,7 @@ static pa_usec_t sink_get_latency_cb(pa_sink *s) {
|
||||||
assert(err >= 0);
|
assert(err >= 0);
|
||||||
|
|
||||||
r += pa_bytes_to_usec(u->written_bytes, &s->sample_spec);
|
r += pa_bytes_to_usec(u->written_bytes, &s->sample_spec);
|
||||||
r -= pa_bytes_to_usec(info.play.samples * u->sample_size, &s->sample_spec);
|
r -= pa_bytes_to_usec(info.play.samples * u->frame_size, &s->sample_spec);
|
||||||
|
|
||||||
if (u->memchunk.memblock)
|
if (u->memchunk.memblock)
|
||||||
r += pa_bytes_to_usec(u->memchunk.length, &s->sample_spec);
|
r += pa_bytes_to_usec(u->memchunk.length, &s->sample_spec);
|
||||||
|
|
@ -282,7 +291,7 @@ static pa_usec_t source_get_latency_cb(pa_source *s) {
|
||||||
err = ioctl(u->fd, AUDIO_GETINFO, &info);
|
err = ioctl(u->fd, AUDIO_GETINFO, &info);
|
||||||
assert(err >= 0);
|
assert(err >= 0);
|
||||||
|
|
||||||
r += pa_bytes_to_usec(info.record.samples * u->sample_size, &s->sample_spec);
|
r += pa_bytes_to_usec(info.record.samples * u->frame_size, &s->sample_spec);
|
||||||
r -= pa_bytes_to_usec(u->read_bytes, &s->sample_spec);
|
r -= pa_bytes_to_usec(u->read_bytes, &s->sample_spec);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
|
|
@ -560,7 +569,7 @@ int pa__init(pa_core *c, pa_module*m) {
|
||||||
|
|
||||||
u->memchunk.memblock = NULL;
|
u->memchunk.memblock = NULL;
|
||||||
u->memchunk.length = 0;
|
u->memchunk.length = 0;
|
||||||
u->sample_size = pa_frame_size(&ss);
|
u->frame_size = pa_frame_size(&ss);
|
||||||
u->buffer_size = buffer_size;
|
u->buffer_size = buffer_size;
|
||||||
|
|
||||||
u->silence.memblock = pa_memblock_new(u->silence.length = CHUNK_SIZE, u->core->memblock_stat);
|
u->silence.memblock = pa_memblock_new(u->silence.length = CHUNK_SIZE, u->core->memblock_stat);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue