// // CompoundSource.hpp // Clock Signal // // Created by Thomas Harte on 19/12/2017. // Copyright © 2017 Thomas Harte. All rights reserved. // #ifndef CompoundSource_h #define CompoundSource_h #include "SampleSource.hpp" #include namespace Outputs { namespace Speaker { /*! A CompoundSource adds together the sound generated by multiple individual SampleSources. It's an instance of template metaprogramming; this is the base case. */ template class CompoundSource: public Outputs::Speaker::SampleSource { public: void get_samples(std::size_t number_of_samples, std::int16_t *target) { std::memset(target, 0, sizeof(std::int16_t) * number_of_samples); } }; /*! A CompoundSource adds together the sound generated by multiple individual SampleSources. It's an instance of template metaprogramming; this is the recursive case. */ template class CompoundSource: public Outputs::Speaker::SampleSource { public: CompoundSource(T &source, R &...next) : source_(source), next_source_(next...) {} void get_samples(std::size_t number_of_samples, std::int16_t *target) { if(source_.is_zero_level()) { source_.skip_samples(number_of_samples); next_source_.get_samples(number_of_samples, target); } else { int16_t next_samples[number_of_samples]; next_source_.get_samples(number_of_samples, next_samples); source_.get_samples(number_of_samples, target); while(number_of_samples--) { target[number_of_samples] += next_samples[number_of_samples]; } } } void skip_samples(const std::size_t number_of_samples) { source_.skip_samples(number_of_samples); next_source_.skip_samples(number_of_samples); } private: bool is_sleeping_ = false; T &source_; CompoundSource next_source_; }; } } #endif /* CompoundSource_h */