/* Causes an infinite loop in alsa-lib's snd_pcm_hw_htimestamp() in the * capture direction * * Build with: * $ gcc -o test -Wall capture_inf_loop.c -lasound */ #include int main(int argc, char **argv) { snd_pcm_t *pcm; snd_pcm_uframes_t avail; snd_pcm_hw_params_t *hw_params; int err; struct timespec ts; unsigned int rate = 44100; err = snd_pcm_open(&pcm, "default", SND_PCM_STREAM_CAPTURE, SND_PCM_NONBLOCK); if(err < 0){ fprintf(stderr, "snd_pcm_open: %s\n", snd_strerror(err)); return 1; } snd_pcm_hw_params_malloc(&hw_params); err = snd_pcm_hw_params_any(pcm, hw_params); if(err < 0){ fprintf(stderr, "snd_pcm_hw_params_any: %s\n", snd_strerror(err)); return 1; } err = snd_pcm_hw_params_set_access(pcm, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); if(err < 0){ fprintf(stderr, "snd_pcm_hw_params_set_access: %s\n", snd_strerror(err)); return 1; } err = snd_pcm_hw_params_set_format(pcm, hw_params, SND_PCM_FORMAT_S16_LE); if(err < 0){ fprintf(stderr, "snd_pcm_hw_params_set_access: %s\n", snd_strerror(err)); return 1; } err = snd_pcm_hw_params_set_rate_near(pcm, hw_params, &rate, NULL); if(err < 0){ fprintf(stderr, "snd_pcm_hw_params_set_rate_near: %s\n", snd_strerror(err)); return 1; } err = snd_pcm_hw_params_set_channels(pcm, hw_params, 2); if(err < 0){ fprintf(stderr, "snd_pcm_hw_params_set_rate_near: %s\n", snd_strerror(err)); return 1; } err = snd_pcm_hw_params(pcm, hw_params); if(err < 0){ fprintf(stderr, "snd_pcm_hw_params: %s\n", snd_strerror(err)); return 1; } fprintf(stderr, "avail_update\n"); snd_pcm_avail_update(pcm); fprintf(stderr, "entering htimestamp...\n"); snd_pcm_htimestamp(pcm, &avail, &ts); fprintf(stderr, "done with htimestamp\n"); snd_pcm_close(pcm); return 0; }