mirror of
https://github.com/vale981/openAV-Luppp
synced 2025-03-05 09:01:39 -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 );
|
0 );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
masterVol = 0.0f;
|
|
||||||
returnVol = 1.0f;
|
returnVol = 1.0f;
|
||||||
|
|
||||||
inputToMixEnable = false;
|
inputToMixEnable = false;
|
||||||
|
@ -211,6 +211,8 @@ Jack::Jack( std::string name ) :
|
||||||
/// setup DSP instances
|
/// setup DSP instances
|
||||||
inputVol = 1.0f;
|
inputVol = 1.0f;
|
||||||
masterVol = 0.75f;
|
masterVol = 0.75f;
|
||||||
|
masterVolLag =0.75f;
|
||||||
|
masterVolDiff =0.0f;
|
||||||
masterMeter = new DBMeter( buffers.samplerate );
|
masterMeter = new DBMeter( buffers.samplerate );
|
||||||
inputMeter = 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;
|
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
|
/// mixdown returns into master buffers
|
||||||
// FIXME: Returns broken, due to metronome glitch in master output: buffer
|
// FIXME: Returns broken, due to metronome glitch in master output: buffer
|
||||||
// writing issue or such. See #95 on github
|
// 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_L][i] = L * masterVolLag;// (L + returnL*returnVol) * masterVol;
|
||||||
buffers.audio[Buffers::JACK_MASTER_OUT_R][i] = R * masterVol;// (R + returnR*returnVol) * masterVol;
|
buffers.audio[Buffers::JACK_MASTER_OUT_R][i] = R * masterVolLag;// (R + returnR*returnVol) * masterVol;
|
||||||
|
|
||||||
/// write SEND content to JACK port
|
/// write SEND content to JACK port
|
||||||
buffers.audio[Buffers::JACK_SEND_OUT][i] = buffers.audio[Buffers::SEND][i];
|
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)
|
void Jack::masterVolume(float vol)
|
||||||
{
|
{
|
||||||
masterVol = vol;
|
masterVol = vol;
|
||||||
|
masterVolDiff=masterVol-masterVolLag;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Jack::returnVolume(float vol)
|
void Jack::returnVolume(float vol)
|
||||||
|
|
|
@ -133,7 +133,11 @@ class Jack
|
||||||
DBMeter* masterMeter;
|
DBMeter* masterMeter;
|
||||||
|
|
||||||
float inputVol;
|
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 masterVol;
|
||||||
|
float masterVolLag;
|
||||||
|
float masterVolDiff;
|
||||||
float returnVol;
|
float returnVol;
|
||||||
|
|
||||||
float inputToMixVol;
|
float inputToMixVol;
|
||||||
|
|
|
@ -34,7 +34,8 @@ TrackOutput::TrackOutput(int t, AudioProcessor* ap) :
|
||||||
dbMeter = new DBMeter( jack->getSamplerate() );
|
dbMeter = new DBMeter( jack->getSamplerate() );
|
||||||
|
|
||||||
_toMaster = 0.8;
|
_toMaster = 0.8;
|
||||||
|
_toMasterLag = 0.8;
|
||||||
|
_toMasterDiff = 0;
|
||||||
_toReverb = 0.0;
|
_toReverb = 0.0;
|
||||||
_toSidechain = 0.0;
|
_toSidechain = 0.0;
|
||||||
_toPostSidechain = 0.0;
|
_toPostSidechain = 0.0;
|
||||||
|
@ -48,6 +49,7 @@ TrackOutput::TrackOutput(int t, AudioProcessor* ap) :
|
||||||
void TrackOutput::setMaster(float value)
|
void TrackOutput::setMaster(float value)
|
||||||
{
|
{
|
||||||
_toMaster = value;
|
_toMaster = value;
|
||||||
|
_toMasterDiff=_toMaster-_toMasterLag;
|
||||||
}
|
}
|
||||||
|
|
||||||
float TrackOutput::getMaster()
|
float TrackOutput::getMaster()
|
||||||
|
@ -102,6 +104,9 @@ void TrackOutput::setSend( int send, float value )
|
||||||
|
|
||||||
void TrackOutput::process(unsigned int nframes, Buffers* buffers)
|
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
|
// get & zero track buffer
|
||||||
float* trackBuffer = buffers->audio[Buffers::TRACK_0 + track];
|
float* trackBuffer = buffers->audio[Buffers::TRACK_0 + track];
|
||||||
memset( trackBuffer, 0, sizeof(float)*nframes );
|
memset( trackBuffer, 0, sizeof(float)*nframes );
|
||||||
|
@ -114,8 +119,8 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers)
|
||||||
|
|
||||||
if (uiUpdateCounter > uiUpdateConstant )
|
if (uiUpdateCounter > uiUpdateConstant )
|
||||||
{
|
{
|
||||||
float l = dbMeter->getLeftDB() * _toMaster;
|
float l = dbMeter->getLeftDB() * _toMasterLag;
|
||||||
float r = dbMeter->getRightDB() * _toMaster;
|
float r = dbMeter->getRightDB() * _toMasterLag;
|
||||||
EventTrackSignalLevel e( track, l, r );
|
EventTrackSignalLevel e( track, l, r );
|
||||||
writeToGuiRingbuffer( &e );
|
writeToGuiRingbuffer( &e );
|
||||||
uiUpdateCounter = 0;
|
uiUpdateCounter = 0;
|
||||||
|
@ -137,14 +142,14 @@ void TrackOutput::process(unsigned int nframes, Buffers* buffers)
|
||||||
float tmp = trackBuffer[i];
|
float tmp = trackBuffer[i];
|
||||||
|
|
||||||
// post-sidechain *moves* signal between "before/after" ducking, not add!
|
// post-sidechain *moves* signal between "before/after" ducking, not add!
|
||||||
masterL[i] += tmp * _toMaster * (1-_toPostSidechain);
|
masterL[i] += tmp * _toMasterLag * (1-_toPostSidechain);
|
||||||
masterR[i] += tmp * _toMaster * (1-_toPostSidechain);
|
masterR[i] += tmp * _toMasterLag * (1-_toPostSidechain);
|
||||||
|
|
||||||
if ( _toPostfaderActive )
|
if ( _toPostfaderActive )
|
||||||
reverb[i] += tmp * _toReverb * _toMaster;
|
reverb[i] += tmp * _toReverb * _toMasterLag;
|
||||||
|
|
||||||
if ( _toXSideActive )
|
if ( _toXSideActive )
|
||||||
postSidechain[i] += tmp * _toPostSidechain * _toMaster;
|
postSidechain[i] += tmp * _toPostSidechain * _toMasterLag;
|
||||||
|
|
||||||
// turning down an element in the mix should *NOT* influence sidechaining
|
// turning down an element in the mix should *NOT* influence sidechaining
|
||||||
if ( _toKeyActive )
|
if ( _toKeyActive )
|
||||||
|
|
|
@ -59,9 +59,12 @@ class TrackOutput : public AudioProcessor
|
||||||
int track;
|
int track;
|
||||||
|
|
||||||
bool _recordArm;
|
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 _toMaster;
|
||||||
|
float _toMasterLag;
|
||||||
|
float _toMasterDiff;
|
||||||
|
|
||||||
float _toReverb;
|
float _toReverb;
|
||||||
float _toSidechain;
|
float _toSidechain;
|
||||||
float _toPostSidechain;
|
float _toPostSidechain;
|
||||||
|
|
Loading…
Add table
Reference in a new issue