audiomanager: create and delete future watchers when necessary

This commit is contained in:
itsmattkc
2020-06-26 00:21:34 +10:00
parent 7523db099b
commit c324de804c
2 changed files with 31 additions and 11 deletions
+29 -9
View File
@@ -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<QAudioDeviceInfo> >* output_watcher = new QFutureWatcher< QList<QAudioDeviceInfo> >();
connect(output_watcher, &QFutureWatcher< QList<QAudioDeviceInfo> >::finished, this, &AudioManager::OutputDevicesRefreshed);
output_watcher->setFuture(QtConcurrent::run(QAudioDeviceInfo::availableDevices, QAudio::AudioOutput));
is_refreshing_outputs_ = true;
}
if (!is_refreshing_inputs_) {
QFutureWatcher< QList<QAudioDeviceInfo> >* input_watcher = new QFutureWatcher< QList<QAudioDeviceInfo> >();
connect(input_watcher, &QFutureWatcher< QList<QAudioDeviceInfo> >::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<QAudioDeviceInfo> >::finished, this, &AudioManager::OutputDevicesRefreshed);
connect(&input_watcher_, &QFutureWatcher< QList<QAudioDeviceInfo> >::finished, this, &AudioManager::InputDevicesRefreshed);
}
AudioManager::~AudioManager()
@@ -224,7 +236,11 @@ AudioManager::~AudioManager()
void AudioManager::OutputDevicesRefreshed()
{
output_devices_ = output_watcher_.result();
QFutureWatcher< QList<QAudioDeviceInfo> >* watcher = static_cast<QFutureWatcher< QList<QAudioDeviceInfo> >*>(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<QAudioDeviceInfo> >* watcher = static_cast<QFutureWatcher< QList<QAudioDeviceInfo> >*>(sender());
input_devices_ = watcher->result();
watcher->deleteLater();
is_refreshing_inputs_ = false;
QString preferred_audio_input = Config::Current()["PreferredAudioInput"].toString();
+2 -2
View File
@@ -102,8 +102,8 @@ private:
QList<QAudioDeviceInfo> input_devices_;
QList<QAudioDeviceInfo> output_devices_;
QFutureWatcher< QList<QAudioDeviceInfo> > input_watcher_;
QFutureWatcher< QList<QAudioDeviceInfo> > output_watcher_;
bool is_refreshing_inputs_;
bool is_refreshing_outputs_;
static AudioManager* instance_;