From fb1ed58d37ada60f4f3b4071d3117c9317ca47a4 Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Tue, 16 Nov 2021 09:38:40 -0600 Subject: [PATCH] Experiment with removing the static MediaPlayer Somehow, this also causes an exception on teardown north of `Windows.Media.MediaControl.dll!AudioStateMonitorImpl::remove_SoundLevelChanged()`, which is in OS code somewhere. Not sure there's anything we can actually do about this. There are piles of bugs on that function in the OS repo. I think we're going to have to just end up avoiding this entirely. --- src/cascadia/TerminalApp/Pane.cpp | 32 +++++++++++------------ src/cascadia/TerminalApp/Pane.h | 2 +- src/cascadia/TerminalApp/TerminalPage.cpp | 6 +++++ src/cascadia/TerminalApp/TerminalPage.h | 2 ++ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/cascadia/TerminalApp/Pane.cpp b/src/cascadia/TerminalApp/Pane.cpp index 484f70c17..427e1184f 100644 --- a/src/cascadia/TerminalApp/Pane.cpp +++ b/src/cascadia/TerminalApp/Pane.cpp @@ -33,7 +33,7 @@ static const Duration AnimationDuration = DurationHelper::FromTimeSpan(winrt::Wi winrt::Windows::UI::Xaml::Media::SolidColorBrush Pane::s_focusedBorderBrush = { nullptr }; winrt::Windows::UI::Xaml::Media::SolidColorBrush Pane::s_unfocusedBorderBrush = { nullptr }; -winrt::Windows::Media::Playback::MediaPlayer Pane::s_bellPlayer = { nullptr }; +// winrt::Windows::Media::Playback::MediaPlayer Pane::s_bellPlayer = { nullptr }; Pane::Pane(const Profile& profile, const TermControl& control, const bool lastFocused) : _control{ control }, @@ -71,14 +71,14 @@ Pane::Pane(const Profile& profile, const TermControl& control, const bool lastFo e.Handled(true); }); - if (!s_bellPlayer) - { - try - { - s_bellPlayer = winrt::Windows::Media::Playback::MediaPlayer(); - } - CATCH_LOG(); - } + // if (!s_bellPlayer) + // { + // try + // { + // s_bellPlayer = winrt::Windows::Media::Playback::MediaPlayer(); + // } + // CATCH_LOG(); + // } } Pane::Pane(std::shared_ptr first, @@ -1125,13 +1125,13 @@ winrt::fire_and_forget Pane::_playBellSound(winrt::Windows::Foundation::Uri uri) co_await winrt::resume_foreground(_root.Dispatcher()); if (auto pane{ weakThis.get() }) { - if (s_bellPlayer) - { - auto source{ winrt::Windows::Media::Core::MediaSource::CreateFromUri(uri) }; - auto item{ winrt::Windows::Media::Playback::MediaPlaybackItem(source) }; - s_bellPlayer.Source(item); - s_bellPlayer.Play(); - } + // if (s_bellPlayer) + // { + // auto source{ winrt::Windows::Media::Core::MediaSource::CreateFromUri(uri) }; + // auto item{ winrt::Windows::Media::Playback::MediaPlaybackItem(source) }; + // s_bellPlayer.Source(item); + // s_bellPlayer.Play(); + // } } } diff --git a/src/cascadia/TerminalApp/Pane.h b/src/cascadia/TerminalApp/Pane.h index 3e935d31d..f3537cb72 100644 --- a/src/cascadia/TerminalApp/Pane.h +++ b/src/cascadia/TerminalApp/Pane.h @@ -229,7 +229,7 @@ private: bool _zoomed{ false }; - static winrt::Windows::Media::Playback::MediaPlayer s_bellPlayer; + // static winrt::Windows::Media::Playback::MediaPlayer s_bellPlayer; bool _IsLeaf() const noexcept; bool _HasFocusedChild() const noexcept; diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 81e2bc517..e1d5b8d35 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -56,6 +56,12 @@ namespace winrt::TerminalApp::implementation _hostingHwnd{} { InitializeComponent(); + + try + { + _bellPlayer = winrt::Windows::Media::Playback::MediaPlayer(); + } + CATCH_LOG(); } // Method Description: diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index cf9477d2e..8b818dd66 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -201,6 +201,8 @@ namespace winrt::TerminalApp::implementation std::shared_ptr _windowIdToast{ nullptr }; std::shared_ptr _windowRenameFailedToast{ nullptr }; + winrt::Windows::Media::Playback::MediaPlayer _bellPlayer{ nullptr }; + void _ShowAboutDialog(); winrt::Windows::Foundation::IAsyncOperation _ShowQuitDialog(); winrt::Windows::Foundation::IAsyncOperation _ShowCloseWarningDialog();