Guest User

Simple alsa recorder example

a guest
Jul 18th, 2015
293
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.83 KB | None | 0 0
  1. /// This work is free. You can redistribute it and/or modify it under the
  2. /// terms of the Do What The Fuck You Want To Public License, Version 2,
  3. /// as published by Sam Hocevar. See http://www.wtfpl.net/ for more details.
  4. // gcc -o alsa_record alsa_record.c -lasound
  5. #include <assert.h>
  6. #include <alsa/asoundlib.h>
  7. #include <math.h>
  8. #define FRAMES 100
  9. short buffer[FRAMES*2]; // stereo
  10. int main(int argc, char *argv[]) {
  11.   const char *pcmname = argc == 2 ? argv[1] : "default";
  12.   snd_pcm_t *pcm;
  13.   assert( snd_pcm_open(&pcm, pcmname, SND_PCM_STREAM_CAPTURE, 0) == 0 );
  14.   assert(
  15.     snd_pcm_set_params(pcm, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 1/*channels*/, 48000/*rate*/, 1, 250*1000/*latency*/) == 0 ||
  16.     snd_pcm_set_params(pcm, SND_PCM_FORMAT_S16_LE, SND_PCM_ACCESS_RW_INTERLEAVED, 2/*channels*/, 48000/*rate*/, 1, 250*1000/*latency*/) == 0
  17.   );
  18.  
  19.   // Need to set start_threshold
  20.   // PCM reads into readi() buffer and never starts if sizeof(buffer) < start_threshold:
  21.   snd_pcm_sw_params_t *swparams;
  22.   snd_pcm_sw_params_alloca(&swparams);
  23.   assert( snd_pcm_sw_params_current(pcm, swparams) == 0 );
  24.   snd_pcm_uframes_t start_threshold = -1;
  25.   assert( snd_pcm_sw_params_get_start_threshold(swparams, &start_threshold) == 0 );
  26.   fprintf(stderr, "[start_threshold=%d]\n", (int)start_threshold);
  27.   start_threshold = 1;
  28.   assert( snd_pcm_sw_params_set_start_threshold(pcm, swparams, start_threshold) == 0 );
  29.   assert( snd_pcm_sw_params(pcm, swparams) == 0 );
  30.  
  31.   int i;
  32.   for (i = 0; i < 144000; ) {
  33.     snd_pcm_sframes_t r = snd_pcm_readi(pcm, buffer, FRAMES);
  34.     fprintf(stderr, "snd_pcm_readi(%d)=%d\n", FRAMES, (int)r);
  35.     if (r < 0)
  36.       fprintf(stderr, "snd_pcm_recover()=%d\n", (int)snd_pcm_recover(pcm, r, 1));
  37.     else if (r > 0)
  38.       i += r;
  39.   }
  40.   assert( snd_pcm_close(pcm) == 0 );
  41.   return 0;
  42. }
Advertisement
Add Comment
Please, Sign In to add comment