GUI: implement sample paste
This commit is contained in:
parent
a199c102ce
commit
7ebc63a514
6 changed files with 129 additions and 11 deletions
|
|
@ -599,7 +599,7 @@ void FurnaceGUI::doAction(int what) {
|
|||
}
|
||||
sampleClipboard=new short[end-start];
|
||||
sampleClipboardLen=end-start;
|
||||
memcpy(sampleClipboard,&(sample->data16[start]),end-start);
|
||||
memcpy(sampleClipboard,&(sample->data16[start]),sizeof(short)*(end-start));
|
||||
|
||||
e->lockEngine([this,sample,start,end]() {
|
||||
sample->strip(start,end);
|
||||
|
|
@ -625,18 +625,92 @@ void FurnaceGUI::doAction(int what) {
|
|||
}
|
||||
sampleClipboard=new short[end-start];
|
||||
sampleClipboardLen=end-start;
|
||||
memcpy(sampleClipboard,&(sample->data16[start]),end-start);
|
||||
memcpy(sampleClipboard,&(sample->data16[start]),sizeof(short)*(end-start));
|
||||
break;
|
||||
}
|
||||
case GUI_ACTION_SAMPLE_PASTE: // TODO!!!
|
||||
case GUI_ACTION_SAMPLE_PASTE: {
|
||||
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
||||
if (sampleClipboard==NULL || sampleClipboardLen<1) break;
|
||||
DivSample* sample=e->song.sample[curSample];
|
||||
int pos=(sampleSelStart==-1 || sampleSelStart==sampleSelEnd)?sample->samples:sampleSelStart;
|
||||
|
||||
e->lockEngine([this,sample,pos]() {
|
||||
if (!sample->insert(pos,sampleClipboardLen)) {
|
||||
showError("couldn't paste! make sure your sample is 8 or 16-bit.");
|
||||
} else {
|
||||
if (sample->depth==8) {
|
||||
for (size_t i=0; i<sampleClipboardLen; i++) {
|
||||
sample->data8[pos+i]=sampleClipboard[i]>>8;
|
||||
}
|
||||
} else {
|
||||
memcpy(&(sample->data16[pos]),sampleClipboard,sizeof(short)*sampleClipboardLen);
|
||||
}
|
||||
}
|
||||
e->renderSamples();
|
||||
});
|
||||
sampleSelStart=pos;
|
||||
sampleSelEnd=pos+sampleClipboardLen;
|
||||
MARK_MODIFIED;
|
||||
break;
|
||||
case GUI_ACTION_SAMPLE_PASTE_REPLACE:
|
||||
}
|
||||
case GUI_ACTION_SAMPLE_PASTE_REPLACE: {
|
||||
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
||||
if (sampleClipboard==NULL || sampleClipboardLen<1) break;
|
||||
DivSample* sample=e->song.sample[curSample];
|
||||
int pos=(sampleSelStart==-1 || sampleSelStart==sampleSelEnd)?0:sampleSelStart;
|
||||
|
||||
e->lockEngine([this,sample,pos]() {
|
||||
if (sample->depth==8) {
|
||||
for (size_t i=0; i<sampleClipboardLen; i++) {
|
||||
if (pos+i>=sample->samples) break;
|
||||
sample->data8[pos+i]=sampleClipboard[i]>>8;
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<sampleClipboardLen; i++) {
|
||||
if (pos+i>=sample->samples) break;
|
||||
sample->data16[pos+i]=sampleClipboard[i];
|
||||
}
|
||||
}
|
||||
e->renderSamples();
|
||||
});
|
||||
sampleSelStart=pos;
|
||||
sampleSelEnd=pos+sampleClipboardLen;
|
||||
if (sampleSelEnd>(int)sample->samples) sampleSelEnd=sample->samples;
|
||||
MARK_MODIFIED;
|
||||
break;
|
||||
case GUI_ACTION_SAMPLE_PASTE_MIX:
|
||||
}
|
||||
case GUI_ACTION_SAMPLE_PASTE_MIX: {
|
||||
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
||||
if (sampleClipboard==NULL || sampleClipboardLen<1) break;
|
||||
DivSample* sample=e->song.sample[curSample];
|
||||
int pos=(sampleSelStart==-1 || sampleSelStart==sampleSelEnd)?0:sampleSelStart;
|
||||
|
||||
e->lockEngine([this,sample,pos]() {
|
||||
if (sample->depth==8) {
|
||||
for (size_t i=0; i<sampleClipboardLen; i++) {
|
||||
if (pos+i>=sample->samples) break;
|
||||
int val=sample->data8[pos+i]+(sampleClipboard[i]>>8);
|
||||
if (val>127) val=127;
|
||||
if (val<-128) val=-128;
|
||||
sample->data8[pos+i]=val;
|
||||
}
|
||||
} else {
|
||||
for (size_t i=0; i<sampleClipboardLen; i++) {
|
||||
if (pos+i>=sample->samples) break;
|
||||
int val=sample->data16[pos+i]+sampleClipboard[i];
|
||||
if (val>32767) val=32767;
|
||||
if (val<-32768) val=-32768;
|
||||
sample->data16[pos+i]=val;
|
||||
}
|
||||
}
|
||||
e->renderSamples();
|
||||
});
|
||||
sampleSelStart=pos;
|
||||
sampleSelEnd=pos+sampleClipboardLen;
|
||||
if (sampleSelEnd>(int)sample->samples) sampleSelEnd=sample->samples;
|
||||
MARK_MODIFIED;
|
||||
break;
|
||||
}
|
||||
case GUI_ACTION_SAMPLE_SELECT_ALL: {
|
||||
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
||||
DivSample* sample=e->song.sample[curSample];
|
||||
|
|
@ -761,6 +835,10 @@ void FurnaceGUI::doAction(int what) {
|
|||
MARK_MODIFIED;
|
||||
break;
|
||||
}
|
||||
case GUI_ACTION_SAMPLE_INSERT:
|
||||
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
||||
openSampleSilenceOpt=true;
|
||||
break;
|
||||
case GUI_ACTION_SAMPLE_SILENCE: {
|
||||
if (curSample<0 || curSample>=(int)e->song.sample.size()) break;
|
||||
DivSample* sample=e->song.sample[curSample];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue