xref: /aosp_15_r20/external/tinyalsa_new/examples/pcm-readi.c (revision 02e95f1a335b55495d41ca67eaf42361f13704fa)
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