diff options
-rw-r--r-- | muse/muse/driver/jack.cpp | 134 | ||||
-rw-r--r-- | muse/muse/seqmsg.cpp | 2 | ||||
-rw-r--r-- | muse/muse/track.cpp | 6 |
3 files changed, 72 insertions, 70 deletions
diff --git a/muse/muse/driver/jack.cpp b/muse/muse/driver/jack.cpp index 733cd70d..5df57475 100644 --- a/muse/muse/driver/jack.cpp +++ b/muse/muse/driver/jack.cpp @@ -306,8 +306,16 @@ static int graph_callback(void*) // by graph_callback() //--------------------------------------------------------- +struct RouteRoute { + Route src; + Route dst; + }; + void JackAudio::graphChanged() { + QList<RouteRoute> rr; + QList<RouteRoute> ra; + InputList* il = song->inputs(); for (iAudioInput ii = il->begin(); ii != il->end(); ++ii) { AudioInput* it = *ii; @@ -318,38 +326,30 @@ void JackAudio::graphChanged() continue; const char** ports = jack_port_get_all_connections(_client, port); RouteList* rl = it->inRoutes(); - //--------------------------------------- // check for disconnects //--------------------------------------- - bool erased; - for (;;) { - erased = false; - for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) { - if (irl->channel != channel) - continue; - const char* name = jack_port_name((jack_port_t*)irl->port); - bool found = false; - const char** pn = ports; - while (pn && *pn) { - if (strcmp(*pn, name) == 0) { - found = true; - break; - } - ++pn; - } - if (!found) { - audio->msgRemoveRoute1( - Route(irl->port, channel, Route::AUDIOPORT), - Route(it, channel) - ); - erased = true; + for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) { + if (irl->channel != channel) + continue; + Route r = *irl; + const char* name = jack_port_name((jack_port_t*)r.port); + bool found = false; + const char** pn = ports; + while (pn && *pn) { + if (strcmp(*pn, name) == 0) { + found = true; break; } + ++pn; + } + if (!found) { + RouteRoute a; + a.src = Route(irl->port, channel, Route::AUDIOPORT); + a.dst = Route(it, channel); + rr.append(a); } - if (!erased) - break; } //--------------------------------------- @@ -357,33 +357,40 @@ void JackAudio::graphChanged() //--------------------------------------- if (ports) { - const char** pn = ports; - while (*pn) { + for (const char** pn = ports; *pn; ++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; } } if (!found) { - audio->msgAddRoute1( - Route(port, channel, Route::AUDIOPORT), - Route(it, channel) - ); + RouteRoute a; + Port port = jack_port_by_name(_client, *pn); + a.src = Route(port, channel, Route::AUDIOPORT); + a.dst = Route(it, channel); + ra.append(a); } - ++pn; } - delete ports; + free(ports); } } } + + foreach(RouteRoute a, rr) { + audio->msgRemoveRoute1(a.src, a.dst); + } + foreach(RouteRoute a, ra) { + audio->msgAddRoute1(a.src, a.dst); + } + rr.clear(); + ra.clear(); + OutputList* ol = song->outputs(); for (iAudioOutput ii = ol->begin(); ii != ol->end(); ++ii) { AudioOutput* it = *ii; @@ -399,33 +406,25 @@ void JackAudio::graphChanged() // check for disconnects //--------------------------------------- - bool erased; - for (;;) { - erased = false; - for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) { - if (irl->channel != channel) - continue; - const char* name = jack_port_name((jack_port_t*)irl->port); - bool found = false; - const char** pn = ports; - while (pn && *pn) { - if (strcmp(*pn, name) == 0) { - found = true; - break; - } - ++pn; - } - if (!found) { - audio->msgRemoveRoute1( - Route(it, channel), - Route(irl->port, channel, Route::AUDIOPORT) - ); - erased = true; + for (iRoute irl = rl->begin(); irl != rl->end(); ++irl) { + if (irl->channel != channel) + continue; + const char* name = jack_port_name((jack_port_t*)irl->port); + bool found = false; + const char** pn = ports; + while (pn && *pn) { + if (strcmp(*pn, name) == 0) { + found = true; break; } + ++pn; + } + if (!found) { + RouteRoute a; + a.src = Route(it, channel); + a.dst = Route(irl->port, channel, Route::AUDIOPORT); + rr.append(a); } - if (!erased) - break; } //--------------------------------------- @@ -448,18 +447,21 @@ void JackAudio::graphChanged() } } if (!found) { - audio->msgAddRoute1( - Route(it, channel), - Route(port, channel, Route::AUDIOPORT) - ); + RouteRoute a; + a.src = Route(it, channel); + a.dst = Route(port, channel, Route::AUDIOPORT); + ra.append(a); } ++pn; } - - delete ports; + free(ports); } } } + foreach(RouteRoute a, rr) + audio->msgRemoveRoute1(a.src, a.dst); + foreach(RouteRoute a, ra) + audio->msgAddRoute1(a.src, a.dst); } //static int xrun_callback(void*) diff --git a/muse/muse/seqmsg.cpp b/muse/muse/seqmsg.cpp index 7c427d15..356745d1 100644 --- a/muse/muse/seqmsg.cpp +++ b/muse/muse/seqmsg.cpp @@ -117,7 +117,6 @@ void Audio::msgAddRoute(Route src, Route dst) msgAddRoute1(src, dst); if (src.type == Route::AUDIOPORT) { AudioInput* ai = (AudioInput*)dst.track; -printf(" dst channel: %d\n", dst.channel); audioDriver->connect(src.port, ai->jackPort(dst.channel)); } if (src.type == Route::MIDIPORT) { @@ -125,7 +124,6 @@ printf(" dst channel: %d\n", dst.channel); } else if (dst.type == Route::AUDIOPORT) { AudioOutput* ao = (AudioOutput*)src.track; -printf(" src channel: %d\n", src.channel); audioDriver->connect(ao->jackPort(src.channel), dst.port); } else if (dst.type == Route::MIDIPORT) { diff --git a/muse/muse/track.cpp b/muse/muse/track.cpp index 67a5014f..4cc19ee3 100644 --- a/muse/muse/track.cpp +++ b/muse/muse/track.cpp @@ -681,9 +681,11 @@ void Track::writeRouting(Xml& xml) const } } for (ciRoute r = _outRoutes.begin(); r != _outRoutes.end(); ++r) { - Route dst((Track*)this); + Route src((Track*)this); + if (type() == AUDIO_OUTPUT) + src.channel = r->channel; xml.tag("Route"); - dst.write(xml, "src"); + src.write(xml, "src"); r->write(xml, "dst"); xml.etag("Route"); } |