-
-
Save fanwei918/4255e549ec2c1b5f28aecd615b4c30a8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
A Minimal Capture Program | |
This program opens an audio interface for capture, configures it for | |
stereo, 16 bit, 44.1kHz, interleaved conventional read/write | |
access. Then its reads a chunk of random data from it, and exits. It | |
isn't meant to be a real program. | |
From on Paul David's tutorial : http://equalarea.com/paul/alsa-audio.html | |
Fixes rate and buffer problems | |
sudo apt-get install libasound2-dev | |
gcc -o alsa-record-example -lasound alsa-record-example.c && ./alsa-record-example hw:0 | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <alsa/asoundlib.h> | |
main (int argc, char *argv[]) | |
{ | |
int i; | |
int err; | |
char *buffer; | |
int buffer_frames = 128; | |
unsigned int rate = 44100; | |
snd_pcm_t *capture_handle; | |
snd_pcm_hw_params_t *hw_params; | |
snd_pcm_format_t format = SND_PCM_FORMAT_S16_LE; | |
if ((err = snd_pcm_open (&capture_handle, argv[1], SND_PCM_STREAM_CAPTURE, 0)) < 0) { | |
fprintf (stderr, "cannot open audio device %s (%s)\n", | |
argv[1], | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "audio interface opened\n"); | |
if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) { | |
fprintf (stderr, "cannot allocate hardware parameter structure (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "hw_params allocated\n"); | |
if ((err = snd_pcm_hw_params_any (capture_handle, hw_params)) < 0) { | |
fprintf (stderr, "cannot initialize hardware parameter structure (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "hw_params initialized\n"); | |
if ((err = snd_pcm_hw_params_set_access (capture_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) { | |
fprintf (stderr, "cannot set access type (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "hw_params access setted\n"); | |
if ((err = snd_pcm_hw_params_set_format (capture_handle, hw_params, format)) < 0) { | |
fprintf (stderr, "cannot set sample format (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "hw_params format setted\n"); | |
if ((err = snd_pcm_hw_params_set_rate_near (capture_handle, hw_params, &rate, 0)) < 0) { | |
fprintf (stderr, "cannot set sample rate (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "hw_params rate setted\n"); | |
if ((err = snd_pcm_hw_params_set_channels (capture_handle, hw_params, 2)) < 0) { | |
fprintf (stderr, "cannot set channel count (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "hw_params channels setted\n"); | |
if ((err = snd_pcm_hw_params (capture_handle, hw_params)) < 0) { | |
fprintf (stderr, "cannot set parameters (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "hw_params setted\n"); | |
snd_pcm_hw_params_free (hw_params); | |
fprintf(stdout, "hw_params freed\n"); | |
if ((err = snd_pcm_prepare (capture_handle)) < 0) { | |
fprintf (stderr, "cannot prepare audio interface for use (%s)\n", | |
snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "audio interface prepared\n"); | |
buffer = malloc(128 * snd_pcm_format_width(format) / 8 * 2); | |
fprintf(stdout, "buffer allocated\n"); | |
for (i = 0; i < 10; ++i) { | |
if ((err = snd_pcm_readi (capture_handle, buffer, buffer_frames)) != buffer_frames) { | |
fprintf (stderr, "read from audio interface failed (%s)\n", | |
err, snd_strerror (err)); | |
exit (1); | |
} | |
fprintf(stdout, "read %d done\n", i); | |
} | |
free(buffer); | |
fprintf(stdout, "buffer freed\n"); | |
snd_pcm_close (capture_handle); | |
fprintf(stdout, "audio interface closed\n"); | |
exit (0); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment