-Updated LooperClip, it now handles save() gracefully, copying data to GUI thread to be serialized to disk.

This commit is contained in:
Harry van Haaren 2013-09-03 19:35:02 +01:00
parent 1b76c1ce2c
commit 298b18af04
6 changed files with 116 additions and 6 deletions

View file

@ -30,7 +30,10 @@ namespace Event
MASTER_VOL, MASTER_VOL,
RECORD, RECORD,
SAVE, SAVE, // save action
SAVE_BUFFER,// save an individual AudioBuffer* to disk
REQUEST_SAVE_BUFFER, // gets an audioBuffer of a certain size
GRID_EVENT, // press / release events GRID_EVENT, // press / release events
GRID_STATE, // state of one block GRID_STATE, // state of one block
@ -332,6 +335,41 @@ class EventLooperClipRequestBuffer : public EventBase
EventLooperClipRequestBuffer(int t, int s, AudioBuffer* a): track(t), scene(s), numElements(0), ab(a) {} EventLooperClipRequestBuffer(int t, int s, AudioBuffer* a): track(t), scene(s), numElements(0), ab(a) {}
}; };
class EventSaveBuffer : public EventBase
{
public:
int type() { return int(SAVE_BUFFER); }
uint32_t size() { return sizeof(EventSaveBuffer); }
int track;
int scene;
// pointer to the AudioBuffer to be saved
AudioBuffer* ab;
EventSaveBuffer(): track(0), scene(0), ab(0) {}
EventSaveBuffer(int t, int s, AudioBuffer* a): track(t), scene(s), ab(a) {}
};
class EventRequestSaveBuffer : public EventBase
{
public:
int type() { return int(REQUEST_SAVE_BUFFER); }
uint32_t size() { return sizeof(EventRequestSaveBuffer); }
int track;
int scene;
size_t bufferSize;
// pointer to the AudioBuffer to be saved
AudioBuffer* ab;
EventRequestSaveBuffer(): track(0), scene(0), ab(0) {}
EventRequestSaveBuffer(int t, int s, size_t si): track(t), scene(s), bufferSize(si), ab(0) {}
EventRequestSaveBuffer(int t, int s, AudioBuffer* a): track(t), scene(s), ab(a) {}
};
class EventDeallocateBuffer : public EventBase class EventDeallocateBuffer : public EventBase
{ {
public: public:

View file

@ -144,6 +144,14 @@ void handleDspEvents()
jack->getLooper( ev.track )->setRequestedBuffer( ev.scene, ev.ab ); jack->getLooper( ev.track )->setRequestedBuffer( ev.scene, ev.ab );
} break; } } break; }
case Event::REQUEST_SAVE_BUFFER: {
if ( availableRead >= sizeof(EventRequestSaveBuffer) ) {
EventRequestSaveBuffer ev;
jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventRequestSaveBuffer) );
cout << "Save buffer sent with t s ab* " << ev.track << " " << ev.scene << " " << ev.ab << endl;
jack->getLooper( ev.track )->getClip(ev.scene)->recieveSaveBuffer( ev.ab );
} break; }
default: default:
{ {
cout << "DSP: Unkown message!! Will clog ringbuffer" << endl; cout << "DSP: Unkown message!! Will clog ringbuffer" << endl;

View file

@ -95,6 +95,18 @@ void handleGuiEvents()
} break; } } break; }
case Event::SAVE_BUFFER: {
if ( availableRead >= sizeof(EventSaveBuffer) ) {
EventSaveBuffer ev;
jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventSaveBuffer) );
// stream buffer to disk, add to JSON
cout << "EventSaveBuffer: " << ev.track << " " << ev.scene << " " << ev.ab->getID() << endl;
} break; }
case Event::GRID_STATE: { case Event::GRID_STATE: {
if ( availableRead >= sizeof(EventGridState) ) { if ( availableRead >= sizeof(EventGridState) ) {
EventGridState ev; EventGridState ev;
@ -170,6 +182,29 @@ void handleGuiEvents()
printf("new buffer going to track %i, scene %i\n",ev.track, ev.scene); printf("new buffer going to track %i, scene %i\n",ev.track, ev.scene);
#endif #endif
} break; } } break; }
case Event::REQUEST_SAVE_BUFFER: {
if ( availableRead >= sizeof(EventRequestSaveBuffer) ) {
EventRequestSaveBuffer ev;
jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventRequestSaveBuffer) );
#ifdef DEBUG_BUFFER
printf("Save buffer to track %i, scene %i\n",ev.track, ev.scene);
#endif
/// allocate a new AudioBuffer with ev.numElements, pass back to DSP
AudioBuffer* ab = new AudioBuffer(ev.bufferSize);
if ( ab )
{
cout << "Save buffer sent with t s ab* " << ev.track << " " << ev.scene << " " << ab << endl;
EventRequestSaveBuffer returnEvent( ev.track, ev.scene, ab);
writeToDspRingbuffer( &returnEvent );
}
else
{
cout << "error allocating save buffer!" << endl;
}
} break; }
case Event::DEALLOCATE_BUFFER: { case Event::DEALLOCATE_BUFFER: {
if ( availableRead >= sizeof(EventDeallocateBuffer) ) { if ( availableRead >= sizeof(EventDeallocateBuffer) ) {
EventDeallocateBuffer ev; EventDeallocateBuffer ev;

View file

@ -49,7 +49,9 @@ static void gmastertrack_button_callback(Fl_Widget *w, void *data) {
else if ( strcmp( w->label(), "Tap" ) == 0 ) else if ( strcmp( w->label(), "Tap" ) == 0 )
{ {
//Avtk::Button* b = (Avtk::Button*)w; //Avtk::Button* b = (Avtk::Button*)w;
EventTimeTempoTap e; //EventTimeTempoTap e;
//writeToDspRingbuffer( &e );
EventSave e;
writeToDspRingbuffer( &e ); writeToDspRingbuffer( &e );
} }
else else

View file

@ -33,10 +33,18 @@ LooperClip::LooperClip(int t, int s) :
void LooperClip::save() void LooperClip::save()
{ {
// ensure there is something in the buffer to be saved
if ( _loaded )
{
char buffer [50]; char buffer [50];
sprintf (buffer, "LooperClip::save() track %i, scene %i", track,scene); sprintf (buffer, "LooperClip::save() track %i, scene %i", track,scene);
EventGuiPrint e( buffer ); EventGuiPrint e( buffer );
writeToGuiRingbuffer( &e ); writeToGuiRingbuffer( &e );
EventRequestSaveBuffer e2( track, scene, _buffer->getData().size() );
writeToGuiRingbuffer( &e2 );
}
} }
/// loads a sample: eg from disk, unloading current sample if necessary /// loads a sample: eg from disk, unloading current sample if necessary
@ -84,6 +92,22 @@ void LooperClip::setRequestedBuffer( AudioBuffer* ab )
} }
void LooperClip::recieveSaveBuffer( AudioBuffer* saveBuffer )
{
// copy current contents into save buffer,
size_t size = _buffer->getData().size();
memcpy( &saveBuffer->getData().at(0), &_buffer->getData().at(0), sizeof(float)*size);
saveBuffer->setID ( _buffer->getID() );
saveBuffer->setBeats( _buffer->getBeats() );
EventSaveBuffer e ( track, scene, saveBuffer );
writeToGuiRingbuffer( &e );
}
void LooperClip::record(int count, float* L, float* R) void LooperClip::record(int count, float* L, float* R)
{ {
// write "count" samples into current buffer. // write "count" samples into current buffer.

View file

@ -75,6 +75,9 @@ class LooperClip : public SaveAble
**/ **/
void setRequestedBuffer( AudioBuffer* ab ); void setRequestedBuffer( AudioBuffer* ab );
/// used for saving the contents of this buffer to disk
void recieveSaveBuffer( AudioBuffer* ab );
private: private:
int track, scene; int track, scene;