|
1 | | -#include <cstddef> |
| 1 | +#include <algorithm> |
| 2 | +#include <cstring> |
2 | 3 | #include "Resource.h" |
3 | | - |
4 | | -bool Resource::setData(void* src, uint32_t length, bool copy){ |
5 | | - if (hasData()){ |
6 | | - // Buffer is allocated, we don't allow doing it more than once |
7 | | - return false; |
8 | | - } |
9 | | - else if (copy) { |
10 | | - // Allocate a new buffer and copy there |
11 | | - size = length; |
12 | | - data = new uint8_t[size]; |
13 | | - memcpy((void*)data, src, length); |
14 | | - allocated = true; |
15 | | - } |
16 | | - else { |
17 | | - // Set pointer to source data, but don't allocate a new buffer |
18 | | - data = (uint8_t*)src; |
19 | | - size = length; |
20 | | - } |
21 | | - return true; |
22 | | -} |
| 4 | +#include "OpenWareMidiControl.h" |
| 5 | +#include "ServiceCall.h" |
| 6 | +#include "ProgramVector.h" |
| 7 | +#include "FloatArray.h" |
23 | 8 |
|
24 | 9 | template<typename Array, typename Element> |
25 | | -const Array Resource::asArray(uint32_t offset, uint32_t max_size) const { |
| 10 | +Array Resource::asArray(size_t offset, size_t max_size) { |
26 | 11 | // Data is expected to be aligned |
27 | 12 | if (max_size > size - offset) |
28 | 13 | max_size = size - offset; |
29 | | - return Array((Element*)(getData() + offset), max_size / sizeof(Element)); |
| 14 | + return Array((Element*)((uint8_t*)getData() + offset), max_size / sizeof(Element)); |
30 | 15 | } |
31 | 16 |
|
32 | | -template const FloatArray Resource::asArray<FloatArray, float>(uint32_t offset, uint32_t max_size) const; |
| 17 | +template FloatArray Resource::asArray<FloatArray, float>(size_t offset, size_t max_size); |
33 | 18 |
|
34 | | -template<typename Array, typename Element> |
35 | | -Array Resource::asArray(uint32_t offset, uint32_t max_size) { |
36 | | - // Data is expected to be aligned |
37 | | - if (max_size > size - offset) |
38 | | - max_size = size - offset; |
39 | | - return Array((Element*)(getData() + offset), max_size / sizeof(Element)); |
| 19 | +void Resource::destroy(Resource* resource) { |
| 20 | + if (resource && resource->allocated) |
| 21 | + delete[] (uint8_t*)resource->data; |
| 22 | + delete resource; |
40 | 23 | } |
41 | 24 |
|
42 | | -template FloatArray Resource::asArray<FloatArray, float>(uint32_t offset, uint32_t max_size); |
43 | | - |
44 | | -void Resource::destroy(Resource resource) { |
45 | | - if (resource.isAllocated()){ |
46 | | - delete [] resource.getData(); |
47 | | - } |
| 25 | +Resource* Resource::open(const char* name){ |
| 26 | + uint8_t* data = NULL; |
| 27 | + size_t offset = 0; |
| 28 | + size_t size = 0; |
| 29 | + void* args[] = { |
| 30 | + (void*)name, (void*)&data, (void*)&offset, (void*)&size |
| 31 | + }; |
| 32 | + if(getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK) |
| 33 | + return new Resource(name, size, data); |
| 34 | + return NULL; |
48 | 35 | } |
49 | 36 |
|
50 | | -const Resource* Resource::get(const char* name, uint32_t offset, uint32_t max_size) { |
51 | | - uint8_t* buffer = NULL; |
52 | | - // Load resource with a pointer to empty buffer |
| 37 | +Resource* Resource::load(const char* name){ |
| 38 | + Resource* resource = Resource::open(name); |
| 39 | + if(resource != NULL && resource->data == NULL){ |
| 40 | + uint8_t* data = new uint8_t[resource->size]; |
| 41 | + size_t offset = 0; |
53 | 42 | void* args[] = { |
54 | | - (void*)name, (void*)&buffer, (void*)&offset, (void*)&max_size |
| 43 | + (void*)name, (void*)&data, (void*)&offset, (void*)&resource->size |
55 | 44 | }; |
56 | | - if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK && buffer != NULL) { |
57 | | - Resource* resource = new Resource(name); |
58 | | - resource->setData(buffer, max_size, false); |
59 | | - return resource; |
60 | | - } |
61 | | - else { |
62 | | - return NULL; |
| 45 | + if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK){ |
| 46 | + resource->data = data; |
| 47 | + resource->allocated = true; |
| 48 | + }else{ |
| 49 | + delete[] data; |
63 | 50 | } |
| 51 | + } |
| 52 | + return resource; |
64 | 53 | } |
65 | 54 |
|
66 | | -Resource Resource::load(const char* name, uint32_t offset, uint32_t max_size) { |
67 | | - uint8_t* buffer = NULL; |
68 | | - // Load resource header separately to know full resource size in advance |
| 55 | + |
| 56 | +size_t Resource::read(void* dest, size_t len, size_t offset){ |
| 57 | + if(this->data == NULL){ |
69 | 58 | void* args[] = { |
70 | | - (void*)name, (void*)&buffer, (void*)&offset, (void*)&max_size |
| 59 | + (void*)this->name, (void*)&dest, (void*)&offset, (void*)&len |
71 | 60 | }; |
72 | 61 | if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK){ |
73 | | - // Reset data pointer to force allocation on memory mapped resources. |
74 | | - Resource allocated_resource = Resource::create(max_size); |
75 | | - args[1] = &allocated_resource.data; |
76 | | - if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK){ |
77 | | - return allocated_resource; |
78 | | - } |
79 | | - else { |
80 | | - Resource::destroy(allocated_resource); |
81 | | - } |
| 62 | + return len; |
| 63 | + }else{ |
| 64 | + return 0; |
82 | 65 | } |
83 | | - // An empty resource is returned if we've failed to load one |
84 | | - Resource resource(name); |
85 | | - return resource; |
86 | | -} |
87 | | - |
88 | | -Resource Resource::create(uint32_t size) { |
89 | | - Resource resource; |
90 | | - resource.setData(new uint8_t[size], size, false); |
91 | | - resource.allocated = true; |
92 | | - return resource; |
| 66 | + }else{ |
| 67 | + len = std::min(this->size-offset, len); |
| 68 | + memcpy(dest, (uint8_t*)this->data+offset, len); |
| 69 | + return len; |
| 70 | + } |
93 | 71 | } |
0 commit comments