HI *,


I have a multiprocessing program that shall host a JACK server and two JACK clients.
The server is named "AVB_Processing", the clients are name "AVB_Talker" and "AVB_Listener".
The JACK server is created and started before forking the other processes and looks fine:

JACK server starting in realtime mode with priority 8
self-connect-mode is "Don't restrict self connect requests"
Jack: JackPosixThread::StartImp : create non RT thread
Jack: JackPosixThread::ThreadHandler : start
Jack: playback device hw:1,0
Jack: capture device hw:1,0
Jack: capture device hw:1,0
Jack: playback device hw:1,0
Jack: apparent rate = 48000
Jack: frames per period = 128
Jack: JackDriver::Open capture_driver_name = hw:1,0
Jack: JackDriver::Open playback_driver_name = hw:1,0
Jack: Check protocol client = 8 server = 8
Jack: JackEngine::ClientInternalOpen: name = system
Jack: JackEngine::AllocateRefNum ref = 0
Jack: JackLinuxFutex::Allocate name = jack_sem.0_AVB_Processing_system val = 0
Jack: JackEngine::NotifyAddClient: name = system
Jack: JackGraphManager::SetBufferSize size = 128
Jack: JackConnectionManager::DirectConnect first: ref1 = 0 ref2 = 0
Jack: JackGraphManager::ConnectRefNum cur_index = 0 ref1 = 0 ref2 = 0
Jack: JackDriver::SetupDriverSync driver sem in flush mode
creating alsa driver ... hw:1,0|hw:1,0|128|2|48000|2|2|nomon|swmeter|-|32bit
configuring for 48000Hz, period = 128 frames (2.7 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 32bit integer little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 32bit integer little-endian
ALSA: use 2 periods for playback
Jack: JackSocketServerChannel::Open
Jack: JackServerSocket::Bind : addr.sun_path /dev/shm/jack_AVB_Processing_0_0
Jack: JackSocketServerChannel::BuildPoolTable size = 1
Jack: JackEngine::Open
Jack: JackClientSocket::Connect : addr.sun_path /dev/shm/jack_AVB_Processing_0_0
Jack: JackEngine::ClientInternalOpen: name = freewheel
Jack: JackEngine::AllocateRefNum ref = 1
Jack: JackLinuxFutex::Allocate name = jack_sem.0_AVB_Processing_freewheel val = 0
Jack: JackEngine::NotifyAddClient: name = freewheel
Jack: JackDriver::ClientNotify ref = 1 driver = system name = freewheel notify = 0
Jack: JackDriver::ClientNotify ref = 0 driver = freewheel name = system notify = 0
Jack: JackConnectionManager::DirectConnect first: ref1 = 1 ref2 = 1
Jack: JackGraphManager::ConnectRefNum cur_index = 0 ref1 = 1 ref2 = 1
Jack: JackDriver::SetupDriverSync driver sem in flush mode
Jack: JackGraphManager::SetBufferSize size = 128
Jack: JackAlsaDriver::Attach fBufferSize 128 fSampleRate 48000
Jack: JackEngine::PortRegister ref = 0 name = system:capture_1 type = 32 bit float mono audio flags = 22 buffer_size = 128
Jack: JackGraphManager::AllocatePortAux port_index = 1 name = system:capture_1 type = 32 bit float mono audio
Jack: JackConnectionManager::AddOutputPort ref = 0 port = 1
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fCapturePortList[i] 1
Jack: JackEngine::PortRegister ref = 0 name = system:capture_2 type = 32 bit float mono audio flags = 22 buffer_size = 128
Jack: JackGraphManager::AllocatePortAux port_index = 2 name = system:capture_2 type = 32 bit float mono audio
Jack: JackConnectionManager::AddOutputPort ref = 0 port = 2
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fCapturePortList[i] 2
Jack: JackEngine::PortRegister ref = 0 name = system:playback_1 type = 32 bit float mono audio flags = 21 buffer_size = 128
Jack: JackGraphManager::AllocatePortAux port_index = 3 name = system:playback_1 type = 32 bit float mono audio
Jack: JackConnectionManager::AddInputPort ref = 0 port = 3
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fPlaybackPortList[i] 3
Jack: JackEngine::PortRegister ref = 0 name = system:playback_2 type = 32 bit float mono audio flags = 21 buffer_size = 128
Jack: JackGraphManager::AllocatePortAux port_index = 4 name = system:playback_2 type = 32 bit float mono audio
Jack: JackConnectionManager::AddInputPort ref = 0 port = 4
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackEngine::ClientNotify: no callback for notification = 9
Jack: JackAlsaDriver::Attach fPlaybackPortList[i] 4
Jack: Clock source : hpet
Jack: JackServer::Start
Jack: JackThreadedDriver::Start
Jack: JackPosixThread::StartImp : create non RT thread
Jack: JackPosixThread::ThreadHandler : start
Jack: JackThreadedDriver::Init real-time
Jack: JackPosixThread::AcquireRealTimeImp priority = 8
Jack: JackPosixThread::StartImp : create non RT thread
Jack: JackPosixThread::ThreadHandler : start
Jack: JackSocketServerChannel::ClientCreate socket
Jack: JackSocketServerChannel::BuildPoolTable size = 2
Jack: JackSocketServerChannel::BuildPoolTable fSocketTable i = 1 fd = 56
Jack: JackSocketServerChannel::Execute : fPollTable i = 1 fd = 56
Jack: JackRequest::Notification
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackDriver::ClientNotify ref = 1 driver = freewheel name = freewheel notify = 18
Jack: JackEngine::ClientNotify: no callback for notification = 4
Jack: JackEngine::ClientNotify: no callback for notification = 4
Jack: **** alsa_pcm: xrun of at least -5118090.752 msecs
Jack: ALSA XRun wait_status = 0
Jack: JackSocketServerChannel::Execute : fPollTable i = 1 fd = 56
Jack: JackRequest::Notification
Jack: JackEngine::ClientNotify: no callback for notification = 3
Jack: JackEngine::ClientNotify: no callback for notification = 3
Jack: **** alsa_pcm: xrun of at least -5118163.456 msecs
Jack: ALSA XRun wait_status = 0
Jack: JackSocketServerChannel::Execute : fPollTable i = 1 fd = 56
Jack: JackRequest::Notification
Jack: JackEngine::ClientNotify: no callback for notification = 3
Jack: JackEngine::ClientNotify: no callback for notification = 3




After the JACK server is running, I fork four processes. Two of which try to open a JACK client without success:


Jack: jack_client_open AVB_Talker
Jack: JackInternalClient::Open name = AVB_Talker
Jack: Check protocol client = 8 server = 8
Jack: JackEngine::ClientInternalOpen: name = AVB_Talker
Jack: JackEngine::AllocateRefNum ref = 2
Jack: JackLinuxFutex::Allocate name = jack_sem.0_AVB_Processing_AVB_Talker val = 0
Jack: JackPosixProcessSync::TimedWait time out = 5000000
Jack: jack_client_open AVB_Listener
Jack: JackInternalClient::Open name = AVB_Listener
Jack: Check protocol client = 8 server = 8
Jack: JackEngine::ClientInternalOpen: name = AVB_Listener
Jack: JackEngine::AllocateRefNum ref = 2
Jack: JackLinuxFutex::Allocate name = jack_sem.0_AVB_Processing_AVB_Listener val = 0
Jack: JackPosixProcessSync::TimedWait time out = 5000000
JackPosixProcessSync::LockedTimedWait error usec = 5000000 err = Connection timed out
Jack: JackPosixProcessSync::TimedWait finished delta = 5000078.0
Driver is not running
Cannot open client name = AVB_Talker
JackPosixProcessSync::LockedTimedWait error usec = 5000000 err = Connection timed out
Jack: JackPosixProcessSync::TimedWait finished delta = 5000069.0
Driver is not running
Cannot open client name = AVB_Listener
Jack: JackSocketServerChannel::Execute : fPollTable i = 1 fd = 56




The client probably fails with "Driver is not running" due to the ALSA xruns of the server:

Jack: **** alsa_pcm: xrun of at least -5118090.752 msecs
Jack: ALSA XRun wait_status = 0
Jack: JackSocketServerChannel::Execute : fPollTable i = 1 fd = 56
Jack: JackRequest::Notification
Jack: JackEngine::ClientNotify: no callback for notification = 3
Jack: JackEngine::ClientNotify: no callback for notification = 3
Jack: **** alsa_pcm: xrun of at least -5118163.456 msecs
Jack: ALSA XRun wait_status = 0


Here is the server code:

static void set_jack_server_parameters( FILE* filepointer, const JSList * node_ptr)
{
    while (node_ptr != NULL) {
        jackctl_parameter_t * parameter = (jackctl_parameter_t *)node_ptr->data;

        if( ( strcmp( jackctl_parameter_get_name(parameter), "rate" ) == 0 ) ||
            ( strcmp( jackctl_parameter_get_name(parameter), "period" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "nperiods" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "device" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "realtime-priority" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "realtime" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "inchannels" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "outchannels" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "playback" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "capture" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "verbose" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "clock-source" ) == 0 ) ||
                ( strcmp( jackctl_parameter_get_name(parameter), "name" ) == 0 ) ){

            union jackctl_parameter_value value;
            if( ( strcmp( jackctl_parameter_get_name(parameter), "name" ) == 0 ) ){
                sprintf( value.str, "AVB_Processing");
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "verbose" ) == 0 ) ){
                value.b = true;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "clock-source" ) == 0 ) ){
                value.ui = 1;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "rate" ) == 0 ) ){
                value.ui = 48000;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "period" ) == 0 ) ){
                value.ui = 128;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "nperiods" ) == 0 ) ){
                value.ui = 2;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "device" ) == 0 ) ){
                sprintf( value.str, "hw:1,0");
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "realtime-priority" ) == 0 ) ){
                value.i = 8;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "realtime" ) == 0 ) ){
                value.b = true;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "inchannels" ) == 0 ) ){
                value.ui = 2;
            } else if( ( strcmp( jackctl_parameter_get_name(parameter), "outchannels" ) == 0 ) ){
                value.ui = 2;
            }
            jackctl_parameter_set_value( parameter, &value );
        }
        node_ptr = jack_slist_next(node_ptr);
    }
}

if( (server = jackctl_server_create(NULL, NULL) ));
parameters = jackctl_server_get_parameters(server);
set_jack_server_parameters(filepointer, parameters);

drivers = jackctl_server_get_drivers_list(server);
node_ptr = drivers;
while (node_ptr != NULL) {
       if( ( strcmp( jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), "alsa" ) == 0 ) ){
                    set_jack_server_parameters( filepointer, jackctl_driver_get_parameters( ( jackctl_driver_t *) node_ptr->data) );
         }
         node_ptr = jack_slist_next(node_ptr);
}

if( (jackctl_server_open(server, jackctl_server_get_driver(server, "alsa")) ));
if( (jackctl_server_start(server) ));

Jack is working fine outside my program.
I cloned the git repo of jack2 today ( jackdmp 1.9.12 ).

What might be going wrong here?


Thanks,
Ck