added lag function to all volume sliders. Suppresses audio jitter at rapid

volume changes
This commit is contained in:
Gerald 2016-09-22 15:53:18 +02:00 committed by Harry van Haaren
parent bc71739b3a
commit eb06f749a5
4 changed files with 30 additions and 12 deletions

View file

@ -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)

View file

@ -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;

View file

@ -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 )

View file

@ -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;