summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim E. Real <termtech@rogers.com>2011-09-09 21:29:24 +0000
committerTim E. Real <termtech@rogers.com>2011-09-09 21:29:24 +0000
commitefc7169b5f31ca13f970ae19e3d41c361acace41 (patch)
tree25fefb2df088f75e9b0126c7c71a60cea74e49ff
parent2120ea4f083228dde0d7307203391a4ec8f57e2d (diff)
More massive cleanups, update ChangeLog.
-rw-r--r--muse2/ChangeLog5
-rw-r--r--muse2/muse/driver/alsamidi.cpp32
-rw-r--r--muse2/muse/dssihost.cpp1362
-rw-r--r--muse2/muse/dssihost.h90
-rw-r--r--muse2/muse/mididev.cpp85
-rw-r--r--muse2/muse/mididev.h40
6 files changed, 94 insertions, 1520 deletions
diff --git a/muse2/ChangeLog b/muse2/ChangeLog
index b0bc5121..65f0dd45 100644
--- a/muse2/ChangeLog
+++ b/muse2/ChangeLog
@@ -8,9 +8,10 @@
and ::addStuckNote, because ALSA midi is processed in a thread other than audio. (Tim)
TODO: processMidi could do stuck notes better by bypassing their insertion in the play event list,
also applies to seek/stop handler block, but I'm not sure about the time comparisons.
+ - Removed MidiSeq::msgSeek and ::msgStop, and removed calls from Audio::seek and ::stopRolling. (Tim)
- Some more separation of ALSA and Jack Midi, one step closer to configurable choice of either/or. (Tim)
- - Massive cleanup of audio, midi, mididev, alsamidi, jackmidi modules. Moved some stuff from Audio::processMidi
- into MidiDevice. (Tim)
+ - Massive cleanup of audio, midi, mididev, alsamidi, jackmidi, dssi modules. Moved some stuff from
+ Audio::processMidi into MidiDevice. (Tim)
- Test OK here so far, with stress files and complete pre-existing songs, ALSA, Jack, and Synth midi. (Tim)
TODO: Restoration of sustain upon play seems broken for a while - try putEvent instead of addScheduledEvent
in Audio::startRolling().
diff --git a/muse2/muse/driver/alsamidi.cpp b/muse2/muse/driver/alsamidi.cpp
index 9a62dbdd..6395bf2d 100644
--- a/muse2/muse/driver/alsamidi.cpp
+++ b/muse2/muse/driver/alsamidi.cpp
@@ -400,6 +400,37 @@ bool MidiAlsaDevice::putEvent(snd_seq_event_t* event)
// Called from ALSA midi sequencer thread only.
//---------------------------------------------------------
+#if 0
+void MidiAlsaDevice::processMidi()
+{
+ processStuckNotes();
+ if (_playEvents.empty())
+ return;
+ int port = midiPort();
+ MidiPort* mp = port != -1 ? &midiPorts[port] : 0;
+ unsigned curFrame = audio->curFrame();
+ int tickpos = audio->tickPos();
+ bool extsync = extSyncFlag.value();
+ //int frameOffset = getFrameOffset();
+ //int nextTick = audio->nextTick();
+
+ // Play all events up to current frame.
+ iMPEvent i = _playEvents.begin();
+ for (; i != _playEvents.end(); ++i) {
+ if (i->time() > (extsync ? tickpos : curFrame)) // p3.3.25 Check: Should be nextTickPos? p4.0.34
+ break;
+ if(mp){
+ if (mp->sendEvent(*i))
+ break;
+ }
+ else
+ if(putMidiEvent(*i))
+ break;
+ }
+ _playEvents.erase(_playEvents.begin(), i);
+}
+
+#else
void MidiAlsaDevice::processMidi()
{
bool stop = stopPending; // Snapshots
@@ -638,6 +669,7 @@ void MidiAlsaDevice::handleSeek()
}
}
}
+#endif
//---------------------------------------------------------
// initMidiAlsa
diff --git a/muse2/muse/dssihost.cpp b/muse2/muse/dssihost.cpp
index 1f7009a4..42653a91 100644
--- a/muse2/muse/dssihost.cpp
+++ b/muse2/muse/dssihost.cpp
@@ -4,6 +4,7 @@
// $Id: dssihost.cpp,v 1.15.2.16 2009/12/15 03:39:58 terminator356 Exp $
//
// Copyright (C) 1999-2011 by Werner Schweer and others
+// (C) Copyright 2011 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License
@@ -34,280 +35,39 @@
#include <dlfcn.h>
#include <stdlib.h>
#include <sys/stat.h>
-//#include <dssi.h>
-//#include <alsa/asoundlib.h>
#include <QDir>
#include <QFileInfo>
-//#include <QMenu>
#include "dssihost.h"
#include "synth.h"
#include "audio.h"
#include "jackaudio.h"
-//#include "../driver/jackaudio.h" // p4.0.2
#include "midi.h"
#include "midiport.h"
#include "stringparam.h"
#include "plugin.h"
#include "controlfifo.h"
-//#include "al/al.h"
-//#include "al/xml.h"
#include "xml.h"
#include "song.h"
-//#include "midictrl.h"
-//#include "ladspaplugin.h"
#include "app.h"
#include "globals.h"
#include "globaldefs.h"
-//#include "al/dsp.h"
#include "gconfig.h"
#include "popupmenu.h"
-
-/*
-static lo_server_thread serverThread;
-static char osc_path_tmp[1024];
-static char* url;
-
-//---------------------------------------------------------
-// oscError
-//---------------------------------------------------------
-
-static void oscError(int num, const char *msg, const char *path)
- {
- fprintf(stderr, "MusE: liblo server error %d in path %s: %s\n",
- num, path, msg);
- }
-
-//---------------------------------------------------------
-// oscDebugHandler
-//---------------------------------------------------------
-
-static int oscDebugHandler(const char* path, const char* types, lo_arg** argv,
- int argc, void*, void*)
- {
- printf("MusE: got unhandled OSC message:\n path: <%s>\n", path);
- for (int i = 0; i < argc; i++) {
- printf(" arg %d '%c' ", i, types[i]);
- lo_arg_pp(lo_type(types[i]), argv[i]);
- printf("\n");
- }
- return 1;
- }
-
-//---------------------------------------------------------
-// oscUpdate
-//---------------------------------------------------------
-
-int DssiSynthIF::oscUpdate(lo_arg **argv)
- {
- const char *url = (char *)&argv[0]->s;
-
- if (uiTarget)
- lo_address_free(uiTarget);
- char* host = lo_url_get_hostname(url);
- char* port = lo_url_get_port(url);
- uiTarget = lo_address_new(host, port);
- free(host);
- free(port);
-
- if (uiOscPath)
- free(uiOscPath);
- uiOscPath = lo_url_get_path(url);
- int pl = strlen(uiOscPath);
-
- if (uiOscControlPath)
- free(uiOscControlPath);
- uiOscControlPath = (char *)malloc(pl + 10);
- sprintf(uiOscControlPath, "%s/control", uiOscPath);
-
- if (uiOscConfigurePath)
- free(uiOscConfigurePath);
- uiOscConfigurePath = (char *)malloc(pl + 12);
- sprintf(uiOscConfigurePath, "%s/configure", uiOscPath);
-
- if (uiOscProgramPath)
- free(uiOscProgramPath);
- uiOscProgramPath = (char *)malloc(pl + 10);
- sprintf(uiOscProgramPath, "%s/program", uiOscPath);
-
- if (uiOscShowPath)
- free(uiOscShowPath);
- uiOscShowPath = (char *)malloc(pl + 10);
- sprintf(uiOscShowPath, "%s/show", uiOscPath);
-
- // At this point a more substantial host might also call
- // configure() on the UI to set any state that it had remembered
- // for the plugin instance. But we don't remember state for
- // plugin instances (see our own configure() implementation in
- // osc_configure_handler), and so we have nothing to send except
- // the optional project directory.
-
-
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::oscUpdate synth name:%s url:%s uiTarget:%p uiOscPath:%s uiOscConfigurePath:%s MusEGlobal::museProject:%s\n", synti->name().ascii(), url, uiTarget, uiOscPath, uiOscConfigurePath, MusEGlobal::museProject.ascii());
- #endif
-
- //lo_send(uiTarget, uiOscConfigurePath, "ss",
- //DSSI_PROJECT_DIRECTORY_KEY, song->projectPath().toAscii().data());
- lo_send(uiTarget, uiOscConfigurePath, "ss",
- DSSI_PROJECT_DIRECTORY_KEY, MusEGlobal::museProject.ascii());
-
-#if 0
- // Send current bank/program (-FIX- another race...)
- if (instance->pendingProgramChange < 0) {
- unsigned long bank = instance->currentBank;
- unsigned long program = instance->currentProgram;
- instance->uiNeedsProgramUpdate = 0;
- if (instance->uiTarget) {
- lo_send(instance->uiTarget, instance->ui_osc_program_path, "ii", bank, program);
- }
- }
-
- // Send control ports
- for (i = 0; i < instance->plugin->controlIns; i++) {
- int in = i + instance->firstControlIn;
- int port = pluginControlInPortNumbers[in];
- lo_send(instance->uiTarget, instance->ui_osc_control_path, "if", port,
- pluginControlIns[in]);
- // Avoid overloading the GUI if there are lots and lots of ports
- if ((i+1) % 50 == 0)
- usleep(300000);
- }
-#endif
- return 0;
- }
-
-//---------------------------------------------------------
-// oscMessageHandler
-//---------------------------------------------------------
-
-int oscMessageHandler(const char* path, const char* types, lo_arg** argv,
- int argc, void* data, void* user_data)
- {
- const char* p = path;
-
- #ifdef DSSI_DEBUG
- if(argc)
- {
- printf("oscMessageHandler: path:%s argc:%d\n", path, argc);
- for(int i = 0; i < argc; ++i)
- {
- printf(" ");
- lo_arg_pp((lo_type)types[i], argv[i]);
- }
- printf("\n");
- }
- else
- {
- printf("%s\n", path);
- printf("oscMessageHandler: no args, path:%s\n", path);
- }
- #endif
-
- if (strncmp(p, "/dssi/", 6))
- return oscDebugHandler(path, types, argv, argc, data, user_data);
-
- p += 6;
- //p = strrchr(p, "/");
-
- SynthIList* sl = song->syntis();
- DssiSynthIF* instance = 0;
- SynthI* synti = 0;
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "oscMessageHandler: song->syntis() size:%d\n", sl->size());
- #endif
-
- for(int retry = 0; retry < 5; ++retry)
- {
- #ifdef DSSI_DEBUG
- fprintf(stderr, "oscMessageHandler: search retry number:%d ...\n", retry);
- #endif
-
- //if(uiOscPath)
- // break;
-
- for(iSynthI si = sl->begin(); si != sl->end(); ++si)
- {
- #ifdef DSSI_DEBUG
- fprintf(stderr, "oscMessageHandler: searching for synth p:%s: checking instances:%s\n", p, (*si)->name().ascii());
- #endif
-
- //int l = strlen((*si)->name().toAscii().data());
- //if (!strncmp(p, (*si)->name().toAscii().data(), l)) {
- //int l = strlen((*si)->name().ascii());
- const char* sub = strstr(p, (*si)->name().ascii());
-
- //if(!strncmp(p, (*si)->name().ascii(), l))
- if(sub != NULL)
- {
- synti = *si;
- instance = (DssiSynthIF*)(synti->sif());
-
- //p += l;
- p = sub + strlen((*si)->name().ascii());
-
- break;
- }
- }
- if(instance)
- break;
-
- sleep(1);
- }
-
- if(!instance)
- {
- fprintf(stderr, "oscMessageHandler: error: no instance\n");
- return oscDebugHandler(path, types, argv, argc, data, user_data);
- }
-
- if (*p != '/' || *(p + 1) == 0)
- {
- fprintf(stderr, "oscMessageHandler: error: end or no /\n");
- return oscDebugHandler(path, types, argv, argc, data, user_data);
- }
-
- ++p;
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "oscMessageHandler: method:%s\n", p);
- #endif
-
- if (!strcmp(p, "configure") && argc == 2 && !strcmp(types, "ss"))
- return instance->oscConfigure(argv);
- else if (!strcmp(p, "control") && argc == 2 && !strcmp(types, "if"))
- return instance->oscControl(argv);
- else if (!strcmp(p, "midi") && argc == 1 && !strcmp(types, "m"))
- return instance->oscMidi(argv);
- else if (!strcmp(p, "program") && argc == 2 && !strcmp(types, "ii"))
- return instance->oscProgram(argv);
- else if (!strcmp(p, "update") && argc == 1 && !strcmp(types, "s"))
- return instance->oscUpdate(argv);
- else if (!strcmp(p, "exiting") && argc == 0)
- return instance->oscExiting(argv);
- return oscDebugHandler(path, types, argv, argc, data, user_data);
- }
-*/
-
//---------------------------------------------------------
// scanDSSILib
//---------------------------------------------------------
static void scanDSSILib(QFileInfo& fi) // ddskrjo removed const for argument
{
- //void* handle = dlopen(fi.filePath().toAscii().data(), RTLD_NOW);
void* handle = dlopen(fi.filePath().toLatin1().constData(), RTLD_NOW);
- //void* handle = dlopen(fi.absFilePath().toLatin1().constData(), RTLD_NOW);
if (handle == 0) {
fprintf(stderr, "scanDSSILib: dlopen(%s) failed: %s\n",
- //fi.filePath().toAscii().data(), dlerror());
fi.filePath().toLatin1().constData(), dlerror());
- //fi.absFilePath().toLatin1().constData(), dlerror());
return;
}
@@ -315,29 +75,11 @@ static void scanDSSILib(QFileInfo& fi) // ddskrjo removed const for argument
if (!dssi)
{
- /*
- const char *txt = dlerror();
- if (txt)
- {
- fprintf(stderr,
- "Unable to find dssi_descriptor() function in plugin "
- "library file \"%s\": %s.\n"
- "Are you sure this is a DSSI plugin file?\n",
- //fi.filePath().toAscii().data(),
- fi.filePath().ascii(),
- //fi.absFilePath().toLatin1().constData(),
-
- txt);
- dlclose(handle);
- exit(1);
- }
- */
dlclose(handle);
return;
}
else
{
- //const DSSI_Descriptor* descr;
for (int i = 0;; ++i)
{
const DSSI_Descriptor* descr;
@@ -407,13 +149,6 @@ static void scanDSSILib(QFileInfo& fi) // ddskrjo removed const for argument
synthis.push_back(s);
}
- //else
- //{
- // NOTE: Just a test
- //QFileInfo ffi(fi);
- //plugins.add(&ffi, LADSPA_Descriptor_Function(NULL), descr->LADSPA_Plugin, false);
- //plugins.add(&ffi, descr, false);
- //}
}
}
dlclose(handle);
@@ -426,7 +161,6 @@ static void scanDSSILib(QFileInfo& fi) // ddskrjo removed const for argument
static void scanDSSIDir(QString& s) // ddskrjo removed const for argument
{
if(MusEGlobal::debugMsg)
- //printf("scan DSSI plugin dir <%s>\n", s.toAscii().data());
printf("scanDSSIDir: scan DSSI plugin dir <%s>\n", s.toLatin1().constData());
#ifdef __APPLE__
@@ -437,12 +171,6 @@ static void scanDSSIDir(QString& s) // ddskrjo removed const for argument
if(!pluginDir.exists())
return;
- //const QFileInfoList list = pluginDir.entryInfoList();
- //for (int i = 0; i < list.size(); ++i) {
- //QFileInfo fi = list.at(i);
- //scanDSSILib(fi);
- //}
-
QStringList list = pluginDir.entryList();
for(int i = 0; i < list.count(); ++i)
{
@@ -464,13 +192,7 @@ void initDSSI()
if (dssiPath == 0)
dssiPath = "/usr/local/lib64/dssi:/usr/lib64/dssi:/usr/local/lib/dssi:/usr/lib/dssi";
- //const char* ladspaPath = getenv("LADSPA_PATH");
- //if (ladspaPath == 0)
- // ladspaPath = "/usr/local/lib64/ladspa:/usr/lib64/ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa";
-
const char* p = dssiPath;
- //QString pth = QString(dssiPath) + QString(":") + QString(ladspaPath);
- //const char* p = pth.toLatin1().constData();
while (*p != '\0') {
const char* pe = p;
while (*pe != ':' && *pe != '\0')
@@ -489,16 +211,6 @@ void initDSSI()
if (*p == ':')
p++;
}
-
- // Create OSC thread
- //serverThread = lo_server_thread_new(0, oscError);
- //snprintf(osc_path_tmp, 31, "/dssi");
- //char* tmp = lo_server_thread_get_url(serverThread);
- //url = (char *)malloc(strlen(tmp) + strlen(osc_path_tmp));
- //sprintf(url, "%s%s", tmp, osc_path_tmp + 1);
- //free(tmp);
- //lo_server_thread_add_method(serverThread, 0, 0, oscMessageHandler, 0);
- //lo_server_thread_start(serverThread);
}
//---------------------------------------------------------
@@ -510,7 +222,6 @@ void initDSSI()
//---------------------------------------------------------
DssiSynth::DssiSynth(QFileInfo& fi, const DSSI_Descriptor* d) : // ddskrjo removed const from QFileInfo
- //Synth(fi, label, descr, maker, ver)
Synth(fi, QString(d->LADSPA_Plugin->Label), QString(d->LADSPA_Plugin->Name), QString(d->LADSPA_Plugin->Maker), QString())
{
df = 0;
@@ -521,9 +232,6 @@ DssiSynth::DssiSynth(QFileInfo& fi, const DSSI_Descriptor* d) : // ddskrjo remov
const LADSPA_Descriptor* descr = d->LADSPA_Plugin;
_portCount = descr->PortCount;
- //_portDescriptors = 0;
- //if(_portCount)
- // _portDescriptors = new LADSPA_PortDescriptor[_portCount];
_inports = 0;
_outports = 0;
@@ -532,7 +240,6 @@ DssiSynth::DssiSynth(QFileInfo& fi, const DSSI_Descriptor* d) : // ddskrjo remov
for(unsigned long k = 0; k < _portCount; ++k)
{
LADSPA_PortDescriptor pd = descr->PortDescriptors[k];
- //_portDescriptors[k] = pd;
if(pd & LADSPA_PORT_AUDIO)
{
if(pd & LADSPA_PORT_INPUT)
@@ -574,17 +281,11 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
{
if (_instances == 0)
{
- //handle = dlopen(info.filePath().toAscii().data(), RTLD_NOW);
handle = dlopen(info.filePath().toLatin1().constData(), RTLD_NOW);
- //handle = dlopen(info.absFilePath().toLatin1().constData(), RTLD_NOW);
-
if (handle == 0)
{
fprintf(stderr, "DssiSynth::createSIF dlopen(%s) failed: %s\n",
- //info.filePath().toAscii().data(), dlerror());
info.filePath().toLatin1().constData(), dlerror());
- //info.absFilePath().toLatin1().constData(), dlerror());
-
return 0;
}
df = (DSSI_Descriptor_Function)dlsym(handle, "dssi_descriptor");
@@ -595,10 +296,7 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
"Unable to find dssi_descriptor() function in plugin "
"library file \"%s\": %s.\n"
"Are you sure this is a DSSI plugin file?\n",
- //info.filePath().toAscii().data(),
info.filePath().toLatin1().constData(),
- //info.absFilePath().toLatin1().constData(),
-
txt ? txt : "?");
dlclose(handle);
handle = 0;
@@ -620,10 +318,6 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
_outports = 0;
_controlInPorts = 0;
_controlOutPorts = 0;
-
- ///pIdx.clear();
- ///opIdx.clear();
-
iIdx.clear();
oIdx.clear();
rpIdx.clear();
@@ -669,7 +363,6 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
{
rpIdx.push_back(_controlInPorts);
++_controlInPorts;
- ///pIdx.push_back(k);
// Set to false at first.
//synti->_guiUpdateControls.push_back(false);
}
@@ -677,7 +370,6 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
{
rpIdx.push_back((unsigned long)-1);
++_controlOutPorts;
- ///opIdx.push_back(k);
}
}
}
@@ -693,7 +385,6 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
if (dssi == 0)
{
- //fprintf(stderr, "cannot found DSSI synti %s\n", _name.toAscii().data());
fprintf(stderr, "cannot find DSSI synti %s\n", _name.toLatin1().constData());
dlclose(handle);
handle = 0;
@@ -707,13 +398,6 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
//_plugin->incInstances(1);
-
-
-// static char oscUrl[1024];
- //snprintf(oscUrl, 1024, "%s/%s", url, synti->name().toAscii().data());
- //snprintf(oscUrl, 1024, "%s/%s", url, synti->name().toLatin1().constData());
-// snprintf(oscUrl, 1024, "%s/%s/%s", url, info.baseName().toLatin1().constData(), synti->name().toLatin1().constData());
- //QString guiPath(info.path() + "/" + info.baseName());
QString guiPath(info.path() + "/" + info.baseName());
QDir guiDir(guiPath, "*", QDir::Unsorted, QDir::Files);
_hasGui = guiDir.exists();
@@ -730,7 +414,6 @@ SynthIF* DssiSynth::createSIF(SynthI* synti)
//bool DssiSynthIF::guiVisible() const
bool DssiSynthIF::nativeGuiVisible() const
{
- //return _guiVisible;
#ifdef OSC_SUPPORT
return _oscif.oscGuiVisible();
#endif
@@ -739,8 +422,6 @@ bool DssiSynthIF::nativeGuiVisible() const
bool DssiSynthIF::guiVisible() const
{
- //return _guiVisible;
- //return false;
return _gui && _gui->isVisible();
}
@@ -748,7 +429,6 @@ bool DssiSynthIF::guiVisible() const
// showGui
//---------------------------------------------------------
-//void DssiSynthIF::showGui(bool v)
void DssiSynthIF::showNativeGui(bool v)
{
#ifdef OSC_SUPPORT
@@ -760,47 +440,6 @@ void DssiSynthIF::showNativeGui(bool v)
_oscif.oscShowGui(v);
#endif // OSC_SUPPORT
-
- /*
- if (v == guiVisible())
- return;
-
- //if(guiPid == -1)
- if((guiQProc == 0) || (!guiQProc->isRunning()))
- {
- // We need an indicator that update was called - update must have been called to get new path etc...
- // If the process is not running this path is invalid, right?
- if(uiOscPath)
- free(uiOscPath);
- uiOscPath = 0;
-
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::showGui(): No QProcess or process not running. Starting gui...\n");
- #endif
-
- initGui();
- }
-
- //for (int i = 0; i < 5; ++i) {
- for (int i = 0; i < 10; ++i) { // Give it a wee bit more time?
- if (uiOscPath)
- break;
- sleep(1);
- }
- if (uiOscPath == 0) {
- printf("DssiSynthIF::showGui(): no uiOscPath. Error: Timeout - synth gui did not start within 10 seconds.\n");
- return;
- }
-
- char uiOscGuiPath[strlen(uiOscPath)+6];
- sprintf(uiOscGuiPath, "%s/%s", uiOscPath, v ? "show" : "hide");
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::showGui(): Sending show/hide uiOscGuiPath:%s\n", uiOscGuiPath);
- #endif
-
- lo_send(uiTarget, uiOscGuiPath, "");
- _guiVisible = v;
- */
}
//---------------------------------------------------------
@@ -809,28 +448,21 @@ void DssiSynthIF::showNativeGui(bool v)
void DssiSynthIF::showGui(bool v)
{
- //if (_plugin)
- {
- if (v) {
- if (_gui == 0)
- makeGui();
- _gui->show();
- }
- else {
- if (_gui)
- _gui->hide();
- }
- }
+ if (v) {
+ if (_gui == 0)
+ makeGui();
+ _gui->show();
+ }
+ else {
+ if (_gui)
+ _gui->hide();
+ }
}
//---------------------------------------------------------
// receiveEvent
//---------------------------------------------------------
-//MidiEvent DssiSynthIF::receiveEvent()
-// {
-// return MidiEvent();
-// }
MidiPlayEvent DssiSynthIF::receiveEvent()
{
return MidiPlayEvent();
@@ -863,8 +495,6 @@ bool DssiSynthIF::init(DssiSynth* s)
audioInBuffers = new float*[inports];
for(int k = 0; k < inports; ++k)
{
- //audioInBuffers[k] = new LADSPA_Data[MusEGlobal::segmentSize];
- //posix_memalign((void**)(audioInBuffers + k), 16, sizeof(float) * MusEGlobal::segmentSize);
posix_memalign((void**)&audioInBuffers[k], 16, sizeof(float) * MusEGlobal::segmentSize);
memset(audioInBuffers[k], 0, sizeof(float) * MusEGlobal::segmentSize);
ld->connect_port(handle, synth->iIdx[k], audioInBuffers[k]);
@@ -877,12 +507,9 @@ bool DssiSynthIF::init(DssiSynth* s)
audioOutBuffers = new float*[outports];
for(int k = 0; k < outports; ++k)
{
- //audioOutBuffers[k] = new LADSPA_Data[MusEGlobal::segmentSize];
- //posix_memalign((void**)(audioOutBuffers + k), 16, sizeof(float) * MusEGlobal::segmentSize);
posix_memalign((void**)&audioOutBuffers[k], 16, sizeof(float) * MusEGlobal::segmentSize);
memset(audioOutBuffers[k], 0, sizeof(float) * MusEGlobal::segmentSize);
ld->connect_port(handle, synth->oIdx[k], audioOutBuffers[k]);
- //printf("DssiSynthIF::init output port name: %s\n", ld->PortNames[synth->oIdx[k]]); // out1, out2, out3 etc
}
}
@@ -904,90 +531,6 @@ bool DssiSynthIF::init(DssiSynth* s)
synti->_guiUpdateControls.clear();
synti->_guiUpdateProgram = false;
-/*
- for (int k = 0; k < controlPorts; ++k) {
- int i = synth->pIdx[k];
- controls[k].idx = i; // p4.0.20
- //controls[k].val = ladspaDefaultValue(ld, i);
- ladspaDefaultValue(ld, i, &controls[k].val);
-
- // Set to false at first.
- synti->_guiUpdateControls.push_back(false);
-
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::init control port:%d port idx:%d name:%s\n", k, i, ld->PortNames[i]);
- #endif
-
- // 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 + 0x2000 = 0x62000. Max NRPN number is 0x3fff.
- // TODO: Update: Actually we want to try to use CC Controller7 controllers if possible (or a choice) because what if
- // the user's controller hardware doesn't support RPN?
- // If CC Controller7 is chosen we must make sure to use only non-common numbers. An already limited range
- // of 127 now becomes narrower. See the cool document midi-controllers.txt in the DSSI source for a
- // nice roundup of numbers and how to choose them and how they relate to synths and DSSI synths etc. !
- ctlnum = CTRL_NRPN14_OFFSET + 0x2000 + k;
- }
- else
- {
- int c = ctlnum;
- // Can be both CC and NRPN! Prefer CC over NRPN.
- if(DSSI_IS_CC(ctlnum))
- {
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::init is CC control\n");
- #endif
-
- ctlnum = DSSI_CC_NUMBER(c);
- #ifdef DSSI_DEBUG
- if(DSSI_IS_NRPN(ctlnum))
- printf("DssiSynthIF::init is also NRPN control. Using CC.\n");
- #endif
- }
- else
- if(DSSI_IS_NRPN(ctlnum))
- {
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::init is NRPN control\n");
- #endif
-
- ctlnum = DSSI_NRPN_NUMBER(c) + CTRL_NRPN14_OFFSET;
- }
-
- }
-
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::init inserting to midiCtl2PortMap: ctlnum:%d k:%d\n", ctlnum, k);
- #endif
-
- // We have a controller number! Insert it and the DSSI port number into both maps.
- synth->midiCtl2PortMap.insert(std::pair<int, int>(ctlnum, k));
- synth->port2MidiCtlMap.insert(std::pair<int, int>(k, ctlnum));
- ld->connect_port(handle, i, &controls[k].val);
- }
-
- for (int k = 0; k < controlOutPorts; ++k) {
- int i = synth->opIdx[k];
- controlsOut[k].idx = i; // p4.0.20
-
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::init control output port:%d port idx:%d name:%s\n", k, i, ld->PortNames[i]);
- #endif
-
- // - Control outs are not handled but still must be connected to something.
- ld->connect_port(handle, i, &controlsOut[k].val);
- }
-*/
- // p4.0.20
int cip = 0;
int cop = 0;
for (unsigned long k = 0; k < synth->_portCount; ++k)
@@ -1072,7 +615,7 @@ bool DssiSynthIF::init(DssiSynth* s)
synth->midiCtl2PortMap.insert(std::pair<int, int>(ctlnum, cip));
synth->port2MidiCtlMap.insert(std::pair<int, int>(cip, ctlnum));
- // Support a special block for dssi synth ladspa controllers. p4.0.20
+ // Support a special block for dssi synth ladspa controllers.
// Put the ID at a special block after plugins (far after).
int id = genACnum(MAX_PLUGINS, cip);
const char* name = ld->PortNames[k];
@@ -1121,35 +664,6 @@ bool DssiSynthIF::init(DssiSynth* s)
}
}
-
- /*
- // Add the LADSPA controllers to the audio track controller list. p4.0.20
- //int controller = plugin->parameters();
- int controller = controlPorts;
- for (int i = 0; i < controller; ++i)
- {
- //int id = genACnum(idx, i);
- // Put the ID at a special block after plugins (far after).
- int id = genACnum(MAX_PLUGINS, i);
- const char* name = plugin->paramName(i);
- synth->dssi->LADSPA_Plugin->PortNames[controls[i].idx]
- float min, max;
- plugin->range(i, &min, &max);
- CtrlValueType t = plugin->valueType();
- CtrlList* cl = new CtrlList(id);
- cl->setRange(min, max);
- cl->setName(QString(name));
- cl->setValueType(t);
- LADSPA_PortRangeHint range = plugin->range(i);
- if(LADSPA_IS_HINT_TOGGLED(range.HintDescriptor))
- cl->setMode(CtrlList::DISCRETE);
- else
- cl->setMode(CtrlList::INTERPOLATE);
- cl->setCurVal(plugin->param(i));
- addController(cl);
- }
- */
-
if (ld->activate)
ld->activate(handle);
@@ -1198,29 +712,10 @@ DssiSynthIF::DssiSynthIF(SynthI* s)
#ifdef DSSI_DEBUG
printf("DssiSynthIF::DssiSynthIF\n");
#endif
-
synth = 0;
handle = NULL;
controls = 0;
controlsOut = 0;
-
- //_curBank = 0;
- //_curProgram = 0;
-
- //#ifdef OSC_SUPPORT
- //_oscif.setSynthIF(this);
- //#endif
-
- //_guiVisible = false;
- //uiTarget = 0;
- //uiOscShowPath = 0;
- //uiOscControlPath = 0;
- //uiOscConfigurePath = 0;
- //uiOscProgramPath = 0;
- //uiOscPath = 0;
- //guiPid = -1;
- //guiQProc = 0;
-
audioInBuffers = 0;
audioOutBuffers = 0;
}
@@ -1274,45 +769,8 @@ DssiSynthIF::~DssiSynthIF()
descr->cleanup(handle);
}
}
-
- /*
- //if (guiPid != -1)
- // kill(guiPid, SIGHUP);
- if(guiQProc)
- {
- if(guiQProc->isRunning())
- {
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::~DssiSynthIF killing guiQProc\n");
- #endif
-
- guiQProc->kill();
- }
-
- //delete guiQProc;
- }
-
- if(uiOscShowPath)
- free(uiOscShowPath);
- if(uiOscControlPath)
- free(uiOscControlPath);
- if(uiOscConfigurePath)
- free(uiOscConfigurePath);
- if(uiOscProgramPath)
- free(uiOscProgramPath);
- if(uiOscPath)
- free(uiOscPath);
- if(uiTarget)
- lo_address_free(uiTarget);
- */
-
if(audioInBuffers)
{
- //for(int i = 0; i < synth->_inports; ++i)
- //{
- // if(audioInBuffers[i])
- // delete[] audioInBuffers[i];
- //}
for(unsigned long i = 0; i < synth->_inports; ++i)
{
if(audioInBuffers[i])
@@ -1323,11 +781,6 @@ DssiSynthIF::~DssiSynthIF()
if(audioOutBuffers)
{
- //for(int i = 0; i < synth->_outports; ++i)
- //{
- // if(audioOutBuffers[i])
- // delete[] audioOutBuffers[i];
- //}
for(unsigned long i = 0; i < synth->_outports; ++i)
{
if(audioOutBuffers[i])
@@ -1397,10 +850,6 @@ void DssiSynthIF::setParameter(unsigned long n, float v)
return;
}
- //if(!controls)
- // return;
- //controls[n].val = v;
- // p4.0.21
ControlEvent ce;
ce.unique = false;
ce.idx = n;
@@ -1451,12 +900,12 @@ void DssiSynthIF::write(int level, Xml& xml) const
synth->dssi->getCustomData(handle,&p, &len);
if (len) {
//xml.tag(level++, "midistate");
- xml.tag(level++, "midistate version=\"%d\"", SYNTH_MIDI_STATE_SAVE_VERSION); // p4.0.27
+ xml.tag(level++, "midistate version=\"%d\"", SYNTH_MIDI_STATE_SAVE_VERSION);
xml.nput(level++, "<event type=\"%d\"", Sysex);
//xml.nput(" datalen=\"%d\">\n", len+7 /*VSTSAVE*/);
xml.nput(" datalen=\"%d\">\n", len+9 /* 2 bytes header + "VSTSAVE" */);
xml.nput(level, "");
- xml.nput("%02x %02x ", (char)MUSE_SYNTH_SYSEX_MFG_ID, (char)DSSI_SYNTH_UNIQUE_ID); // p4.0.27 Wrap in a proper header
+ xml.nput("%02x %02x ", (char)MUSE_SYNTH_SYSEX_MFG_ID, (char)DSSI_SYNTH_UNIQUE_ID); // Wrap in a proper header
xml.nput("56 53 54 53 41 56 45 "); // embed a save marker "string 'VSTSAVE'
for (long unsigned int i = 0; i < len; ++i) {
//if (i && (((i+7) % 16) == 0)) {
@@ -1623,9 +1072,6 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
len += 2;
- //snd_seq_event_t* event = &events[nevents];
- //event->queue = SND_SEQ_QUEUE_DIRECT;
-
#ifdef DSSI_DEBUG
fprintf(stderr, "DssiSynthIF::processEvent midi event type:%d chn:%d a:%d b:%d\n", e.type(), chn, a, b);
#endif
@@ -1691,8 +1137,6 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
int bank = (b >> 8) & 0xff;
int prog = b & 0xff;
- //_curBank = bank;
- //_curProgram = prog;
synti->_curBankH = 0;
synti->_curBankL = bank;
synti->_curProgram = prog;
@@ -1733,7 +1177,7 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
// among different dssi synths and regular synths etc. For example high RPN offset numbers (set by another
// device selected into the midi port before selecting this synth) were passing through here when in fact
// the particular synth had no such midi controllers.
- // ========================== No, that leaves out regular controllers like footpedal
+ // No, that leaves out regular controllers like footpedal
//#ifdef DSSI_DEBUG
//fprintf(stderr, "DssiSynthIF::processEvent dataA:%d not found in map (not a ladspa controller). Ignoring.\n", a);
//#endif
@@ -1746,89 +1190,18 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
//return true;
int ctlnum = a;
- //switch(midiControllerType(a))
if(midiControllerType(a) != MidiController::Controller7)
return false; // Event pointer not filled. Return false.
else
{
- /*
- case MidiController::NRPN14:
- case MidiController::Controller14:
- case MidiController::Pitch:
- case MidiController::Program:
- case MidiController::RPN:
- case MidiController::RPN14:
- case MidiController::NRPN:
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::processEvent non-ladspa midi event controller unsupported. DataA:%d\n", a);
- #endif
- return false;
- */
-
- //case MidiController::Controller7:
#ifdef DSSI_DEBUG
//fprintf(stderr, "DssiSynthIF::processEvent midi event is Controller7. Changing to DSSI_CC type. Current dataA:%d\n", a);
fprintf(stderr, "DssiSynthIF::processEvent non-ladspa midi event is Controller7. Current dataA:%d\n", a);
#endif
- //a = DSSI_CC(a);
a &= 0x7f;
ctlnum = DSSI_CC_NUMBER(ctlnum);
- // break;
-
- /*
- case MidiController::NRPN14:
- #ifdef DSSI_DEBUG
- // fprintf(stderr, "DssiSynthIF::processEvent midi event is NRPN. Changing to DSSI_NRPN type. Current dataA:%d\n", a);
- fprintf(stderr, "DssiSynthIF::processEvent non-ladspa midi event is NRPN. Current dataA:%d\n", a);
- #endif
- //a = DSSI_NRPN(a - CTRL_NRPN14_OFFSET);
- a &= 0x3fff;
- ctlnum = DSSI_NRPN_NUMBER(ctlnum);
- break;
- case MidiController::Controller14:
- a &= 0x7f;
- break;
- case MidiController::Pitch:
- // Should be caught above!
- #ifdef DSSI_DEBUG
- //fprintf(stderr, "DssiSynthIF::processEvent non-ladspa midi event is Pitch. DataA:%d\n", a);
- fprintf(stderr, "DssiSynthIF::processEvent Error! non-ladspa midi event is Pitch. Should have been caught already! DataA:%d\n", a);
- #endif
- //a &= 0x3fff;
- //snd_seq_ev_set_pitchbend(event, chn, b);
- // Event pointer filled. Return true.
- //return true;
- // Event pointer not filled. Return false.
- return false;
- case MidiController::Program:
- // Should be caught above!
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::processEvent Error! non-ladspa midi event is Program. Should have been caught already! DataA:%d\n", a);
- #endif
- return false;
- case MidiController::RPN:
- case MidiController::RPN14:
- case MidiController::NRPN:
- default:
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::processEvent non-ladspa midi event is RPN, RPN14, or NRPN type. DataA:%d\n", a);
- #endif
- break;
- */
}
- // Verify it's the same number.
- //if(ctlnum != a)
- //{
- // #ifdef DSSI_DEBUG
- // printf("DssiSynthIF::processEvent Error! non-ladspa midi ctlnum:%d != event dataA:%d\n", ctlnum, a);
- // #endif
- // Event not filled. Return false.
-
- // TEMP: TODO: Turn on later
- //return false;
- //}
-
// Fill the event.
#ifdef DSSI_DEBUG
printf("DssiSynthIF::processEvent non-ladspa filling midi event chn:%d dataA:%d dataB:%d\n", chn, a, b);
@@ -1839,12 +1212,8 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
return true;
}
- //int num = ip->first;
unsigned long k = ip->second;
-
- ///unsigned long i = synth->pIdx[k];
unsigned long i = controls[k].idx;
-
int ctlnum = DSSI_NONE;
if(dssi->get_midi_controller_for_port)
ctlnum = dssi->get_midi_controller_for_port(handle, i);
@@ -1865,7 +1234,6 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
// Simple but flawed solution: Start them at 0x60000 + 0x2000 = 0x62000. Max NRPN number is 0x3fff.
ctlnum = k + (CTRL_NRPN14_OFFSET + 0x2000);
}
- // p3.3.39
else
{
#ifdef DSSI_DEBUG
@@ -1899,24 +1267,22 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
}
- //{
- float val = midi2LadspaValue(ld, i, ctlnum, b);
-
- #ifdef DSSI_DEBUG
- //fprintf(stderr, "DssiSynthIF::processEvent No midi controller for control port:%d port:%d dataA:%d Converting val from:%d to ladspa:%f\n", i, k, a, b, val);
- fprintf(stderr, "DssiSynthIF::processEvent control port:%lu port:%lu dataA:%d Converting val from:%d to ladspa:%f\n", i, k, a, b, val);
- #endif
-
- // Set the ladspa port value.
- controls[k].val = val;
- // FIXME: Testing - Works but is this safe in a RT process callback? Try hooking into gui heartbeat timer instead...
- //lo_send(uiTarget, uiOscControlPath, "if", i, val);
- // Notify that changes are to be sent upon heartbeat.
- synti->_guiUpdateControls[k] = true;
-
- // Since we absorbed the message as a ladspa control change, return false - the event is not filled.
- return false;
- //}
+ float val = midi2LadspaValue(ld, i, ctlnum, b);
+
+ #ifdef DSSI_DEBUG
+ //fprintf(stderr, "DssiSynthIF::processEvent No midi controller for control port:%d port:%d dataA:%d Converting val from:%d to ladspa:%f\n", i, k, a, b, val);
+ fprintf(stderr, "DssiSynthIF::processEvent control port:%lu port:%lu dataA:%d Converting val from:%d to ladspa:%f\n", i, k, a, b, val);
+ #endif
+
+ // Set the ladspa port value.
+ controls[k].val = val;
+ // FIXME: Testing - Works but is this safe in a RT process callback? Try hooking into gui heartbeat timer instead...
+ //lo_send(uiTarget, uiOscControlPath, "if", i, val);
+ // Notify that changes are to be sent upon heartbeat.
+ synti->_guiUpdateControls[k] = true;
+
+ // Since we absorbed the message as a ladspa control change, return false - the event is not filled.
+ return false;
}
break;
case ME_PITCHBEND:
@@ -1935,7 +1301,6 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
fprintf(stderr, "DssiSynthIF::processEvent midi event is ME_SYSEX\n");
#endif
- // Changed p4.0.27
const unsigned char* data = e.data();
if(e.len() >= 2)
{
@@ -2045,292 +1410,10 @@ bool DssiSynthIF::processEvent(const MidiPlayEvent& e, snd_seq_event_t* event)
return true;
}
-#if 0
-
//---------------------------------------------------------
// getData
//---------------------------------------------------------
-//void DssiSynthIF::getData(MidiEventList* el, unsigned pos, int ch, unsigned samples, float** data)
-iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, unsigned pos, int ports, unsigned n, float** buffer)
-{
- //#ifdef DSSI_DEBUG
- // fprintf(stderr, "DssiSynthIF::getData elsize:%d pos:%d ports:%d samples:%d processed already?:%d\n", el->size(), pos, ports, n, synti->processed());
- //#endif
-
- //BEGIN: Process midi events
-
- // FIXME: Add 10(?) for good luck in case volatile size changes (increments) while we're processing.
- //unsigned long nevents = el->size();
- unsigned long nevents = el->size() + synti->eventFifo.getSize() + 10;
-
- /*
- while (!synti->eventFifo.isEmpty()) {
- MidiEvent event = synti->eventFifo.get();
- printf("Dssi: FIFO\n");
- }
- */
-
- snd_seq_event_t events[nevents];
- memset(events, 0, sizeof(events));
- nevents = 0;
-
- unsigned endPos = pos + n;
- int frameOffset = audio->getFrameOffset();
-
- //iMPEvent i = el->begin(); // Removed p4.0.15
-
- // Process event list events...
- for(; i != el->end(); ++i)
- {
- if(i->time() >= (endPos + frameOffset)) // NOTE: frameOffset? Tested, examined printouts of times: Seems OK for playback.
- break;
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::getData eventlist event time:%d\n", i->time());
- #endif
-
- // p3.3.39 Update hardware state so knobs and boxes are updated. Optimize to avoid re-setting existing values.
- // Same code as in MidiPort::sendEvent()
- if(synti->midiPort() != -1)
- {
- MidiPort* mp = &midiPorts[synti->midiPort()];
- if(i->type() == ME_CONTROLLER)
- {
- int da = i->dataA();
- int db = i->dataB();
- db = mp->limitValToInstrCtlRange(da, db);
- if(!mp->setHwCtrlState(i->channel(), da, db))
- continue;
- //mp->setHwCtrlState(i->channel(), da, db);
- }
- else
- if(i->type() == ME_PITCHBEND)
- {
- int da = mp->limitValToInstrCtlRange(CTRL_PITCH, i->dataA());
- if(!mp->setHwCtrlState(i->channel(), CTRL_PITCH, da))
- continue;
- //mp->setHwCtrlState(i->channel(), CTRL_PITCH, da);
- }
- else
- if(i->type() == ME_PROGRAM)
- {
- if(!mp->setHwCtrlState(i->channel(), CTRL_PROGRAM, i->dataA()))
- continue;
- //mp->setHwCtrlState(i->channel(), CTRL_PROGRAM, i->dataA());
- }
- }
-
- if(processEvent(*i, &events[nevents]))
- {
- // Time-stamp the event. p4.0.15 Tim.
- int ft = i->time() - frameOffset - pos;
- if(ft < 0)
- ft = 0;
- if (ft >= (int)MusEGlobal::segmentSize)
- {
- printf("DssiSynthIF::getData: eventlist event time:%d out of range. pos:%d offset:%d ft:%d (seg=%d)\n", i->time(), pos, frameOffset, ft, MusEGlobal::segmentSize);
- ///if (ft > (int)MusEGlobal::segmentSize)
- ft = MusEGlobal::segmentSize - 1;
- }
- // "Each event is timestamped relative to the start of the block, (mis)using the ALSA "tick time" field as a frame count.
- // The host is responsible for ensuring that events with differing timestamps are already ordered by time." - From dssi.h
- events[nevents].time.tick = ft;
-
- ++nevents;
- }
- }
-
- // Now process putEvent events...
- while(!synti->eventFifo.isEmpty())
- {
- MidiPlayEvent e = synti->eventFifo.get();
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::getData eventFifo event time:%d\n", e.time());
- #endif
-
- // Maybe TODO:
- //if(e.time() >= (endPos + frameOffset))
- // break;
-
- if(processEvent(e, &events[nevents]))
- {
- // Time-stamp the event. p4.0.15 Tim.
- int ft = e.time() - frameOffset - pos;
- if(ft < 0)
- ft = 0;
- if (ft >= (int)MusEGlobal::segmentSize)
- {
- printf("DssiSynthIF::getData: eventFifo event time:%d out of range. pos:%d offset:%d ft:%d (seg=%d)\n", e.time(), pos, frameOffset, ft, MusEGlobal::segmentSize);
- ///if (ft > (int)MusEGlobal::segmentSize)
- ft = MusEGlobal::segmentSize - 1;
- }
- // "Each event is timestamped relative to the start of the block, (mis)using the ALSA "tick time" field as a frame count.
- // The host is responsible for ensuring that events with differing timestamps are already ordered by time." - From dssi.h
- events[nevents].time.tick = ft;
-
- ++nevents;
- }
- }
-
- // Now process OSC gui input control fifo events.
- // It is probably more important that these are processed last so that they take precedence over all other
- // events because OSC + DSSI/DSSI-VST are fussy about receiving feedback via these control ports, from GUI changes.
- #ifdef OSC_SUPPORT
- unsigned long ctls = synth->_controlInPorts;
- for(unsigned long k = 0; k < ctls; ++k)
- {
- OscControlFifo* cfifo = _oscif.oscFifo(k);
- if(!cfifo)
- continue;
-
- // If there are 'events' in the fifo, get exactly one 'event' per control per process cycle...
- // TODO: The OSC events are now time-stamped. Split up the processing below between parameter changes
- // and get rid of this slooow control processing! p4.0.15
- if(!cfifo->isEmpty())
- {
- OscControlValue v = cfifo->get();
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::getData OscControlFifo event input control number:%lu value:%f\n", k, v.value);
- #endif
-
- // Set the ladspa control port value.
- controls[k].val = v.value;
-
- // TODO: (From plugin module, adapt for synth if/when our own plugin gui is added to synths).
- // Need to update the MusEGlobal::automation value, otherwise the block above overwrites with the last MusEGlobal::automation value.
- ///if(_track)
- ///{
- // Since we are now in the audio thread context, there's no need to send a message,
- // just modify directly.
- //audio->msgSetPluginCtrlVal(this, genACnum(_id, i), controls[i].val);
- /// _track->setPluginCtrlVal(k, v.value)
- ///}
- }
- }
- #endif
-
- ///el->erase(el->begin(), i); // Removed p4.0.15 Let SynthI::getData() do this.
-
- //END: Process midi events
-
- //BEGIN: Run the synth
- // All ports must be connected to something!
-
- // First, copy the given input buffers to our local input buffers.
- unsigned long np, k;
- //np = portsin > synth->_inports ? synth->_inports : portsin;
- //for(k = 0; k < np; ++k)
- // memcpy(audioInBuffers[k], inbuffer[k], sizeof(float) * n);
- //for(; k < portsin; ++k)
- // memset(audioInBuffers[k], 0, sizeof(float) * n);
-
- // Watch our limits.
- //willyfoobar-2011-02-13
- //old code//np = ports > synth->_outports ? synth->_outports : ports;
- np = ((unsigned long) ports) > synth->_outports ? synth->_outports : ((unsigned long) ports);
-
- const DSSI_Descriptor* dssi = synth->dssi;
- const LADSPA_Descriptor* descr = dssi->LADSPA_Plugin;
- k = 0;
- // Connect the given buffers directly to the ports, up to a max of synth ports.
- for(; k < np; ++k)
- descr->connect_port(handle, synth->oIdx[k], buffer[k]);
- // Connect the remaining ports to some local buffers (not used yet).
- for(; k < synth->_outports; ++k)
- descr->connect_port(handle, synth->oIdx[k], audioOutBuffers[k]);
-
- /*
- //
- // p3.3.39 Handle inputs...
- //
- //if((song->bounceTrack != this) && !noInRoute())
- if(!((AudioTrack*)synti)->noInRoute())
- {
- RouteList* irl = ((AudioTrack*)synti)->inRoutes();
- iRoute i = irl->begin();
- if(!i->track->isMidiTrack())
- {
- //if(MusEGlobal::debugMsg)
- printf("DssiSynthIF::getData: Error: First route is a midi track route!\n");
- }
- else
- {
- int ch = i->channel == -1 ? 0 : i->channel;
- int remch = i->remoteChannel == -1 ? 0 : i->remoteChannel;
- int chs = i->channels == -1 ? 0 : i->channels;
-
- // TODO:
- //if(ch >= synth->_inports)
- //iUsedIdx[ch] = true;
- //if(chs == 2)
- // iUsedIdx[ch + 1] = true;
-
- //((AudioTrack*)i->track)->copyData(framePos, channels, nframe, bp);
- ((AudioTrack*)i->track)->copyData(pos, ports,
- //(i->track->type() == Track::AUDIO_SOFTSYNTH && i->channel != -1) ? i->channel : 0,
- i->channel,
- i->channels,
- n, bp);
- }
-
- //unsigned pos, int ports, unsigned n, float** buffer
-
- ++i;
- for(; i != irl->end(); ++i)
- {
- if(i->track->isMidiTrack())
- {
- //if(MusEGlobal::debugMsg)
- printf("DssiSynthIF::getData: Error: Route is a midi track route!\n");
- continue;
- }
- //((AudioTrack*)i->track)->addData(framePos, channels, nframe, bp);
- ((AudioTrack*)i->track)->addData(framePos, channels,
- //(i->track->type() == Track::AUDIO_SOFTSYNTH && i->channel != -1) ? i->channel : 0,
- i->channel,
- i->channels,
- nframe, bp);
- }
- }
- */
-
- //#ifdef DSSI_DEBUG
- //if(nevents)
- // fprintf(stderr, "DssiSynthIF::getData run nevents:%d\n", nevents);
- //#endif
-
- // Run the synth for one segment. This processes events and gets/fills our local buffers...
- if(synth->dssi->run_synth)
- {
- synth->dssi->run_synth(handle, n, events, nevents);
-
- // NOTE: Just a test
- //for(int m = 0; m < n; ++m)
- //{
- // synth->dssi->run_synth(handle, 1, events, nevents);
- //}
-
- }
- else if (synth->dssi->run_multiple_synths)
- {
- snd_seq_event_t* ev = events;
- synth->dssi->run_multiple_synths(1, &handle, n, &ev, &nevents);
- }
- //END: Run the synth
-
- return i;
-}
-
-#else
-
-//---------------------------------------------------------
-// getData
-//---------------------------------------------------------
-
-//void DssiSynthIF::getData(MidiEventList* el, unsigned pos, int ch, unsigned samples, float** data)
iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, unsigned pos, int ports, unsigned n, float** buffer)
{
//#ifdef DSSI_DEBUG
@@ -2346,9 +1429,6 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
// No, do this in processEvent.
//memset(events, 0, sizeof(events));
- //nevents = 0;
-
- //unsigned long endPos = pos + n;
int frameOffset = audio->getFrameOffset();
unsigned long syncFrame = audio->curSyncFrame();
@@ -2410,7 +1490,7 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
if(min_per > n)
min_per = n;
- // Process MusEGlobal::automation control values now.
+ // Process automation control values now.
// TODO: This needs to be respect frame resolution. Put this inside the sample loop below.
if(MusEGlobal::automation && synti && synti->automationType() != AUTO_OFF && id() != -1)
{
@@ -2483,7 +1563,7 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
controls[v.idx].val = v.value;
}
- // Process MusEGlobal::automation control values now.
+ // Process automation control values now.
//if(MusEGlobal::automation && synti && synti->automationType() != AUTO_OFF && id() != -1)
//{
// for(unsigned long k = 0; k < synth->_controlInPorts; ++k)
@@ -2520,7 +1600,7 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
fprintf(stderr, "DssiSynthIF::getData eventlist event time:%d\n", i->time());
#endif
- // p3.3.39 Update hardware state so knobs and boxes are updated. Optimize to avoid re-setting existing values.
+ // Update hardware state so knobs and boxes are updated. Optimize to avoid re-setting existing values.
// Same code as in MidiPort::sendEvent()
if(synti->midiPort() != -1)
{
@@ -2532,7 +1612,6 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
db = mp->limitValToInstrCtlRange(da, db);
if(!mp->setHwCtrlState(i->channel(), da, db))
continue;
- //mp->setHwCtrlState(i->channel(), da, db);
}
else
if(i->type() == ME_PITCHBEND)
@@ -2540,14 +1619,12 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
int da = mp->limitValToInstrCtlRange(CTRL_PITCH, i->dataA());
if(!mp->setHwCtrlState(i->channel(), CTRL_PITCH, da))
continue;
- //mp->setHwCtrlState(i->channel(), CTRL_PITCH, da);
}
else
if(i->type() == ME_PROGRAM)
{
if(!mp->setHwCtrlState(i->channel(), CTRL_PROGRAM, i->dataA()))
continue;
- //mp->setHwCtrlState(i->channel(), CTRL_PROGRAM, i->dataA());
}
}
@@ -2561,7 +1638,6 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
//if (ft >= (int)MusEGlobal::segmentSize)
if (ft >= int(sample + nsamp))
{
- //printf("DssiSynthIF::getData: eventlist event time:%d out of range. pos:%d offset:%d ft:%d (seg=%d)\n", i->time(), pos, frameOffset, ft, MusEGlobal::segmentSize);
printf("DssiSynthIF::getData: eventlist event time:%d out of range. pos:%d offset:%d ft:%d sample:%lu nsamp:%lu\n", i->time(), pos, frameOffset, ft, sample, nsamp);
///if (ft > (int)MusEGlobal::segmentSize)
//ft = MusEGlobal::segmentSize - 1;
@@ -2703,7 +1779,6 @@ iMPEvent DssiSynthIF::getData(MidiPort* /*mp*/, MPEventList* el, iMPEvent i, uns
return i;
}
-#endif
//---------------------------------------------------------
// putEvent
@@ -2715,16 +1790,12 @@ bool DssiSynthIF::putEvent(const MidiPlayEvent& ev)
#ifdef DSSI_DEBUG
fprintf(stderr, "DssiSynthIF::putEvent midi event time:%d chn:%d a:%d b:%d\n", ev.time(), ev.channel(), ev.dataA(), ev.dataB());
#endif
-
if (MusEGlobal::midiOutputTrace)
ev.dump();
-
return synti->eventFifo.put(ev);
-
//return false;
}
-
//---------------------------------------------------------
// incInstances
//---------------------------------------------------------
@@ -2745,8 +1816,6 @@ void DssiSynth::incInstances(int val)
handle = 0;
dssi = NULL;
df = NULL;
- ///pIdx.clear();
- ///opIdx.clear();
iIdx.clear();
oIdx.clear();
rpIdx.clear();
@@ -2765,151 +1834,7 @@ bool DssiSynthIF::initGui()
#ifdef OSC_SUPPORT
return _oscif.oscInitGui();
#endif
-
return true;
-
- /*
- // Are we already running? We don't want to allow another process do we...
- if((guiQProc != 0) && (guiQProc->isRunning()))
- return true;
-
- //
- // start gui
- //
- static char oscUrl[1024];
- //snprintf(oscUrl, 1024, "%s/%s", url, synti->name().toAscii().data());
- //snprintf(oscUrl, 1024, "%s/%s", url, synti->name().toLatin1().constData());
- snprintf(oscUrl, 1024, "%s/%s/%s", url, synth->info.baseName().toLatin1().constData(), synti->name().toLatin1().constData());
-
- //QString guiPath(info.path() + "/" + info.baseName());
- QString guiPath(synth->info.dirPath() + "/" + synth->info.baseName());
-
- QDir guiDir(guiPath, "*", QDir::Unsorted, QDir::Files);
- if (guiDir.exists())
- {
- //const QFileInfoList list = guiDir.entryInfoList();
- QStringList list = guiDir.entryList();
-
- //for (int i = 0; i < list.size(); ++i) {
- for (unsigned int i = 0; i < list.count(); ++i)
- {
-
- //QFileInfo fi = list.at(i);
- QFileInfo fi(guiPath + QString("/") + list[i]);
-
- QString gui(fi.filePath());
- if (gui.contains('_') == 0)
- continue;
- struct stat buf;
-
- //if (stat(gui.toAscii().data(), &buf)) {
- if (stat(gui.toLatin1().constData(), &buf)) {
-
- perror("stat failed");
- continue;
- }
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::initGui %s %s %s %s\n",
- //fi.filePath().toAscii().data(),
- //fi.fileName().toAscii().data(),
- fi.filePath().toLatin1().constData(),
- //fi.fileName().toLatin1().constData(),
-
- oscUrl,
-
- synth->info.filePath().toLatin1().constData(),
-
- //name().toAscii().data(),
- synth->name().toLatin1().constData());
- #endif
-
- if ((S_ISREG(buf.st_mode) || S_ISLNK(buf.st_mode)) &&
- (buf.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
- {
- // Changed by T356.
- // fork + execlp were causing the processes to remain after closing gui, requiring manual kill.
- // Changed to QProcess, works OK now.
- //if((guiPid = fork()) == 0)
- {
- // No QProcess created yet? Do it now. Only once per SynthIF instance. Exists until parent destroyed.
- if(guiQProc == 0)
- guiQProc = new QProcess(muse);
-
- // Don't forget this, he he...
- guiQProc->clearArguments();
-
- guiQProc->addArgument(fi.filePath());
- //guiQProc->addArgument(fi.fileName()); // No conventional 'Arg0' here.
- guiQProc->addArgument(QString(oscUrl));
- guiQProc->addArgument(synth->info.filePath());
- guiQProc->addArgument(synth->name());
- guiQProc->addArgument(QString("channel 1"));
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::initGui starting QProcess\n");
- #endif
-
- if(guiQProc->start() == TRUE)
- {
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::initGui started QProcess\n");
- #endif
-
- //guiPid = guiQProc->processIdentifier();
- }
- else
- {
-
- // execlp(
- // fi.filePath().toAscii().data(),
- // fi.fileName().toAscii().data(),
- // fi.filePath().toLatin1().constData(),
- // fi.fileName().toLatin1().constData(),
-
- // oscUrl,
-
- // info.filePath().toAscii().data(),
- // name().toAscii().data(),
- // synth->info.filePath().toLatin1().constData(),
- // synth->name().toLatin1().constData(),
-
- // "channel 1", (void*)0);
-
- fprintf(stderr, "exec %s %s %s %s failed: %s\n",
- // fi.filePath().toAscii().data(),
- // fi.fileName().toAscii().data(),
- fi.filePath().toLatin1().constData(),
- fi.fileName().toLatin1().constData(),
- oscUrl,
- // name().toAscii().data(),
- synth->name().toLatin1().constData(),
- strerror(errno));
-
- // It's Ok, Keep going. So nothing happens. So what. The timeout in showGui will just leave.
- // Maybe it's a 'busy' issue somewhere - allow to try again later + save work now.
- // exit(1);
-
- }
-
- #ifdef DSSI_DEBUG
- fprintf(stderr, "DssiSynthIF::initGui after QProcess\n");
- #endif
- }
- }
- }
- //synth->_hasGui = true;
- }
- else {
- printf("%s: no dir for dssi gui found: %s\n",
- //name().toAscii().data(), guiPath.toAscii().data());
- synth->name().toLatin1().constData(), guiPath.toLatin1().constData());
-
- //synth->_hasGui = false;
- }
-
- return true;
- */
}
//---------------------------------------------------------
@@ -2934,10 +1859,7 @@ void DssiSynthIF::guiHeartBeat()
{
if(synti->_guiUpdateControls[i])
{
- ///unsigned long k = synth->pIdx[i];
- ///_oscif.oscSendControl(k, controls[i].val);
_oscif.oscSendControl(controls[i].idx, controls[i].val);
-
// Reset.
synti->_guiUpdateControls[i] = false;
}
@@ -2956,7 +1878,6 @@ int DssiSynthIF::oscUpdate()
_oscif.oscSendConfigure(DSSI_PROJECT_DIRECTORY_KEY, MusEGlobal::museProject.toLatin1().constData()); // song->projectPath()
// Send current string configuration parameters.
- //StringParamMap& map = synti->_stringParamMap;
int i = 0;
for(ciStringParamMap r = synti->_stringParamMap.begin(); r != synti->_stringParamMap.end(); ++r)
{
@@ -2968,47 +1889,18 @@ int DssiSynthIF::oscUpdate()
}
// Send current bank and program.
- //unsigned long bank, prog;
- //synti->currentProg(&prog, &bank, 0);
- //_oscif.oscSendProgram(prog, bank);
_oscif.oscSendProgram(synti->_curProgram, synti->_curBankL);
// Send current control values.
unsigned long ports = synth->_controlInPorts;
for(unsigned long i = 0; i < ports; ++i)
{
- ///unsigned long k = synth->pIdx[i];
- ///_oscif.oscSendControl(k, controls[i].val);
_oscif.oscSendControl(controls[i].idx, controls[i].val);
-
// Avoid overloading the GUI if there are lots and lots of ports.
if((i+1) % 50 == 0)
usleep(300000);
}
-
-#if 0
- /* Send current bank/program (-FIX- another race...) */
- if (instance->pendingProgramChange < 0) {
- unsigned long bank = instance->currentBank;
- unsigned long program = instance->currentProgram;
- instance->uiNeedsProgramUpdate = 0;
- if (instance->uiTarget) {
- lo_send(instance->uiTarget, instance->ui_osc_program_path, "ii", bank, program);
- }
- }
-
- /* Send control ports */
- for (i = 0; i < instance->plugin->controlIns; i++) {
- int in = i + instance->firstControlIn;
- int port = pluginControlInPortNumbers[in];
- lo_send(instance->uiTarget, instance->ui_osc_control_path, "if", port,
- pluginControlIns[in]);
- /* Avoid overloading the GUI if there are lots and lots of ports */
- if ((i+1) % 50 == 0)
- usleep(300000);
- }
-#endif
return 0;
}
@@ -3018,11 +1910,7 @@ int DssiSynthIF::oscUpdate()
int DssiSynthIF::oscProgram(unsigned long program, unsigned long bank)
{
- //int bank = argv[0]->i;
- //int program = argv[1]->i;
-
int ch = 0; // TODO: ??
-
int port = synti->midiPort();
//_curBank = bank;
@@ -3048,8 +1936,6 @@ int DssiSynthIF::oscProgram(unsigned long program, unsigned long bank)
midiPorts[port].sendEvent(event);
}
-
-
//synti->playMidiEvent(&event); // TODO
//
//MidiDevice* md = dynamic_cast<MidiDevice*>(synti);
@@ -3066,21 +1952,13 @@ int DssiSynthIF::oscProgram(unsigned long program, unsigned long bank)
//---------------------------------------------------------
int DssiSynthIF::oscControl(unsigned long port, float value)
- {
- //int port = argv[0]->i;
- //LADSPA_Data value = argv[1]->f;
-
+{
#ifdef DSSI_DEBUG
printf("DssiSynthIF::oscControl received oscControl port:%lu val:%f\n", port, value);
#endif
- //int controlPorts = synth->_controlInPorts;
-
- //if(port >= controlPorts)
- //if(port < 0 || port >= synth->rpIdx.size())
if(port >= synth->rpIdx.size())
{
- //fprintf(stderr, "DssiSynthIF::oscControl: port number:%d is out of range of number of ports:%d\n", port, controlPorts);
fprintf(stderr, "DssiSynthIF::oscControl: port number:%lu is out of range of index list size:%zd\n", port, synth->rpIdx.size());
return 0;
}
@@ -3149,10 +2027,6 @@ int DssiSynthIF::oscControl(unsigned long port, float value)
fprintf(stderr, "DssiSynthIF::oscControl: fifo overflow: in control number:%lu\n", cport);
}
-
- //const DSSI_Descriptor* dssi = synth->dssi;
- //const LADSPA_Descriptor* ld = dssi->LADSPA_Plugin;
-
ciMidiCtl2LadspaPort ip = synth->port2MidiCtlMap.find(cport);
if(ip != synth->port2MidiCtlMap.end())
{
@@ -3164,96 +2038,8 @@ int DssiSynthIF::oscControl(unsigned long port, float value)
}
-#if 0
- int port = argv[0]->i;
- LADSPA_Data value = argv[1]->f;
-
- if (port < 0 || port > instance->plugin->descriptor->LADSPA_Plugin->PortCount) {
- fprintf(stderr, "MusE: OSC: %s port number (%d) is out of range\n",
- instance->friendly_name, port);
- return 0;
- }
- if (instance->pluginPortControlInNumbers[port] == -1) {
- fprintf(stderr, "MusE: OSC: %s port %d is not a control in\n",
- instance->friendly_name, port);
- return 0;
- }
- pluginControlIns[instance->pluginPortControlInNumbers[port]] = value;
- if (verbose) {
- printf("MusE: OSC: %s port %d = %f\n",
- instance->friendly_name, port, value);
- }
-#endif
- return 0;
- }
-
-/*
-//---------------------------------------------------------
-// oscExiting
-//---------------------------------------------------------
-
-int DssiSynthIF::oscExiting(lo_arg**)
- {
- //printf("not impl.: oscExiting\n");
-
- // The gui is gone now, right?
- _guiVisible = false;
-
- //const DSSI_Descriptor* dssi = synth->dssi;
- //const LADSPA_Descriptor* ld = dssi->LADSPA_Plugin;
- //if(ld->deactivate)
- // ld->deactivate(handle);
-
- if (uiOscPath == 0) {
- printf("DssiSynthIF::oscExiting(): no uiOscPath\n");
- return 1;
- }
- char uiOscGuiPath[strlen(uiOscPath)+6];
-
- sprintf(uiOscGuiPath, "%s/%s", uiOscPath, "quit");
- #ifdef DSSI_DEBUG
- printf("DssiSynthIF::oscExiting(): sending quit to uiOscGuiPath:%s\n", uiOscGuiPath);
- #endif
-
- lo_send(uiTarget, uiOscGuiPath, "");
-
-#if 0
- int i;
-
- if (verbose) {
- printf("MusE: OSC: got exiting notification for instance %d\n",
- instance->number);
- }
-
- if (instance->plugin) {
-
- // !!! No, this isn't safe -- plugins deactivated in this way
- // would still be included in a run_multiple_synths call unless
- // we re-jigged the instance array at the same time -- leave it
- // for now
- //if (instance->plugin->descriptor->LADSPA_Plugin->deactivate) {
- // instance->plugin->descriptor->LADSPA_Plugin->deactivate
- // (instanceHandles[instance->number]);
- // }
- // Leave this flag though, as we need it to determine when to exit
- instance->inactive = 1;
- }
-
- // Do we have any plugins left running?
-
- for (i = 0; i < instance_count; ++i) {
- if (!instances[i].inactive)
- return 0;
- }
-
- if (verbose) {
- printf("MusE: That was the last remaining plugin, exiting...\n");
- }
- exiting = 1;
-#endif
- return 0;
- }
-*/
+ return 0;
+}
//---------------------------------------------------------
// oscMidi
@@ -3261,20 +2047,13 @@ int DssiSynthIF::oscExiting(lo_arg**)
int DssiSynthIF::oscMidi(int a, int b, int c)
{
- //int a = argv[0]->m[1];
- //int b = argv[0]->m[2];
- //int c = argv[0]->m[3];
-
if (a == ME_NOTEOFF) {
a = ME_NOTEON;
c = 0;
}
int channel = 0; // TODO: ??
-
int port = synti->midiPort();
- //MidiEvent event(0, channel, a, b, c);
-
if(port != -1)
{
MidiPlayEvent event(0, port, channel, a, b, c);
@@ -3304,12 +2083,8 @@ int DssiSynthIF::oscMidi(int a, int b, int c)
int DssiSynthIF::oscConfigure(const char *key, const char *value)
{
- //const char *key = (const char *)&argv[0]->s;
- //const char *value = (const char *)&argv[1]->s;
-
- // This is pretty much the simplest legal implementation of
+ //"This is pretty much the simplest legal implementation of
// configure in a DSSI host.
-
// The host has the option to remember the set of (key,value)
// pairs associated with a particular instance, so that if it
// wants to restore the "same" instance on another occasion it can
@@ -3317,7 +2092,7 @@ int DssiSynthIF::oscConfigure(const char *key, const char *value)
// restore state without any input from a GUI. Any real-world GUI
// host will probably want to do that. This host doesn't have any
// concept of restoring an instance from one run to the next, so
- // we don't bother remembering these at all.
+ // we don't bother remembering these at all."
#ifdef DSSI_DEBUG
printf("DssiSynthIF::oscConfigure synth name:%s key:%s value:%s\n", synti->name().toLatin1().constData(), key, value);
@@ -3329,9 +2104,7 @@ int DssiSynthIF::oscConfigure(const char *key, const char *value)
if (!strncmp(key, DSSI_RESERVED_CONFIGURE_PREFIX,
strlen(DSSI_RESERVED_CONFIGURE_PREFIX))) {
fprintf(stderr, "MusE: OSC: UI for plugin '%s' attempted to use reserved configure key \"%s\", ignoring\n",
- //synti->name().toAscii().data(), key);
synti->name().toLatin1().constData(), key);
-
return 0;
}
@@ -3341,14 +2114,12 @@ int DssiSynthIF::oscConfigure(const char *key, const char *value)
char* message = synth->dssi->configure(handle, key, value);
if (message) {
printf("MusE: on configure '%s' '%s', plugin '%s' returned error '%s'\n",
- //key, value, synti->name().toAscii().data(), message);
key, value, synti->name().toLatin1().constData(), message);
-
free(message);
}
- // also call back on UIs for plugins other than the one
- // that requested this:
+ // "also call back on UIs for plugins other than the one
+ // that requested this:"
// if (n != instance->number && instances[n].uiTarget) {
// lo_send(instances[n].uiTarget,
// instances[n].ui_osc_configure_path, "ss", key, value);
@@ -3373,7 +2144,6 @@ void DssiSynthIF::queryPrograms()
}
programs.clear();
- //if (!(synth->dssi->get_program && synth->dssi->select_program))
if (!synth->dssi->get_program)
return;
@@ -3418,7 +2188,6 @@ const char* DssiSynthIF::getPatchName(int /*chan*/, int prog, MType /*type*/, bo
// populatePatchPopup
//---------------------------------------------------------
-//void DssiSynthIF::populatePatchPopup(QMenu* menu, int)
void DssiSynthIF::populatePatchPopup(MusEWidget::PopupMenu* menu, int /*ch*/, MType /*type*/, bool /*drum*/)
{
// The plugin can change the programs, patches etc.
@@ -3442,7 +2211,6 @@ int DssiSynthIF::getControllerInfo(int id, const char** name, int* ctrl, int* mi
{
int controlPorts = synth->_controlInPorts;
if(id >= controlPorts)
- //if(id >= midiCtl2PortMap.size())
return 0;
const DSSI_Descriptor* dssi = synth->dssi;
@@ -3454,12 +2222,7 @@ int DssiSynthIF::getControllerInfo(int id, const char** name, int* ctrl, int* mi
//int ctlnum = ip->first;
//int k = ip->second;
- ///int i = synth->pIdx[id];
- //int i = synth->pIdx[k];
- //int i = controls[id].idx;
- unsigned long i = controls[id].idx; // p4.0.21
-
- //ladspaDefaultValue(ld, i, &controls[id].val);
+ unsigned long i = controls[id].idx;
#ifdef DSSI_DEBUG
printf("DssiSynthIF::getControllerInfo control port:%d port idx:%d name:%s\n", id, i, ld->PortNames[i]);
@@ -3527,37 +2290,6 @@ int DssiSynthIF::getControllerInfo(int id, const char** name, int* ctrl, int* mi
*ctrl = ctlnum;
*name = ld->PortNames[i];
return ++id;
-
- /*
- // ...now create midi controllers for ports which did not define them ...
- for(int k = 0; k < controlPorts; ++k)
- {
- int i = synth->pIdx[k];
- //controls[k].val = ladspaDefaultValue(ld, i);
- ladspaDefaultValue(ld, i, &controls[k].val);
-
- printf("DssiSynthIF::getControllerInfo #2 control port:%d port idx:%d name:%s\n", k, i, ld->PortNames[i]);
-
- if(!dssi->get_midi_controller_for_port || (dssi->get_midi_controller_for_port(handle, i) == DSSI_NONE))
- {
- int ctlnum;
- //printf("DssiSynthIF::getControllerInfo #2 midi controller number:%d\n", ctlnum);
- printf("DssiSynthIF::getControllerInfo #2 creating MidiController number:%d\n", ctlnum);
- MidiController* mc = ladspa2MidiController(ld, i, ctlnum);
- // Add to MidiInstrument controller list.
- if(mc)
- {
- printf("DssiSynthIF::getControllerInfo #2 adding MidiController to instrument\n");
- ((MidiInstrument*)synti)->controller()->add(mc);
- }
- }
- else
- {
-
- }
- }
- */
-
}
int DssiSynthIF::channels() const
@@ -3584,9 +2316,7 @@ int DssiSynthIF::totalInChannels() const
bool DssiSynthIF::on() const { return true; } // Synth is not part of a rack plugin chain. Always on.
void DssiSynthIF::setOn(bool /*val*/) { }
-//int DssiSynthIF::pluginID() { return (synth && synth->dssi) ? synth->dssi->LADSPA_Plugin->UniqueID : 0; }
unsigned long DssiSynthIF::pluginID() { return (synth && synth->dssi) ? synth->dssi->LADSPA_Plugin->UniqueID : 0; }
-//int DssiSynthIF::id() { return 0; } // Synth is not part of a rack plugin chain. Always 0.
int DssiSynthIF::id() { return MAX_PLUGINS; } // Set for special block reserved for dssi synth. p4.0.20
QString DssiSynthIF::pluginLabel() const { return (synth && synth->dssi) ? QString(synth->dssi->LADSPA_Plugin->Label) : QString(); }
QString DssiSynthIF::name() const { return synti->name(); }
@@ -3594,9 +2324,6 @@ QString DssiSynthIF::lib() const { return synth ? sy
QString DssiSynthIF::dirPath() const { return synth ? synth->absolutePath() : QString(); }
QString DssiSynthIF::fileName() const { return synth ? synth->fileName() : QString(); }
AudioTrack* DssiSynthIF::track() { return (AudioTrack*)synti; }
-//void DssiSynthIF::enableController(int i, bool v) { controls[i].enCtrl = v; }
-//bool DssiSynthIF::controllerEnabled(int i) const { return controls[i].enCtrl; }
-//bool DssiSynthIF::controllerEnabled2(int i) const { return controls[i].en2Ctrl; }
void DssiSynthIF::enableController(unsigned long i, bool v) { controls[i].enCtrl = v; }
bool DssiSynthIF::controllerEnabled(unsigned long i) const { return controls[i].enCtrl; }
bool DssiSynthIF::controllerEnabled2(unsigned long i) const { return controls[i].en2Ctrl; }
@@ -3604,12 +2331,6 @@ void DssiSynthIF::updateControllers() { }
void DssiSynthIF::writeConfiguration(int /*level*/, Xml& /*xml*/) { }
bool DssiSynthIF::readConfiguration(Xml& /*xml*/, bool /*readPreset*/) { return false; }
-//int DssiSynthIF::parameters() const { return synth ? synth->_controlInPorts : 0; }
-//void DssiSynthIF::setParam(int i, double val) { setParameter(i, val); }
-//double DssiSynthIF::param(int i) const { return getParameter(i); }
-//const char* DssiSynthIF::paramName(int i) { return (synth && synth->dssi) ? synth->dssi->LADSPA_Plugin->PortNames[controls[i].idx] : 0; }
-//LADSPA_PortRangeHint DssiSynthIF::range(int i) { return (synth && synth->dssi) ? synth->dssi->LADSPA_Plugin->PortRangeHints[i] : 0; }
-//LADSPA_PortRangeHint DssiSynthIF::range(int i) { return synth->dssi->LADSPA_Plugin->PortRangeHints[controls[i].idx]; }
unsigned long DssiSynthIF::parameters() const { return synth ? synth->_controlInPorts : 0; }
unsigned long DssiSynthIF::parametersOut() const { return synth ? synth->_controlOutPorts : 0; }
void DssiSynthIF::setParam(unsigned long i, float val) { setParameter(i, val); }
@@ -3617,7 +2338,6 @@ float DssiSynthIF::param(unsigned long i) const { return getParamet
float DssiSynthIF::paramOut(unsigned long i) const { return getParameterOut(i); }
const char* DssiSynthIF::paramName(unsigned long i) { return (synth && synth->dssi) ? synth->dssi->LADSPA_Plugin->PortNames[controls[i].idx] : 0; }
const char* DssiSynthIF::paramOutName(unsigned long i) { return (synth && synth->dssi) ? synth->dssi->LADSPA_Plugin->PortNames[controlsOut[i].idx] : 0; }
-//LADSPA_PortRangeHint DssiSynthIF::range(unsigned long i) { return (synth && synth->dssi) ? synth->dssi->LADSPA_Plugin->PortRangeHints[i] : 0; }
LADSPA_PortRangeHint DssiSynthIF::range(unsigned long i) { return synth->dssi->LADSPA_Plugin->PortRangeHints[controls[i].idx]; }
LADSPA_PortRangeHint DssiSynthIF::rangeOut(unsigned long i) { return synth->dssi->LADSPA_Plugin->PortRangeHints[controlsOut[i].idx]; }
CtrlValueType DssiSynthIF::ctrlValueType(unsigned long i) const { return ladspaCtrlValueType(synth->dssi->LADSPA_Plugin, controls[i].idx); }
diff --git a/muse2/muse/dssihost.h b/muse2/muse/dssihost.h
index 802e0e95..cea46e69 100644
--- a/muse2/muse/dssihost.h
+++ b/muse2/muse/dssihost.h
@@ -4,6 +4,7 @@
// $Id: dssihost.h,v 1.10.2.7 2009/12/06 10:05:00 terminator356 Exp $
//
// Copyright (C) 1999-2011 by Werner Schweer and others
+// (C) Copyright 2011 Tim E. Real (terminator356 on users dot sourceforge dot net)
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License
@@ -67,18 +68,14 @@ class Port;
class DssiSynth : public Synth {
protected:
- //char* label;
void* handle;
const DSSI_Descriptor* dssi;
DSSI_Descriptor_Function df;
unsigned long _portCount, _inports, _outports, _controlInPorts, _controlOutPorts;
- //std::vector<unsigned long> pIdx; // Control input index to port number.
- //std::vector<unsigned long> opIdx; // Control output index to port number. This is sometimes a latency port and...?
std::vector<unsigned long> iIdx; // Audio input index to port number.
std::vector<unsigned long> oIdx; // Audio output index to port number.
std::vector<bool> iUsedIdx; // During process, tells whether an audio input port was used by any input routes.
std::vector<unsigned long> rpIdx; // Port number to control input index. Item is -1 if it's not a control input.
- //unsigned long* rpIdx;
MidiCtl2LadspaPortMap midiCtl2PortMap; // Maps midi controller numbers to DSSI port numbers.
MidiCtl2LadspaPortMap port2MidiCtlMap; // Maps DSSI port numbers to midi controller numbers.
bool _hasGui;
@@ -87,25 +84,10 @@ class DssiSynth : public Synth {
bool _isDssiVst;
public:
- //DssiSynth(const QFileInfo* fi, QString l) : Synth(fi, l) {
- //DssiSynth(const QFileInfo& fi, QString l) : Synth(fi, l) {
- //DssiSynth(const QFileInfo& fi, QString label, QString descr, QString maker, QString ver) :
- // Synth(fi, label, descr, maker, ver) {
- // rpIdx = 0;
- // df = 0;
- // handle = 0;
- // dssi = 0;
- // _hasGui = false;
- // }
- //DssiSynth(const QFileInfo& fi, QString label, QString descr, QString maker, QString ver);
DssiSynth(QFileInfo&, const DSSI_Descriptor*); // removed const for QFileInfo
virtual ~DssiSynth();
virtual void incInstances(int);
-
- //virtual void* instantiate();
-
virtual SynthIF* createSIF(SynthI*);
- //virtual SynthIF* createSIF();
friend class DssiSynthIF;
//float defaultValue(int); // Not required
@@ -113,8 +95,6 @@ class DssiSynth : public Synth {
unsigned long outPorts() const { return _outports; }
unsigned long inControls() const { return _controlInPorts; }
unsigned long outControls() const { return _controlOutPorts; }
-
- //unsigned long inControlPortIdx(unsigned long i) { return pIdx[i]; }
};
//---------------------------------------------------------
@@ -122,31 +102,18 @@ class DssiSynth : public Synth {
// VSTi synthesizer instance
//---------------------------------------------------------
-//class DssiSynthIF : public SynthIF
class DssiSynthIF : public SynthIF, public PluginIBase
{
- //bool _guiVisible;
DssiSynth* synth;
LADSPA_Handle handle;
- //LadspaPort* controls;
Port* controls;
Port* controlsOut;
- //unsigned long _curBank;
- //unsigned long _curProgram;
-
#ifdef OSC_SUPPORT
OscDssiIF _oscif;
#endif
- //void* uiTarget;
- //char* uiOscShowPath;
- //char* uiOscControlPath;
- //char* uiOscConfigurePath;
- //char* uiOscProgramPath;
- //char* uiOscPath;
-
std::vector<DSSI_Program_Descriptor> programs;
void queryPrograms();
bool processEvent(const MidiPlayEvent&, snd_seq_event_t*);
@@ -154,13 +121,8 @@ class DssiSynthIF : public SynthIF, public PluginIBase
float** audioInBuffers;
float** audioOutBuffers;
- protected:
- //int guiPid;
- //QProcess* guiQProc;
-
public:
DssiSynthIF(SynthI* s);
- //DssiSynthIF();
// This is only a kludge required to support old songs' midistates. Do not use in any new synth.
virtual int oldMidiStateHeader(const unsigned char** data) const;
@@ -174,70 +136,43 @@ class DssiSynthIF : public SynthIF, public PluginIBase
virtual void guiHeartBeat();
virtual bool guiVisible() const;
virtual void showGui(bool);
- //virtual bool hasGui() const { return synth->_hasGui; }
virtual bool hasGui() const { return true; }
- virtual bool nativeGuiVisible() const; // p4.0.20
- virtual void showNativeGui(bool); //
- //virtual bool hasNativeGui() const { /*return synth->_hasGui; */} //
- virtual bool hasNativeGui() const { return !dssi_ui_filename().isEmpty(); } //
+ virtual bool nativeGuiVisible() const;
+ virtual void showNativeGui(bool);
+ virtual bool hasNativeGui() const { return !dssi_ui_filename().isEmpty(); }
virtual void getGeometry(int*x, int*y, int*w, int*h) const { *x=0;*y=0;*w=0;*h=0; }
virtual void setGeometry(int, int, int, int) {}
virtual void getNativeGeometry(int*x, int*y, int*w, int*h) const { *x=0;*y=0;*w=0;*h=0; }
virtual void setNativeGeometry(int, int, int, int) {}
virtual void preProcessAlways();
-
- //virtual void getData(MidiEventList*, unsigned pos, int ports, unsigned n, float** buffer) ;
virtual iMPEvent getData(MidiPort*, MPEventList*, iMPEvent, unsigned pos, int ports, unsigned n, float** buffer);
-
- //virtual bool putEvent(const MidiEvent& ev);
virtual bool putEvent(const MidiPlayEvent& ev);
-
- //virtual MidiEvent receiveEvent();
virtual MidiPlayEvent receiveEvent();
-
virtual int eventsPending() const { return 0; }
- //virtual int channels() const { return synth->_outports; }
virtual int channels() const;
virtual int totalOutChannels() const;
virtual int totalInChannels() const;
virtual void deactivate3() {}
- //virtual QString getPatchName(int, int);
virtual const char* getPatchName(int, int, int, bool) const { return ""; }
virtual const char* getPatchName(int, int, MType, bool);
+ virtual void populatePatchPopup(MusEWidget::PopupMenu*, int, MType, bool);
- //virtual void populatePatchPopup(QMenu*, int);
- //virtual void populatePatchPopup(QMenu*, int, MType, bool);
- virtual void populatePatchPopup(MusEWidget::PopupMenu*, int, MType, bool);
-
- //virtual void write(Xml& xml) const;
virtual void write(int level, Xml& xml) const;
virtual float getParameter(unsigned long /*idx*/) const;
virtual float getParameterOut(unsigned long n) const;
virtual void setParameter(unsigned long /*idx*/, float /*value*/);
- //virtual int getControllerInfo(int, const char**, int*, int*, int*) { return 0; }
virtual int getControllerInfo(int, const char**, int*, int*, int*, int*);
bool init(DssiSynth* s);
- //StringParamMap& stringParameters() { return synti->stringParameters(); }
-
#ifdef OSC_SUPPORT
OscDssiIF& oscIF() { return _oscif; }
- /*
- int oscProgram(lo_arg**);
- int oscControl(lo_arg**);
- int oscMidi(lo_arg**);
- int oscConfigure(lo_arg**);
- int oscUpdate(lo_arg**);
- //int oscExiting(lo_arg**);
- */
-
int oscProgram(unsigned long /*prog*/, unsigned long /*bank*/);
int oscControl(unsigned long /*dssiPort*/, float /*val*/);
int oscMidi(int /*a*/, int /*b*/, int /*c*/);
@@ -251,8 +186,7 @@ class DssiSynthIF : public SynthIF, public PluginIBase
//-------------------------
bool on() const;
void setOn(bool /*val*/);
- //int pluginID();
- unsigned long pluginID(); // p4.0.21
+ unsigned long pluginID();
int id();
QString pluginLabel() const;
QString name() const;
@@ -260,22 +194,14 @@ class DssiSynthIF : public SynthIF, public PluginIBase
QString dirPath() const;
QString fileName() const;
AudioTrack* track();
- //void enableController(int /*i*/, bool v = true);
- //bool controllerEnabled(int /*i*/) const;
- //bool controllerEnabled2(int /*i*/) const;
- void enableController(unsigned long /*i*/, bool v = true); // p4.0.21
+ void enableController(unsigned long /*i*/, bool v = true);
bool controllerEnabled(unsigned long /*i*/) const;
bool controllerEnabled2(unsigned long /*i*/) const;
void updateControllers();
void writeConfiguration(int /*level*/, Xml& /*xml*/);
bool readConfiguration(Xml& /*xml*/, bool readPreset=false);
- //int parameters() const;
- //void setParam(int /*i*/, double /*val*/);
- //double param(int /*i*/) const;
- //const char* paramName(int /*i*/);
- //LADSPA_PortRangeHint range(int /*i*/);
- unsigned long parameters() const; // p4.0.21
+ unsigned long parameters() const;
unsigned long parametersOut() const;
void setParam(unsigned long /*i*/, float /*val*/);
float param(unsigned long /*i*/) const;
diff --git a/muse2/muse/mididev.cpp b/muse2/muse/mididev.cpp
index a06303e1..1c5280f0 100644
--- a/muse2/muse/mididev.cpp
+++ b/muse2/muse/mididev.cpp
@@ -92,7 +92,6 @@ void MidiDevice::init()
_rwFlags = 3;
_openFlags = 3;
_port = -1;
- // _nextPlayEvent = _playEvents.begin(); // Removed p4.0.15 Tim.
}
//---------------------------------------------------------
@@ -101,8 +100,6 @@ void MidiDevice::init()
MidiDevice::MidiDevice()
{
- ///_recBufFlipped = false;
- //_tmpRecordCount = 0;
for(unsigned int i = 0; i < MIDI_CHANNELS + 1; ++i)
_tmpRecordCount[i] = 0;
@@ -116,8 +113,6 @@ MidiDevice::MidiDevice()
MidiDevice::MidiDevice(const QString& n)
: _name(n)
{
- ///_recBufFlipped = false;
- //_tmpRecordCount = 0;
for(unsigned int i = 0; i < MIDI_CHANNELS + 1; ++i)
_tmpRecordCount[i] = 0;
@@ -133,7 +128,6 @@ MidiDevice::MidiDevice(const QString& n)
// return true if event filtered
//---------------------------------------------------------
-//static bool filterEvent(const MEvent& event, int type, bool thru)
bool filterEvent(const MEvent& event, int type, bool thru)
{
switch(event.type()) {
@@ -185,9 +179,6 @@ bool filterEvent(const MEvent& event, int type, bool thru)
void MidiDevice::afterProcess()
{
- //while (_tmpRecordCount--)
- // _recordFifo.remove();
-
for(unsigned int i = 0; i < MIDI_CHANNELS + 1; ++i)
{
while (_tmpRecordCount[i]--)
@@ -202,10 +193,6 @@ void MidiDevice::afterProcess()
void MidiDevice::beforeProcess()
{
- //if (!jackPort(0).isZero())
- // audioDriver->collectMidiEvents(this, jackPort(0));
-
- //_tmpRecordCount = _recordFifo.getSize();
for(unsigned int i = 0; i < MIDI_CHANNELS + 1; ++i)
_tmpRecordCount[i] = _recordFifo[i].getSize();
@@ -235,21 +222,6 @@ void MidiDevice::getEvents(unsigned , unsigned , int ch, MPEventList* dst) //fr
}
*/
-/*
-//---------------------------------------------------------
-// recordEvent
-//---------------------------------------------------------
-
-MREventList* MidiDevice::recordEvents()
-{
- // Return which list is NOT currently being filled with incoming midi events. By T356.
- if(_recBufFlipped)
- return &_recordEvents;
- else
- return &_recordEvents2;
-}
-*/
-
//---------------------------------------------------------
// recordEvent
//---------------------------------------------------------
@@ -263,8 +235,6 @@ void MidiDevice::recordEvent(MidiRecordEvent& event)
//printf("MidiDevice::recordEvent event time:%d\n", event.time());
- // Added by Tim. p3.3.8
-
// By T356. Set the loop number which the event came in at.
//if(audio->isRecording())
if(audio->isPlaying())
@@ -314,7 +284,6 @@ void MidiDevice::recordEvent(MidiRecordEvent& event)
}
}
else
- // p3.3.26 1/23/10 Moved here from alsaProcessMidiInput(). Anticipating Jack midi support, so don't make it ALSA specific. Tim.
// Trigger general activity indicator detector. Sysex has no channel, don't trigger.
midiPorts[_port].syncInfo().trigActDetect(event.channel());
@@ -351,15 +320,6 @@ void MidiDevice::recordEvent(MidiRecordEvent& event)
song->putEvent(pv);
}
- ///if(_recBufFlipped)
- /// _recordEvents2.add(event); // add event to secondary list of recorded events
- ///else
- /// _recordEvents.add(event); // add event to primary list of recorded events
-
- //if(_recordFifo.put(MidiPlayEvent(event)))
- // printf("MidiDevice::recordEvent: fifo overflow\n");
-
- // p3.3.38
// Do not bother recording if it is NOT actually being used by a port.
// Because from this point on, process handles things, by selected port.
if(_port == -1)
@@ -409,8 +369,7 @@ void MidiDeviceList::add(MidiDevice* dev)
{
char incstr[4];
sprintf(incstr,"_%d",++increment);
- //dev->setName(origname + incstr);
- dev->setName(origname + QString(incstr)); // p4.0.0
+ dev->setName(origname + QString(incstr));
gotUniqueName = false;
}
}
@@ -469,7 +428,7 @@ bool MidiDevice::sendNullRPNParams(int chn, bool nrpn)
// putEventWithRetry
// return true if event cannot be delivered
// This method will try to putEvent 'tries' times, waiting 'delayUs' microseconds between tries.
-// NOTE: Since it waits, it should not be used in RT or other time-sensitive threads. p4.0.15 Tim.
+// NOTE: Since it waits, it should not be used in RT or other time-sensitive threads.
//---------------------------------------------------------
bool MidiDevice::putEventWithRetry(const MidiPlayEvent& ev, int tries, long delayUs)
@@ -493,7 +452,7 @@ bool MidiDevice::putEventWithRetry(const MidiPlayEvent& ev, int tries, long dela
// return true if event cannot be delivered
// TODO: retry on controller putMidiEvent
// (Note: Since putEvent is virtual and there are different versions,
-// a retry facility is now found in putEventWithRetry. p4.0.15 Tim)
+// a retry facility is now found in putEventWithRetry. )
//---------------------------------------------------------
bool MidiDevice::putEvent(const MidiPlayEvent& ev)
@@ -524,13 +483,9 @@ bool MidiDevice::putEvent(const MidiPlayEvent& ev)
}
#if 1 // if ALSA cannot handle RPN NRPN etc.
- // p3.3.37
- //if (a < 0x1000) { // 7 Bit Controller
if (a < CTRL_14_OFFSET) { // 7 Bit Controller
- //putMidiEvent(MidiPlayEvent(0, 0, chn, ME_CONTROLLER, a, b));
putMidiEvent(ev);
}
- //else if (a < 0x20000) { // 14 bit high resolution controller
else if (a < CTRL_RPN_OFFSET) { // 14 bit high resolution controller
int ctrlH = (a >> 8) & 0x7f;
int ctrlL = a & 0x7f;
@@ -539,7 +494,6 @@ bool MidiDevice::putEvent(const MidiPlayEvent& ev)
putMidiEvent(MidiPlayEvent(0, 0, chn, ME_CONTROLLER, ctrlH, dataH));
putMidiEvent(MidiPlayEvent(0, 0, chn, ME_CONTROLLER, ctrlL, dataL));
}
- //else if (a < 0x30000) { // RPN 7-Bit Controller
else if (a < CTRL_NRPN_OFFSET) { // RPN 7-Bit Controller
int ctrlH = (a >> 8) & 0x7f;
int ctrlL = a & 0x7f;
@@ -547,11 +501,10 @@ bool MidiDevice::putEvent(const MidiPlayEvent& ev)
putMidiEvent(MidiPlayEvent(0, 0, chn, ME_CONTROLLER, CTRL_LRPN, ctrlL));
putMidiEvent(MidiPlayEvent(0, 0, chn, ME_CONTROLLER, CTRL_HDATA, b));
- // Added by T356. Select null parameters so that subsequent data controller
- // events do not upset the last *RPN controller.
+ // Select null parameters so that subsequent data controller
+ // events do not upset the last *RPN controller. Tim.
sendNullRPNParams(chn, false);
}
- //else if (a < 0x40000) { // NRPN 7-Bit Controller
else if (a < CTRL_INTERNAL_OFFSET) { // NRPN 7-Bit Controller
int ctrlH = (a >> 8) & 0x7f;
int ctrlL = a & 0x7f;
@@ -561,7 +514,6 @@ bool MidiDevice::putEvent(const MidiPlayEvent& ev)
sendNullRPNParams(chn, true);
}
- //else if (a < 0x60000) { // RPN14 Controller
else if (a < CTRL_NRPN14_OFFSET) { // RPN14 Controller
int ctrlH = (a >> 8) & 0x7f;
int ctrlL = a & 0x7f;
@@ -574,7 +526,6 @@ bool MidiDevice::putEvent(const MidiPlayEvent& ev)
sendNullRPNParams(chn, false);
}
- //else if (a < 0x70000) { // NRPN14 Controller
else if (a < CTRL_NONE_OFFSET) { // NRPN14 Controller
int ctrlH = (a >> 8) & 0x7f;
int ctrlL = a & 0x7f;
@@ -646,7 +597,6 @@ void MidiDevice::handleStop()
_playEvents.add(ev);
}
_stuckNotes.clear();
- //setNextPlayEvent(_playEvents.begin());
//---------------------------------------------------
@@ -668,7 +618,7 @@ void MidiDevice::handleStop()
// send midi stop
//---------------------------------------------------
- // Don't send if external sync is on. The master, and our sync routing system will take care of that. p3.3.31
+ // Don't send if external sync is on. The master, and our sync routing system will take care of that.
if(!extSyncFlag.value())
{
// Shall we check open flags?
@@ -722,11 +672,6 @@ void MidiDevice::handleSeek()
}
_stuckNotes.clear();
}
- //else
- // Removed p4.0.15 Device now leaves beginning pointing at next event,
- // immediately after playing some notes.
- // NOTE: This removal needs testing. I'm not sure about this.
- //_playEvents.erase(_playEvents.begin(), _nextPlayEvent);
MidiPort* mp = &midiPorts[_port];
MidiCtrlValListList* cll = mp->controller();
@@ -739,11 +684,6 @@ void MidiDevice::handleSeek()
for(iMidiCtrlValList ivl = cll->begin(); ivl != cll->end(); ++ivl)
{
MidiCtrlValList* vl = ivl->second;
- //int val = vl->value(pos);
- //if (val != CTRL_VAL_UNKNOWN) {
- // int channel = ivl->first >> 24;
- // el->add(MidiPlayEvent(0, port, channel, ME_CONTROLLER, vl->num(), val));
- // }
iMidiCtrlVal imcv = vl->iValue(pos);
if(imcv != vl->end())
{
@@ -754,13 +694,12 @@ void MidiDevice::handleSeek()
_playEvents.add(MidiPlayEvent(0, _port, ivl->first >> 24, ME_CONTROLLER, vl->num(), imcv->second.val));
}
}
- //_nextPlayEvent = (_playEvents.begin()); // Removed p4.0.15
//---------------------------------------------------
// Send STOP and "set song position pointer"
//---------------------------------------------------
- // Don't send if external sync is on. The master, and our sync routing system will take care of that. p3.3.31
+ // Don't send if external sync is on. The master, and our sync routing system will take care of that.
if(!extSyncFlag.value())
{
if(mp->syncInfo().MRTOut())
@@ -772,16 +711,6 @@ void MidiDevice::handleSeek()
//if(!(openFlags() & 1))
// continue;
- //int port = midiPort();
-
- // By checking for no port here (-1), (and out of bounds), it means
- // the device must be assigned to a port for these MMC commands to be sent.
- // Without this check, interesting sync things can be done by the user without ever
- // assigning any devices to ports !
- //if(port < 0 || port > MIDI_PORTS)
- //if(port < -1 || port > MIDI_PORTS)
- // continue;
-
int beat = (pos * 4) / MusEConfig::config.division;
//bool isPlaying = false;
diff --git a/muse2/muse/mididev.h b/muse2/muse/mididev.h
index cdb69ea2..c9d2c1ef 100644
--- a/muse2/muse/mididev.h
+++ b/muse2/muse/mididev.h
@@ -42,23 +42,9 @@ class Xml;
//---------------------------------------------------------
class MidiDevice {
- //MPEventList _stuckNotes;
- //MPEventList _playEvents;
-
- // Removed p4.0.15 Tim.
- //iMPEvent _nextPlayEvent;
-
- ///MREventList _recordEvents;
- ///MREventList _recordEvents2;
-
// Used for multiple reads of fifos during process.
- //int _tmpRecordCount;
int _tmpRecordCount[MIDI_CHANNELS + 1];
bool _sysexFIFOProcessed;
-
- ///bool _recBufFlipped;
- // Holds sync settings and detection monitors.
- //MidiSyncInfo _syncInfo;
protected:
QString _name;
@@ -76,13 +62,9 @@ class MidiDevice {
MPEventList _playEvents;
// Fifo for midi events sent from gui direct to midi port:
- MidiFifo eventFifo; // p4.0.15
-
- // Recording fifo.
- //MidiFifo _recordFifo;
+ MidiFifo eventFifo;
// Recording fifos. To speed up processing, one per channel plus one special system 'channel' for channel-less events like sysex.
- //MidiFifo _recordFifo[MIDI_CHANNELS + 1];
- MidiRecFifo _recordFifo[MIDI_CHANNELS + 1]; // p4.0.15
+ MidiRecFifo _recordFifo[MIDI_CHANNELS + 1];
RouteList _inRoutes, _outRoutes;
@@ -99,8 +81,6 @@ class MidiDevice {
virtual int deviceType() const = 0;
- //virtual void* clientPort() { return 0; }
- // p3.3.55
virtual void* inClientPort() { return 0; }
virtual void* outClientPort() { return 0; }
@@ -123,7 +103,6 @@ class MidiDevice {
int openFlags() const { return _openFlags; }
void setOpenFlags(int val) { _openFlags = val; }
void setrwFlags(int val) { _rwFlags = val; }
- //MidiSyncInfo& syncInfo() { return _syncInfo; }
virtual bool isSynti() const { return false; }
virtual int selectRfd() { return -1; }
@@ -145,23 +124,15 @@ class MidiDevice {
// Since it waits, it should not be used in RT or other time-sensitive threads. p4.0.15
bool putEventWithRetry(const MidiPlayEvent&, int /*tries*/ = 2, long /*delayUs*/ = 50000); // 2 tries, 50 mS by default.
- virtual void handleStop(); // p4.0.22
+ virtual void handleStop();
virtual void handleSeek();
virtual void collectMidiEvents() {}
virtual void processMidi() {}
- //MPEventList* stuckNotes() { return &_stuckNotes; }
- //MPEventList* playEvents() { return &_playEvents; }
-
- ///MREventList* recordEvents();
- ///void flipRecBuffer() { _recBufFlipped = _recBufFlipped ? false : true; }
- ///bool recBufFlipped() { return _recBufFlipped; }
void beforeProcess();
void afterProcess();
- //int tmpRecordCount() { return _tmpRecordCount; }
int tmpRecordCount(const unsigned int ch) { return _tmpRecordCount[ch]; }
- //MidiFifo& recordEvents() { return _recordFifo; }
MidiRecFifo& recordEvents(const unsigned int ch) { return _recordFifo[ch]; }
bool sysexFIFOProcessed() { return _sysexFIFOProcessed; }
void setSysexFIFOProcessed(bool v) { _sysexFIFOProcessed = v; }
@@ -170,11 +141,6 @@ class MidiDevice {
bool sysexReadingChunks() { return _sysexReadingChunks; }
void setSysexReadingChunks(bool v) { _sysexReadingChunks = v; }
//virtual void getEvents(unsigned /*from*/, unsigned /*to*/, int /*channel*/, MPEventList* /*dst*/);
-
- // Removed p4.0.15 Tim.
- //iMPEvent nextPlayEvent() { return _nextPlayEvent; }
- //void setNextPlayEvent(iMPEvent i) { _nextPlayEvent = i; }
-
bool sendNullRPNParams(int, bool);
};