1
0
mirror of https://github.com/cookiengineer/audacity synced 2026-01-10 06:37:06 +01:00

Hold safer shared_ptrs to tracks in MixerBoard

This commit is contained in:
Paul Licameli
2018-02-05 20:32:22 -05:00
parent a663fefb8c
commit 1498958562
2 changed files with 18 additions and 17 deletions

View File

@@ -165,7 +165,7 @@ END_EVENT_TABLE()
MixerTrackCluster::MixerTrackCluster(wxWindow* parent, MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
MixerBoard* grandParent, AudacityProject* project, MixerBoard* grandParent, AudacityProject* project,
PlayableTrack* pTrack, const std::shared_ptr<PlayableTrack> &pTrack,
const wxPoint& pos /*= wxDefaultPosition*/, const wxPoint& pos /*= wxDefaultPosition*/,
const wxSize& size /*= wxDefaultSize*/) const wxSize& size /*= wxDefaultSize*/)
: wxPanelWrapper(parent, -1, pos, size) : wxPanelWrapper(parent, -1, pos, size)
@@ -230,7 +230,7 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
// musical instrument image // musical instrument image
ctrlPos.x += kLeftSideStackWidth + kInset; // + kInset to center it in right side stack ctrlPos.x += kLeftSideStackWidth + kInset; // + kInset to center it in right side stack
ctrlSize.Set(MUSICAL_INSTRUMENT_HEIGHT_AND_WIDTH, MUSICAL_INSTRUMENT_HEIGHT_AND_WIDTH); ctrlSize.Set(MUSICAL_INSTRUMENT_HEIGHT_AND_WIDTH, MUSICAL_INSTRUMENT_HEIGHT_AND_WIDTH);
wxBitmap* bitmap = mMixerBoard->GetMusicalInstrumentBitmap(mTrack); wxBitmap* bitmap = mMixerBoard->GetMusicalInstrumentBitmap(mTrack.get());
wxASSERT(bitmap); wxASSERT(bitmap);
mBitmapButton_MusicalInstrument = mBitmapButton_MusicalInstrument =
safenew wxBitmapButton(this, ID_BITMAPBUTTON_MUSICAL_INSTRUMENT, *bitmap, safenew wxBitmapButton(this, ID_BITMAPBUTTON_MUSICAL_INSTRUMENT, *bitmap,
@@ -329,7 +329,7 @@ MixerTrackCluster::MixerTrackCluster(wxWindow* parent,
WaveTrack *MixerTrackCluster::GetWave() const WaveTrack *MixerTrackCluster::GetWave() const
{ {
return dynamic_cast< WaveTrack * >( mTrack ); return dynamic_cast< WaveTrack * >( mTrack.get() );
} }
WaveTrack *MixerTrackCluster::GetRight() const WaveTrack *MixerTrackCluster::GetRight() const
@@ -344,7 +344,7 @@ WaveTrack *MixerTrackCluster::GetRight() const
#ifdef EXPERIMENTAL_MIDI_OUT #ifdef EXPERIMENTAL_MIDI_OUT
NoteTrack *MixerTrackCluster::GetNote() const NoteTrack *MixerTrackCluster::GetNote() const
{ {
return dynamic_cast< NoteTrack * >( mTrack ); return dynamic_cast< NoteTrack * >( mTrack.get() );
} }
#endif #endif
@@ -405,7 +405,7 @@ void MixerTrackCluster::HandleSliderGain(const bool bWantPushState /*= false*/)
GetRight()->SetGain(fValue); GetRight()->SetGain(fValue);
// Update the TrackPanel correspondingly. // Update the TrackPanel correspondingly.
mProject->RefreshTPTrack(mTrack); mProject->RefreshTPTrack(mTrack.get());
if (bWantPushState) if (bWantPushState)
mProject->TP_PushState(_("Moved gain slider"), _("Gain"), UndoPush::CONSOLIDATE ); mProject->TP_PushState(_("Moved gain slider"), _("Gain"), UndoPush::CONSOLIDATE );
} }
@@ -418,7 +418,7 @@ void MixerTrackCluster::HandleSliderVelocity(const bool bWantPushState /*= false
GetNote()->SetVelocity(fValue); GetNote()->SetVelocity(fValue);
// Update the TrackPanel correspondingly. // Update the TrackPanel correspondingly.
mProject->RefreshTPTrack(mTrack); mProject->RefreshTPTrack(mTrack.get());
if (bWantPushState) if (bWantPushState)
mProject->TP_PushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE); mProject->TP_PushState(_("Moved velocity slider"), _("Velocity"), UndoPush::CONSOLIDATE);
} }
@@ -433,7 +433,7 @@ void MixerTrackCluster::HandleSliderPan(const bool bWantPushState /*= false*/)
GetRight()->SetPan(fValue); GetRight()->SetPan(fValue);
// Update the TrackPanel correspondingly. // Update the TrackPanel correspondingly.
mProject->RefreshTPTrack(mTrack); mProject->RefreshTPTrack(mTrack.get());
if (bWantPushState) if (bWantPushState)
mProject->TP_PushState(_("Moved pan slider"), _("Pan"), UndoPush::CONSOLIDATE ); mProject->TP_PushState(_("Moved pan slider"), _("Pan"), UndoPush::CONSOLIDATE );
@@ -465,7 +465,7 @@ void MixerTrackCluster::UpdateName()
mStaticText_TrackName->SetToolTip(newName); mStaticText_TrackName->SetToolTip(newName);
#endif #endif
mBitmapButton_MusicalInstrument->SetBitmapLabel( mBitmapButton_MusicalInstrument->SetBitmapLabel(
*(mMixerBoard->GetMusicalInstrumentBitmap(mTrack))); *(mMixerBoard->GetMusicalInstrumentBitmap(mTrack.get())));
} }
void MixerTrackCluster::UpdateMute() void MixerTrackCluster::UpdateMute()
@@ -683,7 +683,7 @@ wxColour MixerTrackCluster::GetTrackColor()
void MixerTrackCluster::HandleSelect(bool bShiftDown, bool bControlDown) void MixerTrackCluster::HandleSelect(bool bShiftDown, bool bControlDown)
{ {
mProject->HandleListSelection( mTrack, bShiftDown, bControlDown, true mProject->HandleListSelection( mTrack.get(), bShiftDown, bControlDown, true
); );
} }
@@ -758,7 +758,7 @@ void MixerTrackCluster::OnSlider_Pan(wxCommandEvent& WXUNUSED(event))
void MixerTrackCluster::OnButton_Mute(wxCommandEvent& WXUNUSED(event)) void MixerTrackCluster::OnButton_Mute(wxCommandEvent& WXUNUSED(event))
{ {
mProject->HandleTrackMute(mTrack, mToggleButton_Mute->WasShiftDown()); mProject->HandleTrackMute(mTrack.get(), mToggleButton_Mute->WasShiftDown());
mToggleButton_Mute->SetAlternateIdx(mTrack->GetSolo() ? 1 : 0); mToggleButton_Mute->SetAlternateIdx(mTrack->GetSolo() ? 1 : 0);
// Update the TrackPanel correspondingly. // Update the TrackPanel correspondingly.
@@ -770,12 +770,12 @@ void MixerTrackCluster::OnButton_Mute(wxCommandEvent& WXUNUSED(event))
} }
else else
// Update only the changed track. // Update only the changed track.
mProject->RefreshTPTrack(mTrack); mProject->RefreshTPTrack(mTrack.get());
} }
void MixerTrackCluster::OnButton_Solo(wxCommandEvent& WXUNUSED(event)) void MixerTrackCluster::OnButton_Solo(wxCommandEvent& WXUNUSED(event))
{ {
mProject->HandleTrackSolo(mTrack, mToggleButton_Solo->WasShiftDown()); mProject->HandleTrackSolo(mTrack.get(), mToggleButton_Solo->WasShiftDown());
bool bIsSolo = mTrack->GetSolo(); bool bIsSolo = mTrack->GetSolo();
mToggleButton_Mute->SetAlternateIdx(bIsSolo ? 1 : 0); mToggleButton_Mute->SetAlternateIdx(bIsSolo ? 1 : 0);
@@ -996,13 +996,14 @@ void MixerBoard::UpdateTrackClusters()
while (pTrack) { while (pTrack) {
if (auto pPlayableTrack = dynamic_cast<PlayableTrack*>(pTrack)) if (auto pPlayableTrack = dynamic_cast<PlayableTrack*>(pTrack))
{ {
auto spTrack = Track::Pointer<PlayableTrack>( pPlayableTrack );
if (nClusterIndex < nClusterCount) if (nClusterIndex < nClusterCount)
{ {
// Already showing it. // Already showing it.
// Track clusters are maintained in the same order as the WaveTracks. // Track clusters are maintained in the same order as the WaveTracks.
// Track pointers can change for the "same" track for different states // Track pointers can change for the "same" track for different states
// on the undo stack, so update the pointers and display name. // on the undo stack, so update the pointers and display name.
mMixerTrackClusters[nClusterIndex]->mTrack = pPlayableTrack; mMixerTrackClusters[nClusterIndex]->mTrack = spTrack;
// Assume linked track is wave or null // Assume linked track is wave or null
mMixerTrackClusters[nClusterIndex]->UpdateForStateChange(); mMixerTrackClusters[nClusterIndex]->UpdateForStateChange();
} }
@@ -1018,7 +1019,7 @@ void MixerBoard::UpdateTrackClusters()
wxSize clusterSize(kMixerTrackClusterWidth, nClusterHeight); wxSize clusterSize(kMixerTrackClusterWidth, nClusterHeight);
pMixerTrackCluster = pMixerTrackCluster =
safenew MixerTrackCluster(mScrolledWindow, this, mProject, safenew MixerTrackCluster(mScrolledWindow, this, mProject,
pPlayableTrack, spTrack,
clusterPos, clusterSize); clusterPos, clusterSize);
if (pMixerTrackCluster) if (pMixerTrackCluster)
mMixerTrackClusters.Add(pMixerTrackCluster); mMixerTrackClusters.Add(pMixerTrackCluster);
@@ -1404,7 +1405,7 @@ int MixerBoard::FindMixerTrackCluster(const PlayableTrack* pTrack,
*hMixerTrackCluster = NULL; *hMixerTrackCluster = NULL;
for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++) for (unsigned int i = 0; i < mMixerTrackClusters.GetCount(); i++)
{ {
if (mMixerTrackClusters[i]->mTrack == pTrack) if (mMixerTrackClusters[i]->mTrack.get() == pTrack)
{ {
*hMixerTrackCluster = mMixerTrackClusters[i]; *hMixerTrackCluster = mMixerTrackClusters[i];
return i; return i;

View File

@@ -77,7 +77,7 @@ class MixerTrackCluster final : public wxPanelWrapper
public: public:
MixerTrackCluster(wxWindow* parent, MixerTrackCluster(wxWindow* parent,
MixerBoard* grandParent, AudacityProject* project, MixerBoard* grandParent, AudacityProject* project,
PlayableTrack* pTrack, const std::shared_ptr<PlayableTrack> &pTrack,
const wxPoint& pos = wxDefaultPosition, const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize); const wxSize& size = wxDefaultSize);
virtual ~MixerTrackCluster() {} virtual ~MixerTrackCluster() {}
@@ -134,7 +134,7 @@ private:
public: public:
PlayableTrack * mTrack; std::shared_ptr<PlayableTrack> mTrack;
private: private:
MixerBoard* mMixerBoard; MixerBoard* mMixerBoard;