mixer: per-chp peak meters, fix almost every ui issue:

- fix wrong verticaltext clipping
- fix verticaltext overflow centering
- add hscroll to mixer
This commit is contained in:
Eknous-P 2025-10-10 19:36:02 +04:00
parent 76b29fa31c
commit 2108cffec2
4 changed files with 62 additions and 11 deletions

View file

@ -698,6 +698,8 @@ class DivEngine {
int lastNBIns, lastNBOuts, lastNBSize;
std::atomic<size_t> processTime;
float chipPeak[DIV_MAX_CHIPS][DIV_MAX_OUTPUTS];
void runExportThread();
void nextBuf(float** in, float** out, int inChans, int outChans, unsigned int size);
DivInstrument* getIns(int index, DivInstrumentType fallbackType=DIV_INS_FM);
@ -1542,6 +1544,7 @@ class DivEngine {
memset(walked,0,8192);
memset(oscBuf,0,DIV_MAX_OUTPUTS*(sizeof(float*)));
memset(exportChannelMask,1,DIV_MAX_CHANS*sizeof(bool));
memset(chipPeak,0,DIV_MAX_CHIPS*DIV_MAX_OUTPUTS*sizeof(float));
for (int i=0; i<DIV_MAX_CHIP_DEFS; i++) {
sysFileMapFur[i]=DIV_SYSTEM_NULL;

View file

@ -2706,6 +2706,36 @@ void DivEngine::nextBuf(float** in, float** out, int inChans, int outChans, unsi
}
oscSize=size;
// get per-chip peaks
float decay=2.f*size/got.rate;
for (int i=0; i<song.systemLen; i++) {
DivDispatch* disp=disCont[i].dispatch;
for (int j=0; j<disp->getOutputCount(); j++) {
chipPeak[i][j]*=1.0-decay;
float peak=chipPeak[i][j];
for (unsigned int k=0; k<size; k++) {
float out=disCont[i].bbOut[j][k]*song.systemVol[i]*disp->getPostAmp()/32768.0f; // TODO: PARSE PANNING, FRONT/REAR AND PATCHBAY
// switch (j) {
// case 0:
// out*=MIN(1.0f,1.0f-song.systemPan[i])*MIN(1.0f,1.0f+song.systemPanFR[i]);
// break;
// case 1:
// out*=MIN(1.0f,1.0f+song.systemPan[i])*MIN(1.0f,1.0f+song.systemPanFR[i]);
// break;
// case 2:
// out*=MIN(1.0f,1.0f-song.systemPan[i])*MIN(1.0f,1.0f-song.systemPanFR[i]);
// break;
// case 3:
// out*=MIN(1.0f,1.0f+song.systemPan[i])*MIN(1.0f,1.0f-song.systemPanFR[i]);
// break;
// default: break;
// }
if (out>peak) peak=out;
}
chipPeak[i][j]+=(peak-chipPeak[i][j])*0.9;
}
}
// force mono audio (if enabled)
if (forceMono && outChans>1) {
for (size_t i=0; i<size; i++) {