Attempt to cope with failure to create JACK clients and ports.
This commit is contained in:
parent
f464cdbaea
commit
13b3ddc301
|
@ -414,7 +414,16 @@ Chain::name ( const char *name )
|
|||
|
||||
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
|
||||
{
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Box.H>
|
||||
#include <FL/fl_ask.H>
|
||||
#include <FL/Fl_Counter.H>
|
||||
#include <FL/Fl_Menu_Item.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" );
|
||||
|
||||
if ( ! po.activate() )
|
||||
{
|
||||
fl_alert( "Could not activate JACK port \"%s\"", po.name() );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( po.valid() )
|
||||
{
|
||||
jack_input.push_back( po );
|
||||
|
|
|
@ -21,6 +21,8 @@
|
|||
|
||||
#include <string.h>
|
||||
|
||||
#include <FL/fl_ask.H>
|
||||
|
||||
#include "dsp.h"
|
||||
|
||||
#include "Engine/Engine.H"
|
||||
|
@ -91,6 +93,12 @@ JACK_Module::configure_inputs ( int n )
|
|||
{
|
||||
JACK::Port po( chain()->engine(), JACK::Port::Output, i );
|
||||
|
||||
if ( ! po.activate() )
|
||||
{
|
||||
jack_port_activation_error( &po );
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( po.valid() )
|
||||
{
|
||||
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
|
||||
|
@ -114,6 +122,12 @@ JACK_Module::configure_inputs ( int n )
|
|||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
JACK_Module::jack_port_activation_error ( JACK::Port *p )
|
||||
{
|
||||
fl_alert( "Could not activate JACK port \"%s\"", p->name() );
|
||||
}
|
||||
|
||||
bool
|
||||
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 );
|
||||
|
||||
if ( ! po.activate() )
|
||||
{
|
||||
jack_port_activation_error( &po );
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( po.valid() )
|
||||
{
|
||||
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_output;
|
||||
|
||||
static void jack_port_activation_error ( JACK::Port *p );
|
||||
|
||||
public:
|
||||
|
||||
JACK_Module ( );
|
||||
|
|
|
@ -17,6 +17,9 @@
|
|||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
/*******************************************************************************/
|
||||
|
||||
#include "const.h"
|
||||
#include "debug.h"
|
||||
|
||||
#include <FL/fl_ask.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" );
|
||||
|
||||
if ( ! _output->activate() )
|
||||
{
|
||||
FATAL( "could not create JACK port" );
|
||||
}
|
||||
|
||||
if ( track )
|
||||
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" );
|
||||
|
||||
if ( ! _output->activate() )
|
||||
{
|
||||
FATAL( "could not create JACK port" );
|
||||
}
|
||||
|
||||
t->add( this );
|
||||
}
|
||||
else if ( ! strcmp( ":name", s ) )
|
||||
|
|
|
@ -79,6 +79,11 @@ Track::configure_outputs ( int n )
|
|||
{
|
||||
JACK::Port p( engine, JACK::Port::Output, name(), i );
|
||||
|
||||
if ( !p.activate() )
|
||||
{
|
||||
FATAL( "could not created output port!");
|
||||
}
|
||||
|
||||
if ( p.valid() )
|
||||
output.push_back( p );
|
||||
else
|
||||
|
@ -126,6 +131,11 @@ Track::configure_inputs ( int n )
|
|||
{
|
||||
JACK::Port p( engine, JACK::Port::Input, name(), i );
|
||||
|
||||
if ( !p.activate() )
|
||||
{
|
||||
FATAL( "could not created output port!");
|
||||
}
|
||||
|
||||
if ( p.valid() )
|
||||
input.push_back( p );
|
||||
else
|
||||
|
|
|
@ -42,6 +42,7 @@ namespace JACK
|
|||
_freezer = rhs._freezer;
|
||||
_client = rhs._client;
|
||||
_port = rhs._port;
|
||||
_direction = rhs._direction;
|
||||
_name = strdup( rhs._name );
|
||||
|
||||
_client->port_added( this );
|
||||
|
@ -54,6 +55,7 @@ namespace JACK
|
|||
_client = client;
|
||||
_port = 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 )
|
||||
|
@ -61,7 +63,9 @@ namespace JACK
|
|||
_name = NULL;
|
||||
_freezer = NULL;
|
||||
_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 )
|
||||
|
@ -70,9 +74,8 @@ namespace JACK
|
|||
_freezer = NULL;
|
||||
_client = client;
|
||||
|
||||
const char *name = name_for_port( dir, base, n, type );
|
||||
|
||||
activate( name, dir );
|
||||
_name = strdup( name_for_port( dir, base, n, type ) );
|
||||
_direction = dir;
|
||||
}
|
||||
|
||||
Port::Port ( JACK::Client *client, type_e dir, int n, const char *type )
|
||||
|
@ -81,9 +84,9 @@ namespace JACK
|
|||
_freezer = NULL;
|
||||
_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 ( )
|
||||
|
@ -141,16 +144,29 @@ namespace JACK
|
|||
return pname;
|
||||
}
|
||||
|
||||
void
|
||||
bool
|
||||
Port::activate ( const char *name, type_e dir )
|
||||
{
|
||||
_name = strdup( name );
|
||||
_direction = dir;
|
||||
|
||||
return activate();
|
||||
}
|
||||
|
||||
bool
|
||||
Port::activate ( void )
|
||||
{
|
||||
_port = jack_port_register( _client->jack_client(), _name,
|
||||
JACK_DEFAULT_AUDIO_TYPE,
|
||||
dir == Output ? JackPortIsOutput : JackPortIsInput,
|
||||
_direction == Output ? JackPortIsOutput : JackPortIsInput,
|
||||
0 );
|
||||
|
||||
if ( ! _port )
|
||||
return false;
|
||||
|
||||
_client->port_added( this );
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/** returns the sum of latency of all ports between this one and a
|
||||
|
@ -239,10 +255,7 @@ namespace JACK
|
|||
Port::type_e
|
||||
Port::type ( void ) const
|
||||
{
|
||||
if ( _freezer )
|
||||
return _freezer->direction;
|
||||
else
|
||||
return jack_port_flags( _port ) == JackPortIsOutput ? Output : Input;
|
||||
return _direction;
|
||||
}
|
||||
|
||||
/** Restore the connections returned by connections() */
|
||||
|
@ -295,7 +308,6 @@ namespace JACK
|
|||
freeze_state *f = new freeze_state();
|
||||
|
||||
f->connections = connections();
|
||||
f->direction = type();
|
||||
f->name = strdup( name() );
|
||||
|
||||
_freezer = f;
|
||||
|
@ -304,7 +316,7 @@ namespace JACK
|
|||
void
|
||||
Port::thaw ( void )
|
||||
{
|
||||
activate( name(), _freezer->direction );
|
||||
activate();
|
||||
|
||||
connections( _freezer->connections );
|
||||
|
||||
|
|
|
@ -67,7 +67,7 @@ namespace JACK
|
|||
nframes_t latency ( void ) const;
|
||||
void latency ( nframes_t frames );
|
||||
|
||||
void activate ( const char *name, type_e dir );
|
||||
bool activate ( void );
|
||||
void shutdown ( void );
|
||||
void write ( sample_t *buf, nframes_t nframes );
|
||||
void read ( sample_t *buf, nframes_t nframes );
|
||||
|
@ -82,12 +82,15 @@ namespace JACK
|
|||
|
||||
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
|
||||
new client */
|
||||
struct freeze_state
|
||||
{
|
||||
const char **connections;
|
||||
type_e direction;
|
||||
char *name;
|
||||
|
||||
freeze_state ( )
|
||||
|
|
Loading…
Reference in New Issue