Skip to content

Commit 34faabf

Browse files
author
Martin Klang
committed
revert to pass-by-pointer to prevent double collection due to copy constructors. Added Patch::getResource()
1 parent e5f3bb1 commit 34faabf

5 files changed

Lines changed: 47 additions & 21 deletions

File tree

LibSource/Patch.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "PatchProcessor.h"
77
#include "basicmaths.h"
88
#include "main.h"
9+
#include "message.h"
910

1011
AudioBuffer::~AudioBuffer(){}
1112

@@ -91,6 +92,13 @@ void Patch::sendMidi(MidiMessage msg){
9192

9293
#endif /* USE_MIDI_CALLBACK */
9394

95+
Resource* Patch::getResource(const char* name){
96+
Resource* resource = Resource::load(name);
97+
if(resource == NULL)
98+
error(CONFIGURATION_ERROR_STATUS, "Missing Resource");
99+
return resource;
100+
}
101+
94102
#include "MemoryBuffer.hpp"
95103
AudioBuffer* AudioBuffer::create(int channels, int samples){
96104
return new ManagedMemoryBuffer(channels, samples);

LibSource/Patch.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "device.h"
55
#include "basicmaths.h"
6+
#include "Resource.h"
67
#include "FloatArray.h"
78
#include "PatchParameter.h"
89
#include "SmoothValue.h"
@@ -70,6 +71,12 @@ class Patch {
7071
virtual void processMidi(MidiMessage msg);
7172
virtual void sendMidi(MidiMessage msg);
7273
#endif /* USE_MIDI_CALLBACK */
74+
/**
75+
* Get a resource (such as a stored FloatArray) from the firmware.
76+
* If the resource does not exist, this raises an error.
77+
* If the resource exists but is not memory mapped, this will allocate new memory.
78+
*/
79+
Resource* getResource(const char* name);
7380
};
7481

7582
#endif // __Patch_h__

LibSource/Resource.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,39 @@ Array Resource::asArray(size_t offset, size_t max_size) {
1010
// Data is expected to be aligned
1111
if (max_size > size - offset)
1212
max_size = size - offset;
13-
return Array((Element*)((uint8_t*)getData() + offset), max_size / sizeof(Element));
13+
return Array((Element*)(data + offset), max_size / sizeof(Element));
1414
}
1515

1616
template FloatArray Resource::asArray<FloatArray, float>(size_t offset, size_t max_size);
1717

18-
Resource::~Resource() {
19-
if(allocated)
20-
delete[] (uint8_t*)data;
18+
void Resource::destroy(Resource* resource) {
19+
if(resource && resource->allocated)
20+
delete[] resource->data;
2121
}
2222

23-
Resource Resource::open(const char* name){
23+
Resource* Resource::open(const char* name){
2424
uint8_t* data = NULL;
2525
size_t offset = 0;
2626
size_t size = 0;
2727
void* args[] = {
2828
(void*)name, (void*)&data, (void*)&offset, (void*)&size
2929
};
3030
if(getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK)
31-
return Resource(name, size, data);
32-
return Resource();
31+
return new Resource(name, size, data);
32+
return NULL;
3333
}
3434

35-
Resource Resource::load(const char* name){
36-
Resource resource = Resource::open(name);
37-
if(resource.exists() && !resource.hasData()){
38-
uint8_t* data = new uint8_t[resource.size];
35+
Resource* Resource::load(const char* name){
36+
Resource* resource = Resource::open(name);
37+
if(resource && !resource->hasData()){
38+
uint8_t* data = new uint8_t[resource->size];
3939
size_t offset = 0;
4040
void* args[] = {
41-
(void*)name, (void*)&data, (void*)&offset, (void*)&resource.size
41+
(void*)name, (void*)&data, (void*)&offset, (void*)&resource->size
4242
};
4343
if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK){
44-
resource.data = data;
45-
resource.allocated = true;
44+
resource->data = data;
45+
resource->allocated = true;
4646
}else{
4747
delete[] data;
4848
}

LibSource/Resource.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#define __RESOURCE_STORAGE_H__
33

44
#include <cstddef>
5+
#include <stdint.h>
56
#include "FloatArray.h"
67

78
class Resource {
@@ -31,6 +32,10 @@ class Resource {
3132
return size != 0;
3233
}
3334

35+
bool isMutable() const {
36+
return allocated;
37+
}
38+
3439
/**
3540
* Get resource name
3641
*/
@@ -53,20 +58,26 @@ class Resource {
5358

5459
/**
5560
* Get resource from storage.
61+
* Returned object must be garbage collected with Resource::destroy()
5662
*
5763
* @param name resource name
5864
*
5965
* @return NULL if resource does not exist or can't be read.
6066
*
6167
*/
62-
static Resource open(const char* name);
68+
static Resource* open(const char* name);
6369

6470
/**
6571
* Open resource and load data.
66-
* Allocates extra memory if required, which will be garbage collected
67-
* in the object destructor.
72+
* Allocates extra memory to hold the resource if required.
73+
* Returned object must be garbage collected with Resource::destroy()
74+
*/
75+
static Resource* load(const char* name);
76+
77+
/**
78+
* Clean up used memory resources.
6879
*/
69-
static Resource load(const char* name);
80+
static void destroy(Resource* resource);
7081

7182
/**
7283
* Read data from resource into memory
@@ -82,10 +93,10 @@ class Resource {
8293
~Resource();
8394
protected:
8495
Resource(const char* name, size_t size, void* data)
85-
: name(name), size(size), data(data) {}
96+
: name(name), size(size), data((uint8_t*)data) {}
8697
const char* name;
98+
uint8_t* data;
8799
size_t size;
88-
void* data;
89100
bool allocated;
90101
};
91102
#endif

Source/main.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ ProgramVector programVector __attribute__ ((section (".pv")));
2121

2222
extern "C" {
2323
void vApplicationMallocFailedHook( void ){
24-
error(0x60, "Memory overflow");
24+
error(OUT_OF_MEMORY_ERROR_STATUS, "Memory overflow");
2525
}
2626
}
2727

0 commit comments

Comments
 (0)