From 3e6c1ef0fbd8a790c494dccd1585652476b23956 Mon Sep 17 00:00:00 2001 From: Bart Schipperijn Date: Fri, 14 Feb 2020 15:53:30 +0100 Subject: [PATCH] Added handling of unequal number of input and output channels. --- .../signal_source/libs/gnss_sdr_valve.cc | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/algorithms/signal_source/libs/gnss_sdr_valve.cc b/src/algorithms/signal_source/libs/gnss_sdr_valve.cc index 118446d052..e321126599 100644 --- a/src/algorithms/signal_source/libs/gnss_sdr_valve.cc +++ b/src/algorithms/signal_source/libs/gnss_sdr_valve.cc @@ -98,16 +98,32 @@ int Gnss_Sdr_Valve::work(int noutput_items, return 0; } // multichannel support - for (unsigned int ch = 0; ch < output_items.size(); ch++) - { - memcpy(output_items[ch], input_items[ch], n * input_signature()->sizeof_stream_item(ch)); - } + if (input_items.size() > output_items.size()) { + LOG(WARNING) << "Number of output channels (" << output_items.size() << ") of a signal source is smaller than the number of its inputs (" << input_items.size() << ")" << std::endl; + for (size_t ch = 0; ch < output_items.size(); ch++) + { + memcpy(output_items[ch], input_items[ch], n * input_signature()->sizeof_stream_item(ch)); + } + } else { + for (size_t ch = 0; ch < output_items.size(); ch++) + { + memcpy(output_items[ch], input_items[ch % input_items.size()], n * input_signature()->sizeof_stream_item(ch)); + } + } d_ncopied_items += n; return n; } - for (unsigned int ch = 0; ch < output_items.size(); ch++) - { - memcpy(output_items[ch], input_items[ch], noutput_items * input_signature()->sizeof_stream_item(ch)); - } + if (input_items.size() > output_items.size()) { + LOG(WARNING) << "Number of output channels (" << output_items.size() << ") of a signal source is smaller than the number of its inputs (" << input_items.size() << ")" << std::endl; + for (size_t ch = 0; ch < output_items.size(); ch++) + { + memcpy(output_items[ch], input_items[ch], noutput_items * input_signature()->sizeof_stream_item(ch)); + } + } else { + for (size_t ch = 0; ch < output_items.size(); ch++) + { + memcpy(output_items[ch], input_items[ch % input_items.size()], noutput_items * input_signature()->sizeof_stream_item(ch)); + } + } return noutput_items; }