mirror of
https://github.com/Ardour/ardour.git
synced 2026-01-02 03:47:42 +01:00
[Summary] Fixed bug 46338: Crash if stem export was canceled on high sample rate
[Details] WavesAudioBackend::freewheel (bool start_stop) which starts/stops freewheeling must not return until freewheeling thread is started or activate a device until the thread is stopped. [Reviewed by] PDavis
This commit is contained in:
parent
d7d615e1c8
commit
e482d83de6
1 changed files with 25 additions and 2 deletions
|
|
@ -805,11 +805,23 @@ WavesAudioBackend::freewheel (bool start_stop)
|
|||
}
|
||||
_call_thread_init_callback = true;
|
||||
_freewheel_thread ();
|
||||
engine.freewheel_callback (start_stop);
|
||||
|
||||
while (!engine.freewheeling()) {
|
||||
sleep(0);
|
||||
}
|
||||
|
||||
// freewheel thread was not activated successfully
|
||||
if (_freewheel_thread_active == false) {
|
||||
engine.freewheel_callback(false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
_freewheel_thread_active = false; // stop _freewheel_thread ()
|
||||
engine.freewheel_callback (start_stop);
|
||||
|
||||
while (engine.freewheeling()) {
|
||||
sleep(0);
|
||||
}
|
||||
|
||||
_call_thread_init_callback = true;
|
||||
WTErr retval = _device->SetStreaming (true);
|
||||
if (retval != eNoErr) {
|
||||
|
|
@ -849,6 +861,10 @@ WavesAudioBackend::_freewheel_thread ()
|
|||
_freewheel_thread_active = true;
|
||||
if ((pthread_create (&thread_id, &attributes, __start_process_thread, thread_data))) {
|
||||
_freewheel_thread_active = false;
|
||||
|
||||
// release invoking thread
|
||||
engine.freewheel_callback(true);
|
||||
|
||||
std::cerr << "WavesAudioBackend::freewheel_thread (): pthread_create () failed!" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
|
@ -857,6 +873,9 @@ WavesAudioBackend::_freewheel_thread ()
|
|||
return;
|
||||
}
|
||||
|
||||
// notify angine that freewheeling is started
|
||||
engine.freewheel_callback(true);
|
||||
|
||||
if (_call_thread_init_callback) {
|
||||
_call_thread_init_callback = false;
|
||||
AudioEngine::thread_init_callback (this);
|
||||
|
|
@ -865,6 +884,10 @@ WavesAudioBackend::_freewheel_thread ()
|
|||
while (_freewheel_thread_active) {
|
||||
engine.process_callback (_buffer_size);
|
||||
}
|
||||
|
||||
// notify angine that freewheeling is stopped
|
||||
engine.freewheel_callback(false);
|
||||
|
||||
// COMMENTED DBG LOGS */ std::cout << "WavesAudioBackend::_freewheel_thread (): FINISHED" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue