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