mirror of
https://github.com/vale981/openAV-Luppp
synced 2025-03-06 01:21:38 -05:00
-Updated LooperClip, it now handles save() gracefully, copying data to GUI thread to be serialized to disk.
This commit is contained in:
parent
1b76c1ce2c
commit
298b18af04
6 changed files with 116 additions and 6 deletions
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue