1*02e95f1aSMarcin Radomski #include <stdio.h>
2*02e95f1aSMarcin Radomski #include <stdlib.h>
3*02e95f1aSMarcin Radomski
4*02e95f1aSMarcin Radomski #include <tinyalsa/pcm.h>
5*02e95f1aSMarcin Radomski
read_frames(void ** frames)6*02e95f1aSMarcin Radomski static size_t read_frames(void **frames)
7*02e95f1aSMarcin Radomski {
8*02e95f1aSMarcin Radomski unsigned int card = 0;
9*02e95f1aSMarcin Radomski unsigned int device = 0;
10*02e95f1aSMarcin Radomski int flags = PCM_IN;
11*02e95f1aSMarcin Radomski
12*02e95f1aSMarcin Radomski const struct pcm_config config = {
13*02e95f1aSMarcin Radomski .channels = 2,
14*02e95f1aSMarcin Radomski .rate = 48000,
15*02e95f1aSMarcin Radomski .format = PCM_FORMAT_S32_LE,
16*02e95f1aSMarcin Radomski .period_size = 1024,
17*02e95f1aSMarcin Radomski .period_count = 2,
18*02e95f1aSMarcin Radomski .start_threshold = 1024,
19*02e95f1aSMarcin Radomski .silence_threshold = 1024 * 2,
20*02e95f1aSMarcin Radomski .stop_threshold = 1024 * 2
21*02e95f1aSMarcin Radomski };
22*02e95f1aSMarcin Radomski
23*02e95f1aSMarcin Radomski struct pcm *pcm = pcm_open(card, device, flags, &config);
24*02e95f1aSMarcin Radomski if (pcm == NULL) {
25*02e95f1aSMarcin Radomski fprintf(stderr, "failed to allocate memory for PCM\n");
26*02e95f1aSMarcin Radomski return 0;
27*02e95f1aSMarcin Radomski } else if (!pcm_is_ready(pcm)){
28*02e95f1aSMarcin Radomski pcm_close(pcm);
29*02e95f1aSMarcin Radomski fprintf(stderr, "failed to open PCM\n");
30*02e95f1aSMarcin Radomski return 0;
31*02e95f1aSMarcin Radomski }
32*02e95f1aSMarcin Radomski
33*02e95f1aSMarcin Radomski unsigned int frame_size = pcm_frames_to_bytes(pcm, 1);
34*02e95f1aSMarcin Radomski unsigned int frames_per_sec = pcm_get_rate(pcm);
35*02e95f1aSMarcin Radomski
36*02e95f1aSMarcin Radomski *frames = malloc(frame_size * frames_per_sec);
37*02e95f1aSMarcin Radomski if (*frames == NULL) {
38*02e95f1aSMarcin Radomski fprintf(stderr, "failed to allocate frames\n");
39*02e95f1aSMarcin Radomski pcm_close(pcm);
40*02e95f1aSMarcin Radomski return 0;
41*02e95f1aSMarcin Radomski }
42*02e95f1aSMarcin Radomski
43*02e95f1aSMarcin Radomski int read_count = pcm_readi(pcm, *frames, frames_per_sec);
44*02e95f1aSMarcin Radomski
45*02e95f1aSMarcin Radomski size_t byte_count = pcm_frames_to_bytes(pcm, read_count);
46*02e95f1aSMarcin Radomski
47*02e95f1aSMarcin Radomski pcm_close(pcm);
48*02e95f1aSMarcin Radomski
49*02e95f1aSMarcin Radomski return byte_count;
50*02e95f1aSMarcin Radomski }
51*02e95f1aSMarcin Radomski
write_file(const void * frames,size_t size)52*02e95f1aSMarcin Radomski static int write_file(const void *frames, size_t size)
53*02e95f1aSMarcin Radomski {
54*02e95f1aSMarcin Radomski FILE *output_file = fopen("audio.raw", "wb");
55*02e95f1aSMarcin Radomski if (output_file == NULL) {
56*02e95f1aSMarcin Radomski perror("failed to open 'audio.raw' for writing");
57*02e95f1aSMarcin Radomski return EXIT_FAILURE;
58*02e95f1aSMarcin Radomski }
59*02e95f1aSMarcin Radomski fwrite(frames, 1, size, output_file);
60*02e95f1aSMarcin Radomski fclose(output_file);
61*02e95f1aSMarcin Radomski return 0;
62*02e95f1aSMarcin Radomski }
63*02e95f1aSMarcin Radomski
main(void)64*02e95f1aSMarcin Radomski int main(void)
65*02e95f1aSMarcin Radomski {
66*02e95f1aSMarcin Radomski void *frames = NULL;
67*02e95f1aSMarcin Radomski size_t size = 0;
68*02e95f1aSMarcin Radomski
69*02e95f1aSMarcin Radomski size = read_frames(&frames);
70*02e95f1aSMarcin Radomski if (size == 0) {
71*02e95f1aSMarcin Radomski return EXIT_FAILURE;
72*02e95f1aSMarcin Radomski }
73*02e95f1aSMarcin Radomski
74*02e95f1aSMarcin Radomski if (write_file(frames, size) < 0) {
75*02e95f1aSMarcin Radomski free(frames);
76*02e95f1aSMarcin Radomski return EXIT_FAILURE;
77*02e95f1aSMarcin Radomski }
78*02e95f1aSMarcin Radomski
79*02e95f1aSMarcin Radomski free(frames);
80*02e95f1aSMarcin Radomski
81*02e95f1aSMarcin Radomski return EXIT_SUCCESS;
82*02e95f1aSMarcin Radomski }
83*02e95f1aSMarcin Radomski
84