1 #include <string.h>
2 #include <stdlib.h>
3 #include "audio/sources/raw_source.h"
4 #include "utils/log.h"
5 
6 typedef struct raw_source_t {
7     char *buf;
8     int len;
9     int pos;
10 } raw_source;
11 
12 // TODO: Implement looping if necessary
13 
raw_source_update(audio_source * src,char * buffer,int len)14 int raw_source_update(audio_source *src, char *buffer, int len) {
15     raw_source *local = source_get_userdata(src);
16     int data_left = local->len - local->pos;
17     if(data_left == 0) {
18         return 0;
19     }
20     int real_len = (len > data_left) ? data_left : len;
21     memcpy(buffer, local->buf + local->pos, real_len);
22     local->pos += real_len;
23     return real_len;
24 }
25 
raw_source_close(audio_source * src)26 void raw_source_close(audio_source *src) {
27     raw_source *local = source_get_userdata(src);
28     /*DEBUG("Raw Source: Closed (len: %d).", local->len);*/
29     free(local);
30 }
31 
raw_source_init(audio_source * src,char * buffer,int len)32 int raw_source_init(audio_source *src, char* buffer, int len) {
33     raw_source *local = malloc(sizeof(raw_source));
34 
35     // Set data
36     local->pos = 0;
37     local->len = len;
38     local->buf = buffer;
39 
40     // Audio information
41     source_set_frequency(src, 8000);
42     source_set_bytes(src, 1);
43     source_set_channels(src, 1);
44 
45     // Set callbacks
46     source_set_userdata(src, local);
47     source_set_update_cb(src, raw_source_update);
48     source_set_close_cb(src, raw_source_close);
49 
50     // Some debug info
51     /*DEBUG("Raw Source: Loaded raw pcm sample succesfully.");*/
52 
53     // All done
54     return 0;
55 }
56