Changeset 2fe35cd in ingen


Ignore:
Timestamp:
Oct 29, 2015, 5:37:40 PM (2 years ago)
Author:
David Robillard <d@…>
Branches:
groups, master, nodeless, parallel, parameters, sequencefix, tasks
Children:
8510f80
Parents:
cc5ec74
Message:

Add protocol for loading and unloading bundles

Currently this is only really useful for refreshing updated bundles. It will
trigger the appropriate load and unload in the Lilv world, but the set of
plugins and presets is not updated and clients will not be notified of any
changes.

git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5807 a436a847-0d15-0410-975c-d299462d15a1

Files:
5 edited

Legend:

Unmodified
Added
Removed
  • ingen/URIs.hpp

    rcc5ec74 r2fe35cd  
    114114    const Quark ingen_head;
    115115    const Quark ingen_incidentTo;
     116    const Quark ingen_loadedBundle;
    116117    const Quark ingen_polyphonic;
    117118    const Quark ingen_polyphony;
  • ingen/ingen.h

    rcc5ec74 r2fe35cd  
    5454#define INGEN__head           INGEN_NS "head"
    5555#define INGEN__incidentTo     INGEN_NS "incidentTo"
     56#define INGEN__loadedBundle   INGEN_NS "loadedBundle"
    5657#define INGEN__polyphonic     INGEN_NS "polyphonic"
    5758#define INGEN__polyphony      INGEN_NS "polyphony"
  • src/URIs.cpp

    rcc5ec74 r2fe35cd  
    9696    , ingen_head            (forge, map, lworld, INGEN__head)
    9797    , ingen_incidentTo      (forge, map, lworld, INGEN__incidentTo)
     98    , ingen_loadedBundle    (forge, map, lworld, INGEN__loadedBundle)
    9899    , ingen_polyphonic      (forge, map, lworld, INGEN__polyphonic)
    99100    , ingen_polyphony       (forge, map, lworld, INGEN__polyphony)
  • src/server/events/Delta.cpp

    rcc5ec74 r2fe35cd  
    135135}
    136136
     137static LilvNode*
     138get_file_node(LilvWorld* lworld, const URIs& uris, const Atom& value)
     139{
     140    if (value.type() == uris.atom_Path) {
     141        return lilv_new_file_uri(lworld, NULL, value.ptr<char>());
     142    } else if (uris.forge.is_uri(value)) {
     143        const std::string str = uris.forge.str(value, false);
     144        if (str.substr(0, 5) == "file:") {
     145            return lilv_new_uri(lworld, value.ptr<char>());
     146        }
     147    }
     148    return NULL;
     149}
     150
     151/** @page protocol
     152 * @subsection loading Loading and Unloading Bundles
     153 *
     154 * The property ingen:loadedBundle on the engine can be used to load
     155 * or unload bundles from Ingen's world.  For example:
     156 *
     157 * @code{.ttl}
     158 * # Load /old.lv2
     159 * []
     160 *     a patch:Put ;
     161 *     patch:subject </> ;
     162 *     patch:body [
     163 *         ingen:loadedBundle <file:///old.lv2>
     164 *     ] .
     165 *
     166 * # Replace /old.lv2 with /new.lv2
     167 * []
     168 *     a patch:Patch ;
     169 *     patch:subject </> ;
     170 *     patch:remove [
     171 *         ingen:loadedBundle <file:///old.lv2>
     172 *     ];
     173 *     patch:add [
     174 *         ingen:loadedBundle <file:///new.lv2>
     175 *     ] .
     176 * @endcode
     177 */
     178
    137179bool
    138180Delta::pre_process()
     
    142184    const bool is_graph_object = Node::uri_is_path(_subject);
    143185    const bool is_client       = (_subject == "ingen:/clients/this");
     186    const bool is_engine       = (_subject == "ingen:/");
    144187    const bool is_file         = (_subject.substr(0, 5) == "file:");
    145188    bool       poly_changed    = false;
     
    184227        : static_cast<Ingen::Resource*>(_engine.block_factory()->plugin(_subject));
    185228
    186     if (!_object && !is_client && (!is_graph_object || _type != Type::PUT)) {
     229    if (!_object && !is_client && !is_engine &&
     230        (!is_graph_object || _type != Type::PUT)) {
    187231        return Event::pre_process_done(Status::NOT_FOUND, _subject);
    188232    }
     
    230274        if (_object) {
    231275            _object->remove_property(key, value);
     276        } else if (is_engine && key == uris.ingen_loadedBundle) {
     277            LilvWorld* lworld = _engine.world()->lilv_world();
     278            LilvNode*  bundle = get_file_node(lworld, uris, value);
     279            if (bundle) {
     280                lilv_world_unload_bundle(lworld, bundle);
     281                lilv_node_free(bundle);
     282            } else {
     283                _status = Status::BAD_VALUE;
     284            }
    232285        }
    233286    }
     
    366419            _engine.broadcaster()->set_broadcast(
    367420                _request_client, value.get<int32_t>());
     421        } else if (is_engine && key == uris.ingen_loadedBundle) {
     422            LilvWorld* lworld = _engine.world()->lilv_world();
     423            LilvNode*  bundle = get_file_node(lworld, uris, value);
     424            if (bundle) {
     425                lilv_world_load_bundle(lworld, bundle);
     426                lilv_node_free(bundle);
     427            } else {
     428                _status = Status::BAD_VALUE;
     429            }
    368430        }
    369431
     
    469531                }
    470532            }
     533        case SpecialType::LOADED_BUNDLE:
    471534            break;
    472535        }
  • src/server/events/Delta.hpp

    rcc5ec74 r2fe35cd  
    8686        POLYPHONIC,
    8787        CONTROL_BINDING,
    88         PRESET
     88        PRESET,
     89        LOADED_BUNDLE
    8990    };
    9091
Note: See TracChangeset for help on using the changeset viewer.