Ktam3874/pitx software guide – Kontron KTAM3874-pITX User Manual
Page 98
KTD-S0057-I
Page 94 Linux® Programming Examples (DebianTM)
 
 
KTAM3874/pITX Software Guide
 
/* Underrun and suspend recovery */ 
static int xrun_recovery (snd_pcm_t *handle, int err) 
{ 
 if 
(verbose)
printf("Stream
recovery\n");
if (err == -EPIPE)
/* under-run */
 { 
 
err = snd_pcm_prepare (handle);
if (err < 0)
printf ("Can't recovery from underrun, prepare failed: %s\n", snd_strerror (err));
return
0;
 } 
 
else if (err == -ESTRPIPE)
 { 
 
while ((err = snd_pcm_resume (handle)) == -EAGAIN)
sleep (1);
/* wait until the suspend flag is released */
if (err < 0)
{
err = snd_pcm_prepare (handle);
if (err < 0)
printf ("Can't recovery from suspend, prepare failed: %s\n", snd_strerror (err));
}
return
0;
}
return
err;
} 
 
 
/* Transfer method - write only */
static int 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_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);
}