Introduce a macro for imprecise configurations
authorJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>
Tue, 31 Jul 2018 14:32:52 +0000 (16:32 +0200)
committerJulien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>
Sun, 12 May 2019 20:32:10 +0000 (22:32 +0200)
It enables only setting the imprecise audio channel count if the
configuration is indeed selected.

libs/ardour/audio_unit.cc

index f8b3feac9a2035042ea5e050a2d0708496a3a0c7..af09bd82d6e685550cede3d61f1253b441a6333e 100644 (file)
@@ -1365,13 +1365,19 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
 # pragma clang diagnostic ignored "-Wtautological-compare"
 #endif
 
-#define FOUNDCFG(nch) {                            \
-  float p = fabsf ((float)(nch) - preferred_out);  \
-  _output_configs.insert (nch);                    \
-  if ((nch) > preferred_out) { p *= 1.1; }         \
+#define FOUNDCFG_IMPRECISE(in, out) {              \
+  float p = fabsf ((float)(out) - preferred_out);  \
+  if (in != audio_in) {                            \
+    p += 1000;                                     \
+  }                                                \
+  _output_configs.insert (out);                    \
+  if ((out) > preferred_out) { p *= 1.1; }         \
   if (p < penalty) {                               \
     used_possible_in = possible_in;                \
-    audio_out = (nch);                             \
+    audio_out = (out);                             \
+    if (imprecise) {                               \
+      imprecise->set (DataType::AUDIO, (in));      \
+    }                                              \
     penalty = p;                                   \
     found = true;                                  \
     variable_inputs = possible_in < 0;             \
@@ -1379,6 +1385,9 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
   }                                                \
 }
 
+#define FOUNDCFG(out)                              \
+  FOUNDCFG_IMPRECISE(audio_in, out)
+
 #define ANYTHINGGOES                               \
   _output_configs.insert (0);
 
@@ -1388,6 +1397,10 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
   }                                                \
 }
 
+       if (imprecise) {
+               *imprecise = in;
+       }
+
        for (vector<pair<int,int> >::iterator i = io_configs.begin(); i != io_configs.end(); ++i) {
 
                int32_t possible_in = i->first;
@@ -1458,12 +1471,6 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
 
                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 (possible_in < -2 && audio_in > -possible_in && !imprecise) {
                                /* request is too large */
                        } else if (possible_in > 0 && audio_in != possible_in) {
@@ -1482,6 +1489,14 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
                                /* exact number of outputs */
                                FOUNDCFG (possible_out);
                        }
+                       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. Also, this change
+                               // should only be applied when really selecting a corresponding
+                               // configuration.
+                               imprecise->set (DataType::AUDIO, -possible_in);
+                       }
                }
 
        }
@@ -1494,15 +1509,14 @@ AUPlugin::can_support_io_configuration (const ChanCount& in, ChanCount& out, Cha
 
                        assert (possible_in > 0); // all other cases will have been matched above
 
-                       imprecise->set (DataType::AUDIO, possible_in);
                        if (possible_out == -1 || possible_out == -2) {
-                               FOUNDCFG (2);
+                               FOUNDCFG_IMPRECISE (possible_in, 2);
                        } else if (possible_out < -2) {
                                /* explicitly variable number of outputs, pick maximum */
-                               FOUNDCFG (min (-possible_out, preferred_out));
+                               FOUNDCFG_IMPRECISE (possible_in, min (-possible_out, preferred_out));
                        } else {
                                /* exact number of outputs */
-                               FOUNDCFG (possible_out);
+                               FOUNDCFG_IMPRECISE (possible_in, possible_out);
                        }
                        // ideally we'll also find the closest, best matching
                        // input configuration with minimal output penalty...