diff --git a/src/jack.cxx b/src/jack.cxx index e2ba6d6..51c45d2 100644 --- a/src/jack.cxx +++ b/src/jack.cxx @@ -176,7 +176,7 @@ Jack::Jack( std::string name ) : 0 ); */ - masterVol = 0.0f; + returnVol = 1.0f; inputToMixEnable = false; @@ -211,6 +211,8 @@ Jack::Jack( std::string name ) : /// setup DSP instances inputVol = 1.0f; masterVol = 0.75f; + masterVolLag =0.75f; + masterVolDiff =0.0f; masterMeter = new DBMeter( buffers.samplerate ); inputMeter = new DBMeter( buffers.samplerate ); @@ -466,11 +468,14 @@ void Jack::processFrames(int nframes) buffers.audio[Buffers::SIDECHAIN_SIGNAL][i] += input * inputToXSideVol; + //compute master volume lag; + if(fabs(masterVol-masterVolLag)>=fabs(masterVolDiff/10.0)) + masterVolLag+=masterVolDiff/10.0; /// mixdown returns into master buffers // FIXME: Returns broken, due to metronome glitch in master output: buffer // writing issue or such. See #95 on github - buffers.audio[Buffers::JACK_MASTER_OUT_L][i] = L * masterVol;// (L + returnL*returnVol) * masterVol; - buffers.audio[Buffers::JACK_MASTER_OUT_R][i] = R * masterVol;// (R + returnR*returnVol) * masterVol; + buffers.audio[Buffers::JACK_MASTER_OUT_L][i] = L * masterVolLag;// (L + returnL*returnVol) * masterVol; + buffers.audio[Buffers::JACK_MASTER_OUT_R][i] = R * masterVolLag;// (R + returnR*returnVol) * masterVol; /// write SEND content to JACK port buffers.audio[Buffers::JACK_SEND_OUT][i] = buffers.audio[Buffers::SEND][i]; @@ -541,6 +546,7 @@ void Jack::clearInternalBuffers(int nframes) void Jack::masterVolume(float vol) { masterVol = vol; + masterVolDiff=masterVol-masterVolLag; } void Jack::returnVolume(float vol) diff --git a/src/jack.hxx b/src/jack.hxx index 1c8f71e..f02d901 100644 --- a/src/jack.hxx +++ b/src/jack.hxx @@ -133,7 +133,11 @@ class Jack DBMeter* masterMeter; float inputVol; + /// _toMasterLag is a volume that lags behind _toMaster when setMaster() is called + /// This prohibits audible jumps when rapidly changing the volume float masterVol; + float masterVolLag; + float masterVolDiff; float returnVol; float inputToMixVol; diff --git a/src/trackoutput.cxx b/src/trackoutput.cxx index 9238c33..c1e64ba 100644 --- a/src/trackoutput.cxx +++ b/src/trackoutput.cxx @@ -34,7 +34,8 @@ TrackOutput::TrackOutput(int t, AudioProcessor* ap) : dbMeter = new DBMeter( jack->getSamplerate() ); _toMaster = 0.8; - + _toMasterLag = 0.8; + _toMasterDiff = 0; _toReverb = 0.0; _toSidechain = 0.0; _toPostSidechain = 0.0; @@ -48,6 +49,7 @@ TrackOutput::TrackOutput(int t, AudioProcessor* ap) : void TrackOutput::setMaster(float value) { _toMaster = value; + _toMasterDiff=_toMaster-_toMasterLag; } float TrackOutput::getMaster() @@ -102,6 +104,9 @@ void TrackOutput::setSend( int send, float value ) void TrackOutput::process(unsigned int nframes, Buffers* buffers) { + //compute master volume lag; + if(fabs(_toMaster-_toMasterLag)>=fabs(_toMasterDiff/10.0)) + _toMasterLag+=_toMasterDiff/10.0; // get & zero track buffer float* trackBuffer = buffers->audio[Buffers::TRACK_0 + track]; memset( trackBuffer, 0, sizeof(float)*nframes ); @@ -114,8 +119,8 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) if (uiUpdateCounter > uiUpdateConstant ) { - float l = dbMeter->getLeftDB() * _toMaster; - float r = dbMeter->getRightDB() * _toMaster; + float l = dbMeter->getLeftDB() * _toMasterLag; + float r = dbMeter->getRightDB() * _toMasterLag; EventTrackSignalLevel e( track, l, r ); writeToGuiRingbuffer( &e ); uiUpdateCounter = 0; @@ -137,14 +142,14 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers) float tmp = trackBuffer[i]; // post-sidechain *moves* signal between "before/after" ducking, not add! - masterL[i] += tmp * _toMaster * (1-_toPostSidechain); - masterR[i] += tmp * _toMaster * (1-_toPostSidechain); + masterL[i] += tmp * _toMasterLag * (1-_toPostSidechain); + masterR[i] += tmp * _toMasterLag * (1-_toPostSidechain); if ( _toPostfaderActive ) - reverb[i] += tmp * _toReverb * _toMaster; + reverb[i] += tmp * _toReverb * _toMasterLag; if ( _toXSideActive ) - postSidechain[i] += tmp * _toPostSidechain * _toMaster; + postSidechain[i] += tmp * _toPostSidechain * _toMasterLag; // turning down an element in the mix should *NOT* influence sidechaining if ( _toKeyActive ) diff --git a/src/trackoutput.hxx b/src/trackoutput.hxx index 55c2fa0..a4382bb 100644 --- a/src/trackoutput.hxx +++ b/src/trackoutput.hxx @@ -59,9 +59,12 @@ class TrackOutput : public AudioProcessor int track; bool _recordArm; - + /// _toMasterLag is a volume that lags behind _toMaster when setMaster() is called + /// This prohibits audible jumps when rapidly changing the volume float _toMaster; - + float _toMasterLag; + float _toMasterDiff; + float _toReverb; float _toSidechain; float _toPostSidechain;