mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-23 21:15:11 +00:00
prepare for sample undo/redo
This commit is contained in:
parent
519dd7f2dd
commit
2c05d56ab2
2 changed files with 97 additions and 0 deletions
|
@ -32,6 +32,10 @@ extern "C" {
|
|||
#include "../../extern/adpcm/ymz_codec.h"
|
||||
}
|
||||
|
||||
DivSampleHistory::~DivSampleHistory() {
|
||||
if (data!=NULL) delete[] data;
|
||||
}
|
||||
|
||||
bool DivSample::save(const char* path) {
|
||||
SNDFILE* f;
|
||||
SF_INFO si;
|
||||
|
@ -786,7 +790,48 @@ unsigned int DivSample::getCurBufLen() {
|
|||
return 0;
|
||||
}
|
||||
|
||||
DivSampleHistory* DivSample::prepareUndo(bool data) {
|
||||
DivSampleHistory* h;
|
||||
if (data) {
|
||||
unsigned char* duplicate;
|
||||
if (getCurBuf()==NULL) {
|
||||
duplicate=NULL;
|
||||
} else {
|
||||
duplicate=new unsigned char[getCurBufLen()];
|
||||
memcpy(duplicate,getCurBuf(),getCurBufLen());
|
||||
}
|
||||
h=new DivSampleHistory(duplicate,getCurBufLen(),samples,depth,rate,centerRate,loopStart);
|
||||
} else {
|
||||
h=new DivSampleHistory(depth,rate,centerRate,loopStart);
|
||||
}
|
||||
while (!redoHist.empty()) {
|
||||
DivSampleHistory* h=redoHist.front();
|
||||
delete h;
|
||||
redoHist.pop_front();
|
||||
}
|
||||
undoHist.push_back(h);
|
||||
return h;
|
||||
}
|
||||
|
||||
int DivSample::undo() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int DivSample::redo() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
DivSample::~DivSample() {
|
||||
while (!undoHist.empty()) {
|
||||
DivSampleHistory* h=undoHist.front();
|
||||
delete h;
|
||||
undoHist.pop_front();
|
||||
}
|
||||
while (!redoHist.empty()) {
|
||||
DivSampleHistory* h=redoHist.front();
|
||||
delete h;
|
||||
redoHist.pop_front();
|
||||
}
|
||||
if (data8) delete[] data8;
|
||||
if (data16) delete[] data16;
|
||||
if (data1) delete[] data1;
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
|
||||
#include "../ta-utils.h"
|
||||
#include <deque>
|
||||
|
||||
enum DivResampleFilters {
|
||||
DIV_RESAMPLE_NONE=0,
|
||||
|
@ -28,6 +29,33 @@ enum DivResampleFilters {
|
|||
DIV_RESAMPLE_BEST
|
||||
};
|
||||
|
||||
struct DivSampleHistory {
|
||||
unsigned char* data;
|
||||
unsigned int length, samples;
|
||||
unsigned char depth;
|
||||
int rate, centerRate, loopStart;
|
||||
bool hasSample;
|
||||
DivSampleHistory(void* d, unsigned int l, unsigned int s, unsigned char de, int r, int cr, int ls):
|
||||
data((unsigned char*)d),
|
||||
length(l),
|
||||
samples(s),
|
||||
depth(de),
|
||||
rate(r),
|
||||
centerRate(cr),
|
||||
loopStart(ls),
|
||||
hasSample(true) {}
|
||||
DivSampleHistory(unsigned char de, int r, int cr, int ls):
|
||||
data(NULL),
|
||||
length(0),
|
||||
samples(0),
|
||||
depth(de),
|
||||
rate(r),
|
||||
centerRate(cr),
|
||||
loopStart(ls),
|
||||
hasSample(false) {}
|
||||
~DivSampleHistory();
|
||||
};
|
||||
|
||||
struct DivSample {
|
||||
String name;
|
||||
int rate, centerRate, loopStart, loopOffP;
|
||||
|
@ -62,6 +90,9 @@ struct DivSample {
|
|||
|
||||
unsigned int samples;
|
||||
|
||||
std::deque<DivSampleHistory*> undoHist;
|
||||
std::deque<DivSampleHistory*> redoHist;
|
||||
|
||||
/**
|
||||
* @warning DO NOT USE - internal functions
|
||||
*/
|
||||
|
@ -154,6 +185,27 @@ struct DivSample {
|
|||
* @return the sample data length.
|
||||
*/
|
||||
unsigned int getCurBufLen();
|
||||
|
||||
/**
|
||||
* prepare an undo step for this sample.
|
||||
* @param data whether to include sample data.
|
||||
* @return the undo step.
|
||||
*/
|
||||
DivSampleHistory* prepareUndo(bool data);
|
||||
|
||||
/**
|
||||
* undo. you may need to call DivEngine::renderSamples afterwards.
|
||||
* @warning do not attempt to undo outside of a synchronized block!
|
||||
* @return 0 on failure; 1 on success and 2 on success (data changed).
|
||||
*/
|
||||
int undo();
|
||||
|
||||
/**
|
||||
* redo. you may need to call DivEngine::renderSamples afterwards.
|
||||
* @warning do not attempt to redo outside of a synchronized block!
|
||||
* @return 0 on failure; 1 on success and 2 on success (data changed).
|
||||
*/
|
||||
int redo();
|
||||
DivSample():
|
||||
name(""),
|
||||
rate(32000),
|
||||
|
|
Loading…
Reference in a new issue