[SCM] calf/master: Persist extension 0.2

js at users.alioth.debian.org js at users.alioth.debian.org
Tue May 7 15:40:37 UTC 2013


The following commit has been merged in the master branch:
commit 71d1071e9c70a350d92c451c15bbe90f0f79952e
Author: David Robillard <d at drobilla.net>
Date:   Tue Mar 29 17:29:57 2011 -0400

    Persist extension 0.2
    
    From the original mail:
    
    Well, it seems clear the subject parameter is a can of worms. I have
    removed it. It is still possible to express resources as objects by
    using a specific value type for them (e.g. a dictionary). This is more
    inline with how implementations would work with such things anyway (and
    there are Atom types for this).

diff --git a/src/calf/Makefile.am b/src/calf/Makefile.am
index 9f3c6bf..2518fec 100644
--- a/src/calf/Makefile.am
+++ b/src/calf/Makefile.am
@@ -4,7 +4,7 @@ noinst_HEADERS = audio_fx.h benchmark.h biquad.h buffer.h custom_ctl.h \
     gui.h gui_config.h gui_controls.h inertia.h jackhost.h \
     host_session.h ladspa_wrap.h loudness.h \
     lv2_data_access.h lv2_event.h lv2_external_ui.h \
-    lv2_persist.h lv2_persist2.h lv2_progress.h lv2_ui.h lv2_uri_map.h lv2helpers.h lv2wrap.h \
+    lv2_persist.h  lv2_progress.h lv2_ui.h lv2_uri_map.h lv2helpers.h lv2wrap.h \
     metadata.h modmatrix.h \
     modules.h modules_comp.h modules_dev.h modules_dist.h modules_eq.h modules_mod.h modules_synths.h \
     modulelist.h \
diff --git a/src/calf/lv2_persist.h b/src/calf/lv2_persist.h
index 86ac865..6879a86 100644
--- a/src/calf/lv2_persist.h
+++ b/src/calf/lv2_persist.h
@@ -1,130 +1,228 @@
-// This file is in the public domain.
-// Written by Leonard Ritter <paniq at paniq.org>
+/*
+  Copyright 2010-2011 David Robillard <http://drobilla.net>
+  Copyright 2010 Leonard Ritter <paniq at paniq.org>
+
+  This header is free software; you can redistribute it and/or modify it
+  under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This header is distributed in the hope that it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
+  License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with this header; if not, write to the Free Software Foundation,
+  Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA
+*/
+
+/**
+   @file
+   C API for the LV2 Persist extension <http://lv2plug.in/ns/ext/persist>.
+*/
+
+#ifndef LV2_PERSIST_H
+#define LV2_PERSIST_H
 
-#ifndef __LV2_PERSIST_H__
-#define __LV2_PERSIST_H__
+#include <stdbool.h>
+#include <stdint.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
-    
-/*
-    Indicates that the plugin supports persistence, which means
-    being able to save and restore internal state, allowing hosts to
-    save configuration with a project, or to clone a plugin, including
-    internal state.
-    
-    The plugin should always expose this feature as optional.
+
+#define LV2_PERSIST_URI "http://lv2plug.in/ns/ext/persist"
+
+/**
+   Flags describing value characteristics.
+
+   These flags are used along with the value's type URI to determine how to
+   (de-)serialise the value data, or whether it is even possible to do so.
 */
-#define LV2_PERSIST_URI "http://paniq.org/lv2/persist"
-   
-/*
-    Causes the host to store a binary blob in a map.
-    
-    A callback provided by the host to LV2_Persist.save(). 'callback_data'
-    must be the callback_data argument passed to save(). 'key' is a private
-    string or URI under which the data is to be stored. 'value' points to
-    the binary blob to be stored. 'size' is the size of the binary blob in
-    bytes.
-    
-    The host is expected store a copy of the blob under the provided key.
-    
-    A 'size' of 0 is valid. The host may choose to store nothing.
-    
-    A 'size' of -1 indicates that 'value' points to a zero-terminated string.
-    This is a convenience function which requires the host to calculate the
-    size from strlen(value)+1.
+typedef enum {
+
+	/**
+	   Plain Old Data.
+
+	   Values with this flag contain no references to non-persistent or
+	   non-global resources (e.g. pointers, handles, local paths, etc.). It is
+	   safe to copy POD values with a simple memcpy and store them for use at
+	   any time in the future on a machine with a compatible architecture
+	   (e.g. the same endianness and alignment).
+
+	   Implementations MUST NOT attempt to copy or serialise a non-POD value if
+	   they do not understand its type (and thus know how to correctly do so).
+	*/
+	LV2_PERSIST_IS_POD = 1,
+
+	/**
+	   Portable (architecture independent) data.
+
+	   Values with this flag are in a format that is usable on any
+	   architecture, i.e. if the value is saved on one machine it can safely be
+	   restored on another machine regardless of endianness, alignment, etc.
+	*/
+	LV2_PERSIST_IS_PORTABLE = 1 << 1
+
+} LV2_Persist_Flags;
+
+/**
+   A host-provided function to store a plugin instance property.
+   @param callback_data Must be the callback_data passed to LV2_Persist.save().
+   @param key The key (predicate) to store @a value under (URI mapped integer).
+   @param value Pointer to the value (object) to be stored.
+   @param size The size of the data at @a value in bytes.
+   @param type The type of @a value (URI).
+   @param flags LV2_Persist_Flags for @a value.
+   @return 0 on success, otherwise a non-zero error code.
+
+   The host passes a callback of this type to LV2_Persist.save(). This callback
+   is called repeatedly by the plugin within LV2_Persist.save() to store all
+   the statements that describe its current state.
+
+   The host MAY fail to store a property if the type is not understood and is
+   not LV2_PERSIST_IS_POD and/or LV2_PERSIST_IS_PORTABLE. Implementations are
+   encouraged to use POD and portable values (e.g. string literals) wherever
+   possible, and use common types (e.g. types from
+   http://lv2plug.in/ns/ext/atom) regardless, since hosts are likely to already
+   contain the necessary implementation.
+
+   Note that @a size MUST be > 0, and @a value MUST point to a valid region of
+   memory @a size bytes long (this is required to make restore unambiguous).
+
+   The plugin MUST NOT attempt to use this function outside of the
+   LV2_Persist.restore() context.
 */
-typedef void (*LV2_Persist_Store_Function)(void *callback_data, const char *key, 
-                                           const void *value, ssize_t size);
+typedef int (*LV2_Persist_Store_Function)(
+	void*       callback_data,
+	uint32_t    key,
+	const void* value,
+	size_t      size,
+	uint32_t    type,
+	uint32_t    flags);
 
-/*
-    Causes the host to retrieve a binary blob from the map.
-    
-    A callback provided by the host to LV2_Persist.restore(). 'callback_data'
-    must be the callback_data argument passed to restore(). 'key' is a private
-    string or URI under which a blob has been previously stored.
-    
-    When the blob could be successfully retrieved, retrieve() must return
-    a pointer to the blob and set 'size' to the length of value in bytes.
-    
-    'size' may be NULL. In this case, no return of the blob size is required.
-    This is a convenience function to retrieve zero-terminated strings.
-    
-    The returned value must remain valid until restore() returns. The plugin
-    is required to make a copy if it needs to continue working with the
-    data. It must not attempt to access a retrieved blob pointer outside
-    of the restore context.
+/**
+   A host-provided function to retrieve a property.
+   @param callback_data Must be the callback_data passed to LV2_Persist.restore().
+   @param key The key (predicate) of the property to retrieve (URI).
+   @param size (Output) If non-NULL, set to the size of the restored value.
+   @param type (Output) If non-NULL, set to the type of the restored value.
+   @param flags (Output) If non-NULL, set to the LV2_Persist_Flags for
+   the returned value.
+   @return A pointer to the restored value (object), or NULL if no value
+   has been stored under @a key.
+
+   A callback of this type is passed by the host to LV2_Persist.restore(). This
+   callback is called repeatedly by the plugin within LV2_Persist.restore() to
+   retrieve any properties it requires to restore its state.
+
+   The returned value MUST remain valid until LV2_Persist.restore() returns.
+
+   The plugin MUST NOT attempt to use this function, or any value returned from
+   it, outside of the LV2_Persist.restore() context. Returned values MAY be
+   copied for later use if necessary, assuming the plugin knows how to do so
+   correctly (e.g. the value is POD, or the plugin understands the type).
 */
-typedef const void *(*LV2_Persist_Retrieve_Function)(void *callback_data, 
-                                const char *key, size_t *size);
+typedef const void* (*LV2_Persist_Retrieve_Function)(
+	void*     callback_data,
+	uint32_t  key,
+	size_t*   size,
+	uint32_t* type,
+	uint32_t* flags);
 
-/*
-    When the plugins extension_data is called with argument LV2_PERSIST_URI,
-    the plugin is expected to return an LV2_Persist structure, which remains
-    valid indefinitely.
-    
-    The host can use the exposed function pointers to save and restore
-    the state of a plugin to a map of string keys to binary blobs at any
-    time.
-    
-    The usual application would be to save the plugins state when the
-    project document is to be saved, and to restore the state when
-    a project document has been loaded. Other applications are possible.
-    
-    Blob maps are meant to be only compatible between instances of the
-    same plugin. However, should a future extension require persistent
-    data to follow an URI key naming scheme, this restriction no longer
-    applies.
+/**
+   Persist Extension Data.
+
+   When the plugin's extension_data is called with argument LV2_PERSIST_URI,
+   the plugin MUST return an LV2_Persist structure, which remains valid for the
+   lifetime of the plugin.
+
+   The host can use the contained function pointers to save and restore the
+   state of a plugin instance at any time (provided the threading restrictions
+   for the given function are met).
+
+   The typical use case is to save the plugin's state when a project is saved,
+   and to restore the state when a project has been loaded. Other uses are
+   possible (e.g. cloning plugin instances or taking a snapshot of plugin
+   state).
+
+   Stored data is only guaranteed to be compatible between instances of plugins
+   with the same URI (i.e. if a change to a plugin would cause a fatal error
+   when restoring state saved by a previous version of that plugin, the plugin
+   URI MUST change just as it must when ports change incompatibly). Plugin
+   authors should consider this possibility, and always store sensible data
+   with meaningful types to avoid such compatibility issues in the future.
 */
-struct LV2_Persist {
-    /*
-        Causes the plugin to save state data which it wants to preserve
-        across plugin lifetime using a store callback provided by
-        the host.
-    
-        'instance' is the instance handle of the plugin. 'callback_data'
-        is an opaque pointer to host data, e.g. the map or file where
-        the blobs are to be stored, it should be passed to 'store',
-        which is a host-supplied function to store a blob. For more
-        information, see LV2_Persist_Store_Function.
-    
-        The map on which save() operates must always be empty before
-        the first call to store(). The plugin is expected to store all
-        blobs of interest.
-    
-        The callback data pointer and store function may not be used
-        beyond the scope of save().
-    */
-    void (*save)(LV2_Handle instance, 
-        LV2_Persist_Store_Function store, void *callback_data);
-    
-    /*
-        Causes the plugin to restore state data using a retrieve callback
-        provided by the host.
-        
-        'instance' is the instance handle of the plugin. 'callback_data'
-        is an opaque pointer to host data, e.g. the map or file where
-        the blobs are to be retrieved from; it should be passed to
-        'retrieve', which is a host-supplied function to retrieve blobs.
-        For more information, see LV2_Persist_Retrieve_Function.
-
-        The map on which restore() operates must contain values stored
-        by a plugin instance of the same class, or be empty.
-
-        The plugin must gracefully fall back to a default value
-        when a blob can not be retrieved. This allows the host to reset
-        the plugin state with an empty map.
-        
-        The callback data pointer and store function may not be used
-        beyond the scope of save().
-    */
-    void (*restore)(LV2_Handle instance, 
-        LV2_Persist_Retrieve_Function retrieve, void *callback_data);
-};
+typedef struct _LV2_Persist {
+
+	/**
+	   Save plugin state using a host-provided @a store callback.
+
+	   @param instance The instance handle of the plugin.
+	   @param store The host-provided store callback.
+	   @param callback_data	An opaque pointer to host data, e.g. the map or
+	   file where the values are to be stored. If @a store is called,
+	   this MUST be passed as its callback_data parameter.
+
+	   The plugin is expected to store everything necessary to completely
+	   restore its state later (possibly much later, in a different process, on
+	   a completely different machine, etc.)
+
+	   The @a callback_data pointer and @a store function MUST NOT be used
+	   beyond the scope of save().
+
+	   This function has its own special threading class: it may not be called
+	   concurrently with any "Instantiation" function, but it may be called
+	   concurrently with functions in any other class, unless the definition of
+	   that class prohibits it (e.g. it may not be called concurrently with a
+	   "Discovery" function, but it may be called concurrently with an "Audio"
+	   function. The plugin is responsible for any locking or lock-free
+	   techniques necessary to make this possible.
+
+	   Note that in the simple case where state is only modified by restore(),
+	   there are no synchronization issues since save() is never called
+	   concurrently with restore() (though run() may read it during a save).
+
+	   Plugins that dynamically modify state while running, however, must take
+	   care to do so in such a way that a concurrent call to save() will save a
+	   consistent representation of plugin state for a single instant in time.
+	*/
+	void (*save)(LV2_Handle                 instance,
+	             LV2_Persist_Store_Function store,
+	             void*                      callback_data);
+
+	/**
+	   Restore plugin state using a host-provided @a retrieve callback.
+
+	   @param instance The instance handle of the plugin.
+	   @param retrieve The host-provided retrieve callback.
+	   @param callback_data	An opaque pointer to host data, e.g. the map or
+	   file from which the values are to be restored. If @a retrieve is
+	   called, this MUST be passed as its callback_data parameter.
+
+	   The plugin MAY assume a restored value was set by a previous call to
+	   LV2_Persist.save() by a plugin with the same URI.
+
+	   The plugin MUST gracefully fall back to a default value when a value can
+	   not be retrieved. This allows the host to reset the plugin state with an
+	   empty map.
+
+	   The @a callback_data pointer and @a store function MUST NOT be used
+	   beyond the scope of restore().
+
+	   This function is in the "Instantiation" threading class as defined by
+	   LV2. This means it MUST NOT be called concurrently with any other
+	   function on the same plugin instance.
+	*/
+	void (*restore)(LV2_Handle                    instance,
+	                LV2_Persist_Retrieve_Function retrieve,
+	                void*                         callback_data);
+
+} LV2_Persist;
 
 #ifdef __cplusplus
 } /* extern "C" */
 #endif
 
-#endif /* __LV2_PERSIST_H__ */
\ No newline at end of file
+#endif /* LV2_PERSIST_H */
diff --git a/src/calf/lv2_persist2.h b/src/calf/lv2_persist2.h
deleted file mode 100644
index 2ac4880..0000000
--- a/src/calf/lv2_persist2.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/* lv2_persist.h - C header file for the LV2 Persist extension.
- * Copyright (C) 2010 Leonard Ritter <paniq at paniq.org>
- *
- * This header is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published
- * by the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This header is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
- * License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this header; if not, write to the Free Software Foundation,
- * Inc., 59 Temple Place, Suite 330, Boston, MA 01222-1307 USA
- */
-
-/** @file
- * C header for the LV2 Persist extension <http://lv2plug.in/ns/ext/persist>.
- */
-
-#ifndef LV2_PERSIST_H
-#define LV2_PERSIST_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define LV2_PERSIST_URI "http://lv2plug.in/ns/ext/persist"
-
-/** A host-provided function to store a value under a given key.
- * @param callback_data Must be the callback_data passed to LV2_Persist.save().
- * @param key The URI key (predicate) under which the value is to be stored.
- * @param value Pointer to the value (object) to be stored.
- * @param size The size of the data at @a value in bytes.
- * @param type The type of @a value, as a URI mapped to an integer.
- *
- * The host passes a callback of this type to LV2_Persist.save().  This
- * callback is called repeatedly by the plugin within LV2_Persist.save() to
- * store all the key/value records that describe its current state.
- *
- * Unless @a type is 0, @a value is guaranteed to be POD (i.e. a region
- * of memory that does not contain pointers and can safely be copied
- * and persisted indefinitely with a simple memcpy).  If @a type is 0,
- * then @a value is a reference, as defined by the LV2 Atom extension
- * <http://lv2plug.in/ns/ext/atom/>.  Hosts are not required to support
- * references: a plugin MUST NOT expect a host to persist references unless
- * the host supports the feature <http://lv2plug.in/ns/ext/atom#blobSupport>.
- * Plugins SHOULD express their state entirely with POD values.
- *
- * Note that @a size MUST be > 0, and @a value MUST point to a valid region of
- * memory @a size bytes long (this is required to make restore unambiguous).
- *
- * The plugin MUST NOT attempt to use this function outside of the
- * LV2_Persist.restore() context.
- */
-typedef void (*LV2_Persist_Store_Function)(
-	void*       callback_data,
-	const char* key,
-	const void* value,
-	size_t      size,
-	uint32_t    type);
-
-/** A host-provided function to retrieve a value under a given key.
- * @param callback_data Must be the callback_data passed to LV2_Persist.restore().
- * @param key The URI key (predicate) under which a value has been stored.
- * @param size (Output) If non-NULL, set to the size of the restored value.
- * @param type (Output) If non-NULL, set to the type of the restored value.
- * @return A pointer to the restored value (object), or NULL if no value
- *         has been stored under @a key.
- *
- * A callback of this type is passed by the host to LV2_Persist.restore().  This
- * callback is called repeatedly by the plugin within LV2_Persist.restore() to
- * retrieve the values of any keys it requires to restore its state.
- *
- * The returned value MUST remain valid until LV2_Persist.restore() returns.
- *
- * The plugin MUST NOT attempt to use this function, or any value returned from
- * it, outside of the LV2_Persist.restore() context.  Returned values MAY be
- * copied for later use if necessary.
- */
-typedef const void* (*LV2_Persist_Retrieve_Function)(
-	void*       callback_data,
-	const char* key,
-	size_t*     size,
-	uint32_t*   type);
-
-/** When the plugin's extension_data is called with argument LV2_PERSIST_URI,
- * the plugin MUST return an LV2_Persist structure, which remains valid for
- * the lifetime of the plugin.
- *
- * The host can use the contained function pointers to save and restore the
- * state of a plugin instance at any time (provided the threading restrictions
- * for the given function are met).
- *
- * The typical use case is to save the plugin's state when a project is
- * saved, and to restore the state when a project has been loaded.  Other
- * uses are possible (e.g. cloning plugin instances or taking a snapshot
- * of plugin state).
- *
- * Stored data is only guaranteed to be compatible between instances of plugins
- * with the same URI (i.e. if a change to a plugin would cause a fatal error
- * when restoring state saved by a previous version of that plugin, the plugin
- * URI must change just as it must when a plugin's ports change).  Plugin
- * authors should consider this possibility, and always store sensible data
- * with meaningful types to avoid such compatibility issues in the future.
- */
-typedef struct _LV2_Persist {
-	
-	/** Save plugin state using a host-provided @a store callback.
-	 *
-	 * @param instance The instance handle of the plugin.
-	 * @param store The host-provided store callback.
-	 * @param callback_data	An opaque pointer to host data, e.g. the map or
-	 *        file where the values are to be stored.  If @a store is called,
-	 *        this MUST be passed as its callback_data parameter.
-	 *
-	 * The plugin is expected to store everything necessary to completely
-	 * restore its state later (possibly much later, in a different
-	 * process, on a completely different machine, etc.)
-	 *
-	 * The @a callback_data pointer and @a store function MUST NOT be
-	 * used beyond the scope of save().
-	 *
-	 * This function has its own special threading class: it may not be
-	 * called concurrently with any "Instantiation" function, but it
-	 * may be called concurrently with functions in any other class,
-	 * unless the definition of that class prohibits it (e.g. it may
-	 * not be called concurrently with a "Discovery" function, but it
-	 * may be called concurrently with an "Audio" function.  The plugin
-	 * is responsible for any locking or lock-free techniques necessary
-	 * to make this possible.
-	 *
-	 * Note that in the simple case where state is only modified by
-	 * restore(), there are no synchronization issues since save() is
-	 * never called concurrently with restore() (though run() may read
-	 * it during a save).
-	 *
-	 * Plugins that dynamically modify state while running, however,
-	 * must take care to do so in such a way that a concurrent call to
-	 * save() will save a consistent representation of plugin state for a
-	 * single instant in time.  The simplest way to do this is to modify a
-	 * copy of the state map and atomically swap a pointer to the entire
-	 * map once the changes are complete (for very large state maps,
-	 * a purely functional map data structure may be more appropriate
-	 * since a complete copy is not necessary).
-	 */
-	void (*save)(LV2_Handle                 instance,
-	             LV2_Persist_Store_Function store,
-	             void*                      callback_data);
-
-	/** Restore plugin state using a host-provided @a retrieve callback.
-	 *
-	 * @param instance The instance handle of the plugin.
-	 * @param retrieve The host-provided retrieve callback.
-	 * @param callback_data	An opaque pointer to host data, e.g. the map or
-	 *        file from which the values are to be restored.  If @a retrieve is
-	 *        called, this MUST be passed as its callback_data parameter.
-	 *
-	 * The plugin MAY assume a restored value was set by a previous call to
-	 * LV2_Persist.save() by a plugin with the same URI.
-	 *
-	 * The plugin MUST gracefully fall back to a default value when a
-	 * value can not be retrieved.	This allows the host to reset the
-	 * plugin state with an empty map.
-	 *
-	 * The @a callback_data pointer and @a store function MUST NOT be used
-	 * beyond the scope of restore().
-	 *
-	 * This function is in the "Instantiation" threading class as defined
-	 * by LV2.  This means it MUST NOT be called concurrently with any other
-	 * function on the same plugin instance.
-	 */
-	void (*restore)(LV2_Handle                    instance,
-	                LV2_Persist_Retrieve_Function retrieve,
-	                void*                         callback_data);
-
-} LV2_Persist;
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* LV2_PERSIST_H */
diff --git a/src/calf/lv2wrap.h b/src/calf/lv2wrap.h
index 35f746b..d4ae1ed 100644
--- a/src/calf/lv2wrap.h
+++ b/src/calf/lv2wrap.h
@@ -28,7 +28,7 @@
 #include <lv2.h>
 #include <calf/giface.h>
 #include <calf/lv2_event.h>
-#include <calf/lv2_persist2.h>
+#include <calf/lv2_persist.h>
 #include <calf/lv2_progress.h>
 #include <calf/lv2_uri_map.h>
 #include <string.h>
@@ -92,13 +92,15 @@ struct lv2_instance: public plugin_ctl_iface, public progress_report_iface
         if (!vars)
             return;
         assert(uri_map);
-        uint32_t string_type = uri_map->uri_to_id(uri_map, NULL, "http://lv2plug.in/ns/ext/atom#String");
+        uint32_t string_type = uri_map->uri_to_id(uri_map, NULL, "http://www.w3.org/2001/XMLSchema#string");
         assert(string_type);
         for (unsigned int i = 0; vars[i]; i++)
         {
-            size_t len = 0;
-            uint32_t type = 0;
-            const void *ptr = (*retrieve)(callback_data, vars[i], &len, &type);
+            const uint32_t key   = uri_map->uri_to_id(uri_map, NULL, vars[i]);
+            size_t         len   = 0;
+            uint32_t       type  = 0;
+            uint32_t       flags = 0;
+            const void *ptr = (*retrieve)(callback_data, key, &len, &type, &flags);
             if (ptr)
             {
                 if (type != string_type)
@@ -303,19 +305,26 @@ struct lv2_wrapper
         {
             LV2_Persist_Store_Function store;
             void *callback_data;
+            instance *inst;
             uint32_t string_data_type;
             
             virtual void send_configure(const char *key, const char *value)
             {
-                (*store)(callback_data, key, value, strlen(value) + 1, string_data_type);
+                (*store)(callback_data,
+                         inst->uri_map->uri_to_id(inst->uri_map, NULL, key),
+                         value,
+                         strlen(value) + 1,
+                         string_data_type,
+                         LV2_PERSIST_IS_POD|LV2_PERSIST_IS_PORTABLE);
             }
         };
-        // A host that supports a Persist extension should support an URI map extension as well.
+        // A host that supports Persist MUST support URI-Map as well.
         assert(inst->uri_map);
         store_state s;
         s.store = store;
         s.callback_data = callback_data;
-        s.string_data_type = inst->uri_map->uri_to_id(inst->uri_map, NULL, "http://lv2plug.in/ns/ext/atom#String");
+        s.inst = inst;
+        s.string_data_type = inst->uri_map->uri_to_id(inst->uri_map, NULL, "http://www.w3.org/2001/XMLSchema#string");
 
         inst->send_configures(&s);
     }
diff --git a/src/makerdf.cpp b/src/makerdf.cpp
index 3515234..437309b 100644
--- a/src/makerdf.cpp
+++ b/src/makerdf.cpp
@@ -23,7 +23,7 @@
 #if USE_LV2
 #include <lv2.h>
 #include <calf/lv2_event.h>
-#include <calf/lv2_persist2.h>
+#include <calf/lv2_persist.h>
 #include <calf/lv2_uri_map.h>
 #endif
 #include <getopt.h>

-- 
calf audio plugins packaging



More information about the pkg-multimedia-commits mailing list