Some updates

This commit is contained in:
WolverinDEV 2020-02-11 14:15:31 +01:00
parent 0cdd1ad2c8
commit 91982ecc7b
3 changed files with 14 additions and 2 deletions

View File

@ -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};

View File

@ -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);
}; };

View File

@ -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();
} }