diff options
Diffstat (limited to 'attic/muse2-oom/muse2/muse/route.cpp')
-rw-r--r-- | attic/muse2-oom/muse2/muse/route.cpp | 1685 |
1 files changed, 0 insertions, 1685 deletions
diff --git a/attic/muse2-oom/muse2/muse/route.cpp b/attic/muse2-oom/muse2/muse/route.cpp deleted file mode 100644 index 19f8d09f..00000000 --- a/attic/muse2-oom/muse2/muse/route.cpp +++ /dev/null @@ -1,1685 +0,0 @@ -//========================================================= -// MusE -// Linux Music Editor -// $Id: route.cpp,v 1.18.2.3 2008/05/21 00:28:52 terminator356 Exp $ -// -// (C) Copyright 2003-2004 Werner Schweer (ws@seh.de) -//========================================================= - -#include <QWidget> - -#include "song.h" -#include "route.h" -#include "node.h" -#include "audio.h" -#include "track.h" -#include "synth.h" -#include "audiodev.h" -#include "xml.h" -#include "midiport.h" -#include "driver/jackmidi.h" -#include "driver/alsamidi.h" - -//#define ROUTE_DEBUG - -//#define ROUTE_MIDIPORT_NAME_PREFIX "MusE MidiPort " -const QString ROUTE_MIDIPORT_NAME_PREFIX = "MusE MidiPort "; - -//--------------------------------------------------------- -// Route -//--------------------------------------------------------- - -Route::Route(void* t, int ch) - { - jackPort = t; - midiPort = -1; - channel = ch; - channels = -1; - remoteChannel = -1; - type = JACK_ROUTE; - } - -//Route::Route(AudioTrack* t, int ch) -Route::Route(Track* t, int ch, int chans) -//Route::Route(Track* t, int ch) - { - track = t; - midiPort = -1; - channel = ch; - channels = chans; - remoteChannel = -1; - type = TRACK_ROUTE; - } - -//Route::Route(MidiJackDevice* d) -Route::Route(MidiDevice* d, int ch) -{ - device = d; - midiPort = -1; - channel = ch; - channels = -1; - remoteChannel = -1; - /* - //if(dynamic_cast<MidiJackDevice*>(d)) - if(d->deviceType() == MidiDevice::JACK_MIDI) - type = JACK_MIDI_ROUTE; - else - //if(dynamic_cast<MidiAlsaDevice*>(d)) - if(d->deviceType() == MidiDevice::ALSA_MIDI) - type = ALSA_MIDI_ROUTE; - */ - type = MIDI_DEVICE_ROUTE; -} - -Route::Route(int port, int ch) // p3.3.49 -{ - track = 0; - midiPort = port; - channel = ch; - channels = -1; - remoteChannel = -1; - type = MIDI_PORT_ROUTE; -} - -//Route::Route(const QString& s, bool dst, int ch) -Route::Route(const QString& s, bool dst, int ch, int rtype) - { - //Route node(name2route(s, dst)); - Route node(name2route(s, dst, rtype)); - channel = node.channel; - if(channel == -1) - channel = ch; - //if(channels == -1) - // channels = chans; - channels = node.channels; - remoteChannel = node.remoteChannel; - type = node.type; - if(type == TRACK_ROUTE) - { - track = node.track; - midiPort = -1; - } - else - if(type == JACK_ROUTE) - { - jackPort = node.jackPort; - midiPort = -1; - } - /* - else - if (type == JACK_MIDI_ROUTE) - device = node.device; - else - if (type == ALSA_MIDI_ROUTE) - device = node.device; - */ - else - if(type == MIDI_DEVICE_ROUTE) - { - device = node.device; - midiPort = -1; - } - else - if(type == MIDI_PORT_ROUTE) // p3.3.49 - { - track = 0; - midiPort = node.midiPort; // - } - } - -Route::Route() - { - track = 0; - midiPort = -1; - channel = -1; - channels = -1; - remoteChannel = -1; - type = TRACK_ROUTE; - } - -//--------------------------------------------------------- -// addRoute -//--------------------------------------------------------- - -void addRoute(Route src, Route dst) -{ - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute:\n"); - #endif - - if (!src.isValid() || !dst.isValid()) - { - if(!src.isValid()) - fprintf(stderr, "addRoute: invalid src\n"); - if(!dst.isValid()) - fprintf(stderr, "addRoute: invalid dst\n"); - return; - } - -// printf("addRoute %d.%d:<%s> %d.%d:<%s>\n", -// src.type, src.channel, src.name().toLatin1().constData(), -// dst.type, dst.channel, dst.name().toLatin1().constData()); - if (src.type == Route::JACK_ROUTE) - { - //if (dst.type != TRACK_ROUTE) - //{ - // fprintf(stderr, "addRoute: bad route 1\n"); - // exit(-1); - // return; - //} - - if (dst.type == Route::TRACK_ROUTE) - { - if (dst.track->type() != Track::AUDIO_INPUT) - { - fprintf(stderr, "addRoute: source is jack, dest:%s is track but not audio input\n", dst.track->name().toLatin1().constData()); - //exit(-1); - return; - } - if (dst.channel < 0) - { - fprintf(stderr, "addRoute: source is jack, dest:%s is track but invalid channel:%d\n", dst.track->name().toLatin1().constData(), dst.channel); - //exit(-1); - return; - } - - //src.channel = src.dstChannel = dst.channel; - src.channel = dst.channel; - //src.channels = dst.channels = 1; - RouteList* inRoutes = dst.track->inRoutes(); - for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) - { - if (*i == src) // route already there - { - //#ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src track route already exists.\n"); - //#endif - return; - } - } - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src Jack dst track name: %s pushing source route\n", dst.track->name().toLatin1().constData()); - #endif - inRoutes->push_back(src); - } - else - //if (dst.type == Route::JACK_MIDI_ROUTE) - if (dst.type == Route::MIDI_DEVICE_ROUTE) - //if (dst.type == Route::MIDI_PORT_ROUTE) // p3.3.49 - { - //MidiDevice *md = midiPorts[dst.midiPort].device(); - //if(dst.device->deviceType() == MidiDevice::JACK_MIDI) - //if(!md) - //{ - // fprintf(stderr, "addRoute: source is Jack, but no destination port device\n"); - // return; - //} - - if(dst.device->deviceType() == MidiDevice::JACK_MIDI) - //if(md->deviceType() == MidiDevice::JACK_MIDI) - { - src.channel = dst.channel; - //src.channel = -1; - //src.channel = 0; - //src.channel = src.dstChannel = dst.channel; - //src.channels = dst.channels = 1; - //dst.channel = -1; - - RouteList* routes = dst.device->inRoutes(); - for (iRoute i = routes->begin(); i != routes->end(); ++i) - { - if (*i == src) // route already there - { - //#ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src Jack midi route already exists.\n"); - //#endif - return; - } - } - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src Jack dst Jack midi name: %s pushing source route\n", dst.device->name().toLatin1().constData()); - #endif - routes->push_back(src); - } - else - { - fprintf(stderr, "addRoute: source is Jack, but destination is not jack midi - type:%d\n", dst.device->deviceType()); - // exit(-1); - return; - } - } - else - { - fprintf(stderr, "addRoute: source is Jack, but destination is not track or midi - type:%d \n", dst.type); - // exit(-1); - return; - } - } - else if (dst.type == Route::JACK_ROUTE) - { - //if (src.type != TRACK_ROUTE) - //{ - // fprintf(stderr, "addRoute: bad route 3\n"); - // exit(-1); - // return; - //} - - if (src.type == Route::TRACK_ROUTE) - { - if (src.track->type() != Track::AUDIO_OUTPUT) - { - fprintf(stderr, "addRoute: destination is jack, source is track but not audio output\n"); - // exit(-1); - return; - } - if (src.channel < 0) - { - fprintf(stderr, "addRoute: destination is jack, source:%s is track but invalid channel:%d\n", src.track->name().toLatin1().constData(), src.channel); - // exit(-1); - return; - } - - RouteList* outRoutes = src.track->outRoutes(); - //dst.channel = dst.dstChannel = src.channel; - dst.channel = src.channel; - //dst.channels = src.channels = 1; - - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) // route already there - { - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: dst track route already exists.\n"); - #endif - return; - } - } - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: dst Jack src track name: %s pushing destination route\n", src.track->name().toLatin1().constData()); - #endif - outRoutes->push_back(dst); - } - else - //if (src.type == Route::JACK_MIDI_ROUTE) - if (src.type == Route::MIDI_DEVICE_ROUTE) - { - if(src.device->deviceType() == MidiDevice::JACK_MIDI) - { - dst.channel = src.channel; - //dst.channel = -1; - //src.channel = -1; - //dst.channel = dst.dstChannel = src.channel; - //dst.channels = src.channels = 1; - - RouteList* routes = src.device->outRoutes(); - for (iRoute i = routes->begin(); i != routes->end(); ++i) - { - if (*i == dst) // route already there - { - //#ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: dst Jack midi route already exists.\n"); - //#endif - return; - } - } - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: dst Jack src Jack midi name: %s pushing destination route\n", src.device->name().toLatin1().constData()); - #endif - routes->push_back(dst); - } - else - { - fprintf(stderr, "addRoute: destination is Jack, but source is not jack midi - type:%d\n", src.device->deviceType()); - // exit(-1); - return; - } - } - else - { - fprintf(stderr, "addRoute: destination is Jack, but source is not track or midi - type:%d \n", src.type); - // exit(-1); - return; - } - } - else if(src.type == Route::MIDI_PORT_ROUTE) // p3.3.49 - { - if(dst.type != Route::TRACK_ROUTE) - { - fprintf(stderr, "addRoute: source is midi port:%d, but destination is not track\n", src.midiPort); - return; - } - if(dst.channel < 1 || dst.channel >= (1 << MIDI_CHANNELS)) - { - fprintf(stderr, "addRoute: source is midi port:%d, but destination channel mask:%d out of range\n", src.midiPort, dst.channel); - return; - } - - //MidiDevice *md = midiPorts[src.midiPort].device(); - //if(!md) - //{ - // fprintf(stderr, "addRoute: source is midi port, but no destination port device\n"); - // return; - //} - - MidiPort *mp = &midiPorts[src.midiPort]; - - src.channel = dst.channel; - RouteList* outRoutes = mp->outRoutes(); - //for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - iRoute ir = outRoutes->begin(); // p3.3.50 - for ( ; ir != outRoutes->end(); ++ir) - { - //if (*i == dst) // route already there - if (ir->type == Route::TRACK_ROUTE && ir->track == dst.track) // p3.3.50 Does a route to the track exist? - { - //#ifdef ROUTE_DEBUG - //fprintf(stderr, "addRoute: src midi port:%d dst track:%s route already exists.\n", src.midiPort, dst.track->name().toLatin1().constData()); - //#endif - ir->channel |= dst.channel; // p3.3.50 Bitwise OR the desired channel bit with the existing bit mask. - break; - - //return; - } - } - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src midi port:%d dst track name:%s pushing dst and src routes\n", src.midiPort, dst.track->name().toLatin1().constData()); - #endif - - if(ir == outRoutes->end()) // p3.3.50 Only if route not found, add the route, with the requested channel bits as mask to start with. - outRoutes->push_back(dst); - - RouteList* inRoutes = dst.track->inRoutes(); - - // p3.3.50 Make sure only one single route, with a channel mask, can ever exist. - ir = inRoutes->begin(); - for ( ; ir != inRoutes->end(); ++ir) - { - if (ir->type == Route::MIDI_PORT_ROUTE && ir->midiPort == src.midiPort) // p3.3.50 Does a route to the midi port exist? - { - ir->channel |= src.channel; // p3.3.50 Bitwise OR the desired channel bit with the existing bit mask. - break; - } - } - - if(ir == inRoutes->end()) // p3.3.50 Only if route not found, add the route, with the requested channel bits as mask to start with. - inRoutes->push_back(src); - } - else if(dst.type == Route::MIDI_PORT_ROUTE) // p3.3.49 - { - if(src.type != Route::TRACK_ROUTE) - { - fprintf(stderr, "addRoute: destination is midi port:%d, but source is not track\n", dst.midiPort); - return; - } - if(src.channel < 1 || src.channel >= (1 << MIDI_CHANNELS)) - { - fprintf(stderr, "addRoute: destination is midi port:%d, but source channel mask:%d out of range\n", dst.midiPort, src.channel); - return; - } - - - //MidiDevice *md = midiPorts[dst.midiPort].device(); - //if(!md) - //{ - // fprintf(stderr, "addRoute: dst is midi port, but no destination port device\n"); - // return; - //} - - dst.channel = src.channel; - RouteList* outRoutes = src.track->outRoutes(); - - //for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - iRoute ir = outRoutes->begin(); // p3.3.50 - for ( ; ir != outRoutes->end(); ++ir) - { - //if (*i == dst) // route already there - if (ir->type == Route::MIDI_PORT_ROUTE && ir->midiPort == dst.midiPort) // p3.3.50 Does a route to the midi port exist? - { - //#ifdef ROUTE_DEBUG - //fprintf(stderr, "addRoute: dst midi port:%d src track:%s route already exists.\n", dst.midiPort, src.track->name().toLatin1().constData()); - //#endif - //return; - - ir->channel |= dst.channel; // p3.3.50 Bitwise OR the desired channel bit with the existing bit mask. - break; - } - } - - if(ir == outRoutes->end()) // p3.3.50 Only if route not found, add the route, with the requested channel bits as mask to start with. - outRoutes->push_back(dst); - - MidiPort *mp = &midiPorts[dst.midiPort]; - - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src track:%s dst midi port:%d pushing dst and src routes\n", src.track->name().toLatin1().constData(), dst.midiPort); - #endif - RouteList* inRoutes = mp->inRoutes(); - - // p3.3.50 Make sure only one single route, with a channel mask, can ever exist. - ir = inRoutes->begin(); - for ( ; ir != inRoutes->end(); ++ir) - { - if (ir->type == Route::TRACK_ROUTE && ir->track == src.track) // p3.3.50 Does a route to the track exist? - { - ir->channel |= src.channel; // p3.3.50 Bitwise OR the desired channel bit with the existing bit mask. - break; - } - } - - if(ir == inRoutes->end()) // p3.3.50 Only if route not found, add the route, with the requested channel bits as mask to start with. - inRoutes->push_back(src); - //inRoutes->insert(inRoutes->begin(), src); - } - else - { - if(src.type != Route::TRACK_ROUTE || dst.type != Route::TRACK_ROUTE) // p3.3.49 - { - fprintf(stderr, "addRoute: source or destination are not track routes\n"); - return; - } - - // Removed p3.3.49 - /* - //if ((src.type == Route::JACK_MIDI_ROUTE) || (src.type == Route::ALSA_MIDI_ROUTE)) - if(src.type == Route::MIDI_DEVICE_ROUTE) - { - //src.channel = src.dstChannel = dst.dstChannel = dst.channel; - src.channel = dst.channel; - //src.channels = dst.channels = 1; - RouteList* outRoutes = src.device->outRoutes(); - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src name: %s looking for existing dest in out routes...\n", src.device->name().toLatin1().constData()); - #endif - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) // route already there - { - //#ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src Jack or ALSA midi route already exists.\n"); - //#endif - return; - } - } - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src midi dst name: %s pushing destination and source routes\n", dst.track->name().toLatin1().constData()); - #endif - - outRoutes->push_back(dst); - RouteList* inRoutes = dst.track->inRoutes(); - inRoutes->push_back(src); - } - else - */ - - { - ///if(dst.type == Route::MIDI_DEVICE_ROUTE) // Removed p3.3.49 - //{ - /// dst.channel = src.channel; - //src.channel = src.dstChannel = dst.dstChannel = dst.channel; - //src.channels = dst.channels = 1; - //} - //else - //{ - //src.channel = src.dstChannel = dst.dstChannel = dst.channel; - //src.channels = dst.channels = 1; - //} - - RouteList* outRoutes = src.track->outRoutes(); - - // - // Must enforce to ensure channel and channels are valid if defaults of -1 passed. - // - if(src.track->type() == Track::AUDIO_SOFTSYNTH) - { - if(src.channel == -1) - src.channel = 0; - if(src.channels == -1) - src.channels = src.track->channels(); - //if(dst.type == Route::TRACK_ROUTE) // p3.3.49 Removed - //{ - //if(dst.channel == -1) - // dst.channel = 0; - //if(dst.channels == -1) - // Yes, that's correct: dst channels = src track channels. - // dst.channels = src.track->channels(); - dst.channel = src.channel; - dst.channels = src.channels; - dst.remoteChannel = src.remoteChannel; - //} - } - //if(dst.type == Route::TRACK_ROUTE && dst.track->type() == Track::AUDIO_SOFTSYNTH) - //{ - // if(dst.channel == -1) - // dst.channel = 0; - // if(dst.channels == -1) - // Yes, that's correct: dst channels = src track channels. - // dst.channels = src.track->channels(); - //} - - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) // route already there - // TODO: - //if (i->type == dst.type && i->channel == dst.channel) - { - //if(i->type == Route::TRACK_ROUTE) - { - //if(i->track == dst.track) - { - //if(i->channels == dst.channels) - { - //#ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src track route already exists.\n"); - //#endif - return; - } - //else - //{ - - //} - } - } - } - } - outRoutes->push_back(dst); - RouteList* inRoutes; - - // Removed p3.3.49 - /* - //if ((dst.type == Route::JACK_MIDI_ROUTE) || (dst.type == Route::ALSA_MIDI_ROUTE)) - if(dst.type == Route::MIDI_DEVICE_ROUTE) - { - #ifdef ROUTE_DEBUG - fprintf(stderr, "addRoute: src track dst midi name: %s pushing destination and source routes\n", dst.device->name().toLatin1().constData()); - #endif - inRoutes = dst.device->inRoutes(); - } - else - */ - - { - #ifdef ROUTE_DEBUG - //fprintf(stderr, "addRoute: src track ch:%d chs:%d dst track ch:%d chs:%d name: %s pushing destination and source routes\n", src.channel, src.channels, dst.channel, dst.channels, dst.track->name().toLatin1().constData()); - fprintf(stderr, "addRoute: src track ch:%d chs:%d remch:%d dst track ch:%d chs:%d remch:%d name: %s pushing dest and source routes\n", - src.channel, src.channels, src.remoteChannel, dst.channel, dst.channels, dst.remoteChannel, dst.track->name().toLatin1().constData()); - //fprintf(stderr, "addRoute: src track ch:%d dst track ch:%d name: %s pushing destination and source routes\n", src.channel, dst.channel, dst.track->name().toLatin1().constData()); - #endif - inRoutes = dst.track->inRoutes(); - } - - - // - // make sure AUDIO_AUX is processed last - // - if (src.track->type() == Track::AUDIO_AUX) - inRoutes->push_back(src); - else - inRoutes->insert(inRoutes->begin(), src); - } - } -} - -//--------------------------------------------------------- -// removeRoute -//--------------------------------------------------------- - -void removeRoute(Route src, Route dst) -{ - //printf("removeRoute %d.%d:<%s> %d.%d:<%s>\n", - // src.type, src.channel, src.name().toLatin1().constData(), - // dst.type, dst.channel, dst.name().toLatin1().constData()); - - if (src.type == Route::JACK_ROUTE) - { - //if (dst.type != TRACK_ROUTE) - //{ - // fprintf(stderr, "removeRoute: bad route 1\n"); - // exit(-1); - // return; - //} - if(!dst.isValid()) - { - printf("removeRoute: source is jack, invalid destination\n"); - return; - } - - if (dst.type == Route::TRACK_ROUTE) - { - if (dst.track->type() != Track::AUDIO_INPUT) - { - fprintf(stderr, "removeRoute: source is jack, destination is track but not audio input\n"); - // exit(-1); - return; - } - RouteList* inRoutes = dst.track->inRoutes(); - iRoute i; - for (i = inRoutes->begin(); i != inRoutes->end(); ++i) - { - if (*i == src) - { - inRoutes->erase(i); - break; - } - } - } - else - //if (dst.type == Route::JACK_MIDI_ROUTE) - if (dst.type == Route::MIDI_DEVICE_ROUTE) - { - RouteList* routes = dst.device->inRoutes(); - iRoute i; - for (i = routes->begin(); i != routes->end(); ++i) - { - if (*i == src) - { - routes->erase(i); - break; - } - } - } - else - { - fprintf(stderr, "removeRoute: source is jack, destination unknown\n"); - // exit(-1); - return; - } - } - else if (dst.type == Route::JACK_ROUTE) - { - //if (src.type != TRACK_ROUTE) - //{ - // fprintf(stderr, "removeRoute: bad route 3\n"); - // exit(-1); - // return; - //} - if(!src.isValid()) - { - printf("removeRoute: destination is jack, invalid source\n"); - return; - } - - if (src.type == Route::TRACK_ROUTE) - { - if (src.track->type() != Track::AUDIO_OUTPUT) - { - fprintf(stderr, "removeRoute: destination is jack, source is track but not audio output\n"); - // exit(-1); - return; - } - RouteList* outRoutes = src.track->outRoutes(); - iRoute i; - for (i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) { - outRoutes->erase(i); - break; - } - } - } - else - //if (src.type == Route::JACK_MIDI_ROUTE) - if (src.type == Route::MIDI_DEVICE_ROUTE) - { - RouteList* routes = src.device->outRoutes(); - iRoute i; - for (i = routes->begin(); i != routes->end(); ++i) - { - if (*i == dst) { - routes->erase(i); - break; - } - } - } - else - { - fprintf(stderr, "removeRoute: destination is jack, source unknown\n"); - // exit(-1); - return; - } - } - else if(src.type == Route::MIDI_PORT_ROUTE) // p3.3.49 - { - if(dst.type != Route::TRACK_ROUTE) - { - fprintf(stderr, "removeRoute: source is midi port:%d, but destination is not track\n", src.midiPort); - return; - } - - if(src.isValid()) - { - MidiPort *mp = &midiPorts[src.midiPort]; - RouteList* outRoutes = mp->outRoutes(); - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - //if (*i == dst) - if (i->type == Route::TRACK_ROUTE && i->track == dst.track) // p3.3.50 Is there a route to the track? - { - i->channel &= ~dst.channel; // p3.3.50 Unset the desired channel bits. - if(i->channel == 0) // Only if there are no channel bits set, erase the route. - outRoutes->erase(i); - - break; // For safety, keep looking and remove any more found. - // No, must break, else crash. There should only be one route anyway... - } - } - } - else - printf("removeRoute: source is midi port:%d but invalid\n", src.midiPort); - - if(dst.isValid()) - { - RouteList* inRoutes = dst.track->inRoutes(); - for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) - { - //if (*i == src) - if (i->type == Route::MIDI_PORT_ROUTE && i->midiPort == src.midiPort) // p3.3.50 Is there a route to the midi port? - { - i->channel &= ~src.channel; // p3.3.50 Unset the desired channel bits. - if(i->channel == 0) // Only if there are no channel bits set, erase the route. - inRoutes->erase(i); - - break; // For safety, keep looking and remove any more found. - // No, must break, else crash. There should only be one route anyway... - } - } - } - else - printf("removeRoute: source is midi port:%d but destination track invalid\n", src.midiPort); - } - else if(dst.type == Route::MIDI_PORT_ROUTE) // p3.3.49 - { - if(src.type != Route::TRACK_ROUTE) - { - fprintf(stderr, "removeRoute: destination is midi port:%d, but source is not track\n", dst.midiPort); - return; - } - - if(src.isValid()) - { - RouteList* outRoutes = src.track->outRoutes(); - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - //if (*i == dst) - if (i->type == Route::MIDI_PORT_ROUTE && i->midiPort == dst.midiPort) // p3.3.50 Is there a route to the midi port? - { - i->channel &= ~dst.channel; // p3.3.50 Unset the desired channel bits. - if(i->channel == 0) // Only if there are no channel bits set, erase the route. - outRoutes->erase(i); - - break; // For safety, keep looking and remove any more found. - // No, must break, else crash. There should only be one route anyway... - } - } - } - else - printf("removeRoute: destination is midi port:%d but source track is invalid\n", dst.midiPort); - - if(dst.isValid()) - { - MidiPort *mp = &midiPorts[src.midiPort]; - RouteList* inRoutes = mp->inRoutes(); - for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) - { - //if (*i == src) - if (i->type == Route::TRACK_ROUTE && i->track == src.track) // p3.3.50 Is there a route to the track? - { - i->channel &= ~src.channel; // p3.3.50 Unset the desired channel bits. - if(i->channel == 0) // Only if there are no channel bits set, erase the route. - inRoutes->erase(i); - - break; // For safety, keep looking and remove any more found. - // No, must break, else crash. There should only be one route anyway... - } - } - } - else - printf("removeRoute: destination is midi port:%d but invalid\n", dst.midiPort); - } - else - { - if(src.type != Route::TRACK_ROUTE || dst.type != Route::TRACK_ROUTE) // p3.3.49 - { - fprintf(stderr, "removeRoute: source and destination are not tracks\n"); - return; - } - - // Removed p3.3.49 - /* - //if((src.type == Route::JACK_MIDI_ROUTE) || (src.type == Route::ALSA_MIDI_ROUTE)) - if(src.type == Route::MIDI_DEVICE_ROUTE) - { - if(src.isValid()) - { - RouteList* outRoutes = src.device->outRoutes(); - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) { - outRoutes->erase(i); - break; - } - } - } - else - printf("removeRoute: source is midi but invalid\n"); - - if(dst.isValid()) - { - RouteList* inRoutes = dst.track->inRoutes(); - for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) - { - if (*i == src) { - inRoutes->erase(i); - break; - } - } - } - else - printf("removeRoute: source is midi but destination invalid\n"); - } - else - */ - - { - if(src.isValid()) - { - RouteList* outRoutes = src.track->outRoutes(); - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) { - outRoutes->erase(i); - break; - } - } - } - else - printf("removeRoute: source is track but invalid\n"); - - if(dst.isValid()) - { - RouteList* inRoutes; - - //if ((dst.type == Route::JACK_MIDI_ROUTE) || (dst.type == Route::ALSA_MIDI_ROUTE)) - // Removed p3.3.49 - /* - if (dst.type == Route::MIDI_DEVICE_ROUTE) - inRoutes = dst.device->inRoutes(); - else - */ - - inRoutes = dst.track->inRoutes(); - for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) - { - if (*i == src) { - inRoutes->erase(i); - break; - } - } - } - else - printf("removeRoute: source is track but destination invalid\n"); - } - } -} - -//--------------------------------------------------------- -// removeAllRoutes -// If src is valid, disconnects all output routes from it. -// If dst is valid, disconnects all input routes to it. -// src and dst Route are used SIMPLY because Route provides convenient way to -// specify the different pointer types (track, port, jack) -// This routine will ONLY look at the pointer, not the channel or port etc... -// So far it only works with MidiDevice <-> Jack. -//--------------------------------------------------------- - -// p3.3.55 -void removeAllRoutes(Route src, Route dst) -{ - if(src.isValid()) - { - if(src.type == Route::MIDI_DEVICE_ROUTE) - src.device->outRoutes()->clear(); - else - printf("removeAllRoutes: source is not midi device\n"); - } - - if(dst.isValid()) - { - if(dst.type == Route::MIDI_DEVICE_ROUTE) - dst.device->inRoutes()->clear(); - else - printf("removeAllRoutes: dest is not midi device\n"); - } -} - -//--------------------------------------------------------- -// track2name -// create string name representation for audio node -//--------------------------------------------------------- - -static QString track2name(const Track* n) - { - if (n == 0) - return QWidget::tr("None"); - return n->name(); - } - -//--------------------------------------------------------- -// name -// create string name representation for audio node -//--------------------------------------------------------- - -QString Route::name() const -{ - // p3.3.38 Removed - /* - QString s; - if ((type == TRACK_ROUTE) && (channel != -1)) { -// if (channel != -1) { - QString c; - c.setNum(channel+1); - s = c + ":"; - } - */ - - if(type == MIDI_DEVICE_ROUTE) - { - if(device) - { - // p3.3.55 Removed for unified jack in/out devices, the actual port names are now different from device name. - // Like this: device: "MyJackDevice1" -> inport: "MyJackDevice1_in" outport: "MyJackDevice1_out" - /* - if(device->deviceType() == MidiDevice::JACK_MIDI) - return audioDevice->portName(device->clientPort()); - else - */ - - //if(device->deviceType() == MidiDevice::ALSA_MIDI) - return device->name(); - } - return QWidget::tr("None"); - } - else - if(type == JACK_ROUTE) - { - if (!checkAudioDevice()) return ""; - //return s + audioDevice->portName(jackPort); - return audioDevice->portName(jackPort); - } - else - if(type == MIDI_PORT_ROUTE) // p3.3.49 - { - return ROUTE_MIDIPORT_NAME_PREFIX + QString().setNum(midiPort); - } - else - //return s + track2name(track); - return track2name(track); -} - -//--------------------------------------------------------- -// name2route -//--------------------------------------------------------- - -//Route name2route(const QString& rn, bool dst) -Route name2route(const QString& rn, bool /*dst*/, int rtype) -{ -// printf("name2route %s\n", rn.toLatin1().constData()); - int channel = -1; - //int channel = 0; - QString s(rn); - // Support old route style in med files. Obsolete. - if (rn[0].isNumber() && rn[1]==':') - { - channel = rn[0].toAscii() - int('1'); - s = rn.mid(2); - } - - if(rtype == -1) - { - //if(dst) - //{ - if(checkAudioDevice()) - { - void* p = audioDevice->findPort(s.toLatin1().constData()); - if(p) - return Route(p, channel); - } - - TrackList* tl = song->tracks(); - for(iTrack i = tl->begin(); i != tl->end(); ++i) - { - if((*i)->isMidiTrack()) - { - MidiTrack* track = (MidiTrack*)*i; - if(track->name() == s) - return Route(track, channel); - } - else - { - AudioTrack* track = (AudioTrack*)*i; - if(track->name() == s) - return Route(track, channel); - } - } - - for(iMidiDevice i = midiDevices.begin(); i != midiDevices.end(); ++i) - { - if((*i)->name() == s) - return Route(*i, channel); - } - - // p3.3.49 - if(s.left(ROUTE_MIDIPORT_NAME_PREFIX.length()) == ROUTE_MIDIPORT_NAME_PREFIX) - { - bool ok = false; - int port = s.mid(ROUTE_MIDIPORT_NAME_PREFIX.length()).toInt(&ok); - if(ok) - return Route(port, channel); - } - } - else - { - //if(dst) - //{ - if(rtype == Route::TRACK_ROUTE) - { - TrackList* tl = song->tracks(); - for(iTrack i = tl->begin(); i != tl->end(); ++i) - { - if((*i)->isMidiTrack()) - { - MidiTrack* track = (MidiTrack*)*i; - if(track->name() == s) - return Route(track, channel); - } - else - { - AudioTrack* track = (AudioTrack*)*i; - if(track->name() == s) - return Route(track, channel); - //return Route(track, channel, 1); - //return Route(track, channel, track->channels()); - } - } - } - else - //if((rtype == Route::JACK_MIDI_ROUTE) || (rtype == Route::ALSA_MIDI_ROUTE)) - // TODO Distinguish the device types - if(rtype == Route::MIDI_DEVICE_ROUTE) - { - for(iMidiDevice i = midiDevices.begin(); i != midiDevices.end(); ++i) - { - if((*i)->name() == s) - //if (jmd->name() == rn) - return Route(*i, channel); - - /* - MidiJackDevice* jmd = dynamic_cast<MidiJackDevice*>(*i); - if(jmd) - { - if(jmd->name() == s) - //if (jmd->name() == rn) - return Route(jmd); - } - MidiAlsaDevice* amd = dynamic_cast<MidiAlsaDevice*>(*i); - if(amd) - { - // TODO - if(amd->name() == s) - //if (amd->name() == rn) - return Route(amd); - } - */ - } - } - else - if(rtype == Route::JACK_ROUTE) - { - if(checkAudioDevice()) - { - void* p = audioDevice->findPort(s.toLatin1().constData()); - if(p) - return Route(p, channel); - } - } - else - if(rtype == Route::MIDI_PORT_ROUTE) // p3.3.49 - { - if(s.left(ROUTE_MIDIPORT_NAME_PREFIX.length()) == ROUTE_MIDIPORT_NAME_PREFIX) - { - bool ok = false; - int port = s.mid(ROUTE_MIDIPORT_NAME_PREFIX.length()).toInt(&ok); - if(ok) - return Route(port, channel); - } - } - } - - printf(" name2route: <%s> not found\n", rn.toLatin1().constData()); - return Route((Track*) 0, channel); - //return Route((Track*) 0, channel, 1); -} - -//--------------------------------------------------------- -// checkRoute -// return true if route is valid -//--------------------------------------------------------- - -bool checkRoute(const QString& s, const QString& d) - { - Route src(s, false, -1); - Route dst(d, true, -1); - - if (!(src.isValid() && dst.isValid()) || (src == dst)) - return false; - if (src.type == Route::JACK_ROUTE) - { - //if (dst.type != TRACK_ROUTE) { - // return false; - // } - - if (dst.type == Route::TRACK_ROUTE) - { - if (dst.track->type() != Track::AUDIO_INPUT) { - return false; - } - src.channel = dst.channel; - RouteList* inRoutes = dst.track->inRoutes(); - for (iRoute i = inRoutes->begin(); i != inRoutes->end(); ++i) - { - if (*i == src) { // route already there - return false; - } - } - } - else - //if (dst.type == Route::JACK_MIDI_ROUTE) - if (dst.type == Route::MIDI_DEVICE_ROUTE) - { - //src.channel = dst.channel; - src.channel = -1; - //dst.channel = -1; - RouteList* routes = dst.device->inRoutes(); - for (iRoute i = routes->begin(); i != routes->end(); ++i) - { - if (*i == src) { // route already there - return false; - } - } - } - else - return false; - } - else if (dst.type == Route::JACK_ROUTE) - { - //if (src.type != TRACK_ROUTE) { - // return false; - // } - - if (src.type == Route::TRACK_ROUTE) - { - if (src.track->type() != Track::AUDIO_OUTPUT) { - return false; - } - RouteList* outRoutes = src.track->outRoutes(); - dst.channel = src.channel; - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) { // route already there - return false; - } - } - } - else - //if (src.type == Route::JACK_MIDI_ROUTE) - if (src.type == Route::MIDI_DEVICE_ROUTE) - { - RouteList* routes = src.device->outRoutes(); - //dst.channel = src.channel; - dst.channel = -1; - //src.channel = -1; - for (iRoute i = routes->begin(); i != routes->end(); ++i) - { - if (*i == dst) { // route already there - return false; - } - } - } - else - return false; - } - else if (src.type == Route::MIDI_PORT_ROUTE) // p3.3.49 - { - RouteList* outRoutes = midiPorts[src.midiPort].outRoutes(); - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) { // route already there - return false; - } - } - } - //else if (dst.type == Route::MIDI_PORT_ROUTE) // p3.3.49 - //{ - //} - else - { - //RouteList* outRoutes = ((src.type == Route::JACK_MIDI_ROUTE) || (src.type == Route::ALSA_MIDI_ROUTE)) ? - // src.device->outRoutes() : src.track->outRoutes(); - RouteList* outRoutes = (src.type == Route::MIDI_DEVICE_ROUTE) ? src.device->outRoutes() : src.track->outRoutes(); - - for (iRoute i = outRoutes->begin(); i != outRoutes->end(); ++i) - { - if (*i == dst) { // route already there - return false; - } - } - } - return true; - } - -//--------------------------------------------------------- -// read -//--------------------------------------------------------- - -void Route::read(Xml& xml) -{ - QString s; - int dtype = MidiDevice::ALSA_MIDI; - int port = -1; // p3.3.49 - unsigned char rtype = Route::TRACK_ROUTE; - - for (;;) - { - const QString& tag = xml.s1(); - Xml::Token token = xml.parse(); - switch (token) - { - case Xml::Error: - case Xml::End: - return; - //case Xml::TagStart: - // xml.unknown("Route"); - // break; - case Xml::Attribut: - #ifdef ROUTE_DEBUG - printf("Route::read(): attribute:%s\n", tag.toLatin1().constData()); - #endif - if(tag == "type") - rtype = xml.s2().toInt(); - else - if(tag == "devtype") - { - dtype = xml.s2().toInt(); - rtype = Route::MIDI_DEVICE_ROUTE; - } - else - if(tag == "name") - s = xml.s2(); - else - if(tag == "mport") // p3.3.49 - { - port = xml.s2().toInt(); - rtype = Route::MIDI_PORT_ROUTE; - } - else - printf("Route::read(): unknown attribute:%s\n", tag.toLatin1().constData()); - break; - case Xml::TagEnd: - #ifdef ROUTE_DEBUG - printf("Route::read(): tag end type:%d channel:%d name:%s\n", rtype, channel, s.toLatin1().constData()); - #endif - if(rtype == MIDI_PORT_ROUTE) // p3.3.49 - { - if(port >= 0 && port < MIDI_PORTS) - { - type = rtype; - midiPort = port; - } - else - printf("Route::read(): midi port <%d> out of range\n", port); - } - else - if(!s.isEmpty()) - { - if(rtype == TRACK_ROUTE) - { - TrackList* tl = song->tracks(); - iTrack i = tl->begin(); - for ( ; i != tl->end(); ++i) - { - Track* t = *i; - if (t->name() == s) - { - track = t; - type = rtype; - break; - } - } - if(i == tl->end()) - printf("Route::read(): track <%s> not found\n", s.toLatin1().constData()); - } - else - if(rtype == JACK_ROUTE) - { - void* jport = audioDevice->findPort(s.toLatin1().constData()); - if(jport == 0) - printf("Route::read(): jack port <%s> not found\n", s.toLatin1().constData()); - else - { - jackPort = jport; - type = rtype; - } - } - else - if(rtype == MIDI_DEVICE_ROUTE) - { - iMidiDevice imd = midiDevices.begin(); - for( ; imd != midiDevices.end(); ++imd) - { - MidiDevice* md = *imd; - if(md->name() == s && md->deviceType() == dtype) - { - // p3.3.45 - // We found a device, but if it is not in use by the song (port is -1), ignore it. - // This prevents loading and propagation of bogus routes in the med file. - if(md->midiPort() == -1) - break; - - device = md; - type = rtype; - break; - } - } - if(imd == midiDevices.end()) - printf("Route::read(): midi device <%s> not found\n", s.toLatin1().constData()); - } - } - return; - default: - break; - } - } -} - - -//--------------------------------------------------------- -// read -//--------------------------------------------------------- - -void Song::readRoute(Xml& xml) -{ - QString src; - QString dst; - int ch = -1; - int chs = -1; - int remch = -1; - - Route sroute, droute; - - for (;;) - { - const QString& tag = xml.s1(); - Xml::Token token = xml.parse(); - switch (token) - { - case Xml::Error: - case Xml::End: - return; - case Xml::TagStart: - // p3.3.38 2010/02/03 Support old routes in med files. Now obsolete! - if (tag == "srcNode") - src = xml.parse1(); - else if (tag == "dstNode") - dst = xml.parse1(); - // Support new routes. - else if (tag == "source") - { - sroute.read(xml); - sroute.channel = ch; - sroute.channels = chs; - sroute.remoteChannel = remch; - } - else if (tag == "dest") - { - droute.read(xml); - droute.channel = ch; - droute.channels = chs; - droute.remoteChannel = remch; - } - else - xml.unknown("readRoute"); - break; - case Xml::Attribut: - #ifdef ROUTE_DEBUG - printf("Song::readRoute(): attribute:%s\n", tag.toLatin1().constData()); - #endif - if(tag == "channel") - ch = xml.s2().toInt(); - else - if(tag == "channels") - chs = xml.s2().toInt(); - else - if(tag == "remch") - remch = xml.s2().toInt(); - else - if(tag == "channelMask") // p3.3.50 New channel mask for midi port-track routes. - ch = xml.s2().toInt(); - else - printf("Song::readRoute(): unknown attribute:%s\n", tag.toLatin1().constData()); - break; - case Xml::TagEnd: - if (xml.s1() == "Route") - { - // Support old routes in med files. Now obsolete! - if(!src.isEmpty() && !dst.isEmpty()) - { - Route s = name2route(src, false); - Route d = name2route(dst, true); - addRoute(s, d); - } - else - // Support new routes. - if(sroute.isValid() && droute.isValid()) - { - // p3.3.49 Support pre- 1.1-RC2 midi-device-to-track routes. Obsolete. Replaced with midi port routes. - if(sroute.type == Route::MIDI_DEVICE_ROUTE && droute.type == Route::TRACK_ROUTE) - { - if(sroute.device->midiPort() >= 0 && sroute.device->midiPort() < MIDI_PORTS - && ch >= 0 && ch < MIDI_CHANNELS) // p3.3.50 - { - sroute.midiPort = sroute.device->midiPort(); - sroute.device = 0; - sroute.type = Route::MIDI_PORT_ROUTE; - - sroute.channel = 1 << ch; // p3.3.50 Convert to new bit-wise channel mask. - droute.channel = sroute.channel; - - addRoute(sroute, droute); - } - else - printf(" Warning - device:%s to track route, no device midi port or chan:%d out of range. Ignoring route!\n", - sroute.device->name().toLatin1().constData(), ch); - } - else if(sroute.type == Route::TRACK_ROUTE && droute.type == Route::MIDI_DEVICE_ROUTE) - { - if(droute.device->midiPort() >= 0 && droute.device->midiPort() < MIDI_PORTS - && ch >= 0 && ch < MIDI_CHANNELS) // p3.3.50 - { - droute.midiPort = droute.device->midiPort(); - droute.device = 0; - droute.type = Route::MIDI_PORT_ROUTE; - - droute.channel = 1 << ch; // p3.3.50 Convert to new bit-wise channel mask. - sroute.channel = droute.channel; - - addRoute(sroute, droute); - } - else - printf(" Warning - track to device:%s route, no device midi port or chan:%d out of range. Ignoring route!\n", - droute.device->name().toLatin1().constData(), ch); - } - else - { - //printf("adding new route...\n"); - addRoute(sroute, droute); - } - } - else - printf(" Warning - route invalid. Ignoring route!\n"); - - return; - } - default: - break; - } - } -} - -//--------------------------------------------------------- -// removeRoute -//--------------------------------------------------------- - -void RouteList::removeRoute(const Route& r) - { - //printf("RouteList::removeRoute:\n"); - //r.dump(); - //printf("Searching routes:\n"); - - for (iRoute i = begin(); i != end(); ++i) { - //i->dump(); - if (r == *i) { - erase(i); - return; - } - } - printf("internal error: cannot remove Route\n"); - } - -//--------------------------------------------------------- -// dump -//--------------------------------------------------------- - -void Route::dump() const -{ - if (type == TRACK_ROUTE) - { - if(track) - printf("Route dump: track <%s> channel %d channels %d\n", track->name().toLatin1().constData(), channel, channels); - //printf("Route dump: track <%s> channel %d\n", track->name().toLatin1().constData(), channel); - //else - // printf("Route dump: invalid track, channel %d\n", channel); - } - else - if (type == JACK_ROUTE) - { - if(checkAudioDevice()) - printf("Route dump: jack audio port <%s> channel %d\n", audioDevice->portName(jackPort).toLatin1().constData(), channel); - } - else - if (type == MIDI_PORT_ROUTE) // p3.3.49 - { - printf("Route dump: midi port <%d> channel mask %d\n", midiPort, channel); - } - else - if (type == MIDI_DEVICE_ROUTE) - { - printf("Route dump: "); - if(device) - { - if(device->deviceType() == MidiDevice::JACK_MIDI) - { - if(checkAudioDevice()) - //printf("jack midi port device <%s> ", audioDevice->portName(device->clientPort()).toLatin1().constData()); - // p3.3.55 - { - printf("jack midi device <%s> ", device->name().toLatin1().constData()); - if(device->inClientPort()) - printf("input port <%s> ", - audioDevice->portName(device->inClientPort()).toLatin1().constData()); - if(device->outClientPort()) - printf("output port <%s> ", - audioDevice->portName(device->outClientPort()).toLatin1().constData()); - } - } - else - if(device->deviceType() == MidiDevice::ALSA_MIDI) - printf("alsa midi device <%s> ", device->name().toLatin1().constData()); - else - if(device->deviceType() == MidiDevice::SYNTH_MIDI) - printf("synth midi device <%s> ", device->name().toLatin1().constData()); - else - printf("is midi but unknown device type:%d, ", device->deviceType()); - } - else - printf("is midi but invalid device, "); - - printf("channel:%d\n", channel); - } - else - printf("Route dump: unknown route type:%d\n", type); -} - -//--------------------------------------------------------- -// operator== -//--------------------------------------------------------- - -bool Route::operator==(const Route& a) const -{ - //if (type == MIDI_PORT_ROUTE) // p3.3.50 - //{ - // Use new channel mask. True if all the bits in a.channel are contained in this route's channel. - // Hmm, not commutative... Two such routes are equal if _____ what? ... Code-specific for now. - // return midiPort == a.midiPort && (channel & a.channel) == a.channel; - //} - //else - - if ((type == a.type) && (channel == a.channel)) - //if (type == a.type) - { - if (type == TRACK_ROUTE) - { - return track == a.track && channels == a.channels && remoteChannel == a.remoteChannel; - } - else - if(channel == a.channel) - { - if (type == JACK_ROUTE) - { - //if (!checkAudioDevice()) return false; - //return audioDevice->portName(jackPort) == audioDevice->portName(a.jackPort); - // p3.3.55 Simplified. - return jackPort == a.jackPort; - } - else - if (type == MIDI_PORT_ROUTE) // p3.3.49 - { - return midiPort == a.midiPort; - } - else - if (type == MIDI_DEVICE_ROUTE) - { - // p3.3.55 Changed for unified jack in/out devices, the actual port names are now different from device name. - // Like this: device: "MyJackDevice1" -> inport: "MyJackDevice1_in" outport: "MyJackDevice1_out" - /* - if(device && a.device && device->deviceType() == a.device->deviceType()) - { - if(device->deviceType() == MidiDevice::JACK_MIDI) - { - if (!checkAudioDevice()) return false; - return audioDevice->portName(device->clientPort()) == audioDevice->portName(a.device->clientPort()); - } - else - if(device->deviceType() == MidiDevice::ALSA_MIDI) - // TODO: OK ?? - return device->clientPort() == a.device->clientPort() && (channel == a.channel); - else - if(device->deviceType() == MidiDevice::SYNTH_MIDI) - return device->name() == a.device->name(); - } - */ - return device == a.device; - } - } - } - return false; -} - |