28 , _jackClientName(name)
39 if (not _jackClient)
return;
40 bool error = jack_client_close (_jackClient);
43 std::cerr <<
"JACK ERROR: cannot close client" << std::endl;
50 return _jackClient != 0;
55 if (_jackClient)
return "";
56 return "No connection to JACK server available";
61 unsigned jackClientNameMaxSize=jack_client_name_size();
62 if (jackClientNameMaxSize<=_jackClientName.size())
64 std::cerr <<
"JACK WARNING: jack client name \"" << _jackClientName
65 <<
"\" truncated to " << jackClientNameMaxSize <<
" characters"<<std::endl;
66 _jackClientName.resize(jackClientNameMaxSize-1);
69 CLAM_ASSERT(not _jackClient,
"JACKNetworkPlayer: Initializing a client without closing the previous one");
70 jack_status_t jackStatus;
71 _jackClient = jack_client_open ( _jackClientName.c_str(), JackNullOption, &jackStatus );
75 std::cerr <<
"JACK ERROR: server not running?"<< std::endl;
81 CLAM_ASSERT(not err,
"JACK ERROR: registering process callbacks");
87 _jackSampleRate=(
int)jack_get_sample_rate (_jackClient);
88 _jackBufferSize=(
int)jack_get_buffer_size (_jackClient);
101 "JACKNetworkPlayer::RegisterInputPorts() : there are already registered input ports");
103 _sourceJackPorts.resize(nPorts);
104 for (
unsigned i=0; i<nPorts; i++)
106 _sourceJackPorts[i] = jack_port_register(
108 JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
116 "JACKNetworkPlayer::RegisterOutputPorts() : there are already registered output ports");
118 _sinkJackPorts.resize(nPorts);
119 for(
unsigned i = 0; i < nPorts; ++i)
121 _sinkJackPorts[i] = jack_port_register(
123 JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
130 for (
unsigned i=0; i<_sinkJackPorts.size(); i++)
132 if ( jack_port_unregister ( _jackClient, _sinkJackPorts[i]) )
134 std::cerr <<
"JACK ERROR: unregistering port " << PortName(_sinkJackPorts[i]) << std::endl;
138 _sinkJackPorts.clear();
140 for (
unsigned i=0; i<_sourceJackPorts.size(); i++)
142 if ( jack_port_unregister ( _jackClient, _sourceJackPorts[i]) )
144 std::cerr <<
"JACK ERROR: unregistering port " << PortName(_sourceJackPorts[i]) << std::endl;
148 _sourceJackPorts.clear();
153 for (
unsigned i=0; i<_sourceJackPorts.size(); i++)
155 jack_default_audio_sample_t *jackInBuffer =
156 (jack_default_audio_sample_t*) jack_port_get_buffer(_sourceJackPorts[i], nframes);
163 for (
unsigned i=0; i<_sinkJackPorts.size(); i++)
165 jack_default_audio_sample_t* jackOutBuffer =
166 (jack_default_audio_sample_t*) jack_port_get_buffer(_sinkJackPorts[i], nframes);
173 for (
unsigned i=0; i<_sinkJackPorts.size(); i++)
175 jack_default_audio_sample_t *jackOutBuffer =
176 (jack_default_audio_sample_t*) jack_port_get_buffer ( _sinkJackPorts[i], nframes);
177 std::memset(jackOutBuffer, 0, nframes*
sizeof(jack_default_audio_sample_t));
190 if (!_jackClient)
return;
200 if (jack_activate (_jackClient)) {
201 std::cerr <<
"JACK ERROR: cannot activate client" << std::endl;
216 if (not _jackClient)
return;
219 _sinkJackPorts.clear();
220 _sourceJackPorts.clear();
228 if ( jack_deactivate (_jackClient) )
230 std::cerr <<
"JACK ERROR: cannot deactivate client" << std::endl;
254 for (
unsigned i=0; i<_sourceJackPorts.size(); i++)
256 JackConnection connection;
257 connection.processingName = PortName(_sourceJackPorts[i]);
258 connection.outsideConnections = jack_port_get_connections ( _sourceJackPorts[i] );
259 _incomingJackConnections.push_back(connection);
262 for (
unsigned i=0; i<_sinkJackPorts.size(); i++)
264 JackConnection connection;
265 connection.processingName = PortName(_sinkJackPorts[i]);
266 connection.outsideConnections = jack_port_get_connections ( _sinkJackPorts[i] );
267 _outgoingJackConnections.push_back(connection);
274 for (JackConnections::iterator it=_incomingJackConnections.begin(); it!=_incomingJackConnections.end(); it++)
276 if (not it->outsideConnections)
continue;
277 for (
unsigned i=0; it->outsideConnections[i]; i++)
279 bool error = jack_connect ( _jackClient, it->outsideConnections[i], it->processingName.c_str() );
281 std::cerr <<
"JACK WARNING: could not reconnect ports ( " <<
282 it->processingName <<
" , " << it->outsideConnections[i] <<
" )" <<std::endl;
284 free(it->outsideConnections);
286 _incomingJackConnections.clear();
288 for (JackConnections::iterator it=_outgoingJackConnections.begin(); it!=_outgoingJackConnections.end(); it++)
290 if (not it->outsideConnections)
continue;
291 for (
unsigned i=0; it->outsideConnections[i]; i++)
293 bool error = jack_connect ( _jackClient, it->processingName.c_str(), it->outsideConnections[i] );
295 std::cerr <<
"JACK WARNING: could not reconnect ports ( " <<
296 it->outsideConnections[i] <<
" , " << it->processingName <<
" )" <<std::endl;
298 free(it->outsideConnections);
300 _outgoingJackConnections.clear();
308 const char ** portnames= jack_get_ports ( _jackClient , _jackOutPortAutoConnectList.c_str(),
NULL, JackPortIsOutput);
311 std::cout <<
" -WARNING: couldn't locate any JACK output port <"
312 << _jackOutPortAutoConnectList <<
">"<<std::endl;
316 for (
unsigned i=0; i<_sourceJackPorts.size() && portnames[i]; i++)
318 jack_port_t * port = _sourceJackPorts[i];
319 std::cout <<
"- Connecting " << portnames[i] <<
" -> "
320 << PortName(port) << std::endl;
322 if ( jack_connect( _jackClient, portnames[i], PortName(port) ) !=0 )
323 std::cerr <<
" -WARNING: couldn't connect" << std::endl;
329 portnames= jack_get_ports ( _jackClient , _jackInPortAutoConnectList.c_str(),
NULL, JackPortIsInput);
332 std::cout <<
" -WARNING: couldn't locate any JACK input port <"
333 << _jackInPortAutoConnectList <<
">"<<std::endl;
337 for (
unsigned i=0; i<_sinkJackPorts.size() && portnames[i]; i++)
339 const char * localPortName = PortName(_sinkJackPorts[i]);
340 std::cout <<
"- Connecting "<< localPortName
341 <<
" -> " << portnames[i] << std::endl;
343 if ( jack_connect( _jackClient, localPortName, portnames[i]) != 0)
344 std::cerr <<
" -WARNING: couldn't connect" << std::endl;