Use new Jack Metadata API to mark CV ports.

By adding metadata key "http://jackaudio.org/metadata/signal-type" value "CV" pair to CV ports, patch bays can discriminate between audio and CV ports (SVN patchage e.g. can already do so).

Metadata API is only implemented in Jack1 for now, this patch will thus have no effect when linked to Jack1/2 without support for metadata.
This commit is contained in:
Hanspeter Portner 2014-05-17 12:11:40 +02:00
parent 467e369cd1
commit 2d43a8abe7
8 changed files with 44 additions and 9 deletions

View File

@ -221,7 +221,7 @@ Controller_Module::mode ( Mode m )
char prefix[512]; char prefix[512];
snprintf( prefix, sizeof(prefix), "CV-%s", p->name() ); snprintf( prefix, sizeof(prefix), "CV-%s", p->name() );
add_aux_audio_input( prefix, 0 ); add_aux_cv_input( prefix, 0 );
chain()->client()->unlock(); chain()->client()->unlock();
} }

View File

@ -1270,7 +1270,7 @@ Module::set_latency ( JACK::Port::direction_e dir, nframes_t min, nframes_t max
bool bool
Module::add_aux_port ( bool input, const char *prefix, int i ) Module::add_aux_port ( bool input, const char *prefix, int i, JACK::Port::type_e type )
{ {
const char *trackname = chain()->strip()->group()->single() ? NULL : chain()->name(); const char *trackname = chain()->strip()->group()->single() ? NULL : chain()->name();
@ -1278,7 +1278,7 @@ Module::add_aux_port ( bool input, const char *prefix, int i )
char *portname = generate_port_name( prefix, direction, i ); char *portname = generate_port_name( prefix, direction, i );
JACK::Port *po = new JACK::Port( chain()->client(), trackname, portname, direction, JACK::Port::Audio ); JACK::Port *po = new JACK::Port( chain()->client(), trackname, portname, direction, type );
free(portname); free(portname);
@ -1319,7 +1319,7 @@ Module::add_aux_port ( bool input, const char *prefix, int i )
bool bool
Module::add_aux_audio_output( const char *prefix, int i ) Module::add_aux_audio_output( const char *prefix, int i )
{ {
bool r = add_aux_port ( false, prefix, i ); bool r = add_aux_port ( false, prefix, i , JACK::Port::Audio);
if ( r ) if ( r )
mixer->maybe_auto_connect_output( &aux_audio_output.back() ); mixer->maybe_auto_connect_output( &aux_audio_output.back() );
@ -1330,7 +1330,13 @@ Module::add_aux_audio_output( const char *prefix, int i )
bool bool
Module::add_aux_audio_input( const char *prefix, int i ) Module::add_aux_audio_input( const char *prefix, int i )
{ {
return add_aux_port ( true, prefix, i ); return add_aux_port ( true, prefix, i , JACK::Port::Audio);
}
bool
Module::add_aux_cv_input( const char *prefix, int i )
{
return add_aux_port ( true, prefix, i , JACK::Port::CV);
} }

View File

@ -499,7 +499,7 @@ protected:
virtual void get ( Log_Entry &e ) const; virtual void get ( Log_Entry &e ) const;
virtual void set ( Log_Entry &e ); virtual void set ( Log_Entry &e );
bool add_aux_port ( bool input, const char *prefix, int n ); bool add_aux_port ( bool input, const char *prefix, int n , JACK::Port::type_e type );
public: public:
nframes_t sample_rate ( void ) const { return Module::_sample_rate; } nframes_t sample_rate ( void ) const { return Module::_sample_rate; }
@ -513,6 +513,7 @@ public:
bool add_aux_audio_output ( const char *prefix, int n ); bool add_aux_audio_output ( const char *prefix, int n );
bool add_aux_audio_input ( const char *prefix, int n ); bool add_aux_audio_input ( const char *prefix, int n );
bool add_aux_cv_input ( const char *prefix, int n );
static void set_sample_rate ( nframes_t srate ) { _sample_rate = srate; } static void set_sample_rate ( nframes_t srate ) { _sample_rate = srate; }

View File

@ -21,6 +21,9 @@
#include <jack/jack.h> #include <jack/jack.h>
#include <jack/midiport.h> #include <jack/midiport.h>
#ifdef HAVE_JACK_METADATA
# include <jack/metadata.h>
#endif
#include <Mutex.H> #include <Mutex.H>
typedef jack_nframes_t nframes_t; typedef jack_nframes_t nframes_t;

View File

@ -71,6 +71,8 @@ namespace JACK
_type = Audio; _type = Audio;
if ( strstr( type, "MIDI") ) if ( strstr( type, "MIDI") )
_type = MIDI; _type = MIDI;
else if ( strstr( type, "CV)") )
_type = CV;
_client->port_added( this ); _client->port_added( this );
@ -190,10 +192,18 @@ namespace JACK
DMESSAGE( "Activating port name %s", jackname ); DMESSAGE( "Activating port name %s", jackname );
_port = jack_port_register( _client->jack_client(), jackname, _port = jack_port_register( _client->jack_client(), jackname,
_type == Audio ? JACK_DEFAULT_AUDIO_TYPE : JACK_DEFAULT_MIDI_TYPE, ( _type == Audio ) || ( _type == CV ) ? JACK_DEFAULT_AUDIO_TYPE : JACK_DEFAULT_MIDI_TYPE,
flags, flags,
0 ); 0 );
#ifdef HAVE_JACK_METADATA
if ( _type == CV )
{
jack_uuid_t uuid = jack_port_uuid( _port );
jack_set_property( _client->jack_client(), uuid, "http://jackaudio.org/metadata/signal-type", "CV", "text/plain" );
}
#endif
DMESSAGE( "Port = %p", _port ); DMESSAGE( "Port = %p", _port );
if ( ! _port ) if ( ! _port )
@ -266,7 +276,16 @@ namespace JACK
Port::deactivate ( void ) Port::deactivate ( void )
{ {
if ( _port ) if ( _port )
{
#ifdef HAVE_JACK_METADATA
if ( _type == CV )
{
jack_uuid_t uuid = jack_port_uuid(_port);
jack_remove_property(_client->jack_client(), uuid, "http://jackaudio.org/metadata/signal-type");
}
#endif
jack_port_unregister( _client->jack_client(), _port ); jack_port_unregister( _client->jack_client(), _port );
}
_port = 0; _port = 0;
} }

View File

@ -44,7 +44,7 @@ namespace JACK
bool operator < ( const Port & rhs ) const; bool operator < ( const Port & rhs ) const;
enum direction_e { Output, Input }; enum direction_e { Output, Input };
enum type_e { Audio, MIDI }; enum type_e { Audio, MIDI, CV };
static int max_name ( void ); static int max_name ( void );

View File

@ -175,7 +175,7 @@ Control_Sequence::update_port_name ( void )
if ( ! _output ) if ( ! _output )
{ {
_output = new JACK::Port( engine, track()->name(), s, JACK::Port::Output, JACK::Port::Audio ); _output = new JACK::Port( engine, track()->name(), s, JACK::Port::Output, JACK::Port::CV );
_output->terminal( true ); _output->terminal( true );
needs_activation = true; needs_activation = true;
} }

View File

@ -61,6 +61,12 @@ def configure(conf):
define_name='HAVE_JACK_PORT_GET_LATENCY_RANGE', define_name='HAVE_JACK_PORT_GET_LATENCY_RANGE',
fragment='#include <jack/jack.h>\nint main (int argc, char**argv) { jack_port_get_latency_range( (jack_port_t*)0, JackCaptureLatency, (jack_latency_range_t *)0 ); }', fragment='#include <jack/jack.h>\nint main (int argc, char**argv) { jack_port_get_latency_range( (jack_port_t*)0, JackCaptureLatency, (jack_latency_range_t *)0 ); }',
mandatory=False); mandatory=False);
conf.check(function_name='jack_get_property',
header_name='jack/metadata.h',
define_name='HAVE_JACK_METADATA',
uselib='JACK',
mandatory=False)
conf.check_cfg(package='x11', uselib_store='XLIB',args="--cflags --libs", conf.check_cfg(package='x11', uselib_store='XLIB',args="--cflags --libs",
mandatory=True) mandatory=True)