diff --git a/common/JackNetAdapter.cpp b/common/JackNetAdapter.cpp index 0afcfe54..1b8e6829 100644 --- a/common/JackNetAdapter.cpp +++ b/common/JackNetAdapter.cpp @@ -28,9 +28,6 @@ namespace Jack { jack_log ( "JackNetAdapter::JackNetAdapter" ); - if ( SocketAPIInit() < 0 ) - jack_error ( "Can't init Socket API, exiting..." ); - //global parametering //we can't call JackNetSlaveInterface constructor with some parameters before //because we don't have full parametering right now @@ -165,6 +162,7 @@ namespace Jack } break; // Stop when the thread cycle is finished + case JackThread::kRunning: if ( fThread.Stop() < 0 ) { @@ -172,6 +170,7 @@ namespace Jack return -1; } break; + default: break; } @@ -268,11 +267,13 @@ namespace Jack jack_transport_stop ( fJackClient ); jack_info ( "NetMaster : transport stops." ); break; + case JackTransportStarting : jack_transport_reposition ( fJackClient, &fSendTransportData.fPosition ); jack_transport_start ( fJackClient ); jack_info ( "NetMaster : transport starts." ); break; + case JackTransportRolling : //TODO , we need to : // - find a way to call TransportEngine->SetNetworkSync() @@ -405,6 +406,7 @@ namespace Jack if ( fCaptureRingBuffer[port_index]->WriteResample ( fSoftCaptureBuffer[port_index], fAdaptedBufferSize ) < fAdaptedBufferSize ) failure = true; } + //and output data, for ( port_index = 0; port_index < fPlaybackChannels; port_index++ ) { @@ -529,15 +531,21 @@ extern "C" Jack::JackAudioAdapter* adapter; jack_nframes_t buffer_size = jack_get_buffer_size ( jack_client ); jack_nframes_t sample_rate = jack_get_sample_rate ( jack_client ); + + try { + + adapter = new Jack::JackAudioAdapter ( jack_client, new Jack::JackNetAdapter ( jack_client, buffer_size, sample_rate, params ) ); + assert ( adapter ); - adapter = new Jack::JackAudioAdapter ( jack_client, new Jack::JackNetAdapter ( jack_client, buffer_size, sample_rate, params ) ); - assert ( adapter ); - - if ( adapter->Open() == 0 ) - return 0; - else - { - delete adapter; + if ( adapter->Open() == 0 ) + return 0; + else + { + delete adapter; + return 1; + } + + } catch (...) { return 1; } } diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index 9a3ec943..98bb912d 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -152,9 +152,11 @@ namespace Jack case 's' : plot_name += string ( "_slow" ); break; + case 'n' : plot_name += string ( "_normal" ); break; + case 'f' : plot_name += string ( "_fast" ); break; @@ -372,11 +374,13 @@ namespace Jack fEngineControl->fTransport.SetCommand ( TransportCommandStop ); jack_info ( "Master stops transport." ); break; + case JackTransportStarting : fEngineControl->fTransport.RequestNewPos ( &fSendTransportData.fPosition ); fEngineControl->fTransport.SetCommand ( TransportCommandStart ); jack_info ( "Master starts transport." ); break; + case JackTransportRolling : fEngineControl->fTransport.SetState ( JackTransportRolling ); jack_info ( "Master is rolling." ); @@ -638,11 +642,6 @@ namespace Jack EXPORT Jack::JackDriverClientInterface* driver_initialize ( Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params ) { - if ( SocketAPIInit() < 0 ) - { - jack_error ( "Can't init Socket API, exiting..." ); - return NULL; - } char multicast_ip[16]; strcpy ( multicast_ip, DEFAULT_MULTICAST_IP ); char name[JACK_CLIENT_NAME_SIZE]; @@ -706,15 +705,23 @@ namespace Jack } } - Jack::JackDriverClientInterface* driver = new Jack::JackWaitThreadedDriver ( - new Jack::JackNetDriver ( "system", "net_pcm", engine, table, multicast_ip, udp_port, mtu, - midi_input_ports, midi_output_ports, name, transport_sync, network_mode ) ); - if ( driver->Open ( period_size, sample_rate, 1, 1, audio_capture_ports, audio_playback_ports, - monitor, "from_master_", "to_master_", 0, 0 ) == 0 ) - return driver; - - delete driver; - return NULL; + try { + + Jack::JackDriverClientInterface* driver = + new Jack::JackWaitThreadedDriver( + new Jack::JackNetDriver("system", "net_pcm", engine, table, multicast_ip, udp_port, mtu, + midi_input_ports, midi_output_ports, name, transport_sync, network_mode)); + if (driver->Open (period_size, sample_rate, 1, 1, audio_capture_ports, audio_playback_ports, + monitor, "from_master_", "to_master_", 0, 0) == 0) { + return driver; + } else { + delete driver; + return NULL; + } + + } catch (...) { + return NULL; + } } #ifdef __cplusplus diff --git a/common/JackNetInterface.cpp b/common/JackNetInterface.cpp index 47367e2d..286fc08b 100644 --- a/common/JackNetInterface.cpp +++ b/common/JackNetInterface.cpp @@ -719,7 +719,7 @@ namespace Jack fRxHeader.fIsLastPckt = rx_head->fIsLastPckt; fNetAudioCaptureBuffer->RenderToJackPorts ( rx_head->fSubCycle ); break; - + case 's': //sync jack_info ( "NetSlave : overloaded, skipping receive." ); return 0; diff --git a/common/JackNetInterface.h b/common/JackNetInterface.h index 20f5a326..80e90c83 100644 --- a/common/JackNetInterface.h +++ b/common/JackNetInterface.h @@ -147,11 +147,23 @@ namespace Jack public: JackNetSlaveInterface() : JackNetInterface() { - fSlaveCounter++; + //open Socket API with the first slave + if (fSlaveCounter++ == 0) { + if (SocketAPIInit() < 0) { + jack_error ( "Can't init Socket API, exiting..." ); + throw -1; + } + } } JackNetSlaveInterface ( const char* ip, int port ) : JackNetInterface ( ip, port ) { - fSlaveCounter++; + //open Socket API with the first slave + if (fSlaveCounter++ == 0) { + if (SocketAPIInit() < 0) { + jack_error ( "Can't init Socket API, exiting..." ); + throw -1; + } + } } ~JackNetSlaveInterface() { @@ -164,7 +176,9 @@ namespace Jack #define DEFAULT_MULTICAST_IP "225.3.19.154" #define DEFAULT_PORT 19000 + #define SLAVE_SETUP_RETRY 5 + #define MASTER_INIT_TIMEOUT 1000000 // in usec #define SLAVE_INIT_TIMEOUT 2000000 // in usec