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