From 7f259c21a589d62c610958b996a300322ceaf7ee Mon Sep 17 00:00:00 2001 From: Dave Griffiths Date: Thu, 9 Jul 2015 16:17:58 +0100 Subject: [PATCH] started realtime renderer --- samplebrain/src/realtime_renderer.cpp | 81 +++++++++++++++++++++++++++ samplebrain/src/realtime_renderer.h | 32 +++++++++++ 2 files changed, 113 insertions(+) create mode 100644 samplebrain/src/realtime_renderer.cpp create mode 100644 samplebrain/src/realtime_renderer.h diff --git a/samplebrain/src/realtime_renderer.cpp b/samplebrain/src/realtime_renderer.cpp new file mode 100644 index 0000000..b97fbce --- /dev/null +++ b/samplebrain/src/realtime_renderer.cpp @@ -0,0 +1,81 @@ +#include "realtime_renderer.h" + +using namespace spiralcore; + +void realtime_renderer::init(const brain &source, const brain &target, float ratio) { + m_source=source; + m_target=target; + m_render_time=0; + m_render_blocks.clear(); + m_ratio = ratio; +} + +void realtime_renderer::process(u32 nframes, float *buf) { + // get blocks from source for the current buffer + u32 src_shift = m_source.get_block_size()-m_source.get_overlap(); + u32 tgt_shift = m_target.get_block_size()-m_target.get_overlap(); + + u32 tgt_start = m_render_time/m_tgt_shift; + u32 tgt_end = (m_render_time+nframes)/m_tgt_shift; + + // get indices for current buffer + for (u32 tgt_index = tgt_start; tgt_index::iterator i=m_render_blocks.begin(); i!=m_render_blocks.end(); ++i) { + sample &pcm=m_source.get_block_pcm(i->m_index); + // get the sample offset into the buffer + s32 offset = i->m_time-m_render_time; + + // assume midway through block + u32 block_start = offset; + u32 buffer_start = 0; + if (block_start<0) { + block_start=-block_start; + } else { // block is midway through buffer + block_start=0; + buffer_start=offset; + if (buffer_start>nframes) i->m_finished=true; + } + + if (!i->m_finished) { + // mix in + u32 buffer_pos = buffer_start; + u32 block_pos = block_start; + u32 block_end = block_start+pcm.get_length(); + while (block_pos::iterator i=m_render_blocks.begin(); + list::iterator ni=m_render_blocks.begin(); + while(i!=m_render_blocks.end()) { + ni++; + if (i->m_finished) m_render_blocks.delete(i); + i=ni; + } +} + +bool realtime_renderer::unit_test() { + brain source; + source.load_sound("test_data/up.wav"); + brain target; + target.load_sound("test_data/up.wav"); + + realtime_renderer rr(); + rr.init(source,target,1); + + float *buf=new float[10]; + rr.process(10,buf); + +} diff --git a/samplebrain/src/realtime_renderer.h b/samplebrain/src/realtime_renderer.h new file mode 100644 index 0000000..92c24fe --- /dev/null +++ b/samplebrain/src/realtime_renderer.h @@ -0,0 +1,32 @@ +#include +#include + +namespace spiralcore { + +class realtime_renderer { +public: + void init(const brain &source, const brain &target); + void process(u32 nframes, float *buf); + + bool unit_test(); + +private: + + // realtime stuff + class render_block { + public: + render_block(u32 index, u32 time) : + m_index(index), m_time(time), m_finished(false) {} + u32 m_index; + u32 m_time; // in samples + bool m_finished; + }; + + const brain &m_source; + const brain &m_target; + + list m_render_blocks; + u32 m_render_time; +}; + +}