X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=aoview%2Faoview_flite.c;h=e1b758983d171211d5ee9ade5ec578e7dfa02575;hp=2673824dbdcfaf0780babfd20093fa4a0ca775a6;hb=a5782398d968e7cb11f7203afada7c216f233b3b;hpb=fef7334bddb9fccfbd6deab7d5d466ab3e76323a diff --git a/aoview/aoview_flite.c b/aoview/aoview_flite.c index 2673824d..e1b75898 100644 --- a/aoview/aoview_flite.c +++ b/aoview/aoview_flite.c @@ -37,6 +37,8 @@ aoview_flite_task(gpointer data) int rate; int channels; int err; + char *samples; + int num_samples; err = snd_pcm_open(&alsa_handle, "default", SND_PCM_STREAM_PLAYBACK, 0); @@ -58,21 +60,34 @@ aoview_flite_task(gpointer data) { rate = wave->sample_rate; channels = wave->num_channels; - snd_pcm_set_params(alsa_handle, - SND_PCM_FORMAT_S16, - SND_PCM_ACCESS_RW_INTERLEAVED, - channels, - rate, - 1, - 100000); + err = snd_pcm_set_params(alsa_handle, + SND_PCM_FORMAT_S16, + SND_PCM_ACCESS_RW_INTERLEAVED, + channels, + rate, + 1, + 100000); + if (err < 0) + fprintf(stderr, "alsa set_params error %s\n", + strerror(-err)); } - snd_pcm_prepare(alsa_handle); - err = snd_pcm_writei(alsa_handle, - wave->samples, - wave->num_samples); + err = snd_pcm_prepare(alsa_handle); if (err < 0) - fprintf(stderr, "alsa write error %s\n", + fprintf(stderr, "alsa pcm_prepare error %s\n", strerror(-err)); + samples = (char *) wave->samples; + num_samples = wave->num_samples; + while (num_samples > 0) { + err = snd_pcm_writei(alsa_handle, + samples, num_samples); + if (err <= 0) { + fprintf(stderr, "alsa write error %s\n", + strerror(-err)); + break; + } + num_samples -= err; + samples += err * 2 * channels; + } snd_pcm_drain(alsa_handle); delete_wave(wave); }