KISS: Greatly simplify persistence dynamics

nix
Owen Green 6 years ago
parent 4b88b405d7
commit 99496a6633

@ -19,105 +19,64 @@ FluidProxyUgen : UGen {
FluidManipulationClient { FluidManipulationClient {
var <server; var <server;
var <synth,<>ugen;
var <synth,gen; var id;
var bootFunc; var defName, def;
var synthDefLoaded,id, defName, <>ugen, updateFunc; var onSynthFree, persist;
var nodeResponder;
var initTreeCondition;
var synthBeenSet = false;
var serverListener;
*prServerString{ |s| *prServerString{ |s|
var ascii = s.ascii; var ascii = s.ascii;
^[ascii.size].addAll(ascii) ^[ascii.size].addAll(ascii)
} }
sendSynthDef { |...args| *new{ |server...args|
var plugin = this.class.name.asSymbol; server = server ? Server.default;
if(server.hasBooted)
{
fork{
SynthDef(defName.asSymbol,{
var ugen = FluidProxyUgen.kr(plugin, *args);
this.ugen = ugen;
ugen
}).send(server);
server.sync;
synthDefLoaded = true;
updateFunc = {
//Sometimes Server.initTree seems to get called a bunch of
//times during boot: we can't be having extra instances
//However, once boot has finished, ending up here means cmd-. or server.freeAll
//has happened, and we just need to run
var shouldRun = (synthBeenSet.not.and(server.serverBooting))
.or(server.serverRunning.and(server.serverBooting.not));
if(shouldRun) {
synthBeenSet = true;
synth = nil;
this.updateSynth;
}
};
updateFunc.value;
ServerTree.add(updateFunc, server);
};
};
}
updateSynth {
if(server.hasBooted){
if(synthDefLoaded){
if(synth.isNil){
synth = Synth.after(server.defaultGroup,defName.asSymbol);
synth.register;
}
}
}{
synth !? {synth.free};
}
}
*new{ |server...args|
server = server ? Server.default;
if(server.serverRunning.not,{ if(server.serverRunning.not,{
(this.asString + " server not running").warn; (this.asString + " server not running").warn;
}); });
^super.newCopyArgs(server ?? {Server.default}).baseinit(*args) ^super.newCopyArgs(server ?? {Server.default}).baseinit(*args)
} }
baseinit { |...args| baseinit { |...args|
var makeFirstSynth;
id = UniqueID.next; id = UniqueID.next;
synthDefLoaded = false; defName = (this.class.name.asString ++ id).asSymbol;
defName = (this.class.name.asString ++ id);
if(server.serverRunning){ this.sendSynthDef(*args);}; def = SynthDef(defName,{
var ugen = FluidProxyUgen.kr(this.class.name, *args);
this.ugen = ugen;
ugen
});
bootFunc = { synth = Synth.basicNew(defName,server);
ServerBoot.remove(bootFunc,server); persist = true;
synth = nil; onSynthFree = {
this.sendSynthDef(*args); if(persist){
synth = Synth.after(server.defaultGroup,defName);
synth.onFree(onSynthFree);
}
}; };
ServerBoot.add(bootFunc,server); synth.onFree(onSynthFree);
ServerQuit.add({this.free;},server); CmdPeriod.add(onSynthFree);
makeFirstSynth ={
var synthMsg= synth.newMsg(server.defaultGroup,\addAfter);
def.send(server,synthMsg);
};
if(server.serverRunning)
{ makeFirstSynth.value}
{server.doWhenBooted(makeFirstSynth)};
} }
free{ free{
ServerTree.remove(updateFunc,server); persist = false;
ServerBoot.remove(bootFunc, server); CmdPeriod.remove(onSynthFree);
updateFunc = nil;
// synth !? {synth.tryPerform(\free)};//
synth = nil; synth = nil;
} }
prSendMsg { |msg, args, action,parser| prSendMsg { |msg, args, action,parser|
if(this.server.serverRunning.not,{(this.asString + " server not running").error; ^nil}); if(this.server.serverRunning.not,{(this.asString + " server not running").error; ^nil});
synth !? { synth !? {
OSCFunc( OSCFunc(
@ -130,7 +89,7 @@ FluidManipulationClient {
},'/'++msg, server.addr, nil,[synth.nodeID]).oneShot; },'/'++msg, server.addr, nil,[synth.nodeID]).oneShot;
server.listSendMsg(['/u_cmd',synth.nodeID,ugen.synthIndex,msg].addAll(args)); server.listSendMsg(['/u_cmd',synth.nodeID,ugen.synthIndex,msg].addAll(args));
} }
} }
} }
FluidServerCache { FluidServerCache {

Loading…
Cancel
Save