OpenWareLaboratory
Resource.cpp
Go to the documentation of this file.
1 #include <algorithm>
2 #include <cstring>
3 #include "Resource.h"
4 #include "OpenWareMidiControl.h"
5 #include "ServiceCall.h"
6 #include "ProgramVector.h"
7 
8 template<typename Array, typename Element>
9 Array Resource::asArray(size_t offset, size_t max_size) {
10  // Data is expected to be aligned
11  if (max_size > size - offset)
12  max_size = size - offset;
13  return Array((Element*)(data + offset), max_size / sizeof(Element));
14 }
15 
16 template FloatArray Resource::asArray<FloatArray, float>(size_t offset, size_t max_size);
17 
18 void Resource::destroy(Resource* resource) {
19  if(resource && resource->allocated)
20  delete[] resource->data;
21  delete resource;
22 }
23 
24 Resource* Resource::open(const char* name){
25  uint8_t* data = NULL;
26  size_t offset = 0;
27  size_t size = 0;
28  void* args[] = {
29  (void*)name, (void*)&data, (void*)&offset, (void*)&size
30  };
31  if(getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK)
32  return new Resource(name, size, data);
33  return NULL;
34 }
35 
36 Resource* Resource::load(const char* name){
37  Resource* resource = Resource::open(name);
38  if(resource && !resource->hasData()){
39  size_t offset = 0;
40  size_t size = resource->size;
41  uint8_t* data = new uint8_t[size];
42  void* args[] = {
43  (void*)name, (void*)&data, (void*)&offset, (void*)&size
44  };
45  if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK){
46  resource->data = data;
47  resource->size = size;
48  resource->allocated = true;
49  }else{
50  resource->size = 0;
51  delete[] data;
52  }
53  }
54  return resource;
55 }
56 
57 size_t Resource::read(void* dest, size_t len, size_t offset){
58  if(this->data == NULL){
59  void* args[] = {
60  (void*)this->name, (void*)&dest, (void*)&offset, (void*)&len
61  };
62  if (getProgramVector()->serviceCall(OWL_SERVICE_LOAD_RESOURCE, args, 4) == OWL_SERVICE_OK){
63  return len;
64  }else{
65  return 0;
66  }
67  }else{
68  len = std::min(this->size-offset, len);
69  memcpy(dest, (uint8_t*)this->data+offset, len);
70  return len;
71  }
72 }
#define min(a, b)
Definition: basicmaths.h:38
This class contains useful methods for manipulating arrays of floats.
Definition: FloatArray.h:12
const char * name
Definition: Resource.h:98
bool allocated
Definition: Resource.h:101
size_t read(void *dest, size_t len, size_t offset=0)
Read data from resource into memory.
Definition: Resource.cpp:57
Resource()
Definition: Resource.h:93
uint8_t * data
Definition: Resource.h:100
Array asArray(size_t offset=0, size_t max_size=0xFFFFFFFF)
Array conversion.
Definition: Resource.cpp:9
bool hasData() const
Check if data is available.
Definition: Resource.h:13
static void destroy(Resource *resource)
Clean up used memory resources.
Definition: Resource.cpp:18
size_t size
Definition: Resource.h:99
static Resource * open(const char *name)
Get resource from storage.
Definition: Resource.cpp:24
static Resource * load(const char *name)
Open resource and load data.
Definition: Resource.cpp:36