-static int alsa_write_post_select(__a_unused struct sched *s,
- struct writer_node *wn)
-{
- struct private_alsa_write_data *pad = wn->private_data;
- struct writer_node_group *wng = wn->wng;
- size_t bytes = *wng->loaded - wn->written;
- unsigned char *data = (unsigned char*)*wng->bufp + wn->written;
- snd_pcm_sframes_t ret, frames, avail;
-
- if (*wng->input_error < 0 && (!pad->handle || bytes < pad->bytes_per_frame)) {
- wn->written = *wng->loaded;
- return *wng->input_error;
- }
- if (!bytes) /* no data available */
- return 0;
- if (!pad->handle) {
- int err = alsa_init(pad, wn->conf);
- if (err < 0)
- return err;
- }
- frames = bytes / pad->bytes_per_frame;
- if (!frames) /* less than a single frame available */
- return 0;
- avail = snd_pcm_avail_update(pad->handle);
- if (avail <= 0)
- return 0;
- frames = PARA_MIN(frames, avail);
- ret = snd_pcm_writei(pad->handle, data, frames);
- if (ret >= 0) {
- wn->written += ret * pad->bytes_per_frame;
- return 1;
- }
- if (ret == -EPIPE) {
- xrun(pad->handle);
- snd_pcm_prepare(pad->handle);
- return 0;
- }
- PARA_WARNING_LOG("%s\n", snd_strerror(-ret));
- if (ret == -EAGAIN)
- return 0;
- return -E_ALSA_WRITE;
-}
-