diff options
author | Werner Schweer <ws.seh.de> | 2006-10-23 10:33:08 +0000 |
---|---|---|
committer | Werner Schweer <ws.seh.de> | 2006-10-23 10:33:08 +0000 |
commit | 782da3b949f8f0f2c0016187a2c88e665a762d7a (patch) | |
tree | 6c8d1d7d6f15a35610b197a1555cba8dc7fc1e9f | |
parent | 7209944860501af4868f166f4cff59559bdb567e (diff) |
routing fixes & cleanups
-rw-r--r-- | muse/muse/driver/alsamidi.cpp | 17 | ||||
-rw-r--r-- | muse/muse/driver/jack.cpp | 35 | ||||
-rw-r--r-- | muse/muse/mixer/astrip.cpp | 4 | ||||
-rw-r--r-- | muse/muse/mixer/mstrip.cpp | 78 | ||||
-rw-r--r-- | muse/muse/route.cpp | 22 | ||||
-rw-r--r-- | muse/muse/route.h | 5 | ||||
-rw-r--r-- | muse/muse/song.cpp | 42 | ||||
-rw-r--r-- | muse/muse/track.cpp | 71 |
8 files changed, 159 insertions, 115 deletions
diff --git a/muse/muse/driver/alsamidi.cpp b/muse/muse/driver/alsamidi.cpp index e982d03a..810ace1e 100644 --- a/muse/muse/driver/alsamidi.cpp +++ b/muse/muse/driver/alsamidi.cpp @@ -406,12 +406,10 @@ void AlsaMidi::removeConnection(snd_seq_connect_t* ev) Port dst = iport->alsaPort(); if (equal(dst, rd)) { - RouteList* irl = iport->inRoutes(); - for (iRoute ir = irl->begin(); ir != irl->end(); ++ir) { - Port src = ir->port; - - if (equal(src, rs)) { - irl->erase(ir); + RouteList* irl = iport->outRoutes(); + for (iRoute r = irl->begin(); r != irl->end(); ++r) { + if (!r->disconnected && equal(r->port, rs)) { + iport->inRoutes()->erase(r); break; } } @@ -427,11 +425,8 @@ void AlsaMidi::removeConnection(snd_seq_connect_t* ev) if (equal(src, rs)) { RouteList* orl = oport->outRoutes(); for (iRoute r = orl->begin(); r != orl->end(); ++r) { - Port dst = r->port; - - if (equal(dst, rd)) { + if (!r->disconnected && equal(r->port, rd)) { orl->erase(r); -printf("REMOVE OUT connection\n"); break; } } @@ -678,12 +673,10 @@ bool AlsaMidi::putEvent(snd_seq_event_t* event) error = snd_seq_event_output_direct(alsaSeq, event); int len = snd_seq_event_length(event); if (error == len) { -// printf(".");fflush(stdout); return false; } if (error < 0) { if (error == -12) { -// printf("?");fflush(stdout); return true; } else { diff --git a/muse/muse/driver/jack.cpp b/muse/muse/driver/jack.cpp index 014bd20b..2bccbfcf 100644 --- a/muse/muse/driver/jack.cpp +++ b/muse/muse/driver/jack.cpp @@ -275,21 +275,16 @@ struct RouteRoute { void JackAudio::graphChanged() { - // under construction - return; - QList<RouteRoute> rr; QList<RouteRoute> ra; -printf("graphChanged\n"); +// printf("graphChanged\n"); InputList* il = song->inputs(); for (iAudioInput ii = il->begin(); ii != il->end(); ++ii) { AudioInput* it = *ii; int channels = it->channels(); RouteList* irl = it->inRoutes(); -printf(" inRoutes %d\n", irl->size()); - for (int channel = 0; channel < channels; ++channel) { jack_port_t* port = (jack_port_t*)(it->jackPort(channel)); if (port == 0) @@ -301,15 +296,12 @@ printf(" inRoutes %d\n", irl->size()); //--------------------------------------- foreach (Route r, *irl) { -printf(" channel %d %d\n", r.channel, channel); if (r.channel != channel) continue; const char* name = jack_port_name((jack_port_t*)r.port); -printf(" port name <%s>\n", name); bool found = false; for (const char** pn = ports; pn && *pn; ++pn) { if (strcmp(*pn, name) == 0) { -printf(" compare <%s><%s>\n", *pn, name); found = true; break; } @@ -352,7 +344,7 @@ printf(" compare <%s><%s>\n", *pn, name); } } -printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); +// printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); foreach(RouteRoute a, rr) { audio->msgRemoveRoute1(a.src, a.dst); } @@ -377,10 +369,10 @@ printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); // check for disconnects //--------------------------------------- - for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) { - if (irl->channel != channel) + foreach(Route r, *rl) { + if (r.channel != channel) continue; - const char* name = jack_port_name((jack_port_t*)irl->port); + const char* name = jack_port_name((jack_port_t*)r.port); bool found = false; const char** pn = ports; while (pn && *pn) { @@ -393,7 +385,7 @@ printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); if (!found) { RouteRoute a; a.src = Route(it, channel); - a.dst = Route(irl->port, channel, Route::AUDIOPORT); + a.dst = Route(r.port, channel, Route::AUDIOPORT); rr.append(a); } } @@ -406,12 +398,10 @@ printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); const char** pn = ports; while (*pn) { bool found = false; - Port port; for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) { if (irl->channel != channel) continue; - port = irl->port; - const char* name = jack_port_name((jack_port_t*)port); + const char* name = jack_port_name((jack_port_t*)irl->port); if (strcmp(*pn, name) == 0) { found = true; break; @@ -420,6 +410,7 @@ printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); if (!found) { RouteRoute a; a.src = Route(it, channel); + Port port = jack_port_by_name(_client, *pn); a.dst = Route(port, channel, Route::AUDIOPORT); ra.append(a); } @@ -429,7 +420,7 @@ printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); } } } -printf(" input: remove %d add %d routes\n", rr.size(), ra.size()); +// printf(" output: remove %d add %d routes\n", rr.size(), ra.size()); foreach(RouteRoute a, rr) audio->msgRemoveRoute1(a.src, a.dst); foreach(RouteRoute a, ra) @@ -653,9 +644,11 @@ QString JackAudio::portName(void* port) void JackAudio::unregisterPort(Port p) { - //printf("JACK: unregister Port %p\n", p); - if (_client) - jack_port_unregister(_client, (jack_port_t*)p); + if (_client) { +// printf("JACK: unregister Port %p\n", p); + if (jack_port_unregister(_client, (jack_port_t*)p)) + fprintf(stderr, "jack unregister port %p failed\n", p); + } } //--------------------------------------------------------- diff --git a/muse/muse/mixer/astrip.cpp b/muse/muse/mixer/astrip.cpp index 754861f1..263467b6 100644 --- a/muse/muse/mixer/astrip.cpp +++ b/muse/muse/mixer/astrip.cpp @@ -722,6 +722,8 @@ void AudioStrip::iRoutePressed() addMidiInPorts(t, &pup, irl); break; } + if (pup.isEmpty()) + return; QAction* n = pup.exec(QCursor::pos()); if (n != 0) { Route srcRoute = n->data().value<Route>(); @@ -785,6 +787,8 @@ void AudioStrip::oRoutePressed() addGroupPorts(t, &pup, orl); break; } + if (pup.isEmpty()) + return; QAction* n = pup.exec(QCursor::pos()); if (n != 0) { QString s(n->text()); diff --git a/muse/muse/mixer/mstrip.cpp b/muse/muse/mixer/mstrip.cpp index 9173509f..23b873c2 100644 --- a/muse/muse/mixer/mstrip.cpp +++ b/muse/muse/mixer/mstrip.cpp @@ -350,8 +350,9 @@ void MidiChannelStrip::autoWriteToggled(bool val) void MidiChannelStrip::iRoutePressed() { - QMenu* pup = new QMenu(iR); - pup->addSeparator()->setText(tr("Tracks")); + QMenu pup(iR); + pup.setSeparatorsCollapsible(false); + pup.addSeparator()->setText(tr("Tracks")); MidiChannel* t = (MidiChannel*)track; RouteList* irl = t->inRoutes(); @@ -360,7 +361,7 @@ void MidiChannelStrip::iRoutePressed() int tn = 0; for (iMidiTrack i = tl->begin();i != tl->end(); ++i, ++tn) { MidiTrack* track = *i; - QAction* action = pup->addAction(track->name()); + QAction* action = pup.addAction(track->name()); action->setCheckable(true); Route src(track, -1, Route::TRACK); action->setData(QVariant::fromValue(src)); @@ -371,7 +372,9 @@ void MidiChannelStrip::iRoutePressed() } } } - QAction* n = pup->exec(QCursor::pos()); + if (pup.isEmpty()) + return; + QAction* n = pup.exec(QCursor::pos()); if (n) { Route srcRoute = n->data().value<Route>(); Route dstRoute(track, -1, Route::TRACK); @@ -382,7 +385,6 @@ void MidiChannelStrip::iRoutePressed() audio->msgRemoveRoute(srcRoute, dstRoute); song->update(SC_ROUTE); } - delete pup; iR->setDown(false); // pup->exec() catches mouse release event } @@ -540,15 +542,17 @@ void MidiStrip::recordToggled(bool val) void MidiStrip::iRoutePressed() { - QMenu* pup = new QMenu(oR); - pup->addSeparator()->setText(tr("Input Ports")); + QMenu pup(oR); + pup.setSeparatorsCollapsible(false); + pup.addSeparator()->setText(tr("Input Ports")); + MidiOutPort* t = (MidiOutPort*)track; RouteList* irl = t->inRoutes(); MidiInPortList* ipl = song->midiInPorts(); int tn = 0; for (iMidiInPort i = ipl->begin(); i != ipl->end(); ++i, ++tn) { - QMenu* m = pup->addMenu((*i)->name()); + QMenu* m = pup.addMenu((*i)->name()); m->addSeparator()->setText(tr("Channel")); QAction* all_action = m->addAction(tr("All")); QMap<QString, QVariant> map; @@ -576,8 +580,9 @@ void MidiStrip::iRoutePressed() } } } - - QAction* n = pup->exec(QCursor::pos()); + if (pup.isEmpty()) + return; + QAction* n = pup.exec(QCursor::pos()); if (n) { QMap<QString, QVariant> data = n->data().toMap(); int trackid = data["id"].toInt(); @@ -604,7 +609,6 @@ void MidiStrip::iRoutePressed() } song->update(SC_ROUTE); } - delete pup; iR->setDown(false); // pup->exec() catches mouse release event } @@ -641,6 +645,8 @@ void MidiStrip::oRoutePressed() } } } + if (pup.isEmpty()) + return; QAction* n = pup.exec(QCursor::pos()); if (n) { Route srcRoute(track, -1, Route::TRACK); @@ -900,13 +906,14 @@ void MidiOutPortStrip::controllerChanged(int id) void MidiOutPortStrip::oRoutePressed() { - QMenu* pup = new QMenu(oR); - pup->addSeparator()->setText(tr("MidiDevices")); + QMenu pup(oR); + pup.setSeparatorsCollapsible(false); + pup.addSeparator()->setText(tr("MidiDevices")); RouteList* orl = track->outRoutes(); QList<PortName> ol = midiDriver->outputPorts(true); foreach (PortName ip, ol) { - QAction* oa = pup->addAction(ip.name); + QAction* oa = pup.addAction(ip.name); oa->setCheckable(true); Route dst(ip.port, Route::MIDIPORT); oa->setData(QVariant::fromValue(dst)); @@ -925,7 +932,7 @@ void MidiOutPortStrip::oRoutePressed() SynthIList* sl = song->syntis(); for (iSynthI i = sl->begin(); i != sl->end(); ++i) { SynthI* track = *i; - QAction* oa = pup->addAction(track->name()); + QAction* oa = pup.addAction(track->name()); oa->setCheckable(true); Route dst(track, -1, Route::SYNTIPORT); oa->setData(QVariant::fromValue(dst)); @@ -943,7 +950,7 @@ void MidiOutPortStrip::oRoutePressed() // ol = audioDriver->inputPorts(true); foreach (PortName ip, ol) { - QAction* oa = pup->addAction(ip.name); + QAction* oa = pup.addAction(ip.name); oa->setCheckable(true); Route dst(ip.port, Route::JACKMIDIPORT); oa->setData(QVariant::fromValue(dst)); @@ -955,8 +962,9 @@ void MidiOutPortStrip::oRoutePressed() } } } - - QAction* action = pup->exec(QCursor::pos()); + if (pup.isEmpty()) + return; + QAction* action = pup.exec(QCursor::pos()); if (action) { Route dstRoute = action->data().value<Route>(); Route srcRoute(track); @@ -967,7 +975,6 @@ void MidiOutPortStrip::oRoutePressed() audio->msgRemoveRoute(srcRoute, dstRoute); song->update(SC_ROUTE); } - delete pup; oR->setDown(false); // pup->exec() catches mouse release event } @@ -1121,8 +1128,9 @@ void MidiInPortStrip::soloToggled(bool val) void MidiInPortStrip::oRoutePressed() { - QMenu* pup = new QMenu(tr("Channel"), oR); - pup->addSeparator()->setText(tr("Channel")); + QMenu pup(oR); + pup.setSeparatorsCollapsible(false); + pup.addSeparator()->setText(tr("Channel")); MidiTrackList* tl = song->midis(); MidiSyntiList* sl = song->midiSyntis(); @@ -1131,7 +1139,7 @@ void MidiInPortStrip::oRoutePressed() int sn = 0; for (iSynthI i = asl->begin(); i != asl->end(); ++i,++sn) { - QAction* action = pup->addAction((*i)->name()); + QAction* action = pup.addAction((*i)->name()); QMap<QString, QVariant> data; data["id"] = QVariant(0x20000 + sn); @@ -1150,7 +1158,7 @@ void MidiInPortStrip::oRoutePressed() } } for (int channel = 0; channel < MIDI_CHANNELS; ++channel) { - QMenu* m = pup->addMenu(QString(tr("Channel %1")).arg(channel + 1)); + QMenu* m = pup.addMenu(QString(tr("Channel %1")).arg(channel + 1)); m->addSeparator()->setText(tr("Tracks")); // @@ -1201,8 +1209,9 @@ void MidiInPortStrip::oRoutePressed() } } } - - QAction* action = pup->exec(QCursor::pos()); + if (pup.isEmpty()) + return; + QAction* action = pup.exec(QCursor::pos()); if (action) { int n = action->data().toMap()["id"].toInt(); int was_checked = action->data().toMap()["was_checked"].toInt(); @@ -1233,7 +1242,6 @@ void MidiInPortStrip::oRoutePressed() audio->msgAddRoute(srcRoute, dstRoute); song->update(SC_ROUTE); } - delete pup; oR->setDown(false); // pup->exec() catches mouse release event } @@ -1243,14 +1251,15 @@ void MidiInPortStrip::oRoutePressed() void MidiInPortStrip::iRoutePressed() { - QMenu* pup = new QMenu(oR); - pup->addSeparator()->setText(tr("AlsaDevices")); + QMenu pup(oR); + pup.setSeparatorsCollapsible(false); + pup.addSeparator()->setText(tr("AlsaDevices")); RouteList* irl = track->inRoutes(); QList<PortName> ol = midiDriver->inputPorts(false); foreach (PortName ip, ol) { - QAction* action = pup->addAction(ip.name); + QAction* action = pup.addAction(ip.name); action->setCheckable(true); Route src(ip.port, Route::MIDIPORT); action->setData(QVariant::fromValue(src)); @@ -1266,7 +1275,7 @@ void MidiInPortStrip::iRoutePressed() // ol = audioDriver->outputPorts(true); foreach (PortName ip, ol) { - QAction* action = pup->addAction(ip.name); + QAction* action = pup.addAction(ip.name); action->setCheckable(true); Route src(ip.port, Route::JACKMIDIPORT); action->setData(QVariant::fromValue(src)); @@ -1278,7 +1287,9 @@ void MidiInPortStrip::iRoutePressed() } } } - QAction* action = pup->exec(QCursor::pos()); + if (pup.isEmpty()) + return; + QAction* action = pup.exec(QCursor::pos()); if (action) { Route srcRoute = action->data().value<Route>(); Route dstRoute(track, -1, Route::TRACK); @@ -1299,7 +1310,6 @@ void MidiInPortStrip::iRoutePressed() } song->update(SC_ROUTE); } - delete pup; iR->setDown(false); // pup->exec() catches mouse release event } @@ -1565,6 +1575,8 @@ void MidiSyntiStrip::oRoutePressed() } } } + if (pup.isEmpty()) + return; QAction* action = pup.exec(QCursor::pos()); if (action) { Route dstRoute = action->data().value<Route>(); @@ -1632,6 +1644,8 @@ void MidiSyntiStrip::iRoutePressed() } } + if (pup.isEmpty()) + return; QAction* action = pup.exec(QCursor::pos()); if (action) { Route srcRoute = action->data().value<Route>(); diff --git a/muse/muse/route.cpp b/muse/muse/route.cpp index 1589b480..22b6b3f1 100644 --- a/muse/muse/route.cpp +++ b/muse/muse/route.cpp @@ -33,11 +33,20 @@ // Route //--------------------------------------------------------- +Route::Route() + { + track = 0; + channel = -1; + type = TRACK; + disconnected = false; + } + Route::Route(Port p, int ch, RouteType t) { port = p; channel = ch; type = t; + disconnected = false; } Route::Route(Port p, RouteType t) @@ -45,6 +54,7 @@ Route::Route(Port p, RouteType t) port = p; channel = -1; type = t; + disconnected = false; } Route::Route(Track* tr) @@ -52,6 +62,7 @@ Route::Route(Track* tr) track = tr; channel = -1; type = TRACK; + disconnected = false; } Route::Route(AuxPluginIF* p) @@ -59,6 +70,7 @@ Route::Route(AuxPluginIF* p) plugin = p; channel = -1; type = AUXPLUGIN; + disconnected = false; } Route::Route(Track* tr, int ch, RouteType t) @@ -66,13 +78,7 @@ Route::Route(Track* tr, int ch, RouteType t) track = tr; channel = ch; type = t; - } - -Route::Route() - { - track = 0; - channel = -1; - type = TRACK; + disconnected = false; } //--------------------------------------------------------- @@ -280,6 +286,8 @@ void Song::readRoute(QDomNode n) d.channel = s.channel; if (s.type == Route::TRACK && s.track->type() == Track::MIDI_IN) d.channel = s.channel; + s.disconnected = true; + d.disconnected = true; addRoute(s, d); } diff --git a/muse/muse/route.h b/muse/muse/route.h index 54b574bc..5d17c5c0 100644 --- a/muse/muse/route.h +++ b/muse/muse/route.h @@ -66,7 +66,10 @@ struct Route { Port port; AuxPluginIF* plugin; }; - int channel; // route to/from JACK can specify a channel to connect to + int channel; // route to/from JACK can specify a channel to connect to + bool disconnected; // if true, do not remove route in graphChanged() + // or removeConnection() + RouteType type; Route(); diff --git a/muse/muse/song.cpp b/muse/muse/song.cpp index d3bde0e3..429019f0 100644 --- a/muse/muse/song.cpp +++ b/muse/muse/song.cpp @@ -1705,34 +1705,33 @@ void Song::insertTrack2(Track* track) if (track->type() == Track::AUDIO_SOFTSYNTH) src.type = Route::SYNTIPORT; if (track->type() == Track::AUDIO_OUTPUT || track->type() == Track::MIDI_OUT) { - const RouteList* rl = track->inRoutes(); - for (ciRoute r = rl->begin(); r != rl->end(); ++r) { - src.channel = r->channel; - r->track->outRoutes()->push_back(src); + foreach(Route r, *(track->inRoutes())) { + if (r.type != Route::AUXPLUGIN) { + src.channel = r.channel; + r.track->outRoutes()->push_back(src); + } } } else if (track->type() == Track::AUDIO_INPUT || track->type() == Track::MIDI_IN) { - const RouteList* rl = track->outRoutes(); - for (ciRoute r = rl->begin(); r != rl->end(); ++r) { - src.channel = r->channel; - r->track->inRoutes()->push_back(src); + foreach(Route r, *(track->outRoutes())) { + if (r.type != Route::AUXPLUGIN) { + src.channel = r.channel; + r.track->inRoutes()->push_back(src); + } } } else { - const RouteList* rl = track->inRoutes(); - for (ciRoute r = rl->begin(); r != rl->end(); ++r) { - Route rt = *r; - src.channel = rt.channel; - if (rt.type == Route::AUXPLUGIN) - continue; - rt.track->outRoutes()->push_back(src); + foreach(Route r, *(track->inRoutes())) { + if (r.type != Route::AUXPLUGIN) { + src.channel = r.channel; + r.track->outRoutes()->push_back(src); + } } - rl = track->outRoutes(); - for (ciRoute r = rl->begin(); r != rl->end(); ++r) { - src.channel = r->channel; - if (r->type == Route::AUXPLUGIN) - continue; - r->track->inRoutes()->push_back(src); + foreach(Route r, *(track->outRoutes())) { + if (r.type != Route::AUXPLUGIN) { + src.channel = r.channel; + r.track->inRoutes()->push_back(src); + } } } } @@ -1760,7 +1759,6 @@ void Song::removeTrack(Track* track) void Song::removeTrack1(Track* track) { -// if (track->type() != Track::MIDI_OUT && track->type() != Track::MIDI_IN) track->deactivate(); _tracks.erase(track); } diff --git a/muse/muse/track.cpp b/muse/muse/track.cpp index 7a55cd8d..bcb3ff3c 100644 --- a/muse/muse/track.cpp +++ b/muse/muse/track.cpp @@ -970,7 +970,8 @@ void Track::resetAllMeter() } //--------------------------------------------------------- -// activate +// activate1 +// register JACK and ALSA ports //--------------------------------------------------------- void Track::activate1() @@ -990,6 +991,7 @@ void Track::activate1() } return; } + for (int i = 0; i < channels(); ++i) { if (jackPort(i)) printf("Track::activate1(): already active!\n"); @@ -1005,7 +1007,7 @@ void Track::activate1() //--------------------------------------------------------- // activate2 -// connect all in/out routes +// connect all JACK/ALSA in/out routes // connect to JACK only works if JACK is running //--------------------------------------------------------- @@ -1015,55 +1017,84 @@ void Track::activate2() printf("Track::activate2(): no audio running !\n"); abort(); } - foreach(Route r, _outRoutes) { - if (r.type == Route::JACKMIDIPORT) + for (iRoute ri = _outRoutes.begin(); ri != _outRoutes.end(); ++ri) { + Route& r = *ri; + if (r.type == Route::JACKMIDIPORT) { audioDriver->connect(_jackPort[0], r.port); - else if (r.type == Route::MIDIPORT) + r.disconnected = false; + } + else if (r.type == Route::AUDIOPORT) { + audioDriver->connect(_jackPort[r.channel], r.port); + r.disconnected = false; + } + else if (r.type == Route::MIDIPORT) { midiDriver->connect(_alsaPort[0], r.port); + r.disconnected = false; + } } - foreach(Route r, _inRoutes) { - if (r.type == Route::JACKMIDIPORT) + for (iRoute ri = _inRoutes.begin(); ri != _inRoutes.end(); ++ri) { + Route& r = *ri; + if (r.type == Route::JACKMIDIPORT) { audioDriver->connect(r.port, _jackPort[0]); - else if (r.type == Route::MIDIPORT) + r.disconnected = false; + } + else if (r.type == Route::AUDIOPORT) { + audioDriver->connect(r.port, _jackPort[r.channel]); + r.disconnected = false; + } + else if (r.type == Route::MIDIPORT) { midiDriver->connect(r.port, _alsaPort[0]); + r.disconnected = false; + } } } //--------------------------------------------------------- // deactivate +// disconnect and unregister JACK and ALSA ports //--------------------------------------------------------- void Track::deactivate() { - foreach (Route r, _outRoutes) { - if (r.type == Route::JACKMIDIPORT) + for (iRoute ri = _outRoutes.begin(); ri != _outRoutes.end(); ++ri) { + Route& r = *ri; + if (r.type == Route::JACKMIDIPORT) { + r.disconnected = true; audioDriver->disconnect(_jackPort[0], r.port); - else if (r.type == Route::AUDIOPORT) + } + else if (r.type == Route::AUDIOPORT) { audioDriver->disconnect(_jackPort[r.channel], r.port); - else if (r.type == Route::MIDIPORT) + r.disconnected = true; + } + else if (r.type == Route::MIDIPORT) { + r.disconnected = true; midiDriver->disconnect(_alsaPort[0], r.port); + } } - foreach (Route r, _inRoutes) { - if (r.type == Route::JACKMIDIPORT) + for (iRoute ri = _inRoutes.begin(); ri != _inRoutes.end(); ++ri) { + Route& r = *ri; + if (r.type == Route::JACKMIDIPORT) { + r.disconnected = true; audioDriver->disconnect(r.port, _jackPort[0]); - else if (r.type == Route::AUDIOPORT) + } + else if (r.type == Route::AUDIOPORT) { + r.disconnected = true; audioDriver->disconnect(r.port, _jackPort[r.channel]); - else if (r.type == Route::MIDIPORT) + } + else if (r.type == Route::MIDIPORT) { + r.disconnected = true; midiDriver->disconnect(r.port, _alsaPort[0]); + } } for (int i = 0; i < channels(); ++i) { if (_jackPort[i]) { audioDriver->unregisterPort(_jackPort[i]); _jackPort[i] = 0; } - else - printf("Track::deactivate(): jack port not active!\n"); if (_alsaPort[i]) { midiDriver->unregisterPort(_alsaPort[i]); _alsaPort[i] = 0; } - else - printf("Track::deactivate(): alsa port not active!\n"); } } |