| @@ -682,8 +682,14 @@ Module::show_analysis_window ( void ) | |||
| nframes_t nframes = 4096; | |||
| float *buf = new float[nframes]; | |||
| memset( buf, 0, sizeof(float) * nframes ); | |||
| buf[0] = 1; | |||
| if ( ! get_impulse_response( buf, nframes ) ) | |||
| return false; | |||
| { | |||
| // return false; | |||
| } | |||
| Fl_Double_Window *w = new Fl_Double_Window( 1000, 500 ); | |||
| @@ -48,6 +48,18 @@ | |||
| #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) | |||
| { | |||
| @@ -125,19 +137,28 @@ Module_Parameter_Editor::update_spectrum ( void ) | |||
| { | |||
| nframes_t nframes = 4096; | |||
| float *buf = new float[nframes]; | |||
| memset( buf, 0, sizeof(float) * nframes ); | |||
| buf[0] = 1; | |||
| SpectrumView *o = spectrum_view; | |||
| o->sample_rate( _module->sample_rate() ); | |||
| bool show = false; | |||
| if ( ! _module->get_impulse_response( buf, nframes ) ) | |||
| { | |||
| o->data( buf, 1 ); | |||
| /* o->hide(); */ | |||
| } | |||
| show = is_probably_eq(); | |||
| else | |||
| show = true; | |||
| o->data( buf, nframes ); | |||
| if ( show && ! o->parent()->visible() ) | |||
| { | |||
| o->data( buf, nframes ); | |||
| o->parent()->show(); | |||
| update_control_visibility(); | |||
| } | |||
| o->redraw(); | |||
| @@ -156,7 +177,9 @@ Module_Parameter_Editor::make_controls ( void ) | |||
| Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( (Fl_Widget*)o ); | |||
| flg->hide(); | |||
| control_pack->add( flg ); | |||
| } | |||
| @@ -417,10 +440,24 @@ Module_Parameter_Editor::make_controls ( void ) | |||
| controls_by_port[radius_port_number] = o; | |||
| } | |||
| update_control_visibility(); | |||
| 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(); | |||
| int width = control_pack->w() + 100; | |||
| @@ -435,20 +472,7 @@ Module_Parameter_Editor::make_controls ( void ) | |||
| size( 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 | |||
| @@ -79,6 +79,8 @@ class Module_Parameter_Editor : public Fl_Double_Window | |||
| void make_controls ( void ); | |||
| void update_spectrum ( void ); | |||
| bool is_probably_eq ( void ); | |||
| static void menu_cb ( Fl_Widget *w, void *v ); | |||
| void menu_cb ( Fl_Menu_ *m ); | |||
| @@ -781,10 +781,6 @@ Plugin_Module::handle_port_connection_change ( void ) | |||
| bool | |||
| Plugin_Module::get_impulse_response ( sample_t *buf, nframes_t nframes ) | |||
| { | |||
| memset( buf, 0, sizeof( float ) * nframes ); | |||
| buf[0] = 1; | |||
| apply( buf, nframes ); | |||
| if ( buffer_is_digital_black( buf + 1, nframes - 1 )) | |||
| @@ -31,6 +31,7 @@ | |||
| static std::map<int,float*> _cached_plan; | |||
| unsigned int SpectrumView::_nframes = 0; | |||
| float SpectrumView::_fmin = 10; | |||
| float SpectrumView::_fmax = 24000; | |||
| unsigned int SpectrumView::_sample_rate = 48000; | |||
| @@ -52,13 +53,30 @@ SpectrumView::data ( float *data, unsigned int nframes ) | |||
| delete[] _data; | |||
| _data = data; | |||
| _nframes = nframes; | |||
| _data_frames = nframes; | |||
| clear_bands(); | |||
| impulse_frames( nframes ); | |||
| 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 | |||
| SpectrumView::sample_rate ( unsigned int sample_rate ) | |||
| { | |||
| @@ -68,16 +86,18 @@ SpectrumView::sample_rate ( unsigned int sample_rate ) | |||
| _fmin = 10; | |||
| _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 | |||
| SpectrumView::analyze_data ( unsigned int _plan_size ) | |||
| { | |||
| if ( ! _data ) | |||
| return; | |||
| float res[_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; | |||
| _data = 0; | |||
| _nframes = 0; | |||
| _data_frames = 0; | |||
| _bands = 0; | |||
| _dbmin = -70; | |||
| _dbmax = 30; | |||
| @@ -265,6 +288,9 @@ SpectrumView::draw_semilog ( void ) | |||
| void | |||
| SpectrumView::draw_curve ( void ) | |||
| { | |||
| if ( !_bands ) | |||
| return; | |||
| int W = w() - padding_right; | |||
| //Build lines | |||
| @@ -283,6 +309,16 @@ SpectrumView::draw ( void ) | |||
| int W = w() - padding_right; | |||
| int H = h() - padding_bottom; | |||
| if ( _data_frames != _nframes ) | |||
| { | |||
| /* invalid data */ | |||
| if ( _data ) | |||
| delete[] _data; | |||
| _data = 0; | |||
| clear_bands(); | |||
| } | |||
| if ( !_bands ) { | |||
| analyze_data( W ); | |||
| @@ -25,9 +25,10 @@ class SpectrumView : public Fl_Box | |||
| static unsigned int _sample_rate; | |||
| static float _fmin; | |||
| static float _fmax; | |||
| static unsigned int _nframes; | |||
| float * _data; | |||
| unsigned int _nframes; | |||
| unsigned int _data_frames; | |||
| float * _bands; | |||
| float _dbmin; | |||
| float _dbmax; | |||
| @@ -37,10 +38,14 @@ class SpectrumView : public Fl_Box | |||
| void draw_semilog ( void ); | |||
| void analyze_data ( unsigned int plan_size ); | |||
| void clear_bands ( void ); | |||
| static void clear_plans ( void ); | |||
| public: | |||
| 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 */ | |||
| void db_range ( float min, float max ) | |||
| @@ -50,8 +55,10 @@ public: | |||
| _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 */ | |||
| 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 ); | |||
| virtual ~SpectrumView ( ); | |||