diff --git a/src/SelectionState.cpp b/src/SelectionState.cpp index df072e84f..7def5c947 100644 --- a/src/SelectionState.cpp +++ b/src/SelectionState.cpp @@ -97,7 +97,7 @@ void SelectionState::ChangeSelectionOnShiftClick // Our track was earlier than the first. Extend from the last. if( !pExtendFrom ) - pExtendFrom = (*trackRange.rbegin())->SharedPointer(); + pExtendFrom = Track::SharedPointer( *trackRange.rbegin() ); } SelectNone( tracks ); diff --git a/src/Track.h b/src/Track.h index f7b32816c..3302c730d 100644 --- a/src/Track.h +++ b/src/Track.h @@ -238,7 +238,6 @@ class AUDACITY_DLL_API Track /* not final */ { // shared_from_this is injected into class scope by base class // std::enable_shared_from_this - if (!this) return {}; return std::static_pointer_cast( shared_from_this() ); } @@ -250,10 +249,18 @@ class AUDACITY_DLL_API Track /* not final */ { // shared_from_this is injected into class scope by base class // std::enable_shared_from_this - if (!this) return {}; return std::static_pointer_cast( shared_from_this() ); } + // Static overloads of SharedPointer for when the pointer may be null + template + static inline std::shared_ptr SharedPointer( Track *pTrack ) + { return pTrack ? pTrack->SharedPointer() : nullptr; } + + template + static inline std::shared_ptr SharedPointer( const Track *pTrack ) + { return pTrack ? pTrack->SharedPointer() : nullptr; } + // Find anything registered with TrackList::RegisterPendingChangedTrack and // not yet cleared or applied; if no such exists, return this track std::shared_ptr SubstitutePendingChangedTrack() const; diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index c1e044bfd..0c8bcb716 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -2247,7 +2247,7 @@ void TrackPanel::SetFocusedTrack( Track *t ) // Make sure we always have the first linked track of a stereo track t = *GetTracks()->FindLeader(t); - auto cell = mAx->SetFocus( t->SharedPointer() ).get(); + auto cell = mAx->SetFocus( Track::SharedPointer( t ) ).get(); if (cell) { AudacityProject::CaptureKeyboard(this); diff --git a/src/TrackPanelAx.cpp b/src/TrackPanelAx.cpp index 545528892..fbf9cca4d 100644 --- a/src/TrackPanelAx.cpp +++ b/src/TrackPanelAx.cpp @@ -64,7 +64,7 @@ std::shared_ptr TrackPanelAx::GetFocus() } if (!focusedTrack) { focusedTrack = - (*mTrackPanel->GetTracks()->Any().first)->SharedPointer(); + Track::SharedPointer( *mTrackPanel->GetTracks()->Any().first ); // only call SetFocus if the focus has changed to avoid // unnecessary focus events if (focusedTrack) @@ -99,7 +99,7 @@ std::shared_ptr TrackPanelAx::SetFocus( std::shared_ptr track ) #endif if( !track ) - track = (*mTrackPanel->GetTracks()->Any().begin())->SharedPointer(); + track = Track::SharedPointer( *mTrackPanel->GetTracks()->Any().begin() ); mFocusedTrack = track; mNumFocusedTrack = TrackNum(track); diff --git a/src/tracks/ui/SelectHandle.cpp b/src/tracks/ui/SelectHandle.cpp index 68694b522..a4d05d9c5 100644 --- a/src/tracks/ui/SelectHandle.cpp +++ b/src/tracks/ui/SelectHandle.cpp @@ -1144,7 +1144,7 @@ void SelectHandle::AdjustSelection std::max(0.0, viewInfo.PositionToTime(mouseXCoordinate, trackLeftEdge)); double origSelend = selend; - auto pTrack = track->SharedPointer(); + auto pTrack = Track::SharedPointer( track ); if (!pTrack) pTrack = pProject->GetTracks()->Lock(mpTrack); diff --git a/src/tracks/ui/TimeShiftHandle.cpp b/src/tracks/ui/TimeShiftHandle.cpp index 64c467ab2..a123959a7 100644 --- a/src/tracks/ui/TimeShiftHandle.cpp +++ b/src/tracks/ui/TimeShiftHandle.cpp @@ -695,7 +695,7 @@ UIHandle::Result TimeShiftHandle::Drag } // May need a shared_ptr to reassign mCapturedTrack below - auto pTrack = track->SharedPointer(); + auto pTrack = Track::SharedPointer( track ); if (!pTrack) return RefreshCode::RefreshNone;