diff --git a/delay/buffer.hpp b/delay/buffer.hpp index 24416c0..200fb73 100644 --- a/delay/buffer.hpp +++ b/delay/buffer.hpp @@ -31,6 +31,7 @@ #include #include #include +#include namespace dsp { @@ -41,7 +42,7 @@ class Buffer uint m_mask; size_t m_capacity; vector m_buffer; - + public: Buffer(size_t capacity) : m_index(0) @@ -75,13 +76,13 @@ class Buffer } T & operator[](int offset) - { - return m_buffer[(m_index + (uint)offset) & m_mask]; + { + return at(offset); } const T & operator[](int offset) const { - return m_buffer[(m_index + (uint)offset) & m_mask]; + return at(offset); } Buffer & operator ++() @@ -112,7 +113,43 @@ class Buffer return *this; } + typedef std::vector::iterator iterator; + typedef std::vector::const_iterator const_iterator; + iterator begin() + { + return m_buffer.begin(); + } + + iterator end() + { + return m_buffer.end(); + } + + const_iterator begin() const + { + return m_buffer.begin(); + } + + const_iterator end() const + { + return m_buffer.end(); + } + +protected: + virtual T & at(int offset) + { + int i = (m_index + (uint)offset) & m_mask; + return m_buffer[i]; + } + + virtual const T & at(int offset) const + { + return at(offset); + } + + }; } + #endif // DSP_BUFFER_H diff --git a/delay/buffer_multi.hpp b/delay/buffer_multi.hpp index 3363caa..3383b30 100644 --- a/delay/buffer_multi.hpp +++ b/delay/buffer_multi.hpp @@ -31,18 +31,17 @@ namespace dsp { template -class BufferMulti +class BufferMulti : public Buffer { - Buffer m_buffer; - size_t m_capacity; size_t m_numChannels; + size_t m_capacity; public: - BufferMulti(size_t capacity, size_t numChannels) - : m_capacity(capacity) + BufferMulti(size_t numChannels, size_t capacity) + : Buffer(capacity*numChannels) , m_numChannels(numChannels) + , m_capacity(capacity) { - m_buffer.resize(capacity*numChannels); } size_t capacity() @@ -55,11 +54,19 @@ class BufferMulti return m_numChannels; } - void reset() + using Buffer::at; + T & at(uint channel, int offset) { - m_buffer.reset(); + return at(int(m_capacity*channel + offset)); } + const T & at(uint channel, int offset) const + { + return at(channel, offset); + } + +protected: + }; } diff --git a/delay/buffer_view.hpp b/delay/buffer_view.hpp index 13839ac..0d002e3 100644 --- a/delay/buffer_view.hpp +++ b/delay/buffer_view.hpp @@ -59,6 +59,28 @@ class BufferView return m_buffer.size(); } + typedef std::vector::iterator iterator; + typedef std::vector::const_iterator const_iterator; + iterator begin() + { + return m_buffer.begin(); + } + + iterator end() + { + return m_buffer.end(); + } + + const_iterator begin() const + { + return m_buffer.begin(); + } + + const_iterator end() const + { + return m_buffer.end(); + } + }; } diff --git a/delay/tests/Makefile b/delay/tests/Makefile index 171f6c5..a63d90d 100644 --- a/delay/tests/Makefile +++ b/delay/tests/Makefile @@ -5,7 +5,7 @@ CC=clang CCC=clang++ CXX=clang++ -NAME := test_dsp_buffer +NAME := test_main CONFIG ?= debug TARGET ?= $(NAME) @@ -13,7 +13,7 @@ CXXFLAGS += -std=c++20 INCLUDES += -I $(realpath .) -I $(realpath ../../) -CXX_SRCS := test_buffer.cpp +CXX_SRCS := test_main.cpp test_buffer.cpp test_buffer_multi.cpp LIBS := -lstdc++ diff --git a/delay/tests/test_buffer.cpp b/delay/tests/test_buffer.cpp index 20a42f6..3e35271 100644 --- a/delay/tests/test_buffer.cpp +++ b/delay/tests/test_buffer.cpp @@ -7,10 +7,10 @@ template void print(dsp::BufferView &v, size_t size) { -// for(const auto&i : v) -// { -// std::cout << i << std::endl; -// } + for(const auto&i : v) + { + std::cout << i << std::endl; + } std::cout << "----------------------------------------------" << std::endl; for (int i=0; i < size; i++) { @@ -19,8 +19,17 @@ void print(dsp::BufferView &v, size_t size) } -int main() +static void info() { + std::cout << "----------------------------------------------" << std::endl; + std::cout << "Start test_buffer()" << std::endl; + std::cout << "----------------------------------------------" << std::endl; +} + +int test_buffer() +{ + info(); + dsp::Buffer buffer(10); printf("Buffer capacity = %zu\n", buffer.capacity()); for (int i=0; i < 10; i++) @@ -44,5 +53,10 @@ int main() v2[2] = 77; print(v2,10); + for(const auto&i : buffer) + { + std::cout << i+100 << std::endl; + } + return 0; } \ No newline at end of file diff --git a/delay/tests/test_buffer_multi.cpp b/delay/tests/test_buffer_multi.cpp new file mode 100644 index 0000000..dbe0b61 --- /dev/null +++ b/delay/tests/test_buffer_multi.cpp @@ -0,0 +1,44 @@ +#include +#include + +#include + +static void info() +{ + std::cout << "----------------------------------------------" << std::endl; + std::cout << "Start test_buffer_multi()" << std::endl; + std::cout << "----------------------------------------------" << std::endl; +} + +int test_buffer_multi() +{ + info(); + dsp::BufferMultibuffer(5, 20); + printf("Buffer capacity = %zu\n", buffer.capacity()); + + for (int i=0; i < 10; i++) + { + for (int c=0; c < 5; c++) + { + buffer.at(c, 0) = i+1; + } + buffer += 1; + + } + + buffer.reset(); + for (int i=0; i < 10; i++) + { + for (int c=0; c < 5; c++) + { + int v = buffer.at(c, i); + printf("c=%d: i=%d: v=%d\n", c, i, v); + } + } + + for(const auto&i : buffer) + { + } + + return 0; +} \ No newline at end of file diff --git a/delay/tests/test_main.cpp b/delay/tests/test_main.cpp new file mode 100644 index 0000000..36dd5b7 --- /dev/null +++ b/delay/tests/test_main.cpp @@ -0,0 +1,10 @@ +extern void test_buffer(); +extern void test_buffer_multi(); + +int main() +{ + test_buffer(); + test_buffer_multi(); + + return 0; +} \ No newline at end of file