From f1773b634eb6cf4e1312379dcc7bcbab7291c60b Mon Sep 17 00:00:00 2001 From: Clyne Sullivan <clyne@bitgloo.com> Date: Sun, 23 May 2021 13:19:09 -0400 Subject: 2nd pot; some doc; smooth WAV playback --- source/samplebuffer.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'source/samplebuffer.cpp') diff --git a/source/samplebuffer.cpp b/source/samplebuffer.cpp index 24cc424..1acf2f4 100644 --- a/source/samplebuffer.cpp +++ b/source/samplebuffer.cpp @@ -1,3 +1,14 @@ +/** + * @file samplebuffer.cpp + * @brief Manages ADC/DAC buffer data. + * + * Copyright (C) 2021 Clyne Sullivan + * + * Distributed under the GNU GPL v3 or later. You should have received a copy of + * the GNU General Public License along with this program. + * If not, see <https://www.gnu.org/licenses/>. + */ + #include "samplebuffer.hpp" SampleBuffer::SampleBuffer(Sample *buffer) : -- cgit v1.2.3 From d002746e25237738ab45b472c1fff6e8fbe4183b Mon Sep 17 00:00:00 2001 From: Clyne Sullivan <clyne@bitgloo.com> Date: Sun, 10 Oct 2021 09:45:37 -0400 Subject: wip: better samplebuffer filling --- Makefile | 2 +- source/samplebuffer.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 53 insertions(+), 7 deletions(-) (limited to 'source/samplebuffer.cpp') diff --git a/Makefile b/Makefile index 44f4c8a..3dcfd94 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ TARGET_PLATFORM = L4 # Compiler options here. ifeq ($(USE_OPT),) - USE_OPT = -O0 -ggdb -fomit-frame-pointer -falign-functions=16 --specs=nosys.specs + USE_OPT = -Os -g3 -ggdb -fomit-frame-pointer -falign-functions=16 --specs=nosys.specs endif # C specific options here (added to USE_OPT). diff --git a/source/samplebuffer.cpp b/source/samplebuffer.cpp index 1acf2f4..6f588b1 100644 --- a/source/samplebuffer.cpp +++ b/source/samplebuffer.cpp @@ -19,17 +19,63 @@ void SampleBuffer::clear() { } __attribute__((section(".convcode"))) void SampleBuffer::modify(Sample *data, unsigned int srcsize) { - auto size = srcsize < m_size ? srcsize : m_size; + auto size = std::min(srcsize, m_size); + size = (size + 15) & 0xFF0; + m_modified = m_buffer; - for (Sample *d = m_buffer, *s = data; s != data + size;) - *d++ = *s++; + const int *src = reinterpret_cast<const int *>(data); + const int * const srcend = src + (size / 2); + int *dst = reinterpret_cast<int *>(m_buffer); + do { + int a = src[0]; + int b = src[1]; + int c = src[2]; + int d = src[3]; + int e = src[4]; + int f = src[5]; + int g = src[6]; + int h = src[7]; + dst[0] = a; + dst[1] = b; + dst[2] = c; + dst[3] = d; + dst[4] = e; + dst[5] = f; + dst[6] = g; + dst[7] = h; + src += 8; + dst += 8; + } while (src < srcend); } __attribute__((section(".convcode"))) void SampleBuffer::midmodify(Sample *data, unsigned int srcsize) { - auto size = srcsize < m_size / 2 ? srcsize : m_size / 2; + auto size = std::min(srcsize, m_size / 2); + size = (size + 15) & 0xFF0; + m_modified = middata(); - for (Sample *d = middata(), *s = data; s != data + size;) - *d++ = *s++; + const int *src = reinterpret_cast<const int *>(data); + const int * const srcend = src + (size / 2); + int *dst = reinterpret_cast<int *>(middata()); + do { + int a = src[0]; + int b = src[1]; + int c = src[2]; + int d = src[3]; + int e = src[4]; + int f = src[5]; + int g = src[6]; + int h = src[7]; + dst[0] = a; + dst[1] = b; + dst[2] = c; + dst[3] = d; + dst[4] = e; + dst[5] = f; + dst[6] = g; + dst[7] = h; + src += 8; + dst += 8; + } while (src < srcend); } void SampleBuffer::setModified() { -- cgit v1.2.3 From e4a8d6eefc267c3a38d5237205421cbbe6eaebe8 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan <clyne@bitgloo.com> Date: Sun, 10 Oct 2021 20:19:19 -0400 Subject: optimized samplebuffer copying --- Makefile | 8 ++++---- source/handlers.cpp | 16 ++++++++-------- source/samplebuffer.cpp | 48 ++++++++++++++++++++++++------------------------ 3 files changed, 36 insertions(+), 36 deletions(-) (limited to 'source/samplebuffer.cpp') diff --git a/Makefile b/Makefile index 3dcfd94..9e98828 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ TARGET_PLATFORM = L4 # Compiler options here. ifeq ($(USE_OPT),) - USE_OPT = -Os -g3 -ggdb -fomit-frame-pointer -falign-functions=16 --specs=nosys.specs + USE_OPT = -O0 -g3 -ggdb -fomit-frame-pointer -falign-functions=16 --specs=nosys.specs endif # C specific options here (added to USE_OPT). @@ -177,9 +177,9 @@ CPPWARN = -Wall -Wextra -Wundef -pedantic -Wno-volatile # List all user C define here, like -D_DEBUG=1 UDEFS = -DCORTEX_ENABLE_WFI_IDLE=TRUE \ - -DPORT_USE_SYSCALL=TRUE \ - -DPORT_USE_GUARD_MPU_REGION=MPU_REGION_0 \ - -DTARGET_PLATFORM_$(TARGET_PLATFORM) + -DPORT_USE_SYSCALL=TRUE \ + -DPORT_USE_GUARD_MPU_REGION=MPU_REGION_0 \ + -DTARGET_PLATFORM_$(TARGET_PLATFORM) # Define ASM defines here UADEFS = diff --git a/source/handlers.cpp b/source/handlers.cpp index 07f6ed3..2ff948d 100644 --- a/source/handlers.cpp +++ b/source/handlers.cpp @@ -105,7 +105,7 @@ void MemManage_Handler() { // 1. Get the stack pointer. uint32_t lr; - asm("mov %0, lr" : "=r" (lr)); + asm("mov %0, lr" : "=r" (lr)); // 2. Recover from the fault. ConversionManager::abort(); @@ -120,14 +120,14 @@ void HardFault_Handler() // Get the stack pointer. //uint32_t *stack; uint32_t lr; - asm("mov %0, lr" : "=r" (lr)); - /*asm("\ - tst lr, #4; \ - ite eq; \ - mrseq %0, msp; \ - mrsne %0, psp; \ + asm("mov %0, lr" : "=r" (lr)); + /*asm("\ + tst lr, #4; \ + ite eq; \ + mrseq %0, msp; \ + mrsne %0, psp; \ mov %1, lr; \ - " : "=r" (stack), "=r" (lr));*/ + " : "=r" (stack), "=r" (lr));*/ // If coming from the algorithm, attempt to recover; otherwise, give up. if (run_status != RunStatus::Running && (lr & 4) != 0) diff --git a/source/samplebuffer.cpp b/source/samplebuffer.cpp index 6f588b1..74c6778 100644 --- a/source/samplebuffer.cpp +++ b/source/samplebuffer.cpp @@ -19,8 +19,8 @@ void SampleBuffer::clear() { } __attribute__((section(".convcode"))) void SampleBuffer::modify(Sample *data, unsigned int srcsize) { - auto size = std::min(srcsize, m_size); - size = (size + 15) & 0xFF0; + auto size = srcsize < m_size ? srcsize : m_size; + size = (size + 15) & (~15); m_modified = m_buffer; const int *src = reinterpret_cast<const int *>(data); @@ -35,22 +35,22 @@ void SampleBuffer::modify(Sample *data, unsigned int srcsize) { int f = src[5]; int g = src[6]; int h = src[7]; - dst[0] = a; - dst[1] = b; - dst[2] = c; - dst[3] = d; - dst[4] = e; - dst[5] = f; - dst[6] = g; - dst[7] = h; - src += 8; - dst += 8; + dst[0] = a; + dst[1] = b; + dst[2] = c; + dst[3] = d; + dst[4] = e; + dst[5] = f; + dst[6] = g; + dst[7] = h; + src += 8; + dst += 8; } while (src < srcend); } __attribute__((section(".convcode"))) void SampleBuffer::midmodify(Sample *data, unsigned int srcsize) { - auto size = std::min(srcsize, m_size / 2); - size = (size + 15) & 0xFF0; + auto size = srcsize < m_size / 2 ? srcsize : m_size / 2; + size = (size + 15) & (~15); m_modified = middata(); const int *src = reinterpret_cast<const int *>(data); @@ -65,16 +65,16 @@ void SampleBuffer::midmodify(Sample *data, unsigned int srcsize) { int f = src[5]; int g = src[6]; int h = src[7]; - dst[0] = a; - dst[1] = b; - dst[2] = c; - dst[3] = d; - dst[4] = e; - dst[5] = f; - dst[6] = g; - dst[7] = h; - src += 8; - dst += 8; + dst[0] = a; + dst[1] = b; + dst[2] = c; + dst[3] = d; + dst[4] = e; + dst[5] = f; + dst[6] = g; + dst[7] = h; + src += 8; + dst += 8; } while (src < srcend); } -- cgit v1.2.3