Skip to content

Commit

Permalink
Faders in FX mixer: added peak value indicator
Browse files Browse the repository at this point in the history
Based on the patch by Thorsten Müller provided at #3307037, I continued
the work to display nice indicators for the peak value of the last 1500
ms.

Closes #3307037.
  • Loading branch information
tobydox committed Jun 23, 2011
1 parent ee0f6cc commit d4684f3
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 56 deletions.
21 changes: 13 additions & 8 deletions include/fader.h
@@ -1,7 +1,7 @@
/*
* fader.h - fader-widget used in FX-mixer - partly taken from Hydrogen
*
* Copyright (c) 2008-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2008-2011 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
Expand Down Expand Up @@ -48,6 +48,7 @@
#ifndef _FADER_H
#define _FADER_H

#include <QtCore/QTime>
#include <QtGui/QWidget>
#include <QtGui/QPixmap>

Expand All @@ -63,13 +64,10 @@ class fader : public QWidget, public FloatModelView
fader( FloatModel * _model, const QString & _name, QWidget * _parent );
virtual ~fader();

void setMaxPeak( float _max );
void setMinPeak( float _min );

void setPeak_L( float peak );
void setPeak_L( float fPeak );
float getPeak_L() { return m_fPeakValue_L; }

void setPeak_R( float peak );
void setPeak_R( float fPeak );
float getPeak_R() { return m_fPeakValue_R; }


Expand All @@ -91,10 +89,17 @@ class fader : public QWidget, public FloatModelView

FloatModel * m_model;

void setPeak( float fPeak, float &targetPeak, float &persistentPeak, QTime &lastPeakTime );
int calculateDisplayPeak( float fPeak );
float m_fPeakValue_L;
float m_fPeakValue_R;
float m_fMinPeak;
float m_fMaxPeak;
float m_persistentPeak_L;
float m_persistentPeak_R;
const float m_fMinPeak;
const float m_fMaxPeak;

QTime m_lastPeakTime_L;
QTime m_lastPeakTime_R;

QPixmap m_back;
QPixmap m_leds;
Expand Down
99 changes: 51 additions & 48 deletions src/gui/widgets/fader.cpp
@@ -1,7 +1,7 @@
/*
* fader.cpp - fader-widget used in mixer - partly taken from Hydrogen
*
* Copyright (c) 2008-2009 Tobias Doerffel <tobydox/at/users.sourceforge.net>
* Copyright (c) 2008-2011 Tobias Doerffel <tobydox/at/users.sourceforge.net>
*
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
*
Expand Down Expand Up @@ -67,6 +67,8 @@ fader::fader( FloatModel * _model, const QString & _name, QWidget * _parent ) :
m_model( _model ),
m_fPeakValue_L( 0.0 ),
m_fPeakValue_R( 0.0 ),
m_persistentPeak_L( 0.0 ),
m_persistentPeak_R( 0.0 ),
m_fMinPeak( 0.01f ),
m_fMaxPeak( 1.1 ),
m_back( embed::getIconPixmap( "fader_background" ) ),
Expand Down Expand Up @@ -166,42 +168,52 @@ void fader::wheelEvent ( QWheelEvent *ev )
///
/// Set peak value (0.0 .. 1.0)
///
void fader::setPeak_L( float fPeak )
void fader::setPeak( float fPeak, float &targetPeak, float &persistentPeak, QTime &lastPeakTime )
{
if ( fPeak < m_fMinPeak ) {
if( fPeak < m_fMinPeak )
{
fPeak = m_fMinPeak;
}
else if ( fPeak > m_fMaxPeak ) {
else if( fPeak > m_fMaxPeak )
{
fPeak = m_fMaxPeak;
}

if ( m_fPeakValue_L != fPeak) {
m_fPeakValue_L = fPeak;
if( targetPeak != fPeak)
{
targetPeak = fPeak;
if( targetPeak >= persistentPeak )
{
persistentPeak = targetPeak;
lastPeakTime.restart();
}
update();
}

if( persistentPeak > 0 && lastPeakTime.elapsed() > 1500 )
{
persistentPeak = qMax<float>( 0, persistentPeak-0.05 );
update();
}
}



void fader::setPeak_L( float fPeak )
{
setPeak( fPeak, m_fPeakValue_L, m_persistentPeak_L, m_lastPeakTime_L );
}



///
/// Set peak value (0.0 .. 1.0)
///
void fader::setPeak_R( float fPeak )
{
if ( fPeak < m_fMinPeak ) {
fPeak = m_fMinPeak;
}
else if ( fPeak > m_fMaxPeak ) {
fPeak = m_fMaxPeak;
}

if ( m_fPeakValue_R != fPeak ) {
m_fPeakValue_R = fPeak;
update();
}
setPeak( fPeak, m_fPeakValue_R, m_persistentPeak_R, m_lastPeakTime_R );
}



// update tooltip showing value and adjust position while changing fader value
void fader::updateTextFloat()
{
if( configManager::inst()->value( "app", "displaydbv" ).toInt() )
Expand All @@ -217,6 +229,13 @@ void fader::updateTextFloat()
}


inline int fader::calculateDisplayPeak( float fPeak )
{
int peak = (int)( 116 - ( fPeak / ( m_fMaxPeak - m_fMinPeak ) ) * 116.0 );

if ( peak > 116 ) return 116;
else return peak;
}

void fader::paintEvent( QPaintEvent * ev)
{
Expand All @@ -230,24 +249,23 @@ void fader::paintEvent( QPaintEvent * ev)
// peak leds
//float fRange = abs( m_fMaxPeak ) + abs( m_fMinPeak );

float realPeak_L = m_fPeakValue_L - m_fMinPeak;
//int peak_L = 116 - ( realPeak_L / fRange ) * 116.0;
int peak_L = (int)( 116 - ( realPeak_L / ( m_fMaxPeak - m_fMinPeak ) ) *
116.0 );
int peak_L = calculateDisplayPeak( m_fPeakValue_L - m_fMinPeak );
int persistentPeak_L = qMax<int>( 3, calculateDisplayPeak( m_persistentPeak_L - m_fMinPeak ) );
painter.drawPixmap( QRect( 0, peak_L, 11, 116 - peak_L ), m_leds, QRect( 0, peak_L, 11, 116 - peak_L ) );

if ( peak_L > 116 ) {
peak_L = 116;
if( m_persistentPeak_L > 0.05 )
{
painter.fillRect( QRect( 2, persistentPeak_L, 4, 1 ), (m_persistentPeak_L < 1.0 )? QColor( 0, 200, 0) : QColor( 200, 0, 0));
}
painter.drawPixmap( QRect( 0, peak_L, 11, 116 - peak_L ), m_leds, QRect( 0, peak_L, 11, 116 - peak_L ) );

int peak_R = calculateDisplayPeak( m_fPeakValue_R - m_fMinPeak );
int persistentPeak_R = qMax<int>( 3, calculateDisplayPeak( m_persistentPeak_R - m_fMinPeak ) );
painter.drawPixmap( QRect( 11, peak_R, 11, 116 - peak_R ), m_leds, QRect( 11, peak_R, 11, 116 - peak_R ) );

float realPeak_R = m_fPeakValue_R - m_fMinPeak;
int peak_R = (int)( 116 - ( realPeak_R / ( m_fMaxPeak - m_fMinPeak ) ) *
116.0 );
if ( peak_R > 116 ) {
peak_R = 116;
if( m_persistentPeak_R > 0.05 )
{
painter.fillRect( QRect( 16, persistentPeak_R, 4, 1 ), (m_persistentPeak_R < 1.0 )? QColor( 0, 200, 0) : QColor( 200, 0, 0));
}
painter.drawPixmap( QRect( 11, peak_R, 11, 116 - peak_R ), m_leds, QRect( 11, peak_R, 11, 116 - peak_R ) );

// knob
static const uint knob_height = 29;
Expand All @@ -267,20 +285,5 @@ void fader::paintEvent( QPaintEvent * ev)



void fader::setMaxPeak( float fMax )
{
m_fMaxPeak = fMax;
}




void fader::setMinPeak( float fMin )
{
m_fMinPeak = fMin;
}



#include "moc_fader.cxx"

0 comments on commit d4684f3

Please sign in to comment.