use shared ptr for audio device

Prevents deletion before audio output has received stop signal
This commit is contained in:
itsmattkc
2021-09-25 13:29:30 -07:00
parent 845b4a7559
commit 6f3f7e558b
8 changed files with 14 additions and 13 deletions
+2 -2
View File
@@ -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<QIODevice> 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<QIODevice>, device),
Q_ARG(int, playback_speed));
}
+1 -1
View File
@@ -68,7 +68,7 @@ public:
/**
* @brief Start playing audio from AudioPlaybackCache
*/
void StartOutput(QIODevice *device, int playback_speed);
void StartOutput(std::shared_ptr<QIODevice> device, int playback_speed);
/**
* @brief Stop audio output immediately
+1 -2
View File
@@ -35,10 +35,9 @@ void AudioOutputDeviceProxy::SetParameters(const AudioParams &params)
params_ = params;
}
void AudioOutputDeviceProxy::SetDevice(QIODevice* device, int playback_speed)
void AudioOutputDeviceProxy::SetDevice(std::shared_ptr<QIODevice> device, int playback_speed)
{
device_ = device;
device_->setParent(this);
if (!device_->open(QFile::ReadOnly)) {
qCritical() << "Failed to open IO device for audio playback";
+2 -2
View File
@@ -39,7 +39,7 @@ public:
void SetParameters(const AudioParams& params);
void SetDevice(QIODevice *device, int playback_speed);
void SetDevice(std::shared_ptr<QIODevice> 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<QIODevice> device_;
TempoProcessor tempo_processor_;
+1 -1
View File
@@ -90,7 +90,7 @@ void AudioOutputManager::Close()
}
}
void AudioOutputManager::PullFromDevice(QIODevice *device, int playback_speed)
void AudioOutputManager::PullFromDevice(std::shared_ptr<QIODevice> device, int playback_speed)
{
if (!output_) {
return;
+3 -1
View File
@@ -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<QIODevice> device, int playback_speed);
// Queued
void ResetToPushMode();
@@ -86,4 +86,6 @@ private slots:
}
Q_DECLARE_METATYPE(std::shared_ptr<QIODevice>)
#endif // AUDIOHYBRIDDEVICE_H
+3 -3
View File
@@ -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<PreviewAudioDevice>();
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();
+1 -1
View File
@@ -255,7 +255,7 @@ private:
int active_queue_jobs_;
std::unique_ptr<PreviewAudioDevice> audio_playback_device_;
std::shared_ptr<PreviewAudioDevice> audio_playback_device_;
std::list<RenderTicketWatcher*> audio_playback_queue_;
rational audio_playback_queue_time_;
PackedProcessor packed_processor_;