summaryrefslogtreecommitdiffstats
path: root/src/oss.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/oss.c')
-rw-r--r--src/oss.c57
1 files changed, 40 insertions, 17 deletions
diff --git a/src/oss.c b/src/oss.c
index 4e9cf4e..410fa45 100644
--- a/src/oss.c
+++ b/src/oss.c
@@ -38,6 +38,8 @@ struct oss_stream {
sa_thread *thread;
int socket_fds[2];
sa_bufferq_t bufferq;
+
+ void *cdata;
};
static int simple_log2(int v) {
@@ -558,7 +560,10 @@ int driver_open(sa_stream_t *s) {
if (s->mode & SA_MODE_WRONLY)
printf("Chosen for write: %u fragments, %u fragsize\n", oss->write_nfragments, oss->write_fragment_size);
- if (sa_bufferq_init(&oss->bufferq, s->pcm_attrs.nchannels, s->pcm_sample_size) < 0)
+ if (sa_bufferq_init(&oss->bufferq, s->ni_enabled ? s->pcm_attrs.nchannels : 1) < 0)
+ goto fail;
+
+ if ((oss->cdata = pa_new(void*, s->ni_enabled ? s->pcm_attrs.nchannels : 1) < 0)
goto fail;
return SA_SUCCESS;
@@ -585,6 +590,8 @@ int driver_destroy(sa_stream_t *s) {
sa_converter_done(&oss->converter_read);
sa_converter_done(&oss->converter_write);
+ sa_free(oss->cdata);
+
sa_free(oss);
}
@@ -603,30 +610,37 @@ static int feed(sa_stream_t *s) {
return ret;
while (w > 0) {
- void* i[1];
size_t nbytes;
uint8_t *d;
- int drop;
+ sa_bool_t drop;
- sa_bufferq_get(&oss->bufferq, i, &nbytes);
+ sa_bufferq_get(&oss->bufferq, cdata, &nbytes);
- if (nbytes) {
+ if (nbytes > 0) {
void **dst;
size_t *stride;
- if ((ret = sa_converter_go_interleaved(&oss->converter_write, i[0], &dst, &stride, 1, &nbytes)))
- return ret;
+ if (s->ni_enabled) {
+
+ if ((ret = sa_converter_go(&oss->converter_write, cdata, &dst, &stride,
- d = dst[0];
- drop = 1;
+ } else {
+
+ if ((ret = sa_converter_go_interleaved(&oss->converter_write, cdata, &dst, &stride, 1, &nbytes)))
+ goto fail;
+
+ d = dst[0];
+ }
+ drop = TRUE;
s->state = SA_STATE_RUNNING;
} else {
nbytes = w > oss->write_fragment_size ? oss->write_fragment_size : w;
- if (!(d = sa_converter_get_zero_buffer(&oss->converter_write, nbytes)))
- return SA_ERROR_OOM;
+ if (!(d = sa_converter_get_zero_buffer(&oss->converter_write, nbytes))) {
+ ret = SA_ERROR_OOM;
+ goto fail;
drop = s->xrun_mode == SA_XRUN_MODE_SPIN;
@@ -637,8 +651,10 @@ static int feed(sa_stream_t *s) {
while (nbytes > 0) {
ssize_t l;
- if ((l = write(oss->fd, d, nbytes)) < 0)
- return SA_ERROR_SYSTEM;
+ if ((l = write(oss->fd, d, nbytes)) < 0) {
+ ret = SA_ERROR_SYSTEM;
+ goto fail;
+ }
sa_assert(l > 0);
@@ -653,12 +669,18 @@ static int feed(sa_stream_t *s) {
}
}
- return SA_SUCCESS;
+ ret = SA_SUCCESS;
+
+fail:
+
+ sa_free(i);
+
+ return ret;
}
enum {
POLLFD_OSS_FD,
- POLLFD_SOCKET_FD,
+ POLLFD_PIPE_FD,
POLLFD_MAX
};
@@ -668,8 +690,8 @@ static void thread_func(void *data) {
oss_stream_t *oss = OSS_STREAM(s);
sigset_t mask;
- sigfillset(&mask);
- pthread_sigmask(SIG_BLOCK, &mask, NULL);
+ sa_assert_se(sigfillset(&mask) == 0);
+ sa_assert_se(pthread_sigmask(SIG_BLOCK, &mask, NULL) == 0);
if (s->callback) {
s->event = SA_EVENT_INIT_THREAD;
@@ -687,6 +709,7 @@ static void thread_func(void *data) {
for (;;) {
int ret;
+
if (poll(pollfds, POLLFD_MAX, -1) < 0) {
if (errno == EINTR)
continue;