From fc2f19d356e94e31124838047d86088c94d83160 Mon Sep 17 00:00:00 2001
From: Marek Blok <Marek.Blok@pg.edu.pl>
Date: Wed, 29 Nov 2023 17:18:30 +0100
Subject: [PATCH] DSP::u::Switch input processing fix

---
 CHANGELOG               |  6 ++-
 src/cpp/DSP_modules.cpp | 86 ++++++++++++++---------------------------
 src/include/DSP_lib.h   |  2 +-
 3 files changed, 35 insertions(+), 59 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 15a862b..d8c62eb 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -29,8 +29,10 @@ TODO::
 LAST DONE:
 
 CHANGES:
-- ver. 0.20.035 <b>2023.11.28</b> Fixed:
-  - DSP::u::Switch - inputs were incorrectly defined as ouputs.
+- ver. 0.20.036 <b>2023.11.29</b> Fixed:
+  - DSP::u::Switch - inputs were incorrectly defined as outputs + fix in input processing procedure.
+  - DSP::Component::DefineStandardOutputs - Names for complex outputs corrected
+  - DSP::Block::DefineStandardInputs - Names for complex inputs corrected
 - ver. 0.20.033 <b>2023.11.11</b> Fixed:
   - DSP::u::OutputBuffer - added setting OutputBuffer inputs' clocks (SetBlockInputClock) as equal to ParentClock to allow clock mismatch check when buffers ParentClock dows not match the inputs' clocks. 
     - PROBLEM: the ParentClock match to InputClock is not checked for DSP::u::OutputBuffer which might lead user to not notice that expected NotificationClock is incorectly selected.
diff --git a/src/cpp/DSP_modules.cpp b/src/cpp/DSP_modules.cpp
index 2617dc6..b20842f 100644
--- a/src/cpp/DSP_modules.cpp
+++ b/src/cpp/DSP_modules.cpp
@@ -5246,74 +5246,48 @@ void DSP::u::Switch::Select(unsigned int InputIndex, unsigned int OutputIndex)
     */
 }
 
+#define THIS ((DSP::u::Switch *)block)
 void DSP::u::Switch::InputExecute(INPUT_EXECUTE_ARGS)
 {
   UNUSED_DEBUG_ARGUMENT(Caller);
 
-  /* \todo_later Consider processing Output as soon as SelectedInputs are avaiable
+  /* \todo_later Consider processing Output as soon as SelectedInputs are available
    * \todo_later Consider storing only SelectedInputs, the rest could be ignored
    *
    */
-  unsigned int index;
+  THIS->NoOfInputsProcessed++;
+  if (InputNo==0)
+    THIS->State[InputNo]=value;
+  THIS->NoOfInputsProcessed++;
 
-/*
-  if (InputNo > LastInputInd)
-  {
-    if (InputNo == InputSelectionInd)
-      SelectedInputNo=((int)(floor(value)));
-    if (InputNo == OutputSelectionInd)
-      SelectedOutputNo=((int)(floor(value)));
-  }
-  else
-  {
-*/
-    index=InputNo / ((DSP::u::Switch *)block)->ValuesPerOutput;
-    ((DSP::u::Switch *)block)->State[index]=value;
-/*  } */
-  ((DSP::u::Switch *)block)->NoOfInputsProcessed++;
+  if (THIS->NoOfInputsProcessed < THIS->NoOfInputs)
+    return;
+  THIS->NoOfInputsProcessed=THIS->InitialNoOfInputsProcessed;
 
-  if (((DSP::u::Switch *)block)->NoOfInputsProcessed == ((DSP::u::Switch *)block)->NoOfInputs)
+  if ((THIS->SelectedInputNo != DSP::FO_NoInput) && (THIS->SelectedOutputNo != DSP::FO_NoOutput))
   {
-/*
-   if (SelectedInputNo > MaxSelectedInputNo)
-     SelectedInputNo = MaxSelectedInputNo;
-   if (SelectedOutputNo > MaxSelectedOutputNo)
-     SelectedOutputNo = MaxSelectedOutputNo;
-   if (SelectedInputNo < MinSelectedIndexNo)
-     SelectedInputNo = MinSelectedIndexNo;
-   if (SelectedOutputNo < MinSelectedIndexNo)
-     SelectedOutputNo = MinSelectedIndexNo;
-*/
-    if ((((DSP::u::Switch *)block)->SelectedInputNo != DSP::FO_NoInput) && (((DSP::u::Switch *)block)->SelectedOutputNo != DSP::FO_NoOutput))
+    if (THIS->ValuesPerOutput == 1)
     {
-      if (((DSP::u::Switch *)block)->ValuesPerOutput == 1)
-      {
-//        OutputBlocks[SelectedOutputNo]->
-//          Execute(OutputBlocks_InputNo[SelectedOutputNo], State[SelectedInputNo], this);
-        ((DSP::u::Switch *)block)->OutputBlocks[((DSP::u::Switch *)block)->SelectedOutputNo]->EXECUTE_PTR(
-            ((DSP::u::Switch *)block)->OutputBlocks[((DSP::u::Switch *)block)->SelectedOutputNo],
-            ((DSP::u::Switch *)block)->OutputBlocks_InputNo[((DSP::u::Switch *)block)->SelectedOutputNo],
-            ((DSP::u::Switch *)block)->State[((DSP::u::Switch *)block)->SelectedInputNo], block);
-      }
-      else // if (ValuesPerOutput == 2)
-      {
-//        OutputBlocks[SelectedOutputNo*2]->
-//          Execute(OutputBlocks_InputNo[SelectedOutputNo*2], State[SelectedInputNo*2], this);
-        ((DSP::u::Switch *)block)->OutputBlocks[((DSP::u::Switch *)block)->SelectedOutputNo*2]->EXECUTE_PTR(
-            ((DSP::u::Switch *)block)->OutputBlocks[((DSP::u::Switch *)block)->SelectedOutputNo*2],
-            ((DSP::u::Switch *)block)->OutputBlocks_InputNo[((DSP::u::Switch *)block)->SelectedOutputNo*2],
-            ((DSP::u::Switch *)block)->State[((DSP::u::Switch *)block)->SelectedInputNo*2], block);
-//        OutputBlocks[SelectedOutputNo*2+1]->
-//          Execute(OutputBlocks_InputNo[SelectedOutputNo*2+1], State[SelectedInputNo*2+1], this);
-        ((DSP::u::Switch *)block)->OutputBlocks[((DSP::u::Switch *)block)->SelectedOutputNo*2+1]->EXECUTE_PTR(
-            ((DSP::u::Switch *)block)->OutputBlocks[((DSP::u::Switch *)block)->SelectedOutputNo*2+1],
-            ((DSP::u::Switch *)block)->OutputBlocks_InputNo[((DSP::u::Switch *)block)->SelectedOutputNo*2+1],
-            ((DSP::u::Switch *)block)->State[((DSP::u::Switch *)block)->SelectedInputNo*2+1], block);
-      }
-    } // otherwise simply ignore input (NO output)
-    ((DSP::u::Switch *)block)->NoOfInputsProcessed = ((DSP::u::Switch *)block)->InitialNoOfInputsProcessed;
-  }
+      THIS->OutputBlocks[THIS->SelectedOutputNo]->EXECUTE_PTR(
+          THIS->OutputBlocks[THIS->SelectedOutputNo],
+          THIS->OutputBlocks_InputNo[THIS->SelectedOutputNo],
+          THIS->State[THIS->SelectedInputNo], block);
+    }
+    else // if (ValuesPerOutput == 2)
+    {
+      THIS->OutputBlocks[THIS->SelectedOutputNo*2]->EXECUTE_PTR(
+          THIS->OutputBlocks[THIS->SelectedOutputNo*2],
+          THIS->OutputBlocks_InputNo[THIS->SelectedOutputNo*2],
+          THIS->State[THIS->SelectedInputNo*2], block);
+      THIS->OutputBlocks[THIS->SelectedOutputNo*2+1]->EXECUTE_PTR(
+          THIS->OutputBlocks[THIS->SelectedOutputNo*2+1],
+          THIS->OutputBlocks_InputNo[THIS->SelectedOutputNo*2+1],
+          THIS->State[THIS->SelectedInputNo*2+1], block);
+    }
+  } // otherwise simply ignore input (NO output)
+  THIS->NoOfInputsProcessed = THIS->InitialNoOfInputsProcessed;
 };
+#undef THIS
 
 /**************************************************/
 // Decimator without antialias filter
diff --git a/src/include/DSP_lib.h b/src/include/DSP_lib.h
index f97725f..48cdf96 100644
--- a/src/include/DSP_lib.h
+++ b/src/include/DSP_lib.h
@@ -11,7 +11,7 @@
 
 #define DSP_VER_MAJOR 0
 #define DSP_VER_MINOR 20
-#define DSP_VER_BUILD 35 // !!! without zeroes before, else this will be treated as octal number
+#define DSP_VER_BUILD 36 // !!! without zeroes before, else this will be treated as octal number
 #define DSP_VER_YEAR  2023
 #define DSP_VER       DSP_VER_MAJOR.DSP_VER_MINOR.DSP_VER_BUILD
 
-- 
GitLab