@@ -682,8 +682,14 @@ Module::show_analysis_window ( void ) | |||||
nframes_t nframes = 4096; | nframes_t nframes = 4096; | ||||
float *buf = new float[nframes]; | float *buf = new float[nframes]; | ||||
memset( buf, 0, sizeof(float) * nframes ); | |||||
buf[0] = 1; | |||||
if ( ! get_impulse_response( buf, nframes ) ) | if ( ! get_impulse_response( buf, nframes ) ) | ||||
return false; | |||||
{ | |||||
// return false; | |||||
} | |||||
Fl_Double_Window *w = new Fl_Double_Window( 1000, 500 ); | Fl_Double_Window *w = new Fl_Double_Window( 1000, 500 ); | ||||
@@ -48,6 +48,18 @@ | |||||
#include "SpectrumView.H" | #include "SpectrumView.H" | ||||
#include "string.h" | |||||
bool | |||||
Module_Parameter_Editor::is_probably_eq ( void ) | |||||
{ | |||||
const char *name = _module->label(); | |||||
return strcasestr( name, "eq" ) || | |||||
strcasestr( name, "filter" ) || | |||||
strcasestr( name, "parametric" ) || | |||||
strcasestr( name, "band" ); | |||||
} | |||||
Module_Parameter_Editor::Module_Parameter_Editor ( Module *module ) : Fl_Double_Window( 900,240) | Module_Parameter_Editor::Module_Parameter_Editor ( Module *module ) : Fl_Double_Window( 900,240) | ||||
{ | { | ||||
@@ -125,19 +137,28 @@ Module_Parameter_Editor::update_spectrum ( void ) | |||||
{ | { | ||||
nframes_t nframes = 4096; | nframes_t nframes = 4096; | ||||
float *buf = new float[nframes]; | float *buf = new float[nframes]; | ||||
memset( buf, 0, sizeof(float) * nframes ); | |||||
buf[0] = 1; | |||||
SpectrumView *o = spectrum_view; | SpectrumView *o = spectrum_view; | ||||
o->sample_rate( _module->sample_rate() ); | o->sample_rate( _module->sample_rate() ); | ||||
bool show = false; | |||||
if ( ! _module->get_impulse_response( buf, nframes ) ) | if ( ! _module->get_impulse_response( buf, nframes ) ) | ||||
{ | |||||
o->data( buf, 1 ); | |||||
/* o->hide(); */ | |||||
} | |||||
show = is_probably_eq(); | |||||
else | else | ||||
show = true; | |||||
o->data( buf, nframes ); | |||||
if ( show && ! o->parent()->visible() ) | |||||
{ | { | ||||
o->data( buf, nframes ); | |||||
o->parent()->show(); | o->parent()->show(); | ||||
update_control_visibility(); | |||||
} | } | ||||
o->redraw(); | o->redraw(); | ||||
@@ -156,7 +177,9 @@ Module_Parameter_Editor::make_controls ( void ) | |||||
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( (Fl_Widget*)o ); | Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( (Fl_Widget*)o ); | ||||
flg->hide(); | flg->hide(); | ||||
control_pack->add( flg ); | control_pack->add( flg ); | ||||
} | } | ||||
@@ -417,10 +440,24 @@ Module_Parameter_Editor::make_controls ( void ) | |||||
controls_by_port[radius_port_number] = o; | controls_by_port[radius_port_number] = o; | ||||
} | } | ||||
update_control_visibility(); | |||||
update_spectrum(); | update_spectrum(); | ||||
update_control_visibility(); | |||||
} | |||||
void | |||||
Module_Parameter_Editor::update_control_visibility ( void ) | |||||
{ | |||||
for ( unsigned int i = 0; i < _module->control_input.size(); ++i ) | |||||
{ | |||||
const Module::Port *p = &_module->control_input[i]; | |||||
if ( p->hints.visible ) | |||||
controls_by_port[i]->parent()->show(); | |||||
else | |||||
controls_by_port[i]->parent()->hide(); | |||||
} | |||||
control_pack->dolayout(); | control_pack->dolayout(); | ||||
int width = control_pack->w() + 100; | int width = control_pack->w() + 100; | ||||
@@ -435,20 +472,7 @@ Module_Parameter_Editor::make_controls ( void ) | |||||
size( width, height ); | size( width, height ); | ||||
size_range( width, height, width, height ); | size_range( width, height, width, height ); | ||||
} | |||||
void | |||||
Module_Parameter_Editor::update_control_visibility ( void ) | |||||
{ | |||||
for ( unsigned int i = 0; i < _module->control_input.size(); ++i ) | |||||
{ | |||||
const Module::Port *p = &_module->control_input[i]; | |||||
if ( p->hints.visible ) | |||||
controls_by_port[i]->parent()->show(); | |||||
else | |||||
controls_by_port[i]->parent()->hide(); | |||||
} | |||||
} | } | ||||
void | void | ||||
@@ -79,6 +79,8 @@ class Module_Parameter_Editor : public Fl_Double_Window | |||||
void make_controls ( void ); | void make_controls ( void ); | ||||
void update_spectrum ( void ); | void update_spectrum ( void ); | ||||
bool is_probably_eq ( void ); | |||||
static void menu_cb ( Fl_Widget *w, void *v ); | static void menu_cb ( Fl_Widget *w, void *v ); | ||||
void menu_cb ( Fl_Menu_ *m ); | void menu_cb ( Fl_Menu_ *m ); | ||||
@@ -781,10 +781,6 @@ Plugin_Module::handle_port_connection_change ( void ) | |||||
bool | bool | ||||
Plugin_Module::get_impulse_response ( sample_t *buf, nframes_t nframes ) | Plugin_Module::get_impulse_response ( sample_t *buf, nframes_t nframes ) | ||||
{ | { | ||||
memset( buf, 0, sizeof( float ) * nframes ); | |||||
buf[0] = 1; | |||||
apply( buf, nframes ); | apply( buf, nframes ); | ||||
if ( buffer_is_digital_black( buf + 1, nframes - 1 )) | if ( buffer_is_digital_black( buf + 1, nframes - 1 )) | ||||
@@ -31,6 +31,7 @@ | |||||
static std::map<int,float*> _cached_plan; | static std::map<int,float*> _cached_plan; | ||||
unsigned int SpectrumView::_nframes = 0; | |||||
float SpectrumView::_fmin = 10; | float SpectrumView::_fmin = 10; | ||||
float SpectrumView::_fmax = 24000; | float SpectrumView::_fmax = 24000; | ||||
unsigned int SpectrumView::_sample_rate = 48000; | unsigned int SpectrumView::_sample_rate = 48000; | ||||
@@ -52,13 +53,30 @@ SpectrumView::data ( float *data, unsigned int nframes ) | |||||
delete[] _data; | delete[] _data; | ||||
_data = data; | _data = data; | ||||
_nframes = nframes; | |||||
_data_frames = nframes; | |||||
clear_bands(); | clear_bands(); | ||||
impulse_frames( nframes ); | |||||
redraw(); | redraw(); | ||||
} | } | ||||
void | |||||
SpectrumView::clear_plans ( void ) | |||||
{ | |||||
/* invalidate all plans */ | |||||
for ( std::map<int,float*>::iterator i = _cached_plan.begin(); | |||||
i != _cached_plan.end(); | |||||
i++ ) | |||||
{ | |||||
delete[] i->second; | |||||
} | |||||
_cached_plan.clear(); | |||||
} | |||||
void | void | ||||
SpectrumView::sample_rate ( unsigned int sample_rate ) | SpectrumView::sample_rate ( unsigned int sample_rate ) | ||||
{ | { | ||||
@@ -68,16 +86,18 @@ SpectrumView::sample_rate ( unsigned int sample_rate ) | |||||
_fmin = 10; | _fmin = 10; | ||||
_fmax = _sample_rate * 0.5f; | _fmax = _sample_rate * 0.5f; | ||||
/* invalidate all plans */ | |||||
clear_plans(); | |||||
} | |||||
} | |||||
for ( std::map<int,float*>::iterator i = _cached_plan.begin(); | |||||
i != _cached_plan.end(); | |||||
i++ ) | |||||
{ | |||||
delete[] i->second; | |||||
} | |||||
void | |||||
SpectrumView::impulse_frames ( unsigned int nframes ) | |||||
{ | |||||
if ( _nframes != nframes ) | |||||
{ | |||||
clear_plans(); | |||||
_cached_plan.clear(); | |||||
_nframes = nframes; | |||||
} | } | ||||
} | } | ||||
@@ -127,6 +147,9 @@ qft_plan ( unsigned frames, unsigned samples, float Fs, float Fmin, float Fmax ) | |||||
void | void | ||||
SpectrumView::analyze_data ( unsigned int _plan_size ) | SpectrumView::analyze_data ( unsigned int _plan_size ) | ||||
{ | { | ||||
if ( ! _data ) | |||||
return; | |||||
float res[_plan_size * 2]; | float res[_plan_size * 2]; | ||||
memset(res,0,sizeof(float) * _plan_size * 2); | memset(res,0,sizeof(float) * _plan_size * 2); | ||||
@@ -192,7 +215,7 @@ SpectrumView::SpectrumView ( int X, int Y, int W, int H, const char *L ) | |||||
{ | { | ||||
_auto_level = 0; | _auto_level = 0; | ||||
_data = 0; | _data = 0; | ||||
_nframes = 0; | |||||
_data_frames = 0; | |||||
_bands = 0; | _bands = 0; | ||||
_dbmin = -70; | _dbmin = -70; | ||||
_dbmax = 30; | _dbmax = 30; | ||||
@@ -265,6 +288,9 @@ SpectrumView::draw_semilog ( void ) | |||||
void | void | ||||
SpectrumView::draw_curve ( void ) | SpectrumView::draw_curve ( void ) | ||||
{ | { | ||||
if ( !_bands ) | |||||
return; | |||||
int W = w() - padding_right; | int W = w() - padding_right; | ||||
//Build lines | //Build lines | ||||
@@ -283,6 +309,16 @@ SpectrumView::draw ( void ) | |||||
int W = w() - padding_right; | int W = w() - padding_right; | ||||
int H = h() - padding_bottom; | int H = h() - padding_bottom; | ||||
if ( _data_frames != _nframes ) | |||||
{ | |||||
/* invalid data */ | |||||
if ( _data ) | |||||
delete[] _data; | |||||
_data = 0; | |||||
clear_bands(); | |||||
} | |||||
if ( !_bands ) { | if ( !_bands ) { | ||||
analyze_data( W ); | analyze_data( W ); | ||||
@@ -25,9 +25,10 @@ class SpectrumView : public Fl_Box | |||||
static unsigned int _sample_rate; | static unsigned int _sample_rate; | ||||
static float _fmin; | static float _fmin; | ||||
static float _fmax; | static float _fmax; | ||||
static unsigned int _nframes; | |||||
float * _data; | float * _data; | ||||
unsigned int _nframes; | |||||
unsigned int _data_frames; | |||||
float * _bands; | float * _bands; | ||||
float _dbmin; | float _dbmin; | ||||
float _dbmax; | float _dbmax; | ||||
@@ -37,10 +38,14 @@ class SpectrumView : public Fl_Box | |||||
void draw_semilog ( void ); | void draw_semilog ( void ); | ||||
void analyze_data ( unsigned int plan_size ); | void analyze_data ( unsigned int plan_size ); | ||||
void clear_bands ( void ); | void clear_bands ( void ); | ||||
static void clear_plans ( void ); | |||||
public: | public: | ||||
static void sample_rate ( unsigned int sample_rate ); | static void sample_rate ( unsigned int sample_rate ); | ||||
/* all subsequent calls to data() MUST contain this number of | |||||
* frames. Changing this value will invalidate all cached plans */ | |||||
static void impulse_frames ( unsigned int nframes ); | |||||
/* set dB range. If min == max, then auto leveling will be enabled */ | /* set dB range. If min == max, then auto leveling will be enabled */ | ||||
void db_range ( float min, float max ) | void db_range ( float min, float max ) | ||||
@@ -50,8 +55,10 @@ public: | |||||
_auto_level = min == max; | _auto_level = min == max; | ||||
} | } | ||||
/** /data/ must point to allocated memory. It will be freed when new data is set or when the control is destroyed */ | /** /data/ must point to allocated memory. It will be freed when new data is set or when the control is destroyed */ | ||||
void data ( float *data, unsigned int nframes ); | |||||
void data ( float *data, unsigned int data_frames ); | |||||
SpectrumView ( int X, int Y, int W, int H, const char *L=0 ); | SpectrumView ( int X, int Y, int W, int H, const char *L=0 ); | ||||
virtual ~SpectrumView ( ); | virtual ~SpectrumView ( ); | ||||