Error AlsaPMO::Reset(bool user_stop) { if (user_stop) snd_pcm_playback_drain(m_handle); else snd_pcm_playback_flush(m_handle); snd_pcm_playback_prepare(m_handle); return kError_NoErr; }
int _alsa_write_buffer(ao_alsa_internal *s) { snd_pcm_channel_status_t status; snd_pcm_t *pcm_handle = s->pcm_handle; int len = s->buf_end; ssize_t written, snd_pcm_write_ret; s->buf_end = 0; snd_pcm_write_ret = written = 0; while ((snd_pcm_write_ret >= 0) && (written < len)) { while ((snd_pcm_write_ret = snd_pcm_write(pcm_handle, s->buf, len)) == -EINTR) ; if (snd_pcm_write_ret > 0) written += snd_pcm_write_ret; } memset(&status, 0, sizeof(status)); if (snd_pcm_channel_status(pcm_handle, &status) < 0) { fprintf(stderr, "ALSA: could not get channel status\n"); return 0; } if (status.underrun) { /* fprintf(stderr, "ALSA: underrun. resetting channel\n"); */ snd_pcm_channel_flush(pcm_handle, SND_PCM_CHANNEL_PLAYBACK); snd_pcm_playback_prepare(pcm_handle); snd_pcm_write(pcm_handle, s->buf, len); if (snd_pcm_channel_status(pcm_handle, &status) < 0) { fprintf(stderr, "ALSA: could not get channel status. giving up\n"); return 0; } if (status.underrun) { fprintf(stderr, "ALSA: write error. giving up\n"); return 0; } } return 1; }