aboutsummaryrefslogtreecommitdiffstats
path: root/src/state.c
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2016-07-31 15:24:34 -0400
committerDavid Robillard <d@drobilla.net>2016-07-31 15:24:34 -0400
commitf4ee02db64ee39f1653cbc5373abaa748707e580 (patch)
tree1d036b3f382f2266700c16d484c96f876e12c7f0 /src/state.c
parent005f9bf2051725a197c3b79e769214f78bb23b16 (diff)
downloadjalv-f4ee02db64ee39f1653cbc5373abaa748707e580.tar.gz
jalv-f4ee02db64ee39f1653cbc5373abaa748707e580.tar.bz2
jalv-f4ee02db64ee39f1653cbc5373abaa748707e580.zip
Support thread-safe state restoration
Diffstat (limited to 'src/state.c')
-rw-r--r--src/state.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/state.c b/src/state.c
index d50ef66..f59ea43 100644
--- a/src/state.c
+++ b/src/state.c
@@ -1,5 +1,5 @@
/*
- Copyright 2007-2015 David Robillard <http://drobilla.net>
+ Copyright 2007-2016 David Robillard <http://drobilla.net>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above
@@ -37,6 +37,27 @@
#define NS_RDFS "http://www.w3.org/2000/01/rdf-schema#"
#define NS_XSD "http://www.w3.org/2001/XMLSchema#"
+extern LV2_Feature uri_map_feature;
+extern LV2_Feature map_feature;
+extern LV2_Feature unmap_feature;
+extern LV2_Feature make_path_feature;
+extern LV2_Feature sched_feature;
+extern LV2_Feature state_sched_feature;
+extern LV2_Feature safe_restore_feature;
+extern LV2_Feature log_feature;
+extern LV2_Feature options_feature;
+extern LV2_Feature def_state_feature;
+
+const LV2_Feature* state_features[9] = {
+ &uri_map_feature, &map_feature, &unmap_feature,
+ &make_path_feature,
+ &state_sched_feature,
+ &safe_restore_feature,
+ &log_feature,
+ &options_feature,
+ NULL
+};
+
char*
jalv_make_path(LV2_State_Make_Path_Handle handle,
const char* path)
@@ -178,19 +199,19 @@ set_port_value(const char* port_symbol,
void
jalv_apply_state(Jalv* jalv, LilvState* state)
{
+ bool must_pause = !jalv->safe_restore && jalv->play_state == JALV_RUNNING;
if (state) {
- const bool must_pause = (jalv->play_state == JALV_RUNNING);
if (must_pause) {
jalv->play_state = JALV_PAUSE_REQUESTED;
zix_sem_wait(&jalv->paused);
}
lilv_state_restore(
- state, jalv->instance, set_port_value, jalv, 0, NULL);
+ state, jalv->instance, set_port_value, jalv, 0, state_features);
- jalv->state_changed = true;
if (must_pause) {
- jalv->play_state = JALV_RUNNING;
+ jalv->request_update = true;
+ jalv->play_state = JALV_RUNNING;
}
}
}