Mercurial > hg > svapp
comparison audioio/AudioJACKTarget.cpp @ 70:716e9d2f91c7
* Skip ID3 block when reading MP3 files (so long as ID3 support is included)
* Show progress when retrieving audio file from playlist
* Avoid -- but do not actually fix -- segmentation fault on exit.  I am
  totally stumped at the moment about why both the PA and JACK audio targets
  should crash when properly shut down.  For the moment, we just don't shut
  them down...
* Fix incorrect behaviour (introduced on Friday as part of a different fix)
  when replacing main model in situation where no current main model exists
| author | Chris Cannam | 
|---|---|
| date | Fri, 30 Nov 2007 17:31:09 +0000 | 
| parents | eb596ef12041 | 
| children | 19142c58cc4c | 
   comparison
  equal
  deleted
  inserted
  replaced
| 68:cedeab01d4c8 | 70:716e9d2f91c7 | 
|---|---|
| 67 | 67 | 
| 68 static jack_client_t *dynamic_jack_client_open(const char *client_name, | 68 static jack_client_t *dynamic_jack_client_open(const char *client_name, | 
| 69 jack_options_t options, | 69 jack_options_t options, | 
| 70 jack_status_t *status, ...) | 70 jack_status_t *status, ...) | 
| 71 { | 71 { | 
| 72 typedef jack_client_t (*func)(const char *client_name, | 72 typedef jack_client_t *(*func)(const char *client_name, | 
| 73 jack_options_t options, | 73 jack_options_t options, | 
| 74 jack_status_t *status, ...); | 74 jack_status_t *status, ...); | 
| 75 void *s = symbol("jack_client_open"); | 75 void *s = symbol("jack_client_open"); | 
| 76 if (!s) return 0; | 76 if (!s) return 0; | 
| 77 func f = (func)s; | 77 func f = (func)s; | 
| 78 return f(client_name, options, status); // varargs not supported here | 78 return f(client_name, options, status); // varargs not supported here | 
| 79 } | 79 } | 
| 209 | 209 | 
| 210 AudioJACKTarget::AudioJACKTarget(AudioCallbackPlaySource *source) : | 210 AudioJACKTarget::AudioJACKTarget(AudioCallbackPlaySource *source) : | 
| 211 AudioCallbackPlayTarget(source), | 211 AudioCallbackPlayTarget(source), | 
| 212 m_client(0), | 212 m_client(0), | 
| 213 m_bufferSize(0), | 213 m_bufferSize(0), | 
| 214 m_sampleRate(0) | 214 m_sampleRate(0), | 
| 215 m_done(false) | |
| 215 { | 216 { | 
| 216 JackOptions options = JackNullOption; | 217 JackOptions options = JackNullOption; | 
| 217 #ifdef HAVE_PORTAUDIO | 218 #ifdef HAVE_PORTAUDIO | 
| 218 options = JackNoStartServer; | 219 options = JackNoStartServer; | 
| 219 #endif | 220 #endif | 
| 245 } | 246 } | 
| 246 | 247 | 
| 247 AudioJACKTarget::~AudioJACKTarget() | 248 AudioJACKTarget::~AudioJACKTarget() | 
| 248 { | 249 { | 
| 249 std::cerr << "AudioJACKTarget::~AudioJACKTarget()" << std::endl; | 250 std::cerr << "AudioJACKTarget::~AudioJACKTarget()" << std::endl; | 
| 251 | |
| 252 shutdown(); | |
| 253 | |
| 250 if (m_client) { | 254 if (m_client) { | 
| 255 | |
| 256 while (m_outputs.size() > 0) { | |
| 257 std::vector<jack_port_t *>::iterator itr = m_outputs.end(); | |
| 258 --itr; | |
| 259 jack_port_t *port = *itr; | |
| 260 std::cerr << "unregister " << m_outputs.size() << std::endl; | |
| 261 if (port) jack_port_unregister(m_client, port); | |
| 262 m_outputs.erase(itr); | |
| 263 } | |
| 264 std::cerr << "Deactivating... "; | |
| 251 jack_deactivate(m_client); | 265 jack_deactivate(m_client); | 
| 266 std::cerr << "done\nClosing... "; | |
| 252 jack_client_close(m_client); | 267 jack_client_close(m_client); | 
| 253 } | 268 std::cerr << "done" << std::endl; | 
| 269 } | |
| 270 | |
| 271 m_client = 0; | |
| 272 | |
| 254 std::cerr << "AudioJACKTarget::~AudioJACKTarget() done" << std::endl; | 273 std::cerr << "AudioJACKTarget::~AudioJACKTarget() done" << std::endl; | 
| 274 } | |
| 275 | |
| 276 void | |
| 277 AudioJACKTarget::shutdown() | |
| 278 { | |
| 279 m_done = true; | |
| 255 } | 280 } | 
| 256 | 281 | 
| 257 bool | 282 bool | 
| 258 AudioJACKTarget::isOK() const | 283 AudioJACKTarget::isOK() const | 
| 259 { | 284 { | 
| 340 } | 365 } | 
| 341 | 366 | 
| 342 int | 367 int | 
| 343 AudioJACKTarget::process(jack_nframes_t nframes) | 368 AudioJACKTarget::process(jack_nframes_t nframes) | 
| 344 { | 369 { | 
| 370 if (m_done) return 0; | |
| 371 | |
| 345 if (!m_mutex.tryLock()) { | 372 if (!m_mutex.tryLock()) { | 
| 346 return 0; | 373 return 0; | 
| 347 } | 374 } | 
| 348 | 375 | 
| 349 if (m_outputs.empty()) { | 376 if (m_outputs.empty()) { | 
