From: Jaroslav Kysela Date: Thu, 18 Oct 2001 18:04:26 +0000 (+0000) Subject: Added direct_write transfer method X-Git-Tag: v1.0.3~636 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=d333c1e9deeca422726059770d0770e9e2fea51a;p=alsa-lib.git Added direct_write transfer method --- diff --git a/test/pcm.c b/test/pcm.c index c40a218b..997b3928 100644 --- a/test/pcm.c +++ b/test/pcm.c @@ -419,6 +419,39 @@ static int direct_loop(snd_pcm_t *handle, } } +/* + * Transfer method - direct write only using mmap_write functions + */ + +static int direct_write_loop(snd_pcm_t *handle, + signed short *samples, + snd_pcm_channel_area_t *areas) +{ + double phase = 0; + signed short *ptr; + int err, cptr; + + while (1) { + generate_sine(areas, 0, period_size, &phase); + ptr = samples; + cptr = period_size; + while (cptr > 0) { + err = snd_pcm_mmap_writei(handle, ptr, cptr); + if (err == -EAGAIN) + continue; + if (err < 0) { + if (xrun_recovery(handle, err) < 0) { + printf("Write error: %s\n", snd_strerror(err)); + exit(EXIT_FAILURE); + } + break; /* skip one period */ + } + ptr += err * channels; + cptr -= err; + } + } +} + /* * */ @@ -437,6 +470,7 @@ static struct transfer_method transfer_methods[] = { { "async", SND_PCM_ACCESS_RW_INTERLEAVED, async_loop }, { "direct_interleaved", SND_PCM_ACCESS_MMAP_INTERLEAVED, direct_loop }, { "direct_noninterleaved", SND_PCM_ACCESS_MMAP_NONINTERLEAVED, direct_loop }, + { "direct_write", SND_PCM_ACCESS_MMAP_INTERLEAVED, direct_write_loop }, { NULL, SND_PCM_ACCESS_RW_INTERLEAVED, NULL } };