diff --git a/src/audio_core/dsp_interface.h b/src/audio_core/dsp_interface.h index 0bf011624..8bc40ff5e 100644 --- a/src/audio_core/dsp_interface.h +++ b/src/audio_core/dsp_interface.h @@ -67,7 +67,7 @@ public: virtual std::array& GetDspMemory() = 0; /// Sets the dsp class that we trigger interrupts for - virtual void SetDspToInterrupt(std::shared_ptr dsp) = 0; + virtual void SetServiceToInterrupt(std::weak_ptr dsp) = 0; /// Select the sink to use based on sink id. void SetSink(const std::string& sink_id, const std::string& audio_device); diff --git a/src/audio_core/hle/hle.cpp b/src/audio_core/hle/hle.cpp index e6fee603e..4e58e3f08 100644 --- a/src/audio_core/hle/hle.cpp +++ b/src/audio_core/hle/hle.cpp @@ -34,7 +34,7 @@ public: std::array& GetDspMemory(); - void SetDspToInterrupt(std::shared_ptr dsp); + void SetServiceToInterrupt(std::weak_ptr dsp); private: void ResetPipes(); @@ -65,7 +65,7 @@ private: DspHle& parent; CoreTiming::EventType* tick_event; - std::shared_ptr dsp_dsp; + std::weak_ptr dsp_dsp; }; DspHle::Impl::Impl(DspHle& parent_) : parent(parent_) { @@ -193,7 +193,7 @@ std::array& DspHle::Impl::GetDspMemory() { return dsp_memory.raw_memory; } -void DspHle::Impl::SetDspToInterrupt(std::shared_ptr dsp) { +void DspHle::Impl::SetServiceToInterrupt(std::weak_ptr dsp) { dsp_dsp = std::move(dsp); } @@ -241,8 +241,9 @@ void DspHle::Impl::AudioPipeWriteStructAddresses() { WriteU16(DspPipe::Audio, addr); } // Signal that we have data on this pipe. - if (dsp_dsp) - dsp_dsp->SignalInterrupt(InterruptType::Pipe, DspPipe::Audio); + if (auto service = dsp_dsp.lock()) { + service->SignalInterrupt(InterruptType::Pipe, DspPipe::Audio); + } } size_t DspHle::Impl::CurrentRegionIndex() const { @@ -318,10 +319,10 @@ bool DspHle::Impl::Tick() { void DspHle::Impl::AudioTickCallback(int cycles_late) { if (Tick()) { // TODO(merry): Signal all the other interrupts as appropriate. - if (dsp_dsp) { - dsp_dsp->SignalInterrupt(InterruptType::Pipe, DspPipe::Audio); + if (auto service = dsp_dsp.lock()) { + service->SignalInterrupt(InterruptType::Pipe, DspPipe::Audio); // HACK(merry): Added to prevent regressions. Will remove soon. - dsp_dsp->SignalInterrupt(InterruptType::Pipe, DspPipe::Binary); + service->SignalInterrupt(InterruptType::Pipe, DspPipe::Binary); } } @@ -352,8 +353,8 @@ std::array& DspHle::GetDspMemory() { return impl->GetDspMemory(); } -void DspHle::SetDspToInterrupt(std::shared_ptr dsp) { - impl->SetDspToInterrupt(std::move(dsp)); +void DspHle::SetServiceToInterrupt(std::weak_ptr dsp) { + impl->SetServiceToInterrupt(std::move(dsp)); } } // namespace AudioCore diff --git a/src/audio_core/hle/hle.h b/src/audio_core/hle/hle.h index 6189ae989..e93abf4bc 100644 --- a/src/audio_core/hle/hle.h +++ b/src/audio_core/hle/hle.h @@ -28,7 +28,7 @@ public: std::array& GetDspMemory() override; - void SetDspToInterrupt(std::shared_ptr dsp) override; + void SetServiceToInterrupt(std::weak_ptr dsp) override; private: struct Impl; diff --git a/src/core/hle/service/dsp/dsp_dsp.cpp b/src/core/hle/service/dsp/dsp_dsp.cpp index 5d9bb1774..47b352702 100644 --- a/src/core/hle/service/dsp/dsp_dsp.cpp +++ b/src/core/hle/service/dsp/dsp_dsp.cpp @@ -403,7 +403,7 @@ DSP_DSP::~DSP_DSP() { void InstallInterfaces(SM::ServiceManager& service_manager) { auto dsp = std::make_shared(); dsp->InstallAsService(service_manager); - Core::DSP().SetDspToInterrupt(std::move(dsp)); + Core::DSP().SetServiceToInterrupt(std::move(dsp)); } } // namespace DSP