Skip to content

Commit 6e0c88e

Browse files
author
Martin Klang
committed
refactored to use open(), load() and read()
1 parent 8449655 commit 6e0c88e

2 files changed

Lines changed: 125 additions & 272 deletions

File tree

LibSource/Resource.cpp

Lines changed: 48 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,93 +1,71 @@
1-
#include <cstddef>
1+
#include <algorithm>
2+
#include <cstring>
23
#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"
238

249
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) {
2611
// Data is expected to be aligned
2712
if (max_size > size - offset)
2813
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));
3015
}
3116

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);
3318

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;
4023
}
4124

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;
4835
}
4936

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;
5342
void* args[] = {
54-
(void*)name, (void*)&buffer, (void*)&offset, (void*)&max_size
43+
(void*)name, (void*)&data, (void*)&offset, (void*)&resource->size
5544
};
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;
6350
}
51+
}
52+
return resource;
6453
}
6554

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){
6958
void* args[] = {
70-
(void*)name, (void*)&buffer, (void*)&offset, (void*)&max_size
59+
(void*)this->name, (void*)&dest, (void*)&offset, (void*)&len
7160
};
7261
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;
8265
}
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+
}
9371
}

0 commit comments

Comments
 (0)