comparison audioio/AudioJACKTarget.cpp @ 91:9fc4b256c283

* PortAudio driver: do not specify frames per buffer, let PA decide * Remove old non-RubberBand time stretcher -- it doesn't work with varying buffer sizes such as the PA driver may now be using * Rewrite getCurrentPlayingFrame for greater correctness when using long buffer sizes (interpolating according to audio stream timestamp) * Several changes to make the timestretch management RT safe(r)
author Chris Cannam
date Fri, 08 Feb 2008 17:51:15 +0000
parents 19142c58cc4c
children 9c5c1989d0f8
comparison
equal deleted inserted replaced
90:db267a315058 91:9fc4b256c283
255 255
256 AudioJACKTarget::~AudioJACKTarget() 256 AudioJACKTarget::~AudioJACKTarget()
257 { 257 {
258 std::cerr << "AudioJACKTarget::~AudioJACKTarget()" << std::endl; 258 std::cerr << "AudioJACKTarget::~AudioJACKTarget()" << std::endl;
259 259
260 if (m_source) {
261 m_source->setTarget(0, m_bufferSize);
262 }
263
260 shutdown(); 264 shutdown();
261 265
262 if (m_client) { 266 if (m_client) {
263 267
264 while (m_outputs.size() > 0) { 268 while (m_outputs.size() > 0) {
291 AudioJACKTarget::isOK() const 295 AudioJACKTarget::isOK() const
292 { 296 {
293 return (m_client != 0); 297 return (m_client != 0);
294 } 298 }
295 299
300 double
301 AudioJACKTarget::getCurrentTime() const
302 {
303 if (m_client && m_sampleRate) {
304 return double(jack_frame_time(m_client)) / double(m_sampleRate);
305 } else {
306 return 0.0;
307 }
308 }
309
296 int 310 int
297 AudioJACKTarget::processStatic(jack_nframes_t nframes, void *arg) 311 AudioJACKTarget::processStatic(jack_nframes_t nframes, void *arg)
298 { 312 {
299 return ((AudioJACKTarget *)arg)->process(nframes); 313 return ((AudioJACKTarget *)arg)->process(nframes);
300 } 314 }
308 void 322 void
309 AudioJACKTarget::sourceModelReplaced() 323 AudioJACKTarget::sourceModelReplaced()
310 { 324 {
311 m_mutex.lock(); 325 m_mutex.lock();
312 326
313 m_source->setTargetBlockSize(m_bufferSize); 327 m_source->setTarget(this, m_bufferSize);
314 m_source->setTargetSampleRate(m_sampleRate); 328 m_source->setTargetSampleRate(m_sampleRate);
315 329
316 size_t channels = m_source->getSourceChannelCount(); 330 size_t channels = m_source->getSourceChannelCount();
317 331
318 // Because we offer pan, we always want at least 2 channels 332 // Because we offer pan, we always want at least 2 channels