Changeset 2fe35cd in ingen


Ignore:
Timestamp:
10/29/15 17:37:40 (22 months ago)
Author:
David Robillard <d@…>
Branches:
master, groups, nodeless, parallel, parameters, sequencefix
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

    ra742608 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

    r3353177 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

    ra742608 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

    r94d2f7c 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

    ra742608 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.