diff options
Diffstat (limited to 'firmware/buffer.c')
-rw-r--r-- | firmware/buffer.c | 82 |
1 files changed, 79 insertions, 3 deletions
diff --git a/firmware/buffer.c b/firmware/buffer.c index 015fc04b86..a21a882ff2 100644 --- a/firmware/buffer.c +++ b/firmware/buffer.c | |||
@@ -20,6 +20,8 @@ | |||
20 | ****************************************************************************/ | 20 | ****************************************************************************/ |
21 | #include <stdio.h> | 21 | #include <stdio.h> |
22 | #include "buffer.h" | 22 | #include "buffer.h" |
23 | #include "panic.h" | ||
24 | #include "logf.h" | ||
23 | 25 | ||
24 | #if (CONFIG_PLATFORM & PLATFORM_HOSTED) | 26 | #if (CONFIG_PLATFORM & PLATFORM_HOSTED) |
25 | unsigned char audiobuffer[(MEM*1024-256)*1024]; | 27 | unsigned char audiobuffer[(MEM*1024-256)*1024]; |
@@ -31,20 +33,94 @@ extern unsigned char audiobuffer[]; | |||
31 | 33 | ||
32 | unsigned char *audiobuf; | 34 | unsigned char *audiobuf; |
33 | 35 | ||
36 | #ifdef BUFFER_ALLOC_DEBUG | ||
37 | static unsigned char *audiobuf_orig_start; | ||
38 | |||
39 | struct buffer_start_marker | ||
40 | { | ||
41 | unsigned int magic; | ||
42 | size_t buffer_size; | ||
43 | }; | ||
44 | #define BUF_MAGIC 0xDEADD0D0 | ||
45 | |||
46 | struct buffer_end_marker | ||
47 | { | ||
48 | unsigned int magic; | ||
49 | int last; | ||
50 | }; | ||
51 | #endif /* BUFFER_ALLOC_DEBUG */ | ||
52 | |||
34 | void buffer_init(void) | 53 | void buffer_init(void) |
35 | { | 54 | { |
36 | /* 32-bit aligned */ | 55 | /* 32-bit aligned */ |
37 | audiobuf = (void *)(((unsigned long)audiobuffer + 3) & ~3); | 56 | audiobuf = (void *)(((unsigned long)audiobuffer + 3) & ~3); |
57 | #ifdef BUFFER_ALLOC_DEBUG | ||
58 | audiobuf_orig_start = audiobuf; | ||
59 | #endif /* BUFFER_ALLOC_DEBUG */ | ||
38 | } | 60 | } |
39 | 61 | ||
40 | void *buffer_alloc(size_t size) | 62 | void *buffer_alloc(size_t size) |
41 | { | 63 | { |
42 | void *retval = audiobuf; | 64 | void *retval = audiobuf; |
43 | 65 | #ifdef BUFFER_ALLOC_DEBUG | |
44 | audiobuf += size; | 66 | struct buffer_start_marker *start; |
67 | struct buffer_end_marker *end; | ||
68 | #endif /* BUFFER_ALLOC_DEBUG */ | ||
69 | |||
45 | /* 32-bit aligned */ | 70 | /* 32-bit aligned */ |
46 | audiobuf = (void *)(((unsigned long)audiobuf + 3) & ~3); | 71 | size = (size + 3) & ~3; |
72 | |||
73 | #ifdef BUFFER_ALLOC_DEBUG | ||
74 | retval +=sizeof(struct buffer_start_marker); | ||
75 | end=(struct buffer_end_marker*)(audiobuf - sizeof(struct buffer_end_marker)); | ||
76 | if(end->magic == BUF_MAGIC) | ||
77 | { | ||
78 | end->last=0; | ||
79 | } | ||
80 | start=(struct buffer_start_marker*)audiobuf; | ||
81 | start->magic = BUF_MAGIC; | ||
82 | start->buffer_size = size; | ||
83 | end=(struct buffer_end_marker*)(audiobuf+sizeof(struct buffer_start_marker)+size); | ||
84 | end->magic = BUF_MAGIC; | ||
85 | end->last = 1; | ||
86 | |||
87 | audiobuf = ((unsigned char *)end) + sizeof(struct buffer_end_marker); | ||
88 | |||
89 | logf("Alloc %x %d",(unsigned int)retval,size); | ||
90 | #else /* !BUFFER_ALLOC_DEBUG */ | ||
91 | audiobuf += size; | ||
92 | #endif /* BUFFER_ALLOC_DEBUG */ | ||
93 | |||
94 | if (audiobuf > audiobufend) { | ||
95 | panicf("OOM: %d bytes", (int) size); | ||
96 | } | ||
47 | 97 | ||
48 | return retval; | 98 | return retval; |
49 | } | 99 | } |
50 | 100 | ||
101 | #ifdef BUFFER_ALLOC_DEBUG | ||
102 | void buffer_alloc_check(char *name) | ||
103 | { | ||
104 | unsigned char *buf_ptr = audiobuf_orig_start; | ||
105 | struct buffer_start_marker *start; | ||
106 | struct buffer_end_marker *end; | ||
107 | |||
108 | |||
109 | while(buf_ptr < audiobuf) | ||
110 | { | ||
111 | start=(struct buffer_start_marker*)buf_ptr; | ||
112 | if(start->magic != BUF_MAGIC) | ||
113 | { | ||
114 | panicf("%s corrupted buffer %x start", name,(unsigned int)buf_ptr+sizeof(struct buffer_start_marker)); | ||
115 | } | ||
116 | end=(struct buffer_end_marker*)(buf_ptr+sizeof(struct buffer_start_marker)+start->buffer_size); | ||
117 | if(end->magic != BUF_MAGIC) | ||
118 | { | ||
119 | panicf("%s corrupted %x end", name,(unsigned int)buf_ptr+sizeof(struct buffer_start_marker)); | ||
120 | } | ||
121 | if(end->last) | ||
122 | break; | ||
123 | buf_ptr=((unsigned char *)end)+sizeof(struct buffer_end_marker); | ||
124 | } | ||
125 | } | ||
126 | #endif /* BUFFER_ALLOC_DEBUG */ | ||