// return 0: ok // return 1: cannot activate client // return 2: cannot connect output port // return 3: Jack server not running // return 4: output port = NULL int JackOutput::connect() { INFOLOG( "connect" ); if ( jack_activate ( client ) ) { Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_ACTIVATE_CLIENT ); return 1; } bool connect_output_ports = m_bConnectOutFlag; memset( track_output_ports_L, 0, sizeof(track_output_ports_L) ); memset( track_output_ports_R, 0, sizeof(track_output_ports_R) ); #ifdef H2CORE_HAVE_LASH if ( Preferences::get_instance()->useLash() ){ LashClient* lashClient = LashClient::get_instance(); if (lashClient && lashClient->isConnected()) { // infoLog("[LASH] Sending Jack client name to LASH server"); lashClient->sendJackClientName(); if (!lashClient->isNewProject()) { connect_output_ports = false; } } } #endif if ( connect_output_ports ) { // if ( m_bConnectOutFlag ) { // connect the ports if ( jack_connect( client, jack_port_name( output_port_1 ), output_port_name_1.toLocal8Bit() ) == 0 && jack_connect ( client, jack_port_name( output_port_2 ), output_port_name_2.toLocal8Bit() ) == 0 ) { return 0; } INFOLOG( "Could not connect so saved out-ports. Connecting to first pair of in-ports" ); const char ** portnames = jack_get_ports ( client, NULL, NULL, JackPortIsInput ); if ( !portnames || !portnames[0] || !portnames[1] ) { ERRORLOG( "Could't locate two Jack input port" ); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_CONNECT_OUTPUT_PORT ); return 2; } if ( jack_connect( client, jack_port_name( output_port_1 ), portnames[0] ) != 0 || jack_connect( client, jack_port_name( output_port_2 ), portnames[1] ) != 0 ) { ERRORLOG( "Could't connect to first pair of Jack input ports" ); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_CONNECT_OUTPUT_PORT ); return 2; } free( portnames ); } return 0; }
// return 0: ok // return 1: cannot activate client // return 2: cannot connect output port int JackAudioDriver::connect() { INFOLOG( "connect" ); // The `jack_activate' function is defined in the jack/jack.h // header files and tells the JACK server that the program is // ready to start processing audio. It returns 0 on success // and a non-zero error code otherwise. if ( jack_activate( m_pClient ) ) { Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_ACTIVATE_CLIENT ); return 1; } bool connect_output_ports = m_bConnectOutFlag; memset( track_output_ports_L, 0, sizeof(track_output_ports_L) ); memset( track_output_ports_R, 0, sizeof(track_output_ports_R) ); #ifdef H2CORE_HAVE_LASH if ( Preferences::get_instance()->useLash() ){ LashClient* lashClient = LashClient::get_instance(); if (lashClient && lashClient->isConnected()){ // INFOLOG( "[LASH] Sending JACK client name to LASH server" ); lashClient->sendJackClientName(); if (!lashClient->isNewProject()){ connect_output_ports = false; } } } #endif if ( connect_output_ports ) { // Connect the ports. // The `jack_connect' function is defined in the // jack/jack.h file. It establishes a connection between // two ports. When a connection exists, data written // to the source port will be available to be read at // the destination port. Returns 0 on success, exits // if the connection is already made, and returns a // non-zero error code otherwise. // Syntax: jack_connect( jack_client_t jack_client, // const char *source_port ) // const char *destination_port // ) // The `jack_port_name' function is also defined in // the jack/jack.h header returns the full name of a // provided port of type jack_port_t. if ( jack_connect( m_pClient, jack_port_name( output_port_1 ), output_port_name_1.toLocal8Bit() ) == 0 && jack_connect( m_pClient, jack_port_name( output_port_2 ), output_port_name_2.toLocal8Bit() ) == 0 ) { return 0; } INFOLOG( "Could not connect to the saved output ports. Connect to the first pair of input ports instead." ); // The `jack_get_ports' is defined in the jack/jack.h // header file and performs a lookup of ports of the // JACK server based on their e.g. flags. It returns a // NULL-terminated array of ports that match the // specified arguments. The caller is responsible for // calling jack_free() any non-NULL returned // value. const char ** portnames = jack_get_ports( m_pClient, NULL, NULL, JackPortIsInput ); if ( !portnames || !portnames[0] || !portnames[1] ) { ERRORLOG( "Couldn't locate two Jack input ports" ); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_CONNECT_OUTPUT_PORT ); return 2; } if ( jack_connect( m_pClient, jack_port_name( output_port_1 ), portnames[0] ) != 0 || jack_connect( m_pClient, jack_port_name( output_port_2 ), portnames[1] ) != 0 ) { ERRORLOG( "Couldn't connect to first pair of Jack input ports" ); Hydrogen::get_instance()->raiseError( Hydrogen::JACK_CANNOT_CONNECT_OUTPUT_PORT ); return 2; } free( portnames ); } return 0; }