Some updates
This commit is contained in:
parent
0cdd1ad2c8
commit
91982ecc7b
@ -31,7 +31,7 @@ namespace tc::audio {
|
|||||||
virtual bool impl_start(std::string& /* error */) = 0;
|
virtual bool impl_start(std::string& /* error */) = 0;
|
||||||
virtual void impl_stop() = 0;
|
virtual void impl_stop() = 0;
|
||||||
|
|
||||||
std::mutex state_lock{};
|
std::timed_mutex state_lock{};
|
||||||
bool running{false};
|
bool running{false};
|
||||||
bool stream_invalid{false};
|
bool stream_invalid{false};
|
||||||
|
|
||||||
|
@ -90,6 +90,7 @@ namespace tc::audio {
|
|||||||
|
|
||||||
struct ::SoundIoRingBuffer* buffer{nullptr};
|
struct ::SoundIoRingBuffer* buffer{nullptr};
|
||||||
|
|
||||||
|
bool stop_requested{false}; /* protected via fail_cv_mutex */
|
||||||
void execute_recovery();
|
void execute_recovery();
|
||||||
void read_callback(int frame_count_min, int frame_count_max);
|
void read_callback(int frame_count_min, int frame_count_max);
|
||||||
};
|
};
|
||||||
|
@ -52,9 +52,14 @@ void SoundIORecord::execute_recovery() {
|
|||||||
if(fc == 0) fc = 1;
|
if(fc == 0) fc = 1;
|
||||||
else if(fc > 10) return;
|
else if(fc > 10) return;
|
||||||
this->fail_cv.wait_for(cv_lock, std::chrono::seconds{(fc - 1) * 10});
|
this->fail_cv.wait_for(cv_lock, std::chrono::seconds{(fc - 1) * 10});
|
||||||
|
if(!this->running || this->stop_requested) return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::lock_guard slock{this->state_lock};
|
std::unique_lock slock{this->state_lock, std::defer_lock};
|
||||||
|
if(!slock.try_lock_for(std::chrono::milliseconds{20})) {
|
||||||
|
log_info(category::audio, tr("Failed lock state mutex. Exit input recover thread."));
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(!this->running) return;
|
if(!this->running) return;
|
||||||
|
|
||||||
std::string error{};
|
std::string error{};
|
||||||
@ -131,6 +136,7 @@ bool SoundIORecord::impl_start(std::string &error) {
|
|||||||
|
|
||||||
//TODO: Test for interleaved channel layout!
|
//TODO: Test for interleaved channel layout!
|
||||||
|
|
||||||
|
this->stop_requested = false;
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
error_cleanup:
|
error_cleanup:
|
||||||
@ -140,6 +146,7 @@ bool SoundIORecord::impl_start(std::string &error) {
|
|||||||
|
|
||||||
if(this->buffer) soundio_ring_buffer_destroy(this->buffer);
|
if(this->buffer) soundio_ring_buffer_destroy(this->buffer);
|
||||||
this->buffer = nullptr;
|
this->buffer = nullptr;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,6 +154,10 @@ void SoundIORecord::impl_stop() {
|
|||||||
if(!this->stream) return;
|
if(!this->stream) return;
|
||||||
|
|
||||||
if(this->fail_recover_thread.joinable() && std::this_thread::get_id() != this->fail_recover_thread.get_id()) {
|
if(this->fail_recover_thread.joinable() && std::this_thread::get_id() != this->fail_recover_thread.get_id()) {
|
||||||
|
{
|
||||||
|
std::lock_guard flock{this->fail_cv_mutex};
|
||||||
|
this->stop_requested = true;
|
||||||
|
}
|
||||||
this->fail_cv.notify_all();
|
this->fail_cv.notify_all();
|
||||||
this->fail_recover_thread.join();
|
this->fail_recover_thread.join();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user