summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/audio_unit.cc91
1 files changed, 25 insertions, 66 deletions
diff --git a/libs/ardour/audio_unit.cc b/libs/ardour/audio_unit.cc
index 7a39acb261..f8b3feac9a 100644
--- a/libs/ardour/audio_unit.cc
+++ b/libs/ardour/audio_unit.cc
@@ -1419,12 +1419,9 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
/* now allow potentially "output-imprecise" matches */
if (possible_in == 0) {
/* no inputs, generators & instruments */
- if (possible_out == -1) {
- /* any configuration possible, provide stereo output */
- FOUNDCFG (preferred_out);
- ANYTHINGGOES;
- } else if (possible_out == -2) {
- /* invalid, should be (0, -1) */
+ if (possible_out == -1 || possible_out == -2) {
+ /* any output configuration possible
+ * out == -2 is invalid, interpreted as out == -1 */
FOUNDCFG (preferred_out);
ANYTHINGGOES;
} else if (possible_out < -2) {
@@ -1437,39 +1434,20 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
}
}
- if (possible_in == -1) {
+ if (possible_in == -1 || possible_in == -2) {
/* wildcard for input */
- if (possible_out == -1) {
- /* out must match in */
+ if (possible_out == possible_in) {
+ /* either both -1 or both -2 (invalid and
+ * interpreted as both -1): out must match in */
FOUNDCFG (audio_in);
- } else if (possible_out == -2) {
- /* any configuration possible, pick matching */
- FOUNDCFG (preferred_out);
- ANYTHINGGOES;
- } else if (possible_out < -2) {
- /* explicitly variable number of outputs, pick maximum */
- FOUNDCFG (max (-possible_out, preferred_out));
- /* and try min, too, in case the penalty is lower */
- FOUNDCFG (min (-possible_out, preferred_out));
- UPTO (-possible_out)
- } else {
- /* exact number of outputs */
- FOUNDCFG (possible_out);
- }
- }
-
- if (possible_in == -2) {
- if (possible_out == -1) {
- /* any configuration possible, pick matching */
- FOUNDCFG (preferred_out);
- ANYTHINGGOES;
- } else if (possible_out == -2) {
- /* invalid. interpret as (-1, -1) */
+ } else if (possible_out == -3 - possible_in) {
+ /* one is -1, the other is -2: any output configuration
+ * possible, pick what the insert prefers */
FOUNDCFG (preferred_out);
ANYTHINGGOES;
} else if (possible_out < -2) {
- /* invalid, interpret as (<-2, <-2)
- * variable number of outputs up to -N, */
+ /* variable number of outputs up to -N,
+ * invalid if in == -2 but we accept it anyway */
FOUNDCFG (min (-possible_out, preferred_out));
UPTO (-possible_out)
} else {
@@ -1478,25 +1456,26 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
}
}
- if (possible_in < -2) {
- /* explicit variable number of inputs */
- if (audio_in > -possible_in && imprecise != NULL) {
+ if (possible_in < -2 || possible_in > 0) {
+ /* specified number, exact or up to */
+ if (possible_in < -2 && audio_in > -possible_in && imprecise) {
// hide inputs ports
+ // XXX: this is really *input* imprecise and should have
+ // been part of the second pass below
imprecise->set (DataType::AUDIO, -possible_in);
}
-
- if (audio_in > -possible_in && imprecise == NULL) {
+ if (possible_in < -2 && audio_in > -possible_in && !imprecise) {
/* request is too large */
- } else if (possible_out == -1) {
- /* any output configuration possible */
- FOUNDCFG (preferred_out);
- ANYTHINGGOES;
- } else if (possible_out == -2) {
- /* invalid. interpret as (<-2, -1) */
+ } else if (possible_in > 0 && audio_in != possible_in) {
+ /* this configuration needed exacty possible_in inputs */
+ } else if (possible_out == -1 || possible_out == -2) {
+ /* any output configuration possible
+ * out == -2 is invalid, interpreted as out == -1 */
FOUNDCFG (preferred_out);
ANYTHINGGOES;
} else if (possible_out < -2) {
- /* variable number of outputs up to -N, */
+ /* variable number of outputs up to -N
+ * not specified if in > 0, but we accept it anyway */
FOUNDCFG (min (-possible_out, preferred_out));
UPTO (-possible_out)
} else {
@@ -1505,26 +1484,6 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
}
}
- if (possible_in && (possible_in == audio_in)) {
- /* exact number of inputs ... must match obviously */
- if (possible_out == -1) {
- /* any output configuration possible */
- FOUNDCFG (preferred_out);
- ANYTHINGGOES;
- } else if (possible_out == -2) {
- /* plugins shouldn't really use (>0,-2), interpret as (>0,-1) */
- FOUNDCFG (preferred_out);
- ANYTHINGGOES;
- } else if (possible_out < -2) {
- /* > 0, < -2 is not specified
- * interpret as up to -N */
- FOUNDCFG (min (-possible_out, preferred_out));
- UPTO (-possible_out)
- } else {
- /* exact number of outputs */
- FOUNDCFG (possible_out);
- }
- }
}
if (!found && imprecise) {