diff options
author | David Robillard <d@drobilla.net> | 2015-12-03 17:53:03 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2015-12-03 19:14:03 -0500 |
commit | 5c6465ba7988a36a75b1b78a38830297a4ec35cd (patch) | |
tree | 468d6cb66eb95e4a735f8dfd010bf2a434b1629f | |
parent | a34ea338a347c4ebd3a190b60cde664d977412e8 (diff) | |
download | lv2-5c6465ba7988a36a75b1b78a38830297a4ec35cd.tar.xz |
eg-sampler: Fix handling of state file paths
-rw-r--r-- | lv2/lv2plug.in/ns/meta/meta.ttl | 2 | ||||
-rw-r--r-- | plugins/eg-sampler.lv2/sampler.c | 67 |
2 files changed, 47 insertions, 22 deletions
diff --git a/lv2/lv2plug.in/ns/meta/meta.ttl b/lv2/lv2plug.in/ns/meta/meta.ttl index 5d8cd2e..a3c21fb 100644 --- a/lv2/lv2plug.in/ns/meta/meta.ttl +++ b/lv2/lv2plug.in/ns/meta/meta.ttl @@ -52,6 +52,8 @@ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH R dcs:changeset [ dcs:item [ rdfs:label "eg-scope: Don't feed back UI state updates." + ] , [ + rdfs:label "eg-sampler: Fix handling of state file paths." ] ] ] , [ diff --git a/plugins/eg-sampler.lv2/sampler.c b/plugins/eg-sampler.lv2/sampler.c index 06a2e80..8e69bd5 100644 --- a/plugins/eg-sampler.lv2/sampler.c +++ b/plugins/eg-sampler.lv2/sampler.c @@ -432,6 +432,18 @@ run(LV2_Handle instance, } } +static LV2_State_Map_Path* +get_map_path(LV2_Log_Logger* logger, const LV2_Feature* const* features) +{ + for (int i = 0; features[i]; ++i) { + if (!strcmp(features[i]->URI, LV2_STATE__mapPath)) { + return (LV2_State_Map_Path*)features[i]->data; + } + } + lv2_log_error(logger, "Missing map:path feature\n"); + return NULL; +} + static LV2_State_Status save(LV2_Handle instance, LV2_State_Store_Function store, @@ -444,24 +456,23 @@ save(LV2_Handle instance, return LV2_STATE_SUCCESS; } - LV2_State_Map_Path* map_path = NULL; - for (int i = 0; features[i]; ++i) { - if (!strcmp(features[i]->URI, LV2_STATE__mapPath)) { - map_path = (LV2_State_Map_Path*)features[i]->data; - } + LV2_State_Map_Path* map_path = get_map_path(&self->logger, features); + if (!map_path) { + return LV2_STATE_ERR_NO_FEATURE; } + // Map absolute sample path to an abstract state path char* apath = map_path->abstract_path(map_path->handle, self->sample->path); + // Store eg:sample = abstract path store(handle, self->uris.eg_sample, apath, - strlen(self->sample->path) + 1, + strlen(apath) + 1, self->uris.atom_Path, LV2_STATE_IS_POD | LV2_STATE_IS_PORTABLE); free(apath); - return LV2_STATE_SUCCESS; } @@ -474,23 +485,35 @@ restore(LV2_Handle instance, { Sampler* self = (Sampler*)instance; - size_t size; - uint32_t type; - uint32_t valflags; - - const void* value = retrieve( - handle, - self->uris.eg_sample, - &size, &type, &valflags); - - if (value) { - const char* path = (const char*)value; - lv2_log_trace(&self->logger, "Restoring file %s\n", path); - free_sample(self, self->sample); - self->sample = load_sample(self, path); - self->sample_changed = true; + // Get eg:sample from state + size_t size; + uint32_t type; + uint32_t valflags; + const void* value = retrieve(handle, self->uris.eg_sample, + &size, &type, &valflags); + if (!value) { + lv2_log_error(&self->logger, "Missing eg:sample\n"); + return LV2_STATE_ERR_NO_PROPERTY; + } else if (type != self->uris.atom_Path) { + lv2_log_error(&self->logger, "Non-path eg:sample\n"); + return LV2_STATE_ERR_BAD_TYPE; + } + + LV2_State_Map_Path* map_path = get_map_path(&self->logger, features); + if (!map_path) { + return LV2_STATE_ERR_NO_FEATURE; } + // Map abstract state path to absolute path + const char* apath = (const char*)value; + char* path = map_path->absolute_path(map_path->handle, apath); + + // Replace current sample with the new one + lv2_log_trace(&self->logger, "Restoring file %s\n", path); + free_sample(self, self->sample); + self->sample = load_sample(self, path); + self->sample_changed = true; + return LV2_STATE_SUCCESS; } |