Browse Source

Mixer: Rearrange so that each mixer strip runs as its own JACK client.

tags/non-daw-v1.1.0
Jonathan Moore Liles 15 years ago
parent
commit
a971175c8e
11 changed files with 76 additions and 103 deletions
  1. +38
    -17
      Mixer/Chain.C
  2. +9
    -3
      Mixer/Chain.H
  3. +10
    -10
      Mixer/Controller_Module.C
  4. +4
    -7
      Mixer/Engine/Engine.C
  5. +4
    -3
      Mixer/Engine/Engine.H
  6. +2
    -2
      Mixer/JACK_Module.C
  7. +1
    -33
      Mixer/Mixer.C
  8. +1
    -9
      Mixer/Mixer_Strip.C
  9. +0
    -2
      Mixer/Mixer_Strip.H
  10. +5
    -4
      Mixer/Plugin_Module.C
  11. +2
    -13
      Mixer/main.C

+ 38
- 17
Mixer/Chain.C View File

@@ -79,7 +79,6 @@




std::vector <Module::Port> Chain::port;
std::list <Chain*> Chain::chain; std::list <Chain*> Chain::chain;


@@ -126,6 +125,10 @@ Chain::set ( Log_Entry &e )
Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "") Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")


{ {
_engine = new Engine( &Chain::process, this );

engine()->init( "Non-Mixer" );

int X = 0; int X = 0;
int Y = 0; int Y = 0;
int W = 100; int W = 100;
@@ -192,8 +195,19 @@ Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")


Chain::~Chain ( ) Chain::~Chain ( )
{ {
DMESSAGE( "Destroying chain" );

chain.remove( this ); chain.remove( this );

log_destroy(); log_destroy();

/* if we leave this up to FLTK, it will happen after we've
already destroyed the engine */
modules_pack->clear();
controls_pack->clear();

delete _engine;
_engine = NULL;
} }


@@ -313,7 +327,7 @@ Chain::configure_ports ( void )
/* int old_outs = outs(); */ /* int old_outs = outs(); */
int nouts = 0; int nouts = 0;


engine->lock();
engine()->lock();


for ( int i = 0; i < modules(); ++i ) for ( int i = 0; i < modules(); ++i )
{ {
@@ -333,18 +347,18 @@ Chain::configure_ports ( void )


DMESSAGE( "required_buffers = %i", req_buffers ); DMESSAGE( "required_buffers = %i", req_buffers );


if ( port.size() < req_buffers )
if ( scratch_port.size() < req_buffers )
{ {
for ( unsigned int i = port.size(); i--; )
delete[] (sample_t*)port[i].buffer();
port.clear();
for ( unsigned int i = scratch_port.size(); i--; )
delete[] (sample_t*)scratch_port[i].buffer();
scratch_port.clear();


for ( unsigned int i = 0; i < req_buffers; ++i ) for ( unsigned int i = 0; i < req_buffers; ++i )
{ {
Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO ); Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO );
p.connect_to( new sample_t[engine->nframes()] );
buffer_fill_with_silence( (sample_t*)p.buffer(), engine->nframes() );
port.push_back( p );
p.connect_to( new sample_t[engine()->nframes()] );
buffer_fill_with_silence( (sample_t*)p.buffer(), engine()->nframes() );
scratch_port.push_back( p );
} }
} }


@@ -359,7 +373,7 @@ Chain::configure_ports ( void )
(*i)->build_process_queue(); (*i)->build_process_queue();
} }


engine->unlock();
engine()->unlock();


parent()->redraw(); parent()->redraw();
} }
@@ -445,7 +459,7 @@ bool
Chain::insert ( Module *m, Module *n ) Chain::insert ( Module *m, Module *n )
{ {


engine->lock();
engine()->lock();


if ( !m ) if ( !m )
{ {
@@ -505,13 +519,13 @@ Chain::insert ( Module *m, Module *n )


configure_ports(); configure_ports();


engine->unlock();
engine()->unlock();


return true; return true;


err: err:


engine->unlock();
engine()->unlock();


return false; return false;
} }
@@ -520,11 +534,11 @@ err:
void void
Chain::add_control ( Module *m ) Chain::add_control ( Module *m )
{ {
engine->lock();
engine()->lock();


controls_pack->add( m ); controls_pack->add( m );


engine->unlock();
engine()->unlock();


controls_pack->redraw(); controls_pack->redraw();
} }
@@ -608,11 +622,11 @@ Chain::build_process_queue ( void )
Module *m = module( i ); Module *m = module( i );
for ( unsigned int j = 0; j < m->audio_input.size(); ++j ) for ( unsigned int j = 0; j < m->audio_input.size(); ++j )
{ {
m->audio_input[j].connect_to( &port[j] );
m->audio_input[j].connect_to( &scratch_port[j] );
} }
for ( unsigned int j = 0; j < m->audio_output.size(); ++j ) for ( unsigned int j = 0; j < m->audio_output.size(); ++j )
{ {
m->audio_output[j].connect_to( &port[j] );
m->audio_output[j].connect_to( &scratch_port[j] );
} }


m->handle_port_connection_change(); m->handle_port_connection_change();
@@ -730,6 +744,13 @@ Chain::strip ( Mixer_Strip * ms )
_strip = ms; _strip = ms;
} }



void
Chain::process ( nframes_t nframes, void *v )
{
((Chain*)v)->process( nframes );
}

void void
Chain::process ( nframes_t nframes ) Chain::process ( nframes_t nframes )
{ {


+ 9
- 3
Mixer/Chain.H View File

@@ -32,6 +32,7 @@
class Mixer_Strip; class Mixer_Strip;
class Fl_Flowpack; class Fl_Flowpack;
class Fl_Flip_Button; class Fl_Flip_Button;
class Engine;


class Chain : public Fl_Group, public Loggable { class Chain : public Fl_Group, public Loggable {


@@ -66,9 +67,14 @@ class Chain : public Fl_Group, public Loggable {
void build_process_queue ( void ); void build_process_queue ( void );
void add_to_process_queue ( Module *m ); void add_to_process_queue ( Module *m );


static std::vector <Module::Port> port;
std::vector <Module::Port> scratch_port;
static std::list <Chain*> chain; static std::list <Chain*> chain;


Engine *_engine;

static void process ( nframes_t, void * );
void process ( nframes_t );

protected: protected:


void get ( Log_Entry &e ) const; void get ( Log_Entry &e ) const;
@@ -119,9 +125,9 @@ public:


Fl_Callback * configure_outputs_callback ( void ) const { return _configure_outputs_callback; } Fl_Callback * configure_outputs_callback ( void ) const { return _configure_outputs_callback; }


void process ( nframes_t );

void log_children ( void ); void log_children ( void );


Engine *engine ( void ) const { return _engine; }

LOG_CREATE_FUNC( Chain ); LOG_CREATE_FUNC( Chain );
}; };

+ 10
- 10
Mixer/Controller_Module.C View File

@@ -164,19 +164,19 @@ Controller_Module::connect_to ( Port *p )


if( mode() == CV ) if( mode() == CV )
{ {
engine->lock();
{
char name[256];
snprintf( name, sizeof( name ), "%s-CV", p->name() );
chain()->engine()->lock();


JACK::Port po( engine->client(), JACK::Port::Input, chain()->name(), 0, name );
char name[256];
snprintf( name, sizeof( name ), "%s-CV", p->name() );


if ( po.valid() )
{
JACK::Port po( chain()->engine()->client(), JACK::Port::Input, chain()->name(), 0, name );

if ( po.valid() )
{
jack_input.push_back( po ); jack_input.push_back( po );
}
} }
engine->unlock();

chain()->engine()->unlock();
} }


Fl_Widget *w; Fl_Widget *w;
@@ -302,7 +302,7 @@ Controller_Module::process ( void )


if ( mode() == CV ) if ( mode() == CV )
{ {
f = *((float*)jack_input[0].buffer( engine->nframes() ));
f = *((float*)jack_input[0].buffer( chain()->engine()->nframes() ));


const Port *p = control_output[0].connected_port(); const Port *p = control_output[0].connected_port();




+ 4
- 7
Mixer/Engine/Engine.C View File

@@ -30,8 +30,10 @@




Engine::Engine ( ) : _thread( "RT" )
Engine::Engine ( void (*process_callback)(nframes_t nframes, void *), void *user_data ) : _thread( "RT" )
{ {
_process_callback = process_callback;
_user_data = user_data;
_buffers_dropped = 0; _buffers_dropped = 0;
} }


@@ -120,12 +122,7 @@ Engine::process ( nframes_t nframes )
return 0; return 0;
} }


/* handle chicken/egg problem */
if ( mixer )
/* this will initiate the process() call graph for the various
* number and types of tracks, which will in turn send data out
* the appropriate ports. */
mixer->process( nframes );
_process_callback(nframes, _user_data);


unlock(); unlock();
} }


+ 4
- 3
Mixer/Engine/Engine.H View File

@@ -34,6 +34,9 @@ class Engine : public JACK::Client, public Mutex
int _buffers_dropped; /* buffers dropped because of locking */ int _buffers_dropped; /* buffers dropped because of locking */
/* int _buffers_dropped; /\* buffers dropped because of locking *\/ */ /* int _buffers_dropped; /\* buffers dropped because of locking *\/ */


void ( * _process_callback ) ( nframes_t, void * );
void *_user_data;

void shutdown ( void ); void shutdown ( void );
int process ( nframes_t nframes ); int process ( nframes_t nframes );
int sync ( jack_transport_state_t state, jack_position_t *pos ); int sync ( jack_transport_state_t state, jack_position_t *pos );
@@ -56,11 +59,9 @@ private:


public: public:


Engine ( );
Engine ( void (*process_callback) (nframes_t, void *), void *user_data );
~Engine ( ); ~Engine ( );


int dropped ( void ) const { return _buffers_dropped; } int dropped ( void ) const { return _buffers_dropped; }


}; };

extern Engine * engine;

+ 2
- 2
Mixer/JACK_Module.C View File

@@ -86,7 +86,7 @@ JACK_Module::configure_inputs ( int n )
{ {
for ( int i = on; i < n; ++i ) for ( int i = on; i < n; ++i )
{ {
JACK::Port po( engine->client(), JACK::Port::Output, chain()->name(), i );
JACK::Port po( chain()->engine()->client(), JACK::Port::Output, chain()->name(), i );


if ( po.valid() ) if ( po.valid() )
{ {
@@ -120,7 +120,7 @@ JACK_Module::configure_outputs ( int n )
{ {
for ( int i = on; i < n; ++i ) for ( int i = on; i < n; ++i )
{ {
JACK::Port po( engine->client(), JACK::Port::Input, chain()->name(), i );
JACK::Port po( chain()->engine()->client(), JACK::Port::Input, chain()->name(), i );


if ( po.valid() ) if ( po.valid() )
{ {


+ 1
- 33
Mixer/Mixer.C View File

@@ -140,7 +140,7 @@ Mixer::Mixer ( int X, int Y, int W, int H, const char *L ) :
Mixer::~Mixer ( ) Mixer::~Mixer ( )
{ {
/* FIXME: teardown */ /* FIXME: teardown */
DMESSAGE( "Destroying mixer" );
} }


void Mixer::resize ( int X, int Y, int W, int H ) void Mixer::resize ( int X, int Y, int W, int H )
@@ -156,16 +156,9 @@ void Mixer::add ( Mixer_Strip *ms )
{ {
MESSAGE( "Add mixer strip \"%s\"", ms->name() ); MESSAGE( "Add mixer strip \"%s\"", ms->name() );


engine->lock();

mixer_strips->add( ms ); mixer_strips->add( ms );
// mixer_strips->insert( *ms, 0 );

engine->unlock();


scroll->redraw(); scroll->redraw();

// redraw();
} }


void void
@@ -180,13 +173,9 @@ Mixer::quit ( void )
void void
Mixer::insert ( Mixer_Strip *ms, Mixer_Strip *before ) Mixer::insert ( Mixer_Strip *ms, Mixer_Strip *before )
{ {
engine->lock();

mixer_strips->remove( ms ); mixer_strips->remove( ms );
mixer_strips->insert( *ms, before ); mixer_strips->insert( *ms, before );


engine->unlock();

scroll->redraw(); scroll->redraw();
} }
void void
@@ -219,12 +208,8 @@ void Mixer::remove ( Mixer_Strip *ms )
{ {
MESSAGE( "Remove mixer strip \"%s\"", ms->name() ); MESSAGE( "Remove mixer strip \"%s\"", ms->name() );


engine->lock();

mixer_strips->remove( ms ); mixer_strips->remove( ms );


engine->unlock();

delete ms; delete ms;


parent()->redraw(); parent()->redraw();
@@ -247,17 +232,6 @@ void Mixer::update ( void )
// redraw(); // redraw();
} }


void
Mixer::process ( unsigned int nframes )
{
THREAD_ASSERT( RT );

for ( int i = mixer_strips->children(); i--; )
{
((Mixer_Strip*)mixer_strips->child( i ))->process( nframes );
}
}

/** retrun a pointer to the track named /name/, or NULL if no track is named /name/ */ /** retrun a pointer to the track named /name/, or NULL if no track is named /name/ */
Mixer_Strip * Mixer_Strip *
Mixer::track_by_name ( const char *name ) Mixer::track_by_name ( const char *name )
@@ -299,13 +273,7 @@ Mixer::snapshot ( void )
void void
Mixer::new_strip ( void ) Mixer::new_strip ( void )
{ {
engine->lock();

add( new Mixer_Strip( get_unique_track_name( "Unnamed" ), 1 ) ); add( new Mixer_Strip( get_unique_track_name( "Unnamed" ), 1 ) );

engine->unlock();

// scroll->size( mixer_strips->w(), scroll->h() );
} }


bool bool


+ 1
- 9
Mixer/Mixer_Strip.C View File

@@ -175,6 +175,7 @@ Mixer_Strip::Mixer_Strip() : Fl_Group( 0, 0, 120, 600 )


Mixer_Strip::~Mixer_Strip ( ) Mixer_Strip::~Mixer_Strip ( )
{ {
DMESSAGE( "Destroying mixer strip" );
log_destroy(); log_destroy();
} }


@@ -274,15 +275,6 @@ Mixer_Strip::handle_module_added ( Module *m )
} }
} }



void
Mixer_Strip::process ( nframes_t nframes )
{
THREAD_ASSERT( RT );

_chain->process( nframes );
}

/* update GUI with values from RT thread */ /* update GUI with values from RT thread */
void void
Mixer_Strip::update ( void ) Mixer_Strip::update ( void )


+ 0
- 2
Mixer/Mixer_Strip.H View File

@@ -67,8 +67,6 @@ public:


LOG_CREATE_FUNC( Mixer_Strip ); LOG_CREATE_FUNC( Mixer_Strip );


void process ( unsigned int nframes );

static void configure_outputs ( Fl_Widget *o, void *v ); static void configure_outputs ( Fl_Widget *o, void *v );
void configure_outputs ( void ); void configure_outputs ( void );




+ 5
- 4
Mixer/Plugin_Module.C View File

@@ -38,6 +38,7 @@
#include <math.h> #include <math.h>


#include "Engine/Engine.H" #include "Engine/Engine.H"
#include "Chain.H"




@@ -331,7 +332,7 @@ Plugin_Module::plugin_instances ( unsigned int n )


DMESSAGE( "Instantiating plugin..." ); DMESSAGE( "Instantiating plugin..." );


if ( ! (h = _idata->descriptor->instantiate( _idata->descriptor, engine->sample_rate() ) ) )
if ( ! (h = _idata->descriptor->instantiate( _idata->descriptor, chain()->engine()->sample_rate() ) ) )
{ {
WARNING( "Failed to instantiate plugin" ); WARNING( "Failed to instantiate plugin" );
return false; return false;
@@ -457,7 +458,7 @@ Plugin_Module::load ( unsigned long id )
Min=_idata->descriptor->PortRangeHints[Port].LowerBound; Min=_idata->descriptor->PortRangeHints[Port].LowerBound;
if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc)) if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc))
{ {
Min*=engine->sample_rate();
Min*=chain()->engine()->sample_rate();
} }
} }
if (LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc)) if (LADSPA_IS_HINT_BOUNDED_ABOVE(HintDesc))
@@ -465,7 +466,7 @@ Plugin_Module::load ( unsigned long id )
Max=_idata->descriptor->PortRangeHints[Port].UpperBound; Max=_idata->descriptor->PortRangeHints[Port].UpperBound;
if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc)) if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc))
{ {
Max*=engine->sample_rate();
Max*=chain()->engine()->sample_rate();
} }
} }


@@ -533,7 +534,7 @@ Plugin_Module::load ( unsigned long id )
} }
} }
if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc)) { if (LADSPA_IS_HINT_SAMPLE_RATE(HintDesc)) {
Default *= engine->sample_rate();
Default *= chain()->engine()->sample_rate();
} }
if (LADSPA_IS_HINT_INTEGER(HintDesc)) { if (LADSPA_IS_HINT_INTEGER(HintDesc)) {
if ( p.hints.ranged && if ( p.hints.ranged &&


+ 2
- 13
Mixer/main.C View File

@@ -31,12 +31,10 @@
#include "DPM.H" #include "DPM.H"


#include "Mixer.H" #include "Mixer.H"
#include "Engine/Engine.H"
#include "util/Thread.H" #include "util/Thread.H"
#include "util/debug.h" #include "util/debug.h"
#include "Project.H" #include "Project.H"


Engine *engine;
Mixer *mixer; Mixer *mixer;


Fl_Single_Window *main_window; Fl_Single_Window *main_window;
@@ -98,12 +96,6 @@ main ( int argc, char **argv )
/* Fl::foreground( 0xFF, 0xFF, 0xFF ); */ /* Fl::foreground( 0xFF, 0xFF, 0xFF ); */
/* Fl::background( 0x10, 0x10, 0x10 ); */ /* Fl::background( 0x10, 0x10, 0x10 ); */


MESSAGE( "Initializing JACK" );

engine = new Engine();

engine->init( "Non-Mixer" );

{ {
Fl_Single_Window *o = main_window = new Fl_Single_Window( 1024, 768, "Mixer" ); Fl_Single_Window *o = main_window = new Fl_Single_Window( 1024, 768, "Mixer" );
{ {
@@ -117,8 +109,6 @@ main ( int argc, char **argv )
} }


{ {
engine->lock();

if ( argc > 1 ) if ( argc > 1 )
{ {
/* char name[1024]; */ /* char name[1024]; */
@@ -137,13 +127,12 @@ main ( int argc, char **argv )
{ {
WARNING( "Running without a project--nothing will be saved." ); WARNING( "Running without a project--nothing will be saved." );
} }

engine->unlock();
} }


Fl::run(); Fl::run();


delete engine;
delete main_window;
main_window = NULL;


MESSAGE( "Your fun is over" ); MESSAGE( "Your fun is over" );




Loading…
Cancel
Save