[LAD] jack client autoconnection

Fons Adriaensen fons at kokkinizita.net
Mon Feb 4 16:46:14 UTC 2008


On Mon, Feb 04, 2008 at 03:32:23PM +0100, Fons Adriaensen wrote:

> Where jack_autoconnect() would use environment variables,
> read .rc files, invoke the Buddha, or consult Paul Davis or
> the oracle of Delphi to find out which ports to use, but
> without requiring any special support from jackd itself.

The code required is much shorter than the length of this
thread so far, so I take the liberty to post it.
Quickly but not fully tested.


Enjoy.


(C) Fons Adriaensen, License: GPL

--- jack_autoconnect.h

#ifndef __JACK_AUTOCONNECT_H
#define __JACK_AUTOCONNECT_H

#ifdef __cplusplus
extern "C" {
#endif


#include <jack/jack.h>


/*

Connect to JACK ports specified by an environment variable.

Args:

   client:  Pointer to jack client_t of your application.
   nport:   The number of ports to connect.
   ports:   An array of existing jack ports you want to connect.
   envvar:  The name of the environment variable containing a comma-separated list of the full
            names of the ports you want your ports connected to.

Returns:

   -1 if 'envvar' does not exist, the number of connections made otherwise.


Ports can be input or output in any mix, but of course directions should match
those of the ports specified by 'envvar'.

The name 'envvar' can be application-specific, e.g. MY_VERY_SPECIAL_PLAYER_PORTS, or
general, e.g. JACK_STEREO_PLAYBACK_PORTS, JACK_5DOT1_PLAYBACK_PORTS, etc.

*/


extern int jack_autoconnect (jack_client_t *client, int nport, jack_port_t **ports, const char *envvar);


#ifdef __cplusplus
}
#endif

#endif



--- jack_autoconnect.c


#include <stdlib.h>
#include <string.h>
#include <jack/jack.h>


#define BUFFSIZE 4096


int jack_autoconnect (jack_client_t *client, int nport, jack_port_t **ports, const char *envvar)
{
    int         n, r;
    char        *t;
    const char  *p, *q;
    char        buff [BUFFSIZE];

    p = getenv (envvar);
    if (p == 0) return -1;
    strncpy (buff, p, BUFFSIZE);
    buff [BUFFSIZE - 1] = 0;

    p = buff;
    for (n = 0; n < nport; n++)
    {
	if ((p == 0) || (ports [n] == 0)) return n;
	t = strchr (p, ',');
	if (t) *t = 0;
        q = jack_port_name (ports [n]);
	if (jack_port_flags (ports [n]) & JackPortIsInput)
	{
	    r = jack_connect (client, p, q);
	}
	else
	{
	    r = jack_connect (client, q, p);
	}
	if (r) return n;
	p = t ? (t + 1) : 0;
    }

    return n;
}


--- end of code


-- 
FA

Laboratorio di Acustica ed Elettroacustica
Parma, Italia

Lascia la spina, cogli la rosa.




More information about the Linux-audio-dev mailing list