GUI: improve sample type conversion

This commit is contained in:
tildearrow 2023-05-24 02:54:36 -05:00
parent 0fd5483b59
commit c7b24f706f
3 changed files with 42 additions and 2 deletions

View File

@ -699,6 +699,40 @@ bool DivSample::insert(unsigned int pos, unsigned int length) {
return false;
}
void DivSample::convert(DivSampleDepth newDepth) {
render();
depth=newDepth;
switch (depth) {
case DIV_SAMPLE_DEPTH_1BIT:
setSampleCount((samples+7)&(~7));
break;
case DIV_SAMPLE_DEPTH_1BIT_DPCM:
setSampleCount((1+((((samples+7)/8)+15)&(~15)))<<3);
break;
case DIV_SAMPLE_DEPTH_YMZ_ADPCM:
setSampleCount(((lengthZ+3)&(~0x03))*2);
break;
case DIV_SAMPLE_DEPTH_QSOUND_ADPCM: // QSound ADPCM
setSampleCount((samples+1)&(~1));
break;
case DIV_SAMPLE_DEPTH_ADPCM_A: // ADPCM-A
setSampleCount((samples+1)&(~1));
break;
case DIV_SAMPLE_DEPTH_ADPCM_B: // ADPCM-B
setSampleCount((samples+1)&(~1));
break;
case DIV_SAMPLE_DEPTH_BRR: // BRR
setSampleCount(16*(lengthBRR/9));
break;
case DIV_SAMPLE_DEPTH_VOX: // VOX
setSampleCount((samples+1)&(~1));
break;
default:
break;
}
render();
}
#define RESAMPLE_BEGIN \
if (samples<1) return true; \
int finalCount=(double)samples*(tRate/sRate); \

View File

@ -269,6 +269,13 @@ struct DivSample {
*/
bool resample(double sRate, double tRate, int filter);
/**
* convert sample depth.
* @warning do not attempt to do this outside of a synchronized block!
* @param newDepth the new depth.
*/
void convert(DivSampleDepth newDepth);
/**
* initialize the rest of sample formats for this sample.
*/

View File

@ -257,8 +257,7 @@ void FurnaceGUI::drawSampleEdit() {
if (ImGui::Selectable(sampleDepths[i])) {
sample->prepareUndo(true);
e->lockEngine([this,sample,i]() {
sample->render();
sample->depth=(DivSampleDepth)i;
sample->convert((DivSampleDepth)i);
e->renderSamples();
});
updateSampleTex=true;