Mercurial > hg > svapp
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 |