From: terminator356 <ter...@us...> - 2009-12-02 22:21:42
|
Update of /cvsroot/lmuse/muse/muse In directory sfp-cvsdas-2.v30.ch3.sourceforge.com:/tmp/cvs-serv30422/muse Modified Files: Tag: REL07 dssihost.cpp dssihost.h synth.h Log Message: See ChangeLog Index: dssihost.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/dssihost.cpp,v retrieving revision 1.15.2.8 retrieving revision 1.15.2.9 diff -C2 -d -r1.15.2.8 -r1.15.2.9 *** dssihost.cpp 1 Dec 2009 03:52:40 -0000 1.15.2.8 --- dssihost.cpp 2 Dec 2009 22:21:33 -0000 1.15.2.9 *************** *** 337,340 **** --- 337,355 ---- { QString label(descr->LADSPA_Plugin->Label); + + // Make sure it doesn't already exist. + std::vector<Synth*>::iterator is; + for(is = synthis.begin(); is != synthis.end(); ++is) + { + Synth* s = *is; + if(DSSI_DEBUG) + fprintf(stderr, "scanDSSILib: name:%s listname:%s lib:%s listlib:%s\n", label.ascii(), s->name().ascii(), fi.baseName(true).ascii(), s->baseName().ascii()); + + if(s->name() == label && s->baseName() == fi.baseName(true)) + break; + } + if(is != synthis.end()) + continue; + //DssiSynth* s = new DssiSynth(&fi, label); DssiSynth* s = new DssiSynth(fi, label); *************** *** 516,519 **** --- 531,546 ---- queryPrograms(); + int inports = synth->_inports; + //audioInBuffers = new LADSPA_Data[segmentSize * inports]; + //audioInBuffers = new LADSPA_Data[inports][segsz]; + //for(int i = 0; i < inports; ++i) + // memset(audioInBuffers[i], 0, segsz); + audioInBuffers = new LADSPA_Data*[inports]; + for(int i = 0; i < inports; ++i) + { + audioInBuffers[i] = new LADSPA_Data[segmentSize]; + memset(audioInBuffers[i], 0, segmentSize); + } + int outports = synth->_outports; //audioOutBuffers = new LADSPA_Data[segmentSize * outports]; *************** *** 528,538 **** } int controlPorts = synth->_controller; //controls = new LadspaPort[controlPorts]; ! controls = new Port[controlPorts]; for (int k = 0; k < controlPorts; ++k) { ! int i = synth->pIdx[k]; ! //controls[k].val = ladspaDefaultValue(ld, i); ladspaDefaultValue(ld, i, &controls[k].val); --- 555,580 ---- } + // Extra control port for latency, which is not defined as a control port. int controlPorts = synth->_controller; + //int controlPortsLat = controlPorts + 1; + int controlOutPorts = synth->_controllerOut; + + //synth->dssi->LADSPA_Plugin->portCount - 1 + //controls = new LadspaPort[controlPorts]; ! if(controlPorts != 0) ! controls = new Port[controlPorts]; ! else ! controls = 0; ! ! //controls = new Port[controlPortsLat]; ! if(controlOutPorts != 0) ! controlsOut = new Port[controlOutPorts]; ! else ! controlsOut = 0; for (int k = 0; k < controlPorts; ++k) { ! int i = synth->pIdx[k]; ! //controls[k].val = ladspaDefaultValue(ld, i); ladspaDefaultValue(ld, i, &controls[k].val); *************** *** 589,592 **** --- 631,694 ---- } + for (int k = 0; k < controlOutPorts; ++k) { + int i = synth->opIdx[k]; + //controls[k].val = ladspaDefaultValue(ld, i); + ladspaDefaultValue(ld, i, &controlsOut[k].val); + + if(DSSI_DEBUG) + printf("DssiSynthIF::init control output port:%d port idx:%d name:%s\n", k, i, ld->PortNames[i]); + + // This code is duplicated in ::getControllerInfo() + // + + int ctlnum = DSSI_NONE; + if(dssi->get_midi_controller_for_port) + ctlnum = dssi->get_midi_controller_for_port(handle, i); + + // No controller number? Try to give it a unique one... + if(ctlnum == DSSI_NONE) + { + // FIXME: Be more careful. Must make sure to pick numbers not already chosen or which WILL BE chosen. + // Simple but flawed solution: Start them at 0x60000 + 0x3000 = 0x63000. Max NRPN number is 0x3fff. + // TODO: CC etc. etc. + ctlnum = CTRL_NRPN14_OFFSET + 0x3000 + k; + } + else + { + int c = ctlnum; + // Can be both CC and NRPN! Prefer CC over NRPN. + if(DSSI_IS_CC(ctlnum)) + { + if(DSSI_DEBUG) + printf("DssiSynthIF::init is CC control\n"); + ctlnum = DSSI_CC_NUMBER(c); + if(DSSI_DEBUG && DSSI_IS_NRPN(ctlnum)) + printf("DssiSynthIF::init is also NRPN control. Using CC.\n"); + } + else + if(DSSI_IS_NRPN(ctlnum)) + { + if(DSSI_DEBUG) + printf("DssiSynthIF::init is NRPN control\n"); + ctlnum = DSSI_NRPN_NUMBER(c) + CTRL_NRPN14_OFFSET; + } + + } + + if(DSSI_DEBUG) + printf("DssiSynthIF::init inserting to midiCtl2PortMap: ctlnum:%d k:%d\n", ctlnum, k); + // We have a controller number! Insert it and the DSSI port number into the map. + synth->midiCtl2PortMap.insert(std::pair<int, int>(ctlnum, k)); + + ld->connect_port(handle, i, &controlsOut[k].val); + } + + // Set the latency to zero. + //controls[controlPorts].val = 0.0; + // Insert a controller for latency and the DSSI port number into the map. + //synth->midiCtl2PortMap.insert(std::pair<int, int>(CTRL_NRPN14_OFFSET + 0x2000, controlPorts)); + // Connect the port. + //ld->connect_port(handle, controlPorts, &controls[controlPorts].val); + // Just a test. It works! We can instantiate a ladspa plugin for the synth. But it needs more work... //plugins.add(&synth->info, LADSPA_Descriptor_Function(NULL), ld, false); *************** *** 625,628 **** --- 727,731 ---- //guiPid = -1; guiQProc = 0; + audioInBuffers = 0; audioOutBuffers = 0; } *************** *** 634,642 **** DssiSynthIF::~DssiSynthIF() { ! const DSSI_Descriptor* dssi = synth->dssi; ! const LADSPA_Descriptor* descr = dssi->LADSPA_Plugin; ! if (descr->cleanup) descr->cleanup(handle); //if (guiPid != -1) --- 737,748 ---- DssiSynthIF::~DssiSynthIF() { ! if(synth && synth->dssi && synth->dssi->LADSPA_Plugin) ! { ! const DSSI_Descriptor* dssi = synth->dssi; ! const LADSPA_Descriptor* descr = dssi->LADSPA_Plugin; ! if (descr->cleanup) descr->cleanup(handle); + } //if (guiPid != -1) *************** *** 648,662 **** //delete guiQProc; ! ! if(audioOutBuffers) { ! for(int i = 0; i < synth->_outports; ++i) ! { ! if(audioOutBuffers[i]) ! delete[] audioOutBuffers[i]; ! } ! delete[] audioOutBuffers; } ! } } --- 754,784 ---- //delete guiQProc; ! } ! ! if(audioInBuffers) ! { ! for(int i = 0; i < synth->_inports; ++i) { ! if(audioInBuffers[i]) ! delete[] audioInBuffers[i]; } ! delete[] audioInBuffers; ! } ! ! if(audioOutBuffers) ! { ! for(int i = 0; i < synth->_outports; ++i) ! { ! if(audioOutBuffers[i]) ! delete[] audioOutBuffers[i]; ! } ! delete[] audioOutBuffers; ! } ! ! if(controls) ! delete controls; ! ! if(controlsOut) ! delete controlsOut; } *************** *** 1024,1033 **** descr->connect_port(handle, synth->oIdx[k], buffer[k]); ! // Connect remaining ports to something... int outports = synth->_outports; for(; k < outports; ++k) descr->connect_port(handle, synth->oIdx[k], audioOutBuffers[k]); ! if(synth->dssi->run_synth) { --- 1146,1159 ---- descr->connect_port(handle, synth->oIdx[k], buffer[k]); ! // Connect remaining ports to something, otherwise crashes... int outports = synth->_outports; for(; k < outports; ++k) descr->connect_port(handle, synth->oIdx[k], audioOutBuffers[k]); ! // Connect input ports to something, otherwise crashes... ! int inports = synth->_inports; ! for(int j = 0; j < inports; ++j) ! descr->connect_port(handle, synth->iIdx[k], audioInBuffers[k]); ! if(synth->dssi->run_synth) { *************** *** 1126,1150 **** _outports = 0; _controller = 0; const LADSPA_Descriptor* d = dssi->LADSPA_Plugin; for (unsigned k = 0; k < d->PortCount; ++k) { LADSPA_PortDescriptor pd = d->PortDescriptors[k]; if (LADSPA_IS_PORT_AUDIO(pd)) { if (LADSPA_IS_PORT_INPUT(pd)) { ! //if(_inports < MAX_CHANNELS) ! { ! ++_inports; ! iIdx.push_back(k); ! } } else if (LADSPA_IS_PORT_OUTPUT(pd)) { ! //if(_outports < MAX_CHANNELS) ! { ! ++_outports; ! oIdx.push_back(k); ! } } } --- 1252,1278 ---- _outports = 0; _controller = 0; + _controllerOut = 0; const LADSPA_Descriptor* d = dssi->LADSPA_Plugin; + if(DSSI_DEBUG) + printf("DssiSynth::createSIF ladspa plugin PortCount:%lu\n", d->PortCount); + for (unsigned k = 0; k < d->PortCount; ++k) { LADSPA_PortDescriptor pd = d->PortDescriptors[k]; + + if(DSSI_DEBUG) + printf("DssiSynth::createSIF ladspa plugin Port:%d Name:%s descriptor:%x\n", k, d->PortNames[k], pd); + if (LADSPA_IS_PORT_AUDIO(pd)) { if (LADSPA_IS_PORT_INPUT(pd)) { ! ++_inports; ! iIdx.push_back(k); } else if (LADSPA_IS_PORT_OUTPUT(pd)) { ! ++_outports; ! oIdx.push_back(k); } } *************** *** 1153,1162 **** if (LADSPA_IS_PORT_INPUT(pd)) { ! ++_controller; ! pIdx.push_back(k); } ! else { ! // ?? } } --- 1281,1291 ---- if (LADSPA_IS_PORT_INPUT(pd)) { ! ++_controller; ! pIdx.push_back(k); } ! else if (LADSPA_IS_PORT_OUTPUT(pd)) { ! ++_controllerOut; ! opIdx.push_back(k); } } Index: dssihost.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/dssihost.h,v retrieving revision 1.10.2.4 retrieving revision 1.10.2.5 diff -C2 -d -r1.10.2.4 -r1.10.2.5 *** dssihost.h 30 Nov 2009 05:05:49 -0000 1.10.2.4 --- dssihost.h 2 Dec 2009 22:21:33 -0000 1.10.2.5 *************** *** 48,54 **** DSSI_Descriptor_Function df; std::vector<int> pIdx; std::vector<int> iIdx; std::vector<int> oIdx; ! int _inports, _outports, _controller; MidiCtl2LadspaPortMap midiCtl2PortMap; bool _hasGui; --- 48,55 ---- DSSI_Descriptor_Function df; std::vector<int> pIdx; + std::vector<int> opIdx; // This is sometimes a latency port and...? std::vector<int> iIdx; std::vector<int> oIdx; ! int _inports, _outports, _controller, _controllerOut; MidiCtl2LadspaPortMap midiCtl2PortMap; bool _hasGui; *************** *** 89,92 **** --- 90,94 ---- //LadspaPort* controls; Port* controls; + Port* controlsOut; void* uiTarget; *************** *** 101,104 **** --- 103,107 ---- bool processEvent(const MidiPlayEvent&, snd_seq_event_t*); + LADSPA_Data** audioInBuffers; LADSPA_Data** audioOutBuffers; Index: synth.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/synth.h,v retrieving revision 1.22.2.10 retrieving revision 1.22.2.11 diff -C2 -d -r1.22.2.10 -r1.22.2.11 *** synth.h 25 Nov 2009 09:09:44 -0000 1.22.2.10 --- synth.h 2 Dec 2009 22:21:33 -0000 1.22.2.11 *************** *** 48,52 **** int instances() const { return _instances; } virtual void incInstances(int val) { _instances += val; } ! //QString baseName() const { return info.baseName(true); } QString name() const { return _name; } QString path() const { return info.dirPath(true); } --- 48,52 ---- int instances() const { return _instances; } virtual void incInstances(int val) { _instances += val; } ! QString baseName() const { return info.baseName(true); } QString name() const { return _name; } QString path() const { return info.dirPath(true); } |