diff --git a/src/openrct2/audio/Audio.cpp b/src/openrct2/audio/Audio.cpp index 9505c952ab..5badeb3ba9 100644 --- a/src/openrct2/audio/Audio.cpp +++ b/src/openrct2/audio/Audio.cpp @@ -159,8 +159,9 @@ namespace OpenRCT2::Audio uint8_t rotation = GetCurrentRotation(); auto pos2 = Translate3DTo2DWithZ(rotation, location); - Viewport* viewport = nullptr; - while ((viewport = WindowGetPreviousViewport(viewport)) != nullptr) + // Get all active viewports + auto viewports = WindowGetActiveViewports(); + for (auto* viewport : viewports) { if (viewport->flags & VIEWPORT_FLAG_SOUND_ON) { diff --git a/src/openrct2/interface/Window.cpp b/src/openrct2/interface/Window.cpp index e5892c29d2..68294e908c 100644 --- a/src/openrct2/interface/Window.cpp +++ b/src/openrct2/interface/Window.cpp @@ -916,6 +916,18 @@ static constexpr float kWindowScrollLocations[][2] = { }); } + std::vector WindowGetActiveViewports() + { + std::vector viewports; + WindowVisitEach([&viewports](WindowBase* w) { + if (w->viewport != nullptr && !(w->flags & WF_DEAD)) + { + viewports.push_back(w->viewport); + } + }); + return viewports; + } + Viewport* WindowGetPreviousViewport(Viewport* current) { bool foundPrevious = (current == nullptr); diff --git a/src/openrct2/interface/Window.h b/src/openrct2/interface/Window.h index 57ecd6b433..8e3bce33f6 100644 --- a/src/openrct2/interface/Window.h +++ b/src/openrct2/interface/Window.h @@ -333,6 +333,7 @@ namespace OpenRCT2 void TextinputCancel(); + std::vector WindowGetActiveViewports(); Viewport* WindowGetPreviousViewport(Viewport* current); void WindowInitAll();