non/mixer/src/Spatialization_Console.C

230 lines
5.9 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*******************************************************************************/
/* 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();
}