audiomanager: fixed segfault if olive is closed while the devices are getting

refreshed
This commit is contained in:
itsmattkc
2020-02-23 02:20:39 +11:00
parent 1c033e53d4
commit f1f80c0a39
2 changed files with 22 additions and 13 deletions
+19 -12
View File
@@ -46,24 +46,22 @@ AudioManager *AudioManager::instance()
void AudioManager::RefreshDevices()
{
if (refreshing_devices_) {
if (refresh_thread_) {
return;
}
input_devices_.clear();
output_devices_.clear();
refreshing_devices_ = true;
// Refreshing devices can take some time, so we do it in a separate thread
QThread* thread = new QThread();
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
refresh_thread_ = new QThread(this);
connect(refresh_thread_, &QThread::finished, refresh_thread_, &QThread::deleteLater);
thread->start(QThread::IdlePriority);
refresh_thread_->start(QThread::IdlePriority);
AudioRefreshDevicesObject* refresher = new AudioRefreshDevicesObject();
connect(refresher, &AudioRefreshDevicesObject::ListsReady, this, &AudioManager::RefreshThreadDone);
refresher->moveToThread(thread);
connect(refresher, &AudioRefreshDevicesObject::ListsReady, this, &AudioManager::RefreshThreadDone, Qt::QueuedConnection);
refresher->moveToThread(refresh_thread_);
QMetaObject::invokeMethod(refresher,
"Refresh",
@@ -72,7 +70,7 @@ void AudioManager::RefreshDevices()
bool AudioManager::IsRefreshing()
{
return refreshing_devices_;
return refresh_thread_;
}
void AudioManager::PushToOutput(const QByteArray &samples)
@@ -191,7 +189,7 @@ void AudioManager::ReverseBuffer(char *buffer, int buffer_size, int sample_size)
AudioManager::AudioManager() :
input_(nullptr),
input_file_(nullptr),
refreshing_devices_(false)
refresh_thread_(nullptr)
{
RefreshDevices();
@@ -200,6 +198,14 @@ AudioManager::AudioManager() :
output_manager_.SetEnableSendingSamples(true);
}
AudioManager::~AudioManager()
{
if (refresh_thread_) {
refresh_thread_->quit();
refresh_thread_->wait();
}
}
void AudioManager::RefreshThreadDone()
{
AudioRefreshDevicesObject* refresher = static_cast<AudioRefreshDevicesObject*>(sender());
@@ -207,7 +213,7 @@ void AudioManager::RefreshThreadDone()
output_devices_ = refresher->output_devices();
input_devices_ = refresher->input_devices();
refreshing_devices_ = false;
QString preferred_audio_output = Config::Current()["PreferredAudioOutput"].toString();
@@ -242,7 +248,8 @@ void AudioManager::RefreshThreadDone()
}
// Clean up refresher object
refresher->thread()->quit();
refresh_thread_->quit();
refresh_thread_ = nullptr;
refresher->deleteLater();
emit DeviceListReady();
+3 -1
View File
@@ -105,6 +105,8 @@ signals:
private:
AudioManager();
virtual ~AudioManager() override;
QList<QAudioDeviceInfo> input_devices_;
QList<QAudioDeviceInfo> output_devices_;
@@ -120,7 +122,7 @@ private:
QAudioDeviceInfo input_device_info_;
QIODevice* input_file_;
bool refreshing_devices_;
QThread* refresh_thread_;
private slots:
void RefreshThreadDone();