230 lines
5.9 KiB
C
230 lines
5.9 KiB
C
|
||
/*******************************************************************************/
|
||
/* 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 <FL/Fl.H>
|
||
|
||
#include <string.h>
|
||
#include <stdlib.h>
|
||
#include <stdio.h>
|
||
#include <math.h>
|
||
|
||
#include <FL/fl_draw.H>
|
||
|
||
#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 <FL/Fl_Menu_Bar.H>
|
||
|
||
|
||
|
||
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();
|
||
}
|