#include #include #include #define FORMAT SND_PCM_FORMAT_S16_BE #define RATE 48000 int main(int argc, char *argv[]) { snd_pcm_t *handle; snd_pcm_hw_params_t *params; snd_pcm_sw_params_t *swparams; snd_pcm_uframes_t period_size; snd_pcm_uframes_t buffer_size; snd_pcm_status_t *status; uint8_t *buf; int rate; int ret; ssize_t r; int t; if ((ret = snd_pcm_open(&handle, argv[1], SND_PCM_STREAM_CAPTURE, 0)) < 0) { goto out; } snd_pcm_hw_params_alloca(¶ms); snd_pcm_sw_params_alloca(&swparams); if ((ret = snd_pcm_hw_params_any(handle, params)) < 0) { goto out; } if ((ret = snd_pcm_hw_params_set_access(handle, params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { goto out; } if ((ret = snd_pcm_hw_params_set_format(handle, params, FORMAT)) < 0) { goto out; } if ((ret = snd_pcm_hw_params_set_channels(handle, params, 2)) < 0) { goto out; } rate = RATE; if ((ret = snd_pcm_hw_params_set_rate_near(handle, params, &rate, 0) < 0)) { goto out; } period_size = atoi(argv[2]); if ((ret = snd_pcm_hw_params_set_period_size_near(handle, params, &period_size, 0)) < 0) { fprintf(stderr, "failed to set period size.\n"); } t = 1000000; if ((ret = snd_pcm_hw_params_set_buffer_time_near(handle, params, &t, 0)) < 0) { fprintf(stderr, "failed to set buffer time.\n"); } if ((ret = snd_pcm_hw_params(handle, params)) < 0) { goto out; } snd_pcm_hw_params_get_period_size(params, &period_size, 0); snd_pcm_hw_params_get_buffer_size(params, &buffer_size); snd_pcm_sw_params_current(handle, swparams); if ((ret = snd_pcm_sw_params_set_tstamp_mode(handle, swparams, SND_PCM_TSTAMP_MMAP)) < 0) { goto out; } if ((ret = snd_pcm_sw_params(handle, swparams)) < 0) { goto out; } if ((ret = snd_pcm_prepare(handle)) < 0) { goto out; } buf = malloc(period_size*2*2); snd_pcm_status_alloca(&status); for (t = 0; t < 1000; t++) { r = snd_pcm_readi(handle, buf, period_size); if (snd_pcm_status(handle, status) < 0) { fprintf(stderr, "snd_pcm_status failed.\n"); } else { snd_htimestamp_t tstamp; snd_pcm_status_get_htstamp(status, &tstamp); printf("time: %d %d\n", tstamp.tv_sec, tstamp.tv_nsec); } } snd_pcm_close(handle); out: return 0; }