diff --git a/src/event.hxx b/src/event.hxx index 7d47118..b50ca64 100644 --- a/src/event.hxx +++ b/src/event.hxx @@ -65,7 +65,8 @@ enum EVENT_TYPE { MASTER_RETURN, RECORD, - SESSION_SAVE, // save action + SESSION_SAVE, // save hole session + CLIP_SAVE, // save single clip STATE_RESET, // reset all state STATE_SAVE_FINISH,// save action finished, flush metadata to disk STATE_SAVE_BUFFER,// save an individual AudioBuffer* to disk @@ -550,6 +551,25 @@ public: EventSessionSave() {} }; +class EventClipSave : public EventBase +{ +public: + int type() + { + return int(CLIP_SAVE); + } + uint32_t size() + { + return sizeof(EventClipSave); + } + + int track; + int scene; + + EventClipSave(): track(0), scene(0) {}; + EventClipSave(int t, int s): track(t), scene(s) {} +}; + class EventStateReset : public EventBase { public: @@ -1034,9 +1054,8 @@ public: int scene; // pointer to the AudioBuffer to be saved AudioBuffer* ab; - bool no_dealloc; - EventStateSaveBuffer(): track(0), scene(0), ab(0), no_dealloc(0) {} + EventStateSaveBuffer(): track(0), scene(0), ab(0) {} EventStateSaveBuffer(int t, int s, AudioBuffer* a): track(t), scene(s), ab(a) {} }; diff --git a/src/eventhandlerdsp.cxx b/src/eventhandlerdsp.cxx index ff4bc81..43dc58d 100644 --- a/src/eventhandlerdsp.cxx +++ b/src/eventhandlerdsp.cxx @@ -107,19 +107,14 @@ void handleDspEvents() } break; } - case Event::STATE_SAVE_BUFFER: { - if ( availableRead >= sizeof(EventStateReset) ) { - EventStateSaveBuffer ev; - jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventStateSaveBuffer) ); + case Event::CLIP_SAVE: { + if ( availableRead >= sizeof(EventClipSave) ) { + EventClipSave ev; + jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventClipSave) ); printf("jack got save buffer in %d, %d\n", ev.track, ev.scene); LooperClip* lc = jack->getLooper(ev.track)->getClip(ev.scene); if(!lc) break; - EventStateSaveBuffer e; - e.track = ev.track; - e.scene = ev.scene; - e.ab = lc->getAudioBuffer(); - e.no_dealloc = 1; - writeToGuiRingbuffer( &e ); + lc->save(); } break; } diff --git a/src/eventhandlergui.cxx b/src/eventhandlergui.cxx index 4375914..e23e171 100644 --- a/src/eventhandlergui.cxx +++ b/src/eventhandlergui.cxx @@ -214,14 +214,10 @@ void handleGuiEvents() #ifdef DEBUG_SAVE cout << "EventSaveBuffer: " << ev.track << " " << ev.scene << " " << ev.ab->getID() << endl; #endif - gui->getDiskWriter()->writeAudioBuffer( ev.track, ev.scene, ev.ab ); - // de allocate the AudioBuffer only if reqested - if(!ev.no_dealloc) { + if(gui->saveBufferPath.empty()) { gui->getDiskWriter()->writeAudioBuffer( ev.track, ev.scene, ev.ab ); - delete ev.ab; } else { - gui->getDiskWriter()->writeAudioBuffer(ev.track, ev.scene, ev.ab, - gui->saveBufferPath.c_str()); + gui->getDiskWriter()->writeAudioBuffer(ev.track, ev.scene, ev.ab, gui->saveBufferPath.c_str()); gui->saveBufferPath = ""; } diff --git a/src/gui.cxx b/src/gui.cxx index 35ae6ba..c42bee5 100644 --- a/src/gui.cxx +++ b/src/gui.cxx @@ -247,10 +247,8 @@ string Gui::getProjectsDir() void Gui::selectSaveSample( int track, int scene ) { - EventStateSaveBuffer e; - e.track = track, - e.scene = scene, - writeToDspRingbuffer( &e ); + EventClipSave e = EventClipSave(track, scene); + writeToDspRingbuffer( &e ); } char *