Browse Source

Add peak hold to VU meter widget.

tags/non-daw-v1.1.0
Jonathan Moore Liles 17 years ago
parent
commit
b90a3ac6e5
3 changed files with 31 additions and 7 deletions
  1. +6
    -5
      Mixer_Strip.fl
  2. +20
    -1
      VU_Meter.C
  3. +5
    -1
      VU_Meter.H

+ 6
- 5
Mixer_Strip.fl View File

@@ -2,7 +2,8 @@
version 1.0108
header_name {.H}
code_name {.C}
decl {\#include "VU_Meter.H"} {}
decl {\#include "VU_Meter.H"} {selected public global
}

widget_class Mixer_Strip {open
xywh {1051 42 124 816} type Double box UP_FRAME color 32 selection_color 63 resizable
@@ -21,7 +22,7 @@ widget_class Mixer_Strip {open
} {
Fl_Button {} {
label {@circle}
private xywh {7 143 35 25} type Toggle
private xywh {7 143 35 25} type Toggle labelsize 10
}
Fl_Button {} {
label m
@@ -35,13 +36,13 @@ widget_class Mixer_Strip {open
Fl_Group {} {open
xywh {13 178 104 509} resizable
} {
Fl_Value_Slider {} {
Fl_Value_Slider gain {
label Gain
callback {// parent()->parent()->damage( FL_DAMAGE_ALL, x(), y(), w(), h() );}
xywh {14 195 33 471} type {Vert Knob} color 32 selection_color 1 minimum 1.5 maximum 0 step 0.01 value 1 textsize 14
}
Fl_Box {} {
label VU selected
Fl_Box meter {
label VU
xywh {57 193 55 484} box ROUNDED_BOX selection_color 88
class VU_Meter
}


+ 20
- 1
VU_Meter.C View File

@@ -31,6 +31,8 @@ VU_Meter::VU_Meter ( int X, int Y, int W, int H, const char *L ) :
Fl_Widget( X, Y, W, H, L )
{

_peak = 0.0f;

divisions( 32 );
type( FL_VERTICAL );

@@ -53,6 +55,7 @@ VU_Meter::draw ( void )
// draw_box( FL_FLAT_BOX, x(), y(), w(), h(), color() );

int v = (value() / maximum()) * _divisions;
int pv = (_peak / maximum()) * _divisions;

int bh = h() / _divisions;
int bw = w() / _divisions;
@@ -61,7 +64,7 @@ VU_Meter::draw ( void )
{
Fl_Color c = fl_color_average( _max_color, _min_color, (float)p / _divisions );

if ( p > v )
if ( p > v && p != pv )
// c = fl_color_average( color(), c, _dim );
c = fl_color_average( FL_BLACK, c, _dim );

@@ -72,6 +75,22 @@ VU_Meter::draw ( void )
draw_box( box(), x() + (p * bw), y(), bw, h(), c );
else
draw_box( box(), x(), y() + h() - (p * bh), w(), bh, c );
}

if ( value() > _peak )
_peak = value();
}


int
VU_Meter::handle ( int m )
{
switch ( m )
{
case FL_PUSH:
reset();
break;
}

return 0;
}

+ 5
- 1
VU_Meter.H View File

@@ -24,6 +24,8 @@
class VU_Meter : public Fl_Widget
{

float _peak;

float _value;
float _minimum;
float _maximum;
@@ -38,12 +40,12 @@ class VU_Meter : public Fl_Widget
protected:

virtual void draw ( void );
virtual int handle ( int m );

public:

VU_Meter ( int X, int Y, int W, int H, const char *L = 0 );


void maximum( float v ) { _maximum = v; redraw(); }
float maximum ( void ) const { return _maximum; }

@@ -53,6 +55,8 @@ public:
void value ( float v ) { _value = v; redraw(); }
float value ( void ) const { return _value; }

void reset ( void ) { _peak = 0.0f; }

bool divisions ( void ) const { return _divisions; }
void divisions ( int v ) { _divisions = v; }



Loading…
Cancel
Save