X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=alsa_write.c;h=7e71d4aef70396c4ee7599d9ca890f7ec9cc04d5;hb=b4cb84e1e872a6f9ea6fc9b54d9edda3950e58c8;hp=bbbf8b650ac86c4952ac46f22c166583018bfb88;hpb=27e8c0dca96754834fcc358cfbab548e0be69eb6;p=paraslash.git diff --git a/alsa_write.c b/alsa_write.c index bbbf8b65..7e71d4ae 100644 --- a/alsa_write.c +++ b/alsa_write.c @@ -48,7 +48,7 @@ struct private_alsa_write_data { /* time until buffer underrun occurs, in milliseconds */ unsigned buffer_time; struct timeval drain_barrier; - /* File descriptor for select(). */ + /* File descriptor to monitor for reading. */ int poll_fd; }; @@ -61,6 +61,8 @@ static snd_pcm_format_t get_alsa_pcm_format(enum sample_format sf) case SF_S16_BE: return SND_PCM_FORMAT_S16_BE; case SF_U16_LE: return SND_PCM_FORMAT_U16_LE; case SF_U16_BE: return SND_PCM_FORMAT_U16_BE; + case SF_FLOAT_LE: return SND_PCM_FORMAT_FLOAT_LE; + case SF_FLOAT_BE: return SND_PCM_FORMAT_FLOAT_BE; default: return SND_PCM_FORMAT_S16_LE; } } @@ -202,7 +204,7 @@ out: return ret; } -static void alsa_write_pre_select(struct sched *s, void *context) +static void alsa_write_pre_monitor(struct sched *s, void *context) { struct pollfd pfd; struct writer_node *wn = context; @@ -230,7 +232,7 @@ static void alsa_write_pre_select(struct sched *s, void *context) return; } pad->poll_fd = pfd.fd; - para_fd_set(pfd.fd, &s->rfds, &s->max_fileno); + sched_monitor_readfd(pfd.fd, s); } static void alsa_close(struct writer_node *wn) @@ -254,7 +256,7 @@ free_pad: free(pad); } -static int alsa_write_post_select(__a_unused struct sched *s, void *context) +static int alsa_write_post_monitor(__a_unused struct sched *s, void *context) { struct writer_node *wn = context; struct private_alsa_write_data *pad = wn->private_data; @@ -277,7 +279,7 @@ again: bytes = btr_next_buffer(btrn, &data); if (ret < 0 || bytes < wn->min_iqs) { /* eof */ assert(btr_no_parent(btrn)); - ret = -E_WRITE_COMMON_EOF; + ret = -E_EOF; if (!pad) goto err; /* wait until pending frames are played */ @@ -296,7 +298,7 @@ again: if (bytes == 0) /* no data available */ return 0; - pad = wn->private_data = para_calloc(sizeof(*pad)); + pad = wn->private_data = zalloc(sizeof(*pad)); ret = get_btr_sample_rate(btrn, &val); if (ret < 0) goto err; @@ -321,7 +323,7 @@ again: frames = snd_pcm_writei(pad->handle, data, frames); if (frames == 0 || frames == -EAGAIN) { char buf[100]; - if (pad->poll_fd >= 0 && FD_ISSET(pad->poll_fd, &s->rfds)) + if (pad->poll_fd >= 0 && sched_read_ok(pad->poll_fd, s)) if (read(pad->poll_fd, buf, 100)) do_nothing; return 0; @@ -349,7 +351,7 @@ err: struct writer lsg_write_cmd_com_alsa_user_data = { - .pre_select = alsa_write_pre_select, - .post_select = alsa_write_post_select, + .pre_monitor = alsa_write_pre_monitor, + .post_monitor = alsa_write_post_monitor, .close = alsa_close, };