| @@ -81,31 +81,46 @@ public: | |||||
| void add(std::shared_ptr<stream<T>> s) | void add(std::shared_ptr<stream<T>> s) | ||||
| { | { | ||||
| // FIXME: check the channel count! | // FIXME: check the channel count! | ||||
| m_streamers.insert(s); | |||||
| m_streams.insert(s); | |||||
| } | } | ||||
| void remove(std::shared_ptr<stream<T>> s) | void remove(std::shared_ptr<stream<T>> s) | ||||
| { | { | ||||
| m_streamers.erase(s); | |||||
| m_streams.erase(s); | |||||
| } | } | ||||
| virtual size_t get(T *buf, size_t frames) override | virtual size_t get(T *buf, size_t frames) override | ||||
| { | { | ||||
| memset(buf, 0, frames * this->frame_size()); | |||||
| std::vector<std::vector<T>> buffers; | |||||
| size_t const samples = frames * this->channels(); | |||||
| std::vector<T> tmp(frames * this->channels()); | |||||
| for (auto s : m_streamers) | |||||
| for (auto s : m_streams) | |||||
| { | { | ||||
| s->get(tmp.data(), frames); | |||||
| for (size_t i = 0; i < tmp.size(); ++i) | |||||
| buf[i] += tmp[i]; | |||||
| buffers.push_back(std::vector<T>(samples)); | |||||
| s->get(buffers.back().data(), frames); | |||||
| } | |||||
| for (size_t n = 0; n < samples; ++n) | |||||
| { | |||||
| T sample = T(0); | |||||
| for (auto const &b : buffers) | |||||
| sample += b[n]; | |||||
| if constexpr (std::is_same_v<T, float>) | |||||
| buf[n] = std::min(1.0f, std::max(-1.0f, sample)); | |||||
| else if constexpr (std::is_same_v<T, int16_t>) | |||||
| buf[n] = std::min(int16_t(32767), std::max(int16_t(-32768), sample)); | |||||
| else if constexpr (std::is_same_v<T, uint16_t>) | |||||
| buf[n] = std::min(uint16_t(65535), std::max(uint16_t(0), sample)); | |||||
| else | |||||
| buf[n] = sample; | |||||
| } | } | ||||
| return frames; | return frames; | ||||
| } | } | ||||
| protected: | protected: | ||||
| std::unordered_set<std::shared_ptr<stream<T>>> m_streamers; | |||||
| std::unordered_set<std::shared_ptr<stream<T>>> m_streams; | |||||
| }; | }; | ||||
| template<typename T0, typename T> | template<typename T0, typename T> | ||||