From 9e01e639d4717d968c4c5a7b67e15d4dc23ec735 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Tue, 6 Aug 2013 22:10:27 +0100 Subject: [PATCH] -Working on resizeable recording buffers --- src/audiobuffer.hxx | 15 ++++++++++----- src/event.hxx | 18 ++++++++++++++++++ src/eventhandlergui.cxx | 15 +++++++++++++++ src/gui.cxx | 2 +- src/looper.cxx | 5 +++++ src/looperclip.hxx | 18 ++++++++++++------ 6 files changed, 61 insertions(+), 12 deletions(-) diff --git a/src/audiobuffer.hxx b/src/audiobuffer.hxx index 49983a7..f5295fe 100644 --- a/src/audiobuffer.hxx +++ b/src/audiobuffer.hxx @@ -12,15 +12,20 @@ class AudioBuffer public: AudioBuffer() { - ID = privateID++; + //ID = privateID++; + } + AudioBuffer(unsigned long size) + { + //ID = id; + buffer.resize(size); } ~AudioBuffer(); - + /* int getID() { return ID; } - + */ int getBeats() { return numBeats; @@ -42,8 +47,8 @@ class AudioBuffer } protected: - static int privateID; - int ID; + //static int privateID; + //int ID; int numBeats; diff --git a/src/event.hxx b/src/event.hxx index ddc9d41..2374704 100644 --- a/src/event.hxx +++ b/src/event.hxx @@ -44,6 +44,8 @@ namespace Event TIME_TEMPO_TAP, GUI_PRINT, + + LOOPER_REQUEST_BUFFER, }; }; @@ -235,6 +237,22 @@ class EventTimeBarBeat : public EventBase EventTimeBarBeat(int ba, int be): bar(ba), beat(be) {} }; +class EventLooperClipRequestBuffer : public EventBase +{ + public: + int type() { return int(LOOPER_REQUEST_BUFFER); } + uint32_t size() { return sizeof(EventLooperClipRequestBuffer); } + + int track; + int scene; + + // number of floats to contain + unsigned long numElements; + + EventLooperClipRequestBuffer(): track(0), scene(0){} + EventLooperClipRequestBuffer(int t, int s, int si): track(t), scene(s), numElements(si) {} +}; + // prints the string S in the GUI console class EventGuiPrint : public EventBase diff --git a/src/eventhandlergui.cxx b/src/eventhandlergui.cxx index 0cbdcbf..ad7defb 100644 --- a/src/eventhandlergui.cxx +++ b/src/eventhandlergui.cxx @@ -11,6 +11,7 @@ // Internal #include "gui.hxx" #include "event.hxx" +#include "audiobuffer.hxx" #include "eventhandler.hxx" extern Gui* gui; @@ -129,6 +130,20 @@ void handleGuiEvents() jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventTimeTempoTap) ); gui->getMasterTrack()->setTapTempo( ev.pressed ); } break; } + + + case Event::LOOPER_REQUEST_BUFFER: { + if ( availableRead >= sizeof(EventLooperClipRequestBuffer) ) { + EventLooperClipRequestBuffer ev; + jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventLooperClipRequestBuffer) ); + + /// allocate a new AudioBuffer with ev.numElements, pass back to DSP + AudioBuffer* ab = new AudioBuffer(ev.numElements); + + //gui->getMasterTrack()->setTapTempo( ev.pressed ); + } break; } + + default: { cout << "GUI: Unkown message!! Will clog ringbuffer" << endl; diff --git a/src/gui.cxx b/src/gui.cxx index 905118a..b1b188a 100644 --- a/src/gui.cxx +++ b/src/gui.cxx @@ -14,7 +14,7 @@ // Hack, move to gtrack.cpp int GTrack::privateID = 0; int GMasterTrack::privateID = 0; -int AudioBuffer::privateID = 0; +//int AudioBuffer::privateID = 0; using namespace std; diff --git a/src/looper.cxx b/src/looper.cxx index fefd3d8..fea80b1 100644 --- a/src/looper.cxx +++ b/src/looper.cxx @@ -198,6 +198,11 @@ void Looper::process(int nframes, Buffers* buffers) { // copy data from input buffer to recording buffer + if ( clips[clip].recordSpaceAvailable() < LOOPER_SAMPLES_BEFORE_REQUEST ) + { + EventLooperClipRequestBuffer e( track, clip, clips[clip].audioBufferSize() + 44100 ); + writeToGuiRingbuffer( &e ); + } } else if ( clips[clip].playing() ) { diff --git a/src/looperclip.hxx b/src/looperclip.hxx index 30a365a..2e99f3c 100644 --- a/src/looperclip.hxx +++ b/src/looperclip.hxx @@ -71,14 +71,20 @@ class LooperClip _buffer->getData().at( _recordhead ) = *L++; } - if(_buffer->getData().size() - _recordhead < LOOPER_SAMPLES_BEFORE_REQUEST) - { - // request bigger buffer for this LooperClip - - } - } + bool recordSpaceAvailable() + { + return _buffer->getData().size() - _recordhead; + } + size_t audioBufferSize() + { + if ( _buffer ) + { + return _buffer->getData().size(); + } + return 0; + } bool loaded(){return _loaded;} bool playing(){return _playing;}