80 |
// disconnect all current bindings first |
// disconnect all current bindings first |
81 |
for (int i = 0; i < Bindings.size(); i++) { |
for (int i = 0; i < Bindings.size(); i++) { |
82 |
String dst_name = Bindings[i]; |
String dst_name = Bindings[i]; |
83 |
int res = jack_disconnect(pChannel->pDevice->hJackClient, src_name.c_str(), dst_name.c_str()); |
/*int res =*/ jack_disconnect(pChannel->pDevice->hJackClient, src_name.c_str(), dst_name.c_str()); |
84 |
} |
} |
85 |
// connect new bindings |
// connect new bindings |
86 |
for (int i = 0; i < vS.size(); i++) { |
for (int i = 0; i < vS.size(); i++) { |
184 |
* @see AcquireChannels() |
* @see AcquireChannels() |
185 |
*/ |
*/ |
186 |
AudioOutputDeviceJack::AudioOutputDeviceJack(std::map<String,DeviceCreationParameter*> Parameters) : AudioOutputDevice(Parameters) { |
AudioOutputDeviceJack::AudioOutputDeviceJack(std::map<String,DeviceCreationParameter*> Parameters) : AudioOutputDevice(Parameters) { |
187 |
JackClient* pJackClient = JackClient::CreateAudio(((DeviceCreationParameterString*)Parameters["NAME"])->ValueAsString()); |
pJackClient = JackClient::CreateAudio(((DeviceCreationParameterString*)Parameters["NAME"])->ValueAsString()); |
188 |
existingJackDevices++; |
existingJackDevices++; |
189 |
pJackClient->SetAudioOutputDevice(this); |
pJackClient->SetAudioOutputDevice(this); |
190 |
hJackClient = pJackClient->hJackClient; |
hJackClient = pJackClient->hJackClient; |
237 |
const float rate = jack_get_sample_rate(hJackClient); |
const float rate = jack_get_sample_rate(hJackClient); |
238 |
return size / rate; |
return size / rate; |
239 |
} |
} |
240 |
|
|
241 |
|
jack_client_t* AudioOutputDeviceJack::jackClientHandle() { |
242 |
|
return hJackClient; |
243 |
|
} |
244 |
|
|
245 |
void AudioOutputDeviceJack::Play() { |
void AudioOutputDeviceJack::Play() { |
246 |
csIsPlaying.PushAndUnlock(true); |
csIsPlaying.PushAndUnlock(true); |
265 |
uint AudioOutputDeviceJack::SampleRate() { |
uint AudioOutputDeviceJack::SampleRate() { |
266 |
return jack_get_sample_rate(hJackClient); |
return jack_get_sample_rate(hJackClient); |
267 |
} |
} |
268 |
|
|
269 |
|
void AudioOutputDeviceJack::addListener(JackListener* listener) { |
270 |
|
pJackClient->addListener(listener); |
271 |
|
} |
272 |
|
|
273 |
String AudioOutputDeviceJack::Name() { |
String AudioOutputDeviceJack::Name() { |
274 |
return "JACK"; |
return "JACK"; |
298 |
return static_cast<JackClient*>(arg)->Process(nframes); |
return static_cast<JackClient*>(arg)->Process(nframes); |
299 |
} |
} |
300 |
|
|
301 |
void linuxsampler_libjack_shutdown_callback(void* arg) { |
#if HAVE_JACK_ON_INFO_SHUTDOWN |
302 |
static_cast<JackClient*>(arg)->Stop(); |
void JackClient::libjackShutdownCallback(jack_status_t code, const char* reason, void *arg) |
303 |
|
#else |
304 |
|
void JackClient::libjackShutdownCallback(void *arg) |
305 |
|
#endif |
306 |
|
{ |
307 |
|
JackClient* jackClient = static_cast<JackClient*>(arg); |
308 |
|
jackClient->Stop(); |
309 |
fprintf(stderr, "Jack: Jack server shutdown, exiting.\n"); |
fprintf(stderr, "Jack: Jack server shutdown, exiting.\n"); |
310 |
|
for (int i = 0; i < jackClient->jackListeners.size(); ++i) { |
311 |
|
JackListener* listener = jackClient->jackListeners[i]; |
312 |
|
#if HAVE_JACK_ON_INFO_SHUTDOWN |
313 |
|
listener->onJackShutdown(code, reason); |
314 |
|
#else |
315 |
|
listener->onJackShutdown(JackFailure, "unknown"); |
316 |
|
#endif |
317 |
|
} |
318 |
} |
} |
319 |
|
|
320 |
int JackClient::libjackSampleRateCallback(jack_nframes_t nframes, void *arg) { |
int JackClient::libjackSampleRateCallback(jack_nframes_t nframes, void *arg) { |
337 |
client->ConfigReader.Unlock(); |
client->ConfigReader.Unlock(); |
338 |
return 0; |
return 0; |
339 |
} |
} |
340 |
|
|
341 |
|
void JackClient::addListener(JackListener* listener) { |
342 |
|
jackListeners.push_back(listener); |
343 |
|
} |
344 |
|
|
345 |
std::map<String, JackClient*> JackClient::Clients; |
std::map<String, JackClient*> JackClient::Clients; |
346 |
|
|
386 |
if (!hJackClient) |
if (!hJackClient) |
387 |
throw Exception("Seems Jack server is not running."); |
throw Exception("Seems Jack server is not running."); |
388 |
jack_set_process_callback(hJackClient, linuxsampler_libjack_process_callback, this); |
jack_set_process_callback(hJackClient, linuxsampler_libjack_process_callback, this); |
389 |
jack_on_shutdown(hJackClient, linuxsampler_libjack_shutdown_callback, this); |
#if HAVE_JACK_ON_INFO_SHUTDOWN |
390 |
|
jack_on_info_shutdown(hJackClient, libjackShutdownCallback, this); |
391 |
|
#else |
392 |
|
jack_on_shutdown(hJackClient, libjackShutdownCallback, this); |
393 |
|
#endif |
394 |
jack_set_buffer_size_callback(hJackClient, libjackBufferSizeCallback, this); |
jack_set_buffer_size_callback(hJackClient, libjackBufferSizeCallback, this); |
395 |
jack_set_sample_rate_callback(hJackClient, libjackSampleRateCallback, this); |
jack_set_sample_rate_callback(hJackClient, libjackSampleRateCallback, this); |
396 |
|
|