summaryrefslogtreecommitdiff
path: root/libs/ardour/audio_unit.cc
diff options
context:
space:
mode:
authorJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2018-07-31 13:18:16 +0200
committerJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>2019-05-12 22:32:10 +0200
commit0e0c55c6b548276defd7cdc36be373a708c59f90 (patch)
tree6caabd18a8181b42fedbeadb59718b806d2c4e9b /libs/ardour/audio_unit.cc
parentbaef462cf422eb3179190889dae17a1e8ef3ef90 (diff)
Merge some cases to avoid duplicated logic
Merge the cases in == -1 and in == -2 since those are both wildcards, almost symmetric in the AU spec, and handled completely symmetrically by the code here considering it accepts invalid or unspecified demands. Also merge the cases in > 0 and in < -2 since they are handled exactly the same as far as outputs are concerned. No policy change
Diffstat (limited to 'libs/ardour/audio_unit.cc')
-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) {