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