mirror of
https://github.com/vale981/openAV-Luppp
synced 2025-03-04 16:51:37 -05:00
added lag function to all volume sliders. Suppresses audio jitter at rapid
volume changes
This commit is contained in:
parent
bc71739b3a
commit
eb06f749a5
4 changed files with 30 additions and 12 deletions
12
src/jack.cxx
12
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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 )
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Reference in a new issue