/*******************************************************************************/ /* Copyright (C) 2009 Jonathan Moore Liles */ /* */ /* This program is free software; you can redistribute it and/or modify it */ /* under the terms of the GNU General Public License as published by the */ /* Free Software Foundation; either version 2 of the License, or (at your */ /* option) any later version. */ /* */ /* This program is distributed in the hope that it will be useful, but WITHOUT */ /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ /* more details. */ /* */ /* You should have received a copy of the GNU General Public License along */ /* with This program; see the file COPYING. If not,write to the Free Software */ /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /*******************************************************************************/ #include #include #include #include #include #include #include "Module.H" #include "Spatialization_Console.H" #include "Controller_Module.H" #include "Chain.H" #include "Panner.H" #include "Mixer_Strip.H" #include "Mixer.H" #include "debug.h" #include Spatialization_Console::Spatialization_Console ( void ) : Fl_Double_Window( 850, 850 ) { _resized = false; label( "Spatialization Console" ); labelfont( FL_HELVETICA ); labelsize( 14 ); int padding = 48; int S = 802; if ( fl_display ) /* don't open the display in noui mode... */ { int sx, sy, sw, sh; Fl::screen_xywh( sx, sy, sw, sh ); if ( sw < 850 || sh < 850 ) { /* if screen isn't big enough, use smaller version of control */ S = 502; } } panner = new Panner( 25,25, S, S ); panner->callback( cb_panner_value_handle, this ); panner->when( FL_WHEN_CHANGED ); size( S + padding, S + padding ); callback( cb_window, this ); end(); make_controls(); mixer->spatialization_console = this; } Spatialization_Console::~Spatialization_Console ( ) { // controls_by_port.clear(); mixer->spatialization_console = NULL; } void Spatialization_Console::get ( Log_Entry &e ) const { e.add( ":range", panner->range() ); e.add( ":projection", panner->projection() ); e.add( ":shown", ((const Fl_Double_Window*)this)->shown() ); } void Spatialization_Console::set ( Log_Entry &e ) { for ( int i = 0; i < e.size(); ++i ) { const char *s, *v; e.get( i, &s, &v ); if ( ! ( strcmp( s, ":range" ) ) ) panner->range( atoi( v ) ); if ( ! ( strcmp( s, ":projection" ) ) ) panner->projection( atoi( v ) ); else if ( ! ( strcmp( s, ":shown" ) ) ) { if ( atoi( v ) ) { if ( fl_display ) { show(); } } else hide(); } } } void Spatialization_Console::cb_window ( Fl_Widget *w, void *v ) { ((Spatialization_Console*)v)->cb_window(w); } void Spatialization_Console::cb_window ( Fl_Widget *w ) { w->hide(); mixer->update_menu(); } void Spatialization_Console::make_controls ( void ) { panner->clear_points(); for ( int i = 0; i < mixer->nstrips(); i++ ) { Mixer_Strip *o = mixer->track_by_number( i ); if ( o->spatializer() ) { Panner::Point p; p.color = o->color(); p.userdata = o->spatializer(); p.label = o->name(); if ( o->spatializer()->is_controlling() ) { p.visible = true; p.azimuth( o->spatializer()->control_output[0].control_value() ); p.elevation( o->spatializer()->control_output[1].control_value() ); if ( o->spatializer()->control_output[2].connected() ) { p.radius_enabled = true; p.radius( o->spatializer()->control_output[2].control_value() ); } } else p.visible = false; panner->add_point(p); } } panner->redraw(); } void Spatialization_Console::cb_panner_value_handle ( Fl_Widget *w, void *v ) { // callback_data *cd = (callback_data*)v; Spatialization_Console *sc = (Spatialization_Console*)v; Panner::Point *p = sc->panner->pushed(); Controller_Module *cm = (Controller_Module*)p->userdata; cm->control_output[0].control_value( p->azimuth() ); cm->control_output[1].control_value( p->elevation() ); if ( p->radius_enabled ) cm->control_output[2].control_value( p->radius() ); } /* Display changes initiated via automation or from other parts of the GUI */ void Spatialization_Console::handle_control_changed ( Controller_Module *m ) { if ( Fl::pushed() == panner ) return; for ( int i = 0; i < panner->points(); i++ ) { Panner::Point *p = panner->point(i); if ( p->userdata == m ) { p->azimuth( m->control_output[0].control_value() ); p->elevation( m->control_output[1].control_value() ); if ( p->radius_enabled ) p->radius( m->control_output[2].control_value() ); if ( panner->visible_r() ) panner->redraw(); break; } } } void Spatialization_Console::update ( void ) { make_controls(); }