summaryrefslogtreecommitdiff
path: root/attic/muse_qt4_evolution/muse/route.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'attic/muse_qt4_evolution/muse/route.cpp')
-rw-r--r--attic/muse_qt4_evolution/muse/route.cpp417
1 files changed, 417 insertions, 0 deletions
diff --git a/attic/muse_qt4_evolution/muse/route.cpp b/attic/muse_qt4_evolution/muse/route.cpp
new file mode 100644
index 00000000..a529eb9c
--- /dev/null
+++ b/attic/muse_qt4_evolution/muse/route.cpp
@@ -0,0 +1,417 @@
+//=============================================================================
+// MusE
+// Linux Music Editor
+// $Id:$
+//
+// Copyright (C) 2002-2006 by Werner Schweer and others
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License version 2.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+//=============================================================================
+
+#include "song.h"
+#include "route.h"
+#include "audio.h"
+#include "track.h"
+#include "synth.h"
+#include "audiodev.h"
+#include "al/xml.h"
+#include "auxplugin.h"
+
+//---------------------------------------------------------
+// RouteNode
+//---------------------------------------------------------
+
+RouteNode::RouteNode()
+ {
+ track = 0;
+ channel = -1;
+ type = TRACK;
+ }
+
+RouteNode::RouteNode(Port p, int ch, RouteNodeType t)
+ {
+ port = p;
+ channel = ch;
+ type = t;
+ }
+
+RouteNode::RouteNode(Port p, RouteNodeType t)
+ {
+ port = p;
+ channel = -1;
+ type = t;
+ }
+
+RouteNode::RouteNode(Track* tr)
+ {
+ track = tr;
+ channel = -1;
+ type = TRACK;
+ }
+
+RouteNode::RouteNode(AuxPluginIF* p)
+ {
+ plugin = p;
+ channel = -1;
+ type = AUXPLUGIN;
+ }
+
+RouteNode::RouteNode(Track* tr, int ch, RouteNodeType t)
+ {
+ track = tr;
+ channel = ch;
+ type = t;
+ }
+
+//---------------------------------------------------------
+// addRoute
+// return false, if route invalid or cannot be found
+//---------------------------------------------------------
+
+bool addRoute(const Route& r)
+ {
+// printf("addRoute %s.%d:<%s> %s.%d:<%s>\n",
+// r.src.tname(), r.src.channel, r.src.name().toLatin1().data(),
+// r.dst.tname(), r.dst.channel, r.dst.name().toLatin1().data());
+
+ if (r.src.type == RouteNode::AUDIOPORT || r.src.type == RouteNode::JACKMIDIPORT) {
+ if (r.dst.type != RouteNode::TRACK) {
+ fprintf(stderr, "addRoute: bad route 1\n");
+ return false;
+ }
+ if (r.dst.track->type() != Track::AUDIO_INPUT && r.dst.track->type() != Track::MIDI_IN) {
+ fprintf(stderr, "addRoute: bad route 2\n");
+ return false;
+ }
+ RouteList* inRoutes = r.dst.track->inRoutes();
+ if (inRoutes->indexOf(r) != -1) {
+ printf(" route already there 1\n");
+ return true;
+ }
+ inRoutes->push_back(r);
+ }
+ else if (r.dst.type == RouteNode::AUDIOPORT || r.dst.type == RouteNode::JACKMIDIPORT) {
+ if (r.src.type != RouteNode::TRACK) {
+ fprintf(stderr, "addRoute: bad route 3\n");
+ return false;
+ }
+ if (r.src.track->type() != Track::AUDIO_OUTPUT && r.src.track->type() != Track::MIDI_OUT) {
+ fprintf(stderr, "addRoute: bad route 4, tracktype %s\n", r.src.track->cname().toLatin1().data());
+ return false;
+ }
+ RouteList* outRoutes = r.src.track->outRoutes();
+ if (outRoutes->indexOf(r) != -1) {
+ printf(" route already there 2\n");
+ return true;
+ }
+ outRoutes->push_back(r);
+ }
+ else if (r.src.type == RouteNode::AUXPLUGIN) {
+ RouteList* inRoutes = r.dst.track->inRoutes();
+ inRoutes->insert(inRoutes->begin(), r);
+ }
+ else {
+ if (r.src.track->outRoutes()->indexOf(r) != -1) {
+ printf(" route already there 3\n");
+ return true;
+ }
+ r.src.track->outRoutes()->push_back(r);
+ r.dst.track->inRoutes()->push_back(r);
+ }
+ return true;
+ }
+
+//---------------------------------------------------------
+// removeRoute
+//---------------------------------------------------------
+
+void removeRoute(const Route& r)
+ {
+// printf("removeRoute %s.%d:<%s> %s.%d:<%s>\n",
+// r.src.tname(), r.src.channel, r.src.name().toLatin1().data(),
+// r.dst.tname(), r.dst.channel, r.dst.name().toLatin1().data());
+ if (r.src.type == RouteNode::AUDIOPORT || r.src.type == RouteNode::JACKMIDIPORT) {
+ if (r.dst.type != RouteNode::TRACK) {
+ fprintf(stderr, "removeRoute: bad route 1\n");
+ goto error;
+ }
+ if (r.dst.track->type() != Track::AUDIO_INPUT
+ && r.dst.track->type() != Track::AUDIO_SOFTSYNTH
+ && r.dst.track->type() != Track::MIDI_IN) {
+ fprintf(stderr, "removeRoute: bad route 2\n");
+ goto error;
+ }
+ RouteList* inRoutes = r.dst.track->inRoutes();
+ iRoute i;
+ for (i = inRoutes->begin(); i != inRoutes->end(); ++i) {
+ if (*i == r) {
+ inRoutes->erase(i);
+ break;
+ }
+ }
+ }
+ else if (r.dst.type == RouteNode::AUDIOPORT || r.dst.type == RouteNode::JACKMIDIPORT) {
+ if (r.src.type != RouteNode::TRACK) {
+ fprintf(stderr, "removeRoute: bad route 3\n");
+ goto error;
+ }
+ if (r.src.track->type() != Track::AUDIO_OUTPUT && r.src.track->type() != Track::MIDI_OUT) {
+ fprintf(stderr, "removeRoute: bad route 4\n");
+ goto error;
+ }
+ RouteList* outRoutes = r.src.track->outRoutes();
+ iRoute i;
+ for (i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == r) {
+ outRoutes->erase(i);
+ break;
+ }
+ }
+ }
+ else if (r.src.type == RouteNode::AUXPLUGIN) {
+ if (r.dst.type != RouteNode::TRACK) {
+ fprintf(stderr, "removeRoute: bad route 5\n");
+ goto error;
+ }
+ RouteList* inRoutes = r.dst.track->inRoutes();
+ for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) {
+ if (*i == r) {
+ inRoutes->erase(i);
+ break;
+ }
+ }
+ }
+ else {
+ RouteList* outRoutes = r.src.track->outRoutes();
+ for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) {
+ if (*i == r) {
+ outRoutes->erase(i);
+ break;
+ }
+ }
+ RouteList* inRoutes = r.dst.track->inRoutes();
+ for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) {
+ if (*i == r) {
+ inRoutes->erase(i);
+ break;
+ }
+ }
+ }
+ return;
+error:
+ printf("removeRoute %s.%d:<%s> %s.%d:<%s>\n",
+ r.src.tname(), r.src.channel, r.src.name().toLatin1().data(),
+ r.dst.tname(), r.dst.channel, r.dst.name().toLatin1().data());
+ abort();
+ }
+
+//---------------------------------------------------------
+// track2name
+// create string name representation for audio node
+//---------------------------------------------------------
+
+static QString track2name(const Track* n)
+ {
+ return n ? n->name() : "None";
+ }
+
+//---------------------------------------------------------
+// name
+// create string name representation for audio node
+//---------------------------------------------------------
+
+QString RouteNode::name() const
+ {
+ switch (type) {
+ case TRACK:
+ return track2name(track);
+ case AUDIOPORT:
+ case JACKMIDIPORT:
+ if (port.isZero())
+ return QString("0");
+ return audioDriver->portName(port);
+ case AUXPLUGIN:
+ return plugin->pluginInstance()->name();
+ }
+ return QString("?");
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void Song::readRoute(QDomNode n)
+ {
+ RouteNode s, d;
+ for (QDomNode node = n.firstChild(); !node.isNull(); node = node.nextSibling()) {
+ QDomElement e = node.toElement();
+ if (e.tagName() == "src")
+ s.read(node);
+ else if (e.tagName() == "dst")
+ d.read(node);
+ else
+ printf("MusE:readRoute: unknown tag %s\n", e.tagName().toLatin1().data());
+ }
+ if (!s.isValid()) { // source port not found?
+ printf("Song::readRoute(): invalid source port: %s.%d:<%s> - %s.%d:<%s>\n",
+ s.tname(), s.channel, s.name().toLatin1().data(),
+ d.tname(), d.channel, d.name().toLatin1().data());
+ return;
+ }
+ if (!d.isValid()) { // destination port not found?
+ printf("Song::readRoute(): invalid destination port: %s.%d:<%s> - %s.%d:<%s>\n",
+ s.tname(), s.channel, s.name().toLatin1().data(),
+ d.tname(), d.channel, d.name().toLatin1().data());
+ return;
+ }
+ Route r(s, d);
+ r.disconnected = true;
+ addRoute(r);
+ }
+
+//---------------------------------------------------------
+// dump
+//---------------------------------------------------------
+
+void RouteNode::dump() const
+ {
+ printf("RouteNode %p dump: <%s> channel %d, type %s\n",
+ track, name().toLatin1().data(), channel, tname());
+ }
+
+//---------------------------------------------------------
+// operator==
+//---------------------------------------------------------
+
+bool RouteNode::operator==(const RouteNode& a) const
+ {
+ if (type != a.type)
+ return false;
+ switch(type) {
+ case TRACK:
+ return (channel == a.channel) && (track == a.track);
+ case JACKMIDIPORT:
+ case AUDIOPORT:
+ return port == a.port;
+ case AUXPLUGIN:
+ return plugin == a.plugin;
+ }
+ return false;
+ }
+
+//---------------------------------------------------------
+// tname
+//---------------------------------------------------------
+
+const char* RouteNode::tname(RouteNodeType t)
+ {
+ static const char* names[] = {
+ "TRACK", "AUDIOPORT", "JACKMIDIPORT", "AUX"
+ };
+ if (t > (int)(sizeof(names)/sizeof(*names)))
+ return "???";
+ return names[t];
+ }
+
+const char* RouteNode::tname() const
+ {
+ return tname(type);
+ }
+
+//---------------------------------------------------------
+// write
+//---------------------------------------------------------
+
+void RouteNode::write(Xml& xml, const char* label) const
+ {
+ if (channel != -1)
+ xml.tagE(QString("%1 type=\"%2\" channel=\"%3\" name=\"%4\"")
+ .arg(label).arg(tname()).arg(channel + 1).arg(name()));
+ else
+ xml.tagE(QString("%1 type=\"%2\" name=\"%3\"")
+ .arg(label).arg(tname()).arg(name()));
+ }
+
+//---------------------------------------------------------
+// read
+//---------------------------------------------------------
+
+void RouteNode::read(QDomNode node)
+ {
+ QDomElement e = node.toElement();
+ channel = e.attribute("channel","0").toInt() - 1;
+ QString s = e.attribute("name");
+ QString st = e.attribute("type", "TRACK");
+
+ if (st == "TRACK") {
+ type = RouteNode::TRACK;
+ track = 0;
+ TrackList* tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ Track* t = *i;
+ if (t->name() == s) {
+ track = t;
+ break;
+ }
+ }
+ if (track == 0)
+ printf("Route::read(): track <%s> not found\n", s.toLatin1().data());
+ }
+ else if (st == "AUDIOPORT") {
+ type = RouteNode::AUDIOPORT;
+ port = audioDriver->findPort(s);
+ if (port.isZero())
+ printf("Route::read(): audioport <%s> not found\n", s.toLatin1().data());
+ }
+ else if (st == "JACKMIDIPORT") {
+ type = RouteNode::JACKMIDIPORT;
+ port = audioDriver->findPort(s);
+ if (port.isZero())
+ printf("Route::read(): jack midiport <%s> not found\n", s.toLatin1().data());
+ }
+ else if (st == "AUX") {
+ type = RouteNode::AUXPLUGIN;
+ plugin = 0;
+ TrackList* tl = song->tracks();
+ for (iTrack i = tl->begin(); i != tl->end(); ++i) {
+ if ((*i)->type() == Track::WAVE || (*i)->type() == Track::AUDIO_INPUT) {
+ AudioTrack* t = (AudioTrack*)*i;
+ QList<AuxPluginIF*> pl = t->preAux();
+ foreach(AuxPluginIF* p, pl) {
+ if (p->pluginInstance()->name() == s) {
+ plugin = p;
+ break;
+ }
+ }
+ if (plugin)
+ break;
+ pl = t->postAux();
+ foreach(AuxPluginIF* p, pl) {
+ if (p->pluginInstance()->name() == s) {
+ plugin = p;
+ break;
+ }
+ }
+ if (plugin)
+ break;
+ }
+ }
+ if (plugin == 0)
+ printf("Route::read(): plugin <%s> not found\n", s.toLatin1().data());
+ }
+ else {
+ printf("Route::read(): unknown type <%s>\n", st.toLatin1().data());
+ type = RouteNode::TRACK;
+ }
+ }
+