From 984f51b373f5fceefbff68ec8d26dbe13c63292b Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Sun, 26 Oct 2025 12:10:12 +0100 Subject: [PATCH] Inital commit --- README.md | 0 delay/public/dsp_ringbuffer.hpp | 85 ++++++++++++++++++ delay/tests/Makefile | 26 ++++++ .../test_dsp_ringbuffer/test_dsp_ringbuffer | Bin 0 -> 58824 bytes .../test_dsp_ringbuffer/test_ringbuffer.d | 3 + .../test_dsp_ringbuffer/test_ringbuffer.o | Bin 0 -> 83744 bytes delay/tests/test_ringbuffer.cpp | 19 ++++ dsp_types.hpp | 41 +++++++++ 8 files changed, 174 insertions(+) create mode 100644 README.md create mode 100644 delay/public/dsp_ringbuffer.hpp create mode 100644 delay/tests/Makefile create mode 100755 delay/tests/build/linux/debug/test_dsp_ringbuffer/test_dsp_ringbuffer create mode 100644 delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.d create mode 100644 delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.o create mode 100644 delay/tests/test_ringbuffer.cpp create mode 100644 dsp_types.hpp diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/delay/public/dsp_ringbuffer.hpp b/delay/public/dsp_ringbuffer.hpp new file mode 100644 index 0000000..b68de20 --- /dev/null +++ b/delay/public/dsp_ringbuffer.hpp @@ -0,0 +1,85 @@ +/* + * jayDSP, A cross-platform Digital Signal Processing library written in modern C++. + * Copyright (C) 2025 Jens Ahrensfeld, All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + * File: dsp_ringbuffer.hpp + * Author Jens Ahrensfeld on 26.10.2025. + */ + +#ifndef DSP_RINGBUFFER_H +#define DSP_RINGBUFFER_H + +#include +#include +#include +#include +#include "../../dsp_types.hpp" + +namespace dsp { + +template +class RingBuffer +{ + uint32_t m_index; + uint32_t m_mask; + size_t m_capacity; + vector m_buffer; + + public: + RingBuffer(size_t capacity) + : m_index(0) + , m_mask(0) + , m_capacity(0) + { + resize(capacity); + } + + size_t capacity() + { + return m_buffer.capacity(); + } + void resize(int capacity, T value=T()) + { + m_capacity = 1; + while (m_capacity < capacity) + { + m_capacity *= 2; + } + + m_buffer.assign(m_capacity, value); + m_mask = unsigned(m_capacity - 1); + m_index = 0; + } + + void put(T sample) + { + m_index = (m_index + 1) & m_mask; + m_buffer[m_index] = sample; + } + + T get(uint32_t delay = 0) + { + uint32_t i = (m_index - delay) & m_mask; + return m_buffer[i]; + } +}; +} + +#endif diff --git a/delay/tests/Makefile b/delay/tests/Makefile new file mode 100644 index 0000000..31f80e6 --- /dev/null +++ b/delay/tests/Makefile @@ -0,0 +1,26 @@ +include $(MAKE_HOME)/defaults.mk + +# Environment +CC=clang +CCC=clang++ +CXX=clang++ + +NAME := test_dsp_ringbuffer +CONFIG ?= debug +TARGET ?= $(NAME) + +CXXFLAGS += -std=c++11 + +INCLUDES += -I $(realpath .) -I $(realpath ../public) + +CXX_SRCS := test_ringbuffer.cpp + +LIBS := -lstdc++ + +run: link + @echo Running $(TARGET) + @${BUILD_DIR}/${TARGET} + +include $(MAKE_HOME)/compile.mk +include $(MAKE_HOME)/link.mk + diff --git a/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_dsp_ringbuffer b/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_dsp_ringbuffer new file mode 100755 index 0000000000000000000000000000000000000000..f9a42b5d201cb8e7658c048c976963039bbab362 GIT binary patch literal 58824 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 literal 0 HcmV?d00001 diff --git a/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.d b/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.d new file mode 100644 index 0000000..6c5156d --- /dev/null +++ b/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.d @@ -0,0 +1,3 @@ +/home/jens/work/repos/dsp/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.o: \ + test_ringbuffer.cpp ../public/dsp_ringbuffer.hpp \ + ../public/../../dsp_types.hpp diff --git a/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.o b/delay/tests/build/linux/debug/test_dsp_ringbuffer/test_ringbuffer.o new file mode 100644 index 0000000000000000000000000000000000000000..d3f3607dfb817b7ab1029de7d915e40fb114feeb GIT binary patch literal 83744 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 O#{f@YBzHZsi~qkO3l|0e literal 0 HcmV?d00001 diff --git a/delay/tests/test_ringbuffer.cpp b/delay/tests/test_ringbuffer.cpp new file mode 100644 index 0000000..ae81c12 --- /dev/null +++ b/delay/tests/test_ringbuffer.cpp @@ -0,0 +1,19 @@ +#include "../public/dsp_ringbuffer.hpp" +#include + + +int main() +{ + dsp::RingBuffer buffer(10); + printf("Buffer capacity = %zu\n", buffer.capacity()); + for (int i; i < 10; i++) + { + buffer.put(i+1); + int v = buffer.get(2); + printf("i=%d: v=%d\n", i, v); + + } + + + return 0; +} \ No newline at end of file diff --git a/dsp_types.hpp b/dsp_types.hpp new file mode 100644 index 0000000..912b69e --- /dev/null +++ b/dsp_types.hpp @@ -0,0 +1,41 @@ +/* + * jayDSP, A cross-platform Digital Signal Processing library written in modern C++. + * Copyright (C) 2025 Jens Ahrensfeld, All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + * File: dsp_types.hpp + * Author Jens Ahrensfeld on 26.10.2025. + */ + +#ifndef DSP_TYPES_HPP +#define DSP_TYPES_HPP + +#include + +namespace dsp { + + template + class vector : public std::vector + { + + }; + +} + +#endif // DSP_TYPES_HPP \ No newline at end of file