#include #include #define RATE 44100 #define CHANNELS 2 #define CHK(msg, r) \ { \ if ((r) < 0) { \ fprintf(stderr, "%s: %s\n", msg, snd_strerror(r)); \ return -1; \ } \ } int main(int argc, char *argv[]) { int r, dir; unsigned int p; snd_pcm_t *pcm; snd_pcm_hw_params_t *hw_params; snd_pcm_uframes_t buffer_size, period_size; r = snd_pcm_open(&pcm, argv[1], SND_PCM_STREAM_CAPTURE, 0); CHK("open", r); r = snd_pcm_hw_params_malloc(&hw_params); CHK("params_malloc", r); r = snd_pcm_hw_params_any(pcm, hw_params); CHK("params_any", r); r = snd_pcm_hw_params_set_access(pcm, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED); CHK("params_set_access", r); r = snd_pcm_hw_params_set_format(pcm, hw_params, SND_PCM_FORMAT_S32); CHK("set_format", r); r = snd_pcm_hw_params_set_rate(pcm, hw_params, RATE, 0); CHK("set_rate", r); r = snd_pcm_hw_params_set_channels(pcm, hw_params, CHANNELS); CHK("set_channels",r); if (argc > 2) { p = atoi(argv[2]) * 1000; r = snd_pcm_hw_params_set_buffer_time_near(pcm, hw_params, &p, &dir); CHK("set_buffer_time_near", r); } if (argc > 3) { p = atoi(argv[3]) * 1000; r = snd_pcm_hw_params_set_period_time_near(pcm, hw_params, &p, &dir); CHK("set_period_time_near", r); } r = snd_pcm_hw_params(pcm, hw_params); CHK("hw_params", r); r = snd_pcm_hw_params_get_buffer_size(hw_params, &buffer_size); CHK("get_buffer_size", r); r = snd_pcm_hw_params_get_period_size(hw_params, &period_size, &dir); CHK("get_period_size", r); printf("buffer_size=%d period_size=%d\n", (int)buffer_size, (int)period_size); r = snd_pcm_close(pcm); CHK("pcm_close", r); return 0; }