From c324de804c961986ce0f5d09070f5b483c1cbd5a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 26 Jun 2020 00:21:34 +1000 Subject: [PATCH] audiomanager: create and delete future watchers when necessary --- app/audio/audiomanager.cpp | 38 +++++++++++++++++++++++++++++--------- app/audio/audiomanager.h | 4 ++-- 2 files changed, 31 insertions(+), 11 deletions(-) diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index 4a8ac8435..f5a1a866d 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -48,18 +48,31 @@ AudioManager *AudioManager::instance() void AudioManager::RefreshDevices() { - output_watcher_.setFuture(QtConcurrent::run(QAudioDeviceInfo::availableDevices, QAudio::AudioOutput)); - input_watcher_.setFuture(QtConcurrent::run(QAudioDeviceInfo::availableDevices, QAudio::AudioInput)); + if (!is_refreshing_outputs_) { + QFutureWatcher< QList >* output_watcher = new QFutureWatcher< QList >(); + connect(output_watcher, &QFutureWatcher< QList >::finished, this, &AudioManager::OutputDevicesRefreshed); + output_watcher->setFuture(QtConcurrent::run(QAudioDeviceInfo::availableDevices, QAudio::AudioOutput)); + + is_refreshing_outputs_ = true; + } + + if (!is_refreshing_inputs_) { + QFutureWatcher< QList >* input_watcher = new QFutureWatcher< QList >(); + connect(input_watcher, &QFutureWatcher< QList >::finished, this, &AudioManager::InputDevicesRefreshed); + input_watcher->setFuture(QtConcurrent::run(QAudioDeviceInfo::availableDevices, QAudio::AudioInput)); + + is_refreshing_inputs_ = true; + } } bool AudioManager::IsRefreshingOutputs() { - return output_watcher_.isRunning(); + return is_refreshing_outputs_; } bool AudioManager::IsRefreshingInputs() { - return input_watcher_.isRunning(); + return is_refreshing_inputs_; } void AudioManager::PushToOutput(const QByteArray &samples) @@ -200,6 +213,8 @@ void AudioManager::ReverseBuffer(char *buffer, int buffer_size, int sample_size) } AudioManager::AudioManager() : + is_refreshing_inputs_(false), + is_refreshing_outputs_(false), output_is_set_(false), input_(nullptr), input_file_(nullptr) @@ -210,9 +225,6 @@ AudioManager::AudioManager() : output_manager_.moveToThread(&output_thread_); connect(&output_manager_, &AudioOutputManager::OutputNotified, this, &AudioManager::OutputNotified); - - connect(&output_watcher_, &QFutureWatcher< QList >::finished, this, &AudioManager::OutputDevicesRefreshed); - connect(&input_watcher_, &QFutureWatcher< QList >::finished, this, &AudioManager::InputDevicesRefreshed); } AudioManager::~AudioManager() @@ -224,7 +236,11 @@ AudioManager::~AudioManager() void AudioManager::OutputDevicesRefreshed() { - output_devices_ = output_watcher_.result(); + QFutureWatcher< QList >* watcher = static_cast >*>(sender()); + + output_devices_ = watcher->result(); + watcher->deleteLater(); + is_refreshing_outputs_ = false; QString preferred_audio_output = Config::Current()["PreferredAudioOutput"].toString(); @@ -247,7 +263,11 @@ void AudioManager::OutputDevicesRefreshed() void AudioManager::InputDevicesRefreshed() { - input_devices_ = input_watcher_.result(); + QFutureWatcher< QList >* watcher = static_cast >*>(sender()); + + input_devices_ = watcher->result(); + watcher->deleteLater(); + is_refreshing_inputs_ = false; QString preferred_audio_input = Config::Current()["PreferredAudioInput"].toString(); diff --git a/app/audio/audiomanager.h b/app/audio/audiomanager.h index 07a5fb9a1..f0c6c7db0 100644 --- a/app/audio/audiomanager.h +++ b/app/audio/audiomanager.h @@ -102,8 +102,8 @@ private: QList input_devices_; QList output_devices_; - QFutureWatcher< QList > input_watcher_; - QFutureWatcher< QList > output_watcher_; + bool is_refreshing_inputs_; + bool is_refreshing_outputs_; static AudioManager* instance_;