From 453f3700ab487b4b65b09e9e4dc82feeccaf21b5 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 12 Oct 2020 12:23:20 +1100 Subject: [PATCH] ensure AudioOutputManager is deleted in its own thread Fixes #1265 --- app/audio/audiomanager.cpp | 19 ++++++++++--------- app/audio/audiomanager.h | 2 +- app/audio/outputmanager.cpp | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index 1540ab678..a0afa7cce 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -77,7 +77,7 @@ bool AudioManager::IsRefreshingInputs() void AudioManager::PushToOutput(const QByteArray &samples) { - output_manager_.Push(samples); + output_manager_->Push(samples); emit OutputPushed(samples); } @@ -88,10 +88,10 @@ void AudioManager::StartOutput(AudioPlaybackCache *cache, qint64 offset, int pla QIODevice* device = cache->CreatePlaybackDevice(); // Move to output manager's thread - device->moveToThread(output_manager_.thread()); + device->moveToThread(&output_thread_); // Queue to output manger in other thread - QMetaObject::invokeMethod(&output_manager_, + QMetaObject::invokeMethod(output_manager_, "PullFromDevice", Qt::QueuedConnection, Q_ARG(QIODevice*, device), @@ -103,7 +103,7 @@ void AudioManager::StartOutput(AudioPlaybackCache *cache, qint64 offset, int pla void AudioManager::StopOutput() { - QMetaObject::invokeMethod(&output_manager_, + QMetaObject::invokeMethod(output_manager_, "ResetToPushMode", Qt::QueuedConnection); @@ -156,7 +156,7 @@ void AudioManager::SetOutputDevice(const QAudioDeviceInfo &info) } if (info.isFormatSupported(format)) { - QMetaObject::invokeMethod(&output_manager_, + QMetaObject::invokeMethod(output_manager_, "SetOutputDevice", Qt::QueuedConnection, Q_ARG(const QAudioDeviceInfo&, info), @@ -173,7 +173,7 @@ void AudioManager::SetOutputParams(const AudioParams ¶ms) if (output_params_ != params) { output_params_ = params; - QMetaObject::invokeMethod(&output_manager_, + QMetaObject::invokeMethod(output_manager_, "SetParameters", Qt::QueuedConnection, OLIVE_NS_ARG(AudioParams, params)); @@ -229,14 +229,15 @@ AudioManager::AudioManager() : RefreshDevices(); output_thread_.start(QThread::TimeCriticalPriority); - output_manager_.moveToThread(&output_thread_); + output_manager_ = new AudioOutputManager(); + output_manager_->moveToThread(&output_thread_); - connect(&output_manager_, &AudioOutputManager::OutputNotified, this, &AudioManager::OutputNotified); + connect(output_manager_, &AudioOutputManager::OutputNotified, this, &AudioManager::OutputNotified); } AudioManager::~AudioManager() { - QMetaObject::invokeMethod(&output_manager_, "Close", Qt::QueuedConnection); + QMetaObject::invokeMethod(output_manager_, "deleteLater", Qt::BlockingQueuedConnection); output_thread_.quit(); output_thread_.wait(); } diff --git a/app/audio/audiomanager.h b/app/audio/audiomanager.h index ea1aa4aa5..d351e6852 100644 --- a/app/audio/audiomanager.h +++ b/app/audio/audiomanager.h @@ -107,7 +107,7 @@ private: static AudioManager* instance_; QThread output_thread_; - AudioOutputManager output_manager_; + AudioOutputManager* output_manager_; bool output_is_set_; QAudioDeviceInfo output_device_info_; diff --git a/app/audio/outputmanager.cpp b/app/audio/outputmanager.cpp index d4bd297cc..8c4a059fc 100644 --- a/app/audio/outputmanager.cpp +++ b/app/audio/outputmanager.cpp @@ -83,7 +83,7 @@ void AudioOutputManager::Close() device_proxy_.close(); } - output_->deleteLater(); + delete output_; output_ = nullptr; } }