xref: /aosp_15_r20/external/tinyalsa_new/examples/pcm-writei.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 
file_size(FILE * file)6*02e95f1aSMarcin Radomski static long int file_size(FILE * file)
7*02e95f1aSMarcin Radomski {
8*02e95f1aSMarcin Radomski     if (fseek(file, 0, SEEK_END) < 0) {
9*02e95f1aSMarcin Radomski         return -1;
10*02e95f1aSMarcin Radomski     }
11*02e95f1aSMarcin Radomski     long int file_size = ftell(file);
12*02e95f1aSMarcin Radomski     if (fseek(file, 0, SEEK_SET) < 0) {
13*02e95f1aSMarcin Radomski         return -1;
14*02e95f1aSMarcin Radomski     }
15*02e95f1aSMarcin Radomski     return file_size;
16*02e95f1aSMarcin Radomski }
17*02e95f1aSMarcin Radomski 
read_file(void ** frames)18*02e95f1aSMarcin Radomski static size_t read_file(void ** frames){
19*02e95f1aSMarcin Radomski 
20*02e95f1aSMarcin Radomski     FILE * input_file = fopen("audio.raw", "rb");
21*02e95f1aSMarcin Radomski     if (input_file == NULL) {
22*02e95f1aSMarcin Radomski         perror("failed to open 'audio.raw' for writing");
23*02e95f1aSMarcin Radomski         return 0;
24*02e95f1aSMarcin Radomski     }
25*02e95f1aSMarcin Radomski 
26*02e95f1aSMarcin Radomski     long int size = file_size(input_file);
27*02e95f1aSMarcin Radomski     if (size < 0) {
28*02e95f1aSMarcin Radomski         perror("failed to get file size of 'audio.raw'");
29*02e95f1aSMarcin Radomski         fclose(input_file);
30*02e95f1aSMarcin Radomski         return 0;
31*02e95f1aSMarcin Radomski     }
32*02e95f1aSMarcin Radomski 
33*02e95f1aSMarcin Radomski     *frames = malloc(size);
34*02e95f1aSMarcin Radomski     if (*frames == NULL) {
35*02e95f1aSMarcin Radomski         fprintf(stderr, "failed to allocate frames\n");
36*02e95f1aSMarcin Radomski         fclose(input_file);
37*02e95f1aSMarcin Radomski         return 0;
38*02e95f1aSMarcin Radomski     }
39*02e95f1aSMarcin Radomski 
40*02e95f1aSMarcin Radomski     size = fread(*frames, 1, size, input_file);
41*02e95f1aSMarcin Radomski 
42*02e95f1aSMarcin Radomski     fclose(input_file);
43*02e95f1aSMarcin Radomski 
44*02e95f1aSMarcin Radomski     return size;
45*02e95f1aSMarcin Radomski }
46*02e95f1aSMarcin Radomski 
write_frames(const void * frames,size_t byte_count)47*02e95f1aSMarcin Radomski static int write_frames(const void * frames, size_t byte_count){
48*02e95f1aSMarcin Radomski 
49*02e95f1aSMarcin Radomski     unsigned int card = 0;
50*02e95f1aSMarcin Radomski     unsigned int device = 0;
51*02e95f1aSMarcin Radomski     int flags = PCM_OUT;
52*02e95f1aSMarcin Radomski 
53*02e95f1aSMarcin Radomski     const struct pcm_config config = {
54*02e95f1aSMarcin Radomski         .channels = 2,
55*02e95f1aSMarcin Radomski         .rate = 48000,
56*02e95f1aSMarcin Radomski         .format = PCM_FORMAT_S32_LE,
57*02e95f1aSMarcin Radomski         .period_size = 1024,
58*02e95f1aSMarcin Radomski         .period_count = 2,
59*02e95f1aSMarcin Radomski         .start_threshold = 1024,
60*02e95f1aSMarcin Radomski         .silence_threshold = 1024 * 2,
61*02e95f1aSMarcin Radomski         .stop_threshold = 1024 * 2
62*02e95f1aSMarcin Radomski     };
63*02e95f1aSMarcin Radomski 
64*02e95f1aSMarcin Radomski     struct pcm * pcm = pcm_open(card, device, flags, &config);
65*02e95f1aSMarcin Radomski     if (pcm == NULL) {
66*02e95f1aSMarcin Radomski         fprintf(stderr, "failed to allocate memory for PCM\n");
67*02e95f1aSMarcin Radomski         return -1;
68*02e95f1aSMarcin Radomski     } else if (!pcm_is_ready(pcm)){
69*02e95f1aSMarcin Radomski         pcm_close(pcm);
70*02e95f1aSMarcin Radomski         fprintf(stderr, "failed to open PCM\n");
71*02e95f1aSMarcin Radomski         return -1;
72*02e95f1aSMarcin Radomski     }
73*02e95f1aSMarcin Radomski 
74*02e95f1aSMarcin Radomski     unsigned int frame_count = pcm_bytes_to_frames(pcm, byte_count);
75*02e95f1aSMarcin Radomski 
76*02e95f1aSMarcin Radomski     int err = pcm_writei(pcm, frames, frame_count);
77*02e95f1aSMarcin Radomski     if (err < 0) {
78*02e95f1aSMarcin Radomski       printf("error: %s\n", pcm_get_error(pcm));
79*02e95f1aSMarcin Radomski     }
80*02e95f1aSMarcin Radomski 
81*02e95f1aSMarcin Radomski     pcm_close(pcm);
82*02e95f1aSMarcin Radomski 
83*02e95f1aSMarcin Radomski     return 0;
84*02e95f1aSMarcin Radomski }
85*02e95f1aSMarcin Radomski 
main(void)86*02e95f1aSMarcin Radomski int main(void)
87*02e95f1aSMarcin Radomski {
88*02e95f1aSMarcin Radomski     void *frames;
89*02e95f1aSMarcin Radomski     size_t size;
90*02e95f1aSMarcin Radomski 
91*02e95f1aSMarcin Radomski     size = read_file(&frames);
92*02e95f1aSMarcin Radomski     if (size == 0) {
93*02e95f1aSMarcin Radomski         return EXIT_FAILURE;
94*02e95f1aSMarcin Radomski     }
95*02e95f1aSMarcin Radomski 
96*02e95f1aSMarcin Radomski     if (write_frames(frames, size) < 0) {
97*02e95f1aSMarcin Radomski         return EXIT_FAILURE;
98*02e95f1aSMarcin Radomski     }
99*02e95f1aSMarcin Radomski 
100*02e95f1aSMarcin Radomski     free(frames);
101*02e95f1aSMarcin Radomski     return EXIT_SUCCESS;
102*02e95f1aSMarcin Radomski }
103*02e95f1aSMarcin Radomski 
104