--- linuxsampler/trunk/src/engines/AbstractEngineChannel.cpp 2014/06/06 12:38:54 2598 +++ linuxsampler/trunk/src/engines/AbstractEngineChannel.cpp 2014/06/11 11:39:44 2618 @@ -46,12 +46,10 @@ ResetControllers(); PortamentoMode = false; PortamentoTime = CONFIG_PORTAMENTO_TIME_DEFAULT; - pScriptEvents = NULL; + pScript = NULL; } AbstractEngineChannel::~AbstractEngineChannel() { - unloadCurrentInstrumentScript(); - if (pScriptEvents) delete pScriptEvents; delete pEventQueue; DeleteGroupEventLists(); RemoveAllFxSends(); @@ -145,99 +143,6 @@ } /** - * Loads the real-time instrument script given by @a text on this engine - * channel. A resource manager is used to allocate and share equivalent - * scripts on multiple engine channels. - * - * @param text - source code of script - */ - void AbstractEngineChannel::loadInstrumentScript(const String& text) { - dmsg(1,("Loading real-time instrument script ... ")); - - // hand back old script reference and VM execution contexts - // (if not done already) - unloadCurrentInstrumentScript(); - - // get new script reference - script.parserContext = pEngine->scripts.Borrow(text, this); - if (!script.parserContext->errors().empty()) { - std::vector errors = script.parserContext->errors(); - std::cerr << "[ScriptVM] Could not load instrument script, there were " - << errors.size() << " parser errors:\n"; - for (int i = 0; i < errors.size(); ++i) - errors[i].dump(); - return; // stop here if there were any parser errors - } - - script.handlerInit = script.parserContext->eventHandlerByName("init"); - script.handlerNote = script.parserContext->eventHandlerByName("note"); - script.handlerRelease = script.parserContext->eventHandlerByName("release"); - script.handlerController = script.parserContext->eventHandlerByName("controller"); - script.bHasValidScript = - script.handlerInit || script.handlerNote || script.handlerRelease || - script.handlerController; - - // amount of script handlers each script event has to execute - int handlerExecCount = 0; - if (script.handlerInit) handlerExecCount++; // "init" handler is always executed before the actual event handler - if (script.handlerNote || script.handlerRelease || script.handlerController) // only one of these are executed after "init" handler - handlerExecCount++; - - // create script event pool (if it doesn't exist already) - if (!pScriptEvents) - pScriptEvents = new Pool(CONFIG_MAX_EVENTS_PER_FRAGMENT); - - // create new VM execution contexts for new script - while (!pScriptEvents->poolIsEmpty()) { - RTList::Iterator it = pScriptEvents->allocAppend(); - it->execCtx = pEngine->pScriptVM->createExecContext( - script.parserContext - ); - it->handlers = new VMEventHandler*[handlerExecCount+1]; - } - pScriptEvents->clear(); - - dmsg(1,("Done\n")); - } - - /** - * Unloads the currently used real-time instrument script on this sampler - * channel. A resource manager is used to share equivalent scripts among - * multiple sampler channels, and to deallocate the parsed script once not - * used on any engine channel anymore. - */ - void AbstractEngineChannel::unloadCurrentInstrumentScript() { - if (script.parserContext) - dmsg(1,("Unloading current instrument script.")); - - // free allocated VM execution contexts - if (pScriptEvents) { - pScriptEvents->clear(); - while (!pScriptEvents->poolIsEmpty()) { - RTList::Iterator it = pScriptEvents->allocAppend(); - if (it->execCtx) { - // free VM execution context object - delete it->execCtx; - it->execCtx = NULL; - // free C array of handler pointers - delete [] it->handlers; - } - } - pScriptEvents->clear(); - } - // hand back VM representation of script - if (script.parserContext) { - pEngine->scripts.HandBack(script.parserContext, this); - script.parserContext = NULL; - script.handlerInit = NULL; - script.handlerNote = NULL; - script.handlerRelease = NULL; - script.handlerController = NULL; - } - script.bHasValidScript = false; - } - - /** * Implementation of virtual method from abstract EngineChannel interface. * This method will periodically be polled (e.g. by the LSCP server) to * check if some engine channel parameter has changed since the last @@ -471,6 +376,7 @@ event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.Param.Note.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); @@ -512,6 +418,7 @@ event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.Param.Note.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); @@ -548,6 +455,7 @@ event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.Param.Note.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); @@ -589,6 +497,7 @@ event.Param.Note.Key = Key; event.Param.Note.Velocity = Velocity; event.Param.Note.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); @@ -623,6 +532,7 @@ event.Type = Event::type_pitchbend; event.Param.Pitch.Pitch = Pitch; event.Param.Pitch.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("EngineChannel: Input event queue full!")); @@ -652,6 +562,7 @@ event.Type = Event::type_pitchbend; event.Param.Pitch.Pitch = Pitch; event.Param.Pitch.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("AbstractEngineChannel: Input event queue full!")); @@ -678,6 +589,7 @@ event.Param.CC.Controller = Controller; event.Param.CC.Value = Value; event.Param.CC.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("AbstractEngineChannel: Input event queue full!")); @@ -709,6 +621,7 @@ event.Param.CC.Controller = Controller; event.Param.CC.Value = Value; event.Param.CC.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("AbstractEngineChannel: Input event queue full!")); @@ -723,8 +636,10 @@ Event event = pEngine->pEventGenerator->CreateEvent(); event.Type = Event::type_channel_pressure; + event.Param.ChannelPressure.Controller = CTRL_TABLE_IDX_AFTERTOUCH; // required for instrument scripts event.Param.ChannelPressure.Value = Value; event.Param.ChannelPressure.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("AbstractEngineChannel: Input event queue full!")); @@ -739,8 +654,10 @@ Event event = pEngine->pEventGenerator->CreateEvent(FragmentPos); event.Type = Event::type_channel_pressure; + event.Param.ChannelPressure.Controller = CTRL_TABLE_IDX_AFTERTOUCH; // required for instrument scripts event.Param.ChannelPressure.Value = Value; event.Param.ChannelPressure.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("AbstractEngineChannel: Input event queue full!")); @@ -758,6 +675,7 @@ event.Param.NotePressure.Key = Key; event.Param.NotePressure.Value = Value; event.Param.NotePressure.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("AbstractEngineChannel: Input event queue full!")); @@ -775,6 +693,7 @@ event.Param.NotePressure.Key = Key; event.Param.NotePressure.Value = Value; event.Param.NotePressure.Channel = MidiChannel; + memset(&event.Format, 0, sizeof(event.Format)); // init format speific stuff with zeroes event.pEngineChannel = this; if (this->pEventQueue->write_space() > 0) this->pEventQueue->push(&event); else dmsg(1,("AbstractEngineChannel: Input event queue full!"));