summaryrefslogtreecommitdiff
path: root/firmware/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/buffer.c')
-rw-r--r--firmware/buffer.c82
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)
25unsigned char audiobuffer[(MEM*1024-256)*1024]; 27unsigned char audiobuffer[(MEM*1024-256)*1024];
@@ -31,20 +33,94 @@ extern unsigned char audiobuffer[];
31 33
32unsigned char *audiobuf; 34unsigned char *audiobuf;
33 35
36#ifdef BUFFER_ALLOC_DEBUG
37static unsigned char *audiobuf_orig_start;
38
39struct buffer_start_marker
40{
41 unsigned int magic;
42 size_t buffer_size;
43};
44#define BUF_MAGIC 0xDEADD0D0
45
46struct buffer_end_marker
47{
48 unsigned int magic;
49 int last;
50};
51#endif /* BUFFER_ALLOC_DEBUG */
52
34void buffer_init(void) 53void 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
40void *buffer_alloc(size_t size) 62void *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
102void 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 */