Mercurial > hg > svapp
comparison audioio/AudioJACKTarget.cpp @ 100:22bf057ea151 1.2-stable
* merge from trunk (1.2 ended up being tracked from trunk, but we may want
this branch for fixes later)
author | Chris Cannam |
---|---|
date | Wed, 27 Feb 2008 10:32:45 +0000 |
parents | a8acc7841d70 |
children |
comparison
equal
deleted
inserted
replaced
71:a8acc7841d70 | 100:22bf057ea151 |
---|---|
182 dynamic1(jack_nframes_t, jack_get_buffer_size, jack_client_t *, 0); | 182 dynamic1(jack_nframes_t, jack_get_buffer_size, jack_client_t *, 0); |
183 dynamic1(jack_nframes_t, jack_get_sample_rate, jack_client_t *, 0); | 183 dynamic1(jack_nframes_t, jack_get_sample_rate, jack_client_t *, 0); |
184 dynamic1(int, jack_activate, jack_client_t *, 1); | 184 dynamic1(int, jack_activate, jack_client_t *, 1); |
185 dynamic1(int, jack_deactivate, jack_client_t *, 1); | 185 dynamic1(int, jack_deactivate, jack_client_t *, 1); |
186 dynamic1(int, jack_client_close, jack_client_t *, 1); | 186 dynamic1(int, jack_client_close, jack_client_t *, 1); |
187 dynamic1(jack_nframes_t, jack_frame_time, jack_client_t *, 0); | |
187 dynamic1(jack_nframes_t, jack_port_get_latency, jack_port_t *, 0); | 188 dynamic1(jack_nframes_t, jack_port_get_latency, jack_port_t *, 0); |
188 dynamic1(const char *, jack_port_name, const jack_port_t *, 0); | 189 dynamic1(const char *, jack_port_name, const jack_port_t *, 0); |
189 | 190 |
190 #define jack_client_new dynamic_jack_client_new | 191 #define jack_client_new dynamic_jack_client_new |
191 #define jack_client_open dynamic_jack_client_open | 192 #define jack_client_open dynamic_jack_client_open |
194 #define jack_set_process_callback dynamic_jack_set_process_callback | 195 #define jack_set_process_callback dynamic_jack_set_process_callback |
195 #define jack_set_xrun_callback dynamic_jack_set_xrun_callback | 196 #define jack_set_xrun_callback dynamic_jack_set_xrun_callback |
196 #define jack_activate dynamic_jack_activate | 197 #define jack_activate dynamic_jack_activate |
197 #define jack_deactivate dynamic_jack_deactivate | 198 #define jack_deactivate dynamic_jack_deactivate |
198 #define jack_client_close dynamic_jack_client_close | 199 #define jack_client_close dynamic_jack_client_close |
200 #define jack_frame_time dynamic_jack_frame_time | |
199 #define jack_get_ports dynamic_jack_get_ports | 201 #define jack_get_ports dynamic_jack_get_ports |
200 #define jack_port_register dynamic_jack_port_register | 202 #define jack_port_register dynamic_jack_port_register |
201 #define jack_port_unregister dynamic_jack_port_unregister | 203 #define jack_port_unregister dynamic_jack_port_unregister |
202 #define jack_port_get_latency dynamic_jack_port_get_latency | 204 #define jack_port_get_latency dynamic_jack_port_get_latency |
203 #define jack_port_name dynamic_jack_port_name | 205 #define jack_port_name dynamic_jack_port_name |
241 } | 243 } |
242 | 244 |
243 if (m_source) { | 245 if (m_source) { |
244 sourceModelReplaced(); | 246 sourceModelReplaced(); |
245 } | 247 } |
248 | |
249 // Mainstream JACK (though not jackdmp) calls mlockall() to lock | |
250 // down all memory for real-time operation. That isn't a terribly | |
251 // good idea in an application like this that may have very high | |
252 // dynamic memory usage in other threads, as mlockall() applies | |
253 // across all threads. We're far better off undoing it here and | |
254 // accepting the possible loss of true RT capability. | |
255 MUNLOCKALL(); | |
246 } | 256 } |
247 | 257 |
248 AudioJACKTarget::~AudioJACKTarget() | 258 AudioJACKTarget::~AudioJACKTarget() |
249 { | 259 { |
250 std::cerr << "AudioJACKTarget::~AudioJACKTarget()" << std::endl; | 260 std::cerr << "AudioJACKTarget::~AudioJACKTarget()" << std::endl; |
261 | |
262 if (m_source) { | |
263 m_source->setTarget(0, m_bufferSize); | |
264 } | |
251 | 265 |
252 shutdown(); | 266 shutdown(); |
253 | 267 |
254 if (m_client) { | 268 if (m_client) { |
255 | 269 |
283 AudioJACKTarget::isOK() const | 297 AudioJACKTarget::isOK() const |
284 { | 298 { |
285 return (m_client != 0); | 299 return (m_client != 0); |
286 } | 300 } |
287 | 301 |
302 double | |
303 AudioJACKTarget::getCurrentTime() const | |
304 { | |
305 if (m_client && m_sampleRate) { | |
306 return double(jack_frame_time(m_client)) / double(m_sampleRate); | |
307 } else { | |
308 return 0.0; | |
309 } | |
310 } | |
311 | |
288 int | 312 int |
289 AudioJACKTarget::processStatic(jack_nframes_t nframes, void *arg) | 313 AudioJACKTarget::processStatic(jack_nframes_t nframes, void *arg) |
290 { | 314 { |
291 return ((AudioJACKTarget *)arg)->process(nframes); | 315 return ((AudioJACKTarget *)arg)->process(nframes); |
292 } | 316 } |
300 void | 324 void |
301 AudioJACKTarget::sourceModelReplaced() | 325 AudioJACKTarget::sourceModelReplaced() |
302 { | 326 { |
303 m_mutex.lock(); | 327 m_mutex.lock(); |
304 | 328 |
305 m_source->setTargetBlockSize(m_bufferSize); | 329 m_source->setTarget(this, m_bufferSize); |
306 m_source->setTargetSampleRate(m_sampleRate); | 330 m_source->setTargetSampleRate(m_sampleRate); |
307 | 331 |
308 size_t channels = m_source->getSourceChannelCount(); | 332 size_t channels = m_source->getSourceChannelCount(); |
309 | 333 |
310 // Because we offer pan, we always want at least 2 channels | 334 // Because we offer pan, we always want at least 2 channels |