From a2b28ddd5aa5e11895aa2a53df4065475c525b68 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Sun, 13 Apr 2008 00:10:04 +0000 Subject: some leftover work git-svn-id: file:///home/lennart/svn/public/libsydney/trunk@43 9ba3c220-e4d3-45a2-8aa3-73fcc9aff6ce --- src/oss.c | 57 ++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 17 deletions(-) (limited to 'src/oss.c') 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; -- cgit