Attempt to cope with failure to create JACK clients and ports.
parent
f464cdbaea
commit
13b3ddc301
|
@ -414,7 +414,16 @@ Chain::name ( const char *name )
|
||||||
|
|
||||||
engine()->buffer_size_callback( &Chain::buffer_size, this );
|
engine()->buffer_size_callback( &Chain::buffer_size, this );
|
||||||
|
|
||||||
engine()->init( ename );
|
const char *jack_name = engine()->init( ename );
|
||||||
|
|
||||||
|
if ( ! jack_name )
|
||||||
|
{
|
||||||
|
_engine = NULL;
|
||||||
|
|
||||||
|
fl_alert( "Could not create JACK client. Perhaps the sound device already in use. In any event, now I'll die." );
|
||||||
|
exit( 1 );
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
#include <FL/Fl.H>
|
#include <FL/Fl.H>
|
||||||
#include <FL/Fl_Box.H>
|
#include <FL/Fl_Box.H>
|
||||||
|
#include <FL/fl_ask.H>
|
||||||
#include <FL/Fl_Counter.H>
|
#include <FL/Fl_Counter.H>
|
||||||
#include <FL/Fl_Menu_Item.H>
|
#include <FL/Fl_Menu_Item.H>
|
||||||
#include <FL/Fl_Menu_Button.H>
|
#include <FL/Fl_Menu_Button.H>
|
||||||
|
@ -159,6 +160,12 @@ Controller_Module::mode ( Mode m )
|
||||||
|
|
||||||
JACK::Port po( chain()->engine(), JACK::Port::Input, p->name(), 0, "CV" );
|
JACK::Port po( chain()->engine(), JACK::Port::Input, p->name(), 0, "CV" );
|
||||||
|
|
||||||
|
if ( ! po.activate() )
|
||||||
|
{
|
||||||
|
fl_alert( "Could not activate JACK port \"%s\"", po.name() );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ( po.valid() )
|
if ( po.valid() )
|
||||||
{
|
{
|
||||||
jack_input.push_back( po );
|
jack_input.push_back( po );
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <FL/fl_ask.H>
|
||||||
|
|
||||||
#include "dsp.h"
|
#include "dsp.h"
|
||||||
|
|
||||||
#include "Engine/Engine.H"
|
#include "Engine/Engine.H"
|
||||||
|
@ -91,6 +93,12 @@ JACK_Module::configure_inputs ( int n )
|
||||||
{
|
{
|
||||||
JACK::Port po( chain()->engine(), JACK::Port::Output, i );
|
JACK::Port po( chain()->engine(), JACK::Port::Output, i );
|
||||||
|
|
||||||
|
if ( ! po.activate() )
|
||||||
|
{
|
||||||
|
jack_port_activation_error( &po );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if ( po.valid() )
|
if ( po.valid() )
|
||||||
{
|
{
|
||||||
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
|
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
|
||||||
|
@ -114,6 +122,12 @@ JACK_Module::configure_inputs ( int n )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
JACK_Module::jack_port_activation_error ( JACK::Port *p )
|
||||||
|
{
|
||||||
|
fl_alert( "Could not activate JACK port \"%s\"", p->name() );
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
JACK_Module::configure_outputs ( int n )
|
JACK_Module::configure_outputs ( int n )
|
||||||
{
|
{
|
||||||
|
@ -125,6 +139,12 @@ JACK_Module::configure_outputs ( int n )
|
||||||
{
|
{
|
||||||
JACK::Port po( chain()->engine(), JACK::Port::Input, i );
|
JACK::Port po( chain()->engine(), JACK::Port::Input, i );
|
||||||
|
|
||||||
|
if ( ! po.activate() )
|
||||||
|
{
|
||||||
|
jack_port_activation_error( &po );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if ( po.valid() )
|
if ( po.valid() )
|
||||||
{
|
{
|
||||||
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
|
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
|
||||||
|
|
|
@ -29,6 +29,8 @@ class JACK_Module : public Module
|
||||||
std::vector<JACK::Port> jack_input;
|
std::vector<JACK::Port> jack_input;
|
||||||
std::vector<JACK::Port> jack_output;
|
std::vector<JACK::Port> jack_output;
|
||||||
|
|
||||||
|
static void jack_port_activation_error ( JACK::Port *p );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
JACK_Module ( );
|
JACK_Module ( );
|
||||||
|
|
|
@ -17,6 +17,9 @@
|
||||||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
|
||||||
|
#include "const.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
#include <FL/fl_ask.H>
|
#include <FL/fl_ask.H>
|
||||||
|
|
||||||
#include "Control_Sequence.H"
|
#include "Control_Sequence.H"
|
||||||
|
@ -43,6 +46,11 @@ Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0 )
|
||||||
|
|
||||||
_output = new JACK::Port( engine, JACK::Port::Output, track->name(), track->ncontrols(), "cv" );
|
_output = new JACK::Port( engine, JACK::Port::Output, track->name(), track->ncontrols(), "cv" );
|
||||||
|
|
||||||
|
if ( ! _output->activate() )
|
||||||
|
{
|
||||||
|
FATAL( "could not create JACK port" );
|
||||||
|
}
|
||||||
|
|
||||||
if ( track )
|
if ( track )
|
||||||
track->add( this );
|
track->add( this );
|
||||||
|
|
||||||
|
@ -112,6 +120,11 @@ Control_Sequence::set ( Log_Entry &e )
|
||||||
|
|
||||||
_output = new JACK::Port( engine, JACK::Port::Output, t->name(), t->ncontrols(), "cv" );
|
_output = new JACK::Port( engine, JACK::Port::Output, t->name(), t->ncontrols(), "cv" );
|
||||||
|
|
||||||
|
if ( ! _output->activate() )
|
||||||
|
{
|
||||||
|
FATAL( "could not create JACK port" );
|
||||||
|
}
|
||||||
|
|
||||||
t->add( this );
|
t->add( this );
|
||||||
}
|
}
|
||||||
else if ( ! strcmp( ":name", s ) )
|
else if ( ! strcmp( ":name", s ) )
|
||||||
|
|
|
@ -79,6 +79,11 @@ Track::configure_outputs ( int n )
|
||||||
{
|
{
|
||||||
JACK::Port p( engine, JACK::Port::Output, name(), i );
|
JACK::Port p( engine, JACK::Port::Output, name(), i );
|
||||||
|
|
||||||
|
if ( !p.activate() )
|
||||||
|
{
|
||||||
|
FATAL( "could not created output port!");
|
||||||
|
}
|
||||||
|
|
||||||
if ( p.valid() )
|
if ( p.valid() )
|
||||||
output.push_back( p );
|
output.push_back( p );
|
||||||
else
|
else
|
||||||
|
@ -126,6 +131,11 @@ Track::configure_inputs ( int n )
|
||||||
{
|
{
|
||||||
JACK::Port p( engine, JACK::Port::Input, name(), i );
|
JACK::Port p( engine, JACK::Port::Input, name(), i );
|
||||||
|
|
||||||
|
if ( !p.activate() )
|
||||||
|
{
|
||||||
|
FATAL( "could not created output port!");
|
||||||
|
}
|
||||||
|
|
||||||
if ( p.valid() )
|
if ( p.valid() )
|
||||||
input.push_back( p );
|
input.push_back( p );
|
||||||
else
|
else
|
||||||
|
|
|
@ -42,6 +42,7 @@ namespace JACK
|
||||||
_freezer = rhs._freezer;
|
_freezer = rhs._freezer;
|
||||||
_client = rhs._client;
|
_client = rhs._client;
|
||||||
_port = rhs._port;
|
_port = rhs._port;
|
||||||
|
_direction = rhs._direction;
|
||||||
_name = strdup( rhs._name );
|
_name = strdup( rhs._name );
|
||||||
|
|
||||||
_client->port_added( this );
|
_client->port_added( this );
|
||||||
|
@ -54,6 +55,7 @@ namespace JACK
|
||||||
_client = client;
|
_client = client;
|
||||||
_port = port;
|
_port = port;
|
||||||
_name = strdup( jack_port_name( port ) );
|
_name = strdup( jack_port_name( port ) );
|
||||||
|
_direction = jack_port_flags( _port ) == JackPortIsOutput ? Output : Input;
|
||||||
}
|
}
|
||||||
|
|
||||||
Port::Port ( JACK::Client *client, const char *name, type_e dir )
|
Port::Port ( JACK::Client *client, const char *name, type_e dir )
|
||||||
|
@ -61,7 +63,9 @@ namespace JACK
|
||||||
_name = NULL;
|
_name = NULL;
|
||||||
_freezer = NULL;
|
_freezer = NULL;
|
||||||
_client = client;
|
_client = client;
|
||||||
activate( name, dir );
|
_direction = dir;
|
||||||
|
|
||||||
|
_name = strdup( name );
|
||||||
}
|
}
|
||||||
|
|
||||||
Port::Port ( JACK::Client *client, type_e dir, const char *base, int n, const char *type )
|
Port::Port ( JACK::Client *client, type_e dir, const char *base, int n, const char *type )
|
||||||
|
@ -70,9 +74,8 @@ namespace JACK
|
||||||
_freezer = NULL;
|
_freezer = NULL;
|
||||||
_client = client;
|
_client = client;
|
||||||
|
|
||||||
const char *name = name_for_port( dir, base, n, type );
|
_name = strdup( name_for_port( dir, base, n, type ) );
|
||||||
|
_direction = dir;
|
||||||
activate( name, dir );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Port::Port ( JACK::Client *client, type_e dir, int n, const char *type )
|
Port::Port ( JACK::Client *client, type_e dir, int n, const char *type )
|
||||||
|
@ -81,9 +84,9 @@ namespace JACK
|
||||||
_freezer = NULL;
|
_freezer = NULL;
|
||||||
_client = client;
|
_client = client;
|
||||||
|
|
||||||
const char *name = name_for_port( dir, NULL, n, type );
|
_name = strdup( name_for_port( dir, NULL, n, type ) );
|
||||||
|
_direction = dir;
|
||||||
|
|
||||||
activate( name, dir );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Port::~Port ( )
|
Port::~Port ( )
|
||||||
|
@ -141,16 +144,29 @@ namespace JACK
|
||||||
return pname;
|
return pname;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
Port::activate ( const char *name, type_e dir )
|
Port::activate ( const char *name, type_e dir )
|
||||||
{
|
{
|
||||||
_name = strdup( name );
|
_name = strdup( name );
|
||||||
|
_direction = dir;
|
||||||
|
|
||||||
|
return activate();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Port::activate ( void )
|
||||||
|
{
|
||||||
_port = jack_port_register( _client->jack_client(), _name,
|
_port = jack_port_register( _client->jack_client(), _name,
|
||||||
JACK_DEFAULT_AUDIO_TYPE,
|
JACK_DEFAULT_AUDIO_TYPE,
|
||||||
dir == Output ? JackPortIsOutput : JackPortIsInput,
|
_direction == Output ? JackPortIsOutput : JackPortIsInput,
|
||||||
0 );
|
0 );
|
||||||
|
|
||||||
|
if ( ! _port )
|
||||||
|
return false;
|
||||||
|
|
||||||
_client->port_added( this );
|
_client->port_added( this );
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** returns the sum of latency of all ports between this one and a
|
/** returns the sum of latency of all ports between this one and a
|
||||||
|
@ -239,10 +255,7 @@ namespace JACK
|
||||||
Port::type_e
|
Port::type_e
|
||||||
Port::type ( void ) const
|
Port::type ( void ) const
|
||||||
{
|
{
|
||||||
if ( _freezer )
|
return _direction;
|
||||||
return _freezer->direction;
|
|
||||||
else
|
|
||||||
return jack_port_flags( _port ) == JackPortIsOutput ? Output : Input;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Restore the connections returned by connections() */
|
/** Restore the connections returned by connections() */
|
||||||
|
@ -295,7 +308,6 @@ namespace JACK
|
||||||
freeze_state *f = new freeze_state();
|
freeze_state *f = new freeze_state();
|
||||||
|
|
||||||
f->connections = connections();
|
f->connections = connections();
|
||||||
f->direction = type();
|
|
||||||
f->name = strdup( name() );
|
f->name = strdup( name() );
|
||||||
|
|
||||||
_freezer = f;
|
_freezer = f;
|
||||||
|
@ -304,7 +316,7 @@ namespace JACK
|
||||||
void
|
void
|
||||||
Port::thaw ( void )
|
Port::thaw ( void )
|
||||||
{
|
{
|
||||||
activate( name(), _freezer->direction );
|
activate();
|
||||||
|
|
||||||
connections( _freezer->connections );
|
connections( _freezer->connections );
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ namespace JACK
|
||||||
nframes_t latency ( void ) const;
|
nframes_t latency ( void ) const;
|
||||||
void latency ( nframes_t frames );
|
void latency ( nframes_t frames );
|
||||||
|
|
||||||
void activate ( const char *name, type_e dir );
|
bool activate ( void );
|
||||||
void shutdown ( void );
|
void shutdown ( void );
|
||||||
void write ( sample_t *buf, nframes_t nframes );
|
void write ( sample_t *buf, nframes_t nframes );
|
||||||
void read ( sample_t *buf, nframes_t nframes );
|
void read ( sample_t *buf, nframes_t nframes );
|
||||||
|
@ -82,12 +82,15 @@ namespace JACK
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
type_e _direction;
|
||||||
|
|
||||||
|
bool activate ( const char *name, type_e dir );
|
||||||
|
|
||||||
/* holds all we need to know about a jack port to recreate it on a
|
/* holds all we need to know about a jack port to recreate it on a
|
||||||
new client */
|
new client */
|
||||||
struct freeze_state
|
struct freeze_state
|
||||||
{
|
{
|
||||||
const char **connections;
|
const char **connections;
|
||||||
type_e direction;
|
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
freeze_state ( )
|
freeze_state ( )
|
||||||
|
|
Loading…
Reference in New Issue