From 6f3f7e558b84dd2981f113a6540249349a3e777d Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Sat, 25 Sep 2021 13:29:30 -0700 Subject: [PATCH] use shared ptr for audio device Prevents deletion before audio output has received stop signal --- app/audio/audiomanager.cpp | 4 ++-- app/audio/audiomanager.h | 2 +- app/audio/outputdeviceproxy.cpp | 3 +-- app/audio/outputdeviceproxy.h | 4 ++-- app/audio/outputmanager.cpp | 2 +- app/audio/outputmanager.h | 4 +++- app/widget/viewer/viewer.cpp | 6 +++--- app/widget/viewer/viewer.h | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/app/audio/audiomanager.cpp b/app/audio/audiomanager.cpp index 382b6dd8d..7484b7cb3 100644 --- a/app/audio/audiomanager.cpp +++ b/app/audio/audiomanager.cpp @@ -94,7 +94,7 @@ void AudioManager::PushToOutput(const QByteArray &samples) emit OutputPushed(samples); } -void AudioManager::StartOutput(QIODevice *device, int playback_speed) +void AudioManager::StartOutput(std::shared_ptr device, int playback_speed) { // Move to output manager's thread device->moveToThread(&output_thread_); @@ -103,7 +103,7 @@ void AudioManager::StartOutput(QIODevice *device, int playback_speed) QMetaObject::invokeMethod(output_manager_, "PullFromDevice", Qt::QueuedConnection, - Q_ARG(QIODevice*, device), + Q_ARG(std::shared_ptr, device), Q_ARG(int, playback_speed)); } diff --git a/app/audio/audiomanager.h b/app/audio/audiomanager.h index 43c4edc29..fee7ef462 100644 --- a/app/audio/audiomanager.h +++ b/app/audio/audiomanager.h @@ -68,7 +68,7 @@ public: /** * @brief Start playing audio from AudioPlaybackCache */ - void StartOutput(QIODevice *device, int playback_speed); + void StartOutput(std::shared_ptr device, int playback_speed); /** * @brief Stop audio output immediately diff --git a/app/audio/outputdeviceproxy.cpp b/app/audio/outputdeviceproxy.cpp index 712b3f556..c6087a064 100644 --- a/app/audio/outputdeviceproxy.cpp +++ b/app/audio/outputdeviceproxy.cpp @@ -35,10 +35,9 @@ void AudioOutputDeviceProxy::SetParameters(const AudioParams ¶ms) params_ = params; } -void AudioOutputDeviceProxy::SetDevice(QIODevice* device, int playback_speed) +void AudioOutputDeviceProxy::SetDevice(std::shared_ptr device, int playback_speed) { device_ = device; - device_->setParent(this); if (!device_->open(QFile::ReadOnly)) { qCritical() << "Failed to open IO device for audio playback"; diff --git a/app/audio/outputdeviceproxy.h b/app/audio/outputdeviceproxy.h index 453d1b94c..58587ea2f 100644 --- a/app/audio/outputdeviceproxy.h +++ b/app/audio/outputdeviceproxy.h @@ -39,7 +39,7 @@ public: void SetParameters(const AudioParams& params); - void SetDevice(QIODevice *device, int playback_speed); + void SetDevice(std::shared_ptr device, int playback_speed); virtual void close() override; @@ -51,7 +51,7 @@ protected: private: qint64 ReverseAwareRead(char* data, qint64 maxlen); - QIODevice* device_; + std::shared_ptr device_; TempoProcessor tempo_processor_; diff --git a/app/audio/outputmanager.cpp b/app/audio/outputmanager.cpp index 3e032075e..9986772f8 100644 --- a/app/audio/outputmanager.cpp +++ b/app/audio/outputmanager.cpp @@ -90,7 +90,7 @@ void AudioOutputManager::Close() } } -void AudioOutputManager::PullFromDevice(QIODevice *device, int playback_speed) +void AudioOutputManager::PullFromDevice(std::shared_ptr device, int playback_speed) { if (!output_) { return; diff --git a/app/audio/outputmanager.h b/app/audio/outputmanager.h index 990303bd3..9f65dc544 100644 --- a/app/audio/outputmanager.h +++ b/app/audio/outputmanager.h @@ -53,7 +53,7 @@ public slots: * This will clear any pushed samples or QIODevices currently being read and will start reading from this next time * the audio output requests data. */ - void PullFromDevice(QIODevice* device, int playback_speed); + void PullFromDevice(std::shared_ptr device, int playback_speed); // Queued void ResetToPushMode(); @@ -86,4 +86,6 @@ private slots: } +Q_DECLARE_METATYPE(std::shared_ptr) + #endif // AUDIOHYBRIDDEVICE_H diff --git a/app/widget/viewer/viewer.cpp b/app/widget/viewer/viewer.cpp index 29036f9ea..b0b6603ba 100644 --- a/app/widget/viewer/viewer.cpp +++ b/app/widget/viewer/viewer.cpp @@ -405,7 +405,7 @@ void ViewerWidget::StartAudioOutput() if (params.is_valid()) { AudioManager::instance()->SetOutputParams(params); - AudioManager::instance()->StartOutput(audio_playback_device_.get(), playback_speed_); + AudioManager::instance()->StartOutput(audio_playback_device_, playback_speed_); qDebug() << "STUB: Nothing to send to audio monitor"; /*emit AudioManager::instance()->OutputWaveformStarted(&audio_cache->visual(), @@ -606,7 +606,7 @@ void ViewerWidget::PlayInternal(int speed, bool in_to_out_only) } } - audio_playback_device_.reset(new PreviewAudioDevice()); + audio_playback_device_ = std::make_shared(); prequeuing_audio_ = true; audio_playback_queue_time_ = GetTime(); QueueNextAudioBuffer(); @@ -628,7 +628,7 @@ void ViewerWidget::PauseInternal() playback_queue_.clear(); playback_backup_timer_.stop(); - audio_playback_device_.reset(nullptr); + audio_playback_device_ = nullptr; qDeleteAll(audio_playback_queue_); audio_playback_queue_.clear(); packed_processor_.Close(); diff --git a/app/widget/viewer/viewer.h b/app/widget/viewer/viewer.h index 7844bb555..cca17f9d6 100644 --- a/app/widget/viewer/viewer.h +++ b/app/widget/viewer/viewer.h @@ -255,7 +255,7 @@ private: int active_queue_jobs_; - std::unique_ptr audio_playback_device_; + std::shared_ptr audio_playback_device_; std::list audio_playback_queue_; rational audio_playback_queue_time_; PackedProcessor packed_processor_;