1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-09-17 16:50:26 +02:00

static TrackFactory::Get()...

... not member functions of AudacityProject
This commit is contained in:
Paul Licameli 2019-01-22 10:59:44 -05:00
parent 4ba4d0978b
commit 116ff70756
18 changed files with 99 additions and 73 deletions

View File

@ -103,7 +103,7 @@ int LabelTrack::mFontHeight=-1;
static ProjectFileIORegistry::Entry registerFactory{
wxT( "labeltrack" ),
[]( AudacityProject &project ){
auto &trackFactory = *project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto &tracks = TrackList::Get( project );
return tracks.Add(trackFactory.NewLabelTrack());
}
@ -3088,11 +3088,11 @@ void LabelTrack::DoEditLabels
auto format = project.GetSelectionFormat(),
freqFormat = project.GetFrequencySelectionFormatName();
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto rate = project.GetRate();
auto &viewInfo = ViewInfo::Get( project );
LabelDialog dlg(&project, *trackFactory, &tracks,
LabelDialog dlg(&project, trackFactory, &tracks,
lt, index,
viewInfo, rate,
format, freqFormat);

View File

@ -33,7 +33,6 @@
#include "AColor.h"
#include "DirManager.h"
#include "Prefs.h"
#include "Project.h"
#include "ProjectFileIORegistry.h"
#include "InconsistencyException.h"
@ -107,7 +106,7 @@ SONFNS(AutoSave)
static ProjectFileIORegistry::Entry registerFactory{
wxT( "notetrack" ),
[]( AudacityProject &project ){
auto &trackFactory = *project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto &tracks = TrackList::Get( project );
return tracks.Add(trackFactory.NewNoteTrack());
}

View File

@ -1352,10 +1352,6 @@ AudacityProject::AudacityProject(wxWindow * parent, wxWindowID id,
#endif
mIconized = false;
auto &dirManager = DirManager::Get( project );
mTrackFactory.reset(
safenew TrackFactory{ dirManager.shared_from_this(), &viewInfo });
int widths[] = {0, GetControlToolBar()->WidthForStatusBar(mStatusBar), -1, 150};
mStatusBar->SetStatusWidths(4, widths);
wxString msg = wxString::Format(_("Welcome to Audacity version %s"),
@ -1496,11 +1492,6 @@ void AudacityProject::OnThemeChange(wxCommandEvent& evt)
GetRulerPanel()->ReCreateButtons();
}
TrackFactory *AudacityProject::GetTrackFactory()
{
return mTrackFactory.get();
}
AdornedRulerPanel *AudacityProject::GetRulerPanel()
{
return mRuler;
@ -2664,7 +2655,7 @@ void AudacityProject::OnCloseWindow(wxCloseEvent & event)
DestroyChildren();
mTrackFactory.reset();
TrackFactory::Destroy( project );
mTags.reset();
@ -4107,6 +4098,7 @@ bool AudacityProject::SaveCopyWaveTracks(const FilePath & strProjectPathName,
{
auto &project = *this;
auto &tracks = TrackList::Get( project );
auto &trackFactory = TrackFactory::Get( project );
wxString extension, fileFormat;
#ifdef USE_LIBVORBIS
@ -4134,7 +4126,7 @@ bool AudacityProject::SaveCopyWaveTracks(const FilePath & strProjectPathName,
for (auto pWaveTrack : trackRange)
{
numWaveTracks++;
pSavedTrackList.Add(mTrackFactory->DuplicateWaveTrack(*pWaveTrack));
pSavedTrackList.Add( trackFactory.DuplicateWaveTrack( *pWaveTrack ) );
}
auto cleanup = finally( [&] {
// Restore the saved track states and clean up.
@ -4343,7 +4335,7 @@ bool AudacityProject::Import(const FilePath &fileName, WaveTrackArray* pTrackArr
mTags ? mTags->Duplicate() : decltype(mTags){} );
bool success = Importer::Get().Import(fileName,
GetTrackFactory(),
&TrackFactory::Get( project ),
newTracks,
mTags.get(),
errorMessage);
@ -5246,7 +5238,7 @@ void AudacityProject::OnAudioIOStopRecording()
auto &intervals = gAudioIO->LostCaptureIntervals();
if (intervals.size()) {
// Make a track with labels for recording errors
auto uTrack = GetTrackFactory()->NewLabelTrack();
auto uTrack = TrackFactory::Get( project ).NewLabelTrack();
auto pTrack = uTrack.get();
tracks.Add( uTrack );
/* i18n-hint: A name given to a track, appearing as its menu button.
@ -5363,9 +5355,8 @@ void AudacityProject::ResetProjectToEmpty() {
TrackActions::DoRemoveTracks( project );
// A new DirManager.
auto &dirManager = DirManager::Reset( project );
mTrackFactory.reset(
safenew TrackFactory{ dirManager.shared_from_this(), &viewInfo });
DirManager::Reset( project );
TrackFactory::Reset( project );
projectFileIO.ResetProjectFileIO();

View File

@ -208,7 +208,6 @@ class AUDACITY_DLL_API AudacityProject final : public wxFrame,
void SetPlayRegionLocked(bool value) { mLockPlayRegion = value; }
wxString GetProjectName() const;
TrackFactory *GetTrackFactory();
AdornedRulerPanel *GetRulerPanel();
Tags *GetTags();
const Tags *GetTags() const;
@ -569,7 +568,6 @@ private:
wxPanel *mTopPanel{};
TrackPanel *mTrackPanel{};
SelectionState mSelectionState{};
std::unique_ptr<TrackFactory> mTrackFactory;
wxWindow * mMainPage;
wxPanel * mMainPanel;
wxScrollBar *mHsbar;

View File

@ -44,7 +44,7 @@ std::shared_ptr<TimeTrack> TrackFactory::NewTimeTrack()
static ProjectFileIORegistry::Entry registerFactory{
wxT( "timetrack" ),
[]( AudacityProject &project ){
auto &trackFactory = *project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto &tracks = TrackList::Get( project );
return tracks.Add(trackFactory.NewTimeTrack());
}

View File

@ -1406,3 +1406,37 @@ TransportTracks GetAllPlaybackTracks(TrackList &trackList, bool selectedOnly, bo
#endif
return result;
}
#include "ViewInfo.h"
static auto TrackFactoryFactory = []( AudacityProject &project ) {
auto &dirManager = DirManager::Get( project );
auto &viewInfo = ViewInfo::Get( project );
return std::make_shared< TrackFactory >(
dirManager.shared_from_this(), &viewInfo );
};
static const AudacityProject::AttachedObjects::RegisteredFactory key2{
TrackFactoryFactory
};
TrackFactory &TrackFactory::Get( AudacityProject &project )
{
return project.AttachedObjects::Get< TrackFactory >( key2 );
}
const TrackFactory &TrackFactory::Get( const AudacityProject &project )
{
return Get( const_cast< AudacityProject & >( project ) );
}
TrackFactory &TrackFactory::Reset( AudacityProject &project )
{
auto result = TrackFactoryFactory( project );
project.AttachedObjects::Assign( key2, result );
return *result;
}
void TrackFactory::Destroy( AudacityProject &project )
{
project.AttachedObjects::Assign( key2, nullptr );
}

View File

@ -1620,15 +1620,22 @@ private:
std::vector< Updater > mUpdaters;
};
class AUDACITY_DLL_API TrackFactory
class AUDACITY_DLL_API TrackFactory final
: public ClientData::Base
{
private:
public:
static TrackFactory &Get( AudacityProject &project );
static const TrackFactory &Get( const AudacityProject &project );
static TrackFactory &Reset( AudacityProject &project );
static void Destroy( AudacityProject &project );
TrackFactory(const std::shared_ptr<DirManager> &dirManager, const ZoomInfo *zoomInfo):
mDirManager(dirManager)
, mZoomInfo(zoomInfo)
{
}
private:
const std::shared_ptr<DirManager> mDirManager;
const ZoomInfo *const mZoomInfo;
friend class AudacityProject;

View File

@ -73,7 +73,7 @@ using std::max;
static ProjectFileIORegistry::Entry registerFactory{
wxT( "wavetrack" ),
[]( AudacityProject &project ){
auto &trackFactory = *project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto &tracks = TrackList::Get( project );
return tracks.Add(trackFactory.NewWaveTrack());
}
@ -1204,10 +1204,8 @@ void WaveTrack::SyncLockAdjust(double oldT1, double newT1)
AudacityProject *p = GetActiveProject();
if (!p)
THROW_INCONSISTENCY_EXCEPTION;
TrackFactory *f = p->GetTrackFactory();
if (!f)
THROW_INCONSISTENCY_EXCEPTION;
auto tmp = f->NewWaveTrack(GetSampleFormat(), GetRate());
auto &factory = TrackFactory::Get( *p );
auto tmp = factory.NewWaveTrack( GetSampleFormat(), GetRate() );
tmp->InsertSilence(0.0, newT1 - oldT1);
tmp->Flush();

View File

@ -1092,7 +1092,7 @@ bool EffectEqualization::ProcessOne(int count, WaveTrack * t,
{
// create a NEW WaveTrack to hold all of the output, including 'tails' each end
AudacityProject *p = GetActiveProject();
auto output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate());
auto output = TrackFactory::Get( *p ).NewWaveTrack(floatSample, t->GetRate());
wxASSERT(mM - 1 < windowSize);
size_t L = windowSize - (mM - 1); //Process L samples at a go

View File

@ -411,7 +411,7 @@ bool EffectEqualization48x::DeltaTrack(
Floats buffer2{ trackBlockSize };
AudacityProject *p = GetActiveProject();
auto output=p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate());
auto output = TrackFactory::Get( *p ).NewWaveTrack(floatSample, t->GetRate());
auto originalLen = len;
auto currentSample = start;
@ -628,7 +628,7 @@ bool EffectEqualization48x::ProcessOne1x(int count, WaveTrack * t,
auto trackBlockSize = t->GetMaxBlockSize();
AudacityProject *p = GetActiveProject();
auto output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate());
auto output = TrackFactory::Get( *p ).NewWaveTrack(floatSample, t->GetRate());
mEffectEqualization->TrackProgress(count, 0.0);
int subBufferSize=mBufferCount==8?(mSubBufferSize>>1):mSubBufferSize; // half the buffers if avx is active
@ -815,7 +815,7 @@ bool EffectEqualization48x::ProcessOne4x(int count, WaveTrack * t,
auto trackBlockSize = t->GetMaxBlockSize();
AudacityProject *p = GetActiveProject();
auto output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate());
auto output = TrackFactory::Get( *p ).NewWaveTrack(floatSample, t->GetRate());
mEffectEqualization->TrackProgress(count, 0.0);
auto bigRuns = len/(subBufferSize-mBlockSize);
@ -905,7 +905,7 @@ bool EffectEqualization48x::ProcessOne1x4xThreaded(int count, WaveTrack * t,
mEQWorkers[i].mProcessingType=processingType;
AudacityProject *p = GetActiveProject();
auto output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate());
auto output = TrackFactory::Get( *p ).NewWaveTrack(floatSample, t->GetRate());
auto trackBlockSize = t->GetMaxBlockSize();
mEffectEqualization->TrackProgress(count, 0.0);
@ -1151,7 +1151,7 @@ bool EffectEqualization48x::ProcessOne8x(int count, WaveTrack * t,
auto trackBlockSize = t->GetMaxBlockSize();
AudacityProject *p = GetActiveProject();
auto output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate());
auto output = TrackFactory::Get( *p ).NewWaveTrack(floatSample, t->GetRate());
mEffectEqualization->TrackProgress(count, 0.0);
int bigRuns=len/(mSubBufferSize-mBlockSize);
@ -1203,7 +1203,7 @@ bool EffectEqualization48x::ProcessOne8xThreaded(int count, WaveTrack * t,
return ProcessOne4x(count, t, start, len);
AudacityProject *p = GetActiveProject();
auto output = p->GetTrackFactory()->NewWaveTrack(floatSample, t->GetRate());
auto output = TrackFactory::Get( *p ).NewWaveTrack(floatSample, t->GetRate());
auto trackBlockSize = t->GetMaxBlockSize();
mEffectEqualization->TrackProgress(count, 0.0);

View File

@ -135,7 +135,7 @@ bool EffectStereoToMono::ProcessOne(int count)
AudacityProject *p = GetActiveProject();
auto outTrack =
p->GetTrackFactory()->NewWaveTrack(floatSample, mLeftTrack->GetRate());
TrackFactory::Get( *p ).NewWaveTrack(floatSample, mLeftTrack->GetRate());
while (index < mEnd) {
bResult &= mLeftTrack->Get((samplePtr)leftBuffer.get(), floatSample, index, idealBlockLen);

View File

@ -70,7 +70,7 @@ bool DoPasteText(AudacityProject &project)
bool DoPasteNothingSelected(AudacityProject &project)
{
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto trackPanel = project.GetTrackPanel();
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
@ -96,25 +96,25 @@ bool DoPasteNothingSelected(AudacityProject &project)
// Cause duplication of block files on disk, when copy is
// between projects
locker.create(wc);
uNewTrack = trackFactory->NewWaveTrack(
uNewTrack = trackFactory.NewWaveTrack(
wc->GetSampleFormat(), wc->GetRate()),
pNewTrack = uNewTrack.get();
},
#ifdef USE_MIDI
[&](const NoteTrack *) {
uNewTrack = trackFactory->NewNoteTrack(),
uNewTrack = trackFactory.NewNoteTrack(),
pNewTrack = uNewTrack.get();
},
#endif
[&](const LabelTrack *) {
uNewTrack = trackFactory->NewLabelTrack(),
uNewTrack = trackFactory.NewLabelTrack(),
pNewTrack = uNewTrack.get();
},
[&](const TimeTrack *) {
// Maintain uniqueness of the time track!
pNewTrack = tracks.GetTimeTrack();
if (!pNewTrack)
uNewTrack = trackFactory->NewTimeTrack(),
uNewTrack = trackFactory.NewTimeTrack(),
pNewTrack = uNewTrack.get();
}
);
@ -429,7 +429,7 @@ void OnPaste(const CommandContext &context)
auto &project = context.project;
auto &tracks = TrackList::Get( project );
auto trackPanel = project.GetTrackPanel();
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
auto isSyncLocked = project.IsSyncLocked();
@ -643,7 +643,7 @@ void OnPaste(const CommandContext &context)
wt->ClearAndPaste(t0, t1, wc, true, true);
}
else {
auto tmp = trackFactory->NewWaveTrack(
auto tmp = trackFactory.NewWaveTrack(
wt->GetSampleFormat(), wt->GetRate());
tmp->InsertSilence( 0.0,
// MJS: Is this correct?

View File

@ -119,7 +119,7 @@ AudacityProject *DoImportMIDI(
auto cleanup = finally( [&]
{ if ( pNewProject ) pNewProject->Close(true); } );
auto newTrack = pProject->GetTrackFactory()->NewNoteTrack();
auto newTrack = TrackFactory::Get( *pProject ).NewNoteTrack();
if (::ImportMIDI(fileName, newTrack.get())) {
@ -439,7 +439,7 @@ void OnImport(const CommandContext &context)
void OnImportLabels(const CommandContext &context)
{
auto &project = context.project;
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto &tracks = TrackList::Get( project );
wxString fileName =
@ -462,7 +462,7 @@ void OnImportLabels(const CommandContext &context)
return;
}
auto newTrack = trackFactory->NewLabelTrack();
auto newTrack = trackFactory.NewLabelTrack();
wxString sTrackName;
wxFileName::SplitPath(fileName, NULL, NULL, &sTrackName, NULL);
newTrack->SetName(sTrackName);
@ -502,7 +502,7 @@ void OnImportMIDI(const CommandContext &context)
void OnImportRaw(const CommandContext &context)
{
auto &project = context.project;
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
wxString fileName =
FileNames::SelectFile(FileNames::Operation::Open,
@ -519,7 +519,7 @@ void OnImportRaw(const CommandContext &context)
TrackHolders newTracks;
::ImportRaw(&project, fileName, trackFactory, newTracks);
::ImportRaw(&project, fileName, &trackFactory, newTracks);
if (newTracks.size() <= 0)
return;

View File

@ -20,7 +20,7 @@ int DoAddLabel(
{
auto &tracks = TrackList::Get( project );
auto trackPanel = project.GetTrackPanel();
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
wxString title; // of label
@ -43,7 +43,7 @@ int DoAddLabel(
// If none found, start a NEW label track and use it
if (!lt)
lt = tracks.Add(trackFactory->NewLabelTrack());
lt = tracks.Add( trackFactory.NewLabelTrack() );
// LLL: Commented as it seemed a little forceful to remove users
// selection when adding the label. This does not happen if
@ -281,7 +281,7 @@ void OnPasteNewLabel(const CommandContext &context)
{
auto &project = context.project;
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto trackPanel = project.GetTrackPanel();
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
@ -298,9 +298,8 @@ void OnPasteNewLabel(const CommandContext &context)
.Filter<LabelTrack>();
// If no match found, add one
if (!t) {
t = tracks.Add(trackFactory->NewLabelTrack());
}
if (!t)
t = tracks.Add( trackFactory.NewLabelTrack() );
// Select this track so the loop picks it up
t->SetSelected(true);

View File

@ -396,7 +396,7 @@ bool DoEffect(
AudacityProject &project = context.project;
auto &tracks = TrackList::Get( project );
auto trackPanel = project.GetTrackPanel();
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto rate = project.GetRate();
auto &selectedRegion = ViewInfo::Get( project ).selectedRegion;
auto &commandManager = CommandManager::Get( project );
@ -448,7 +448,7 @@ bool DoEffect(
EffectManager & em = EffectManager::Get();
success = em.DoEffect(ID, &project, rate,
&tracks, trackFactory, &selectedRegion,
&tracks, &trackFactory, &selectedRegion,
(flags & kConfigured) == 0);
if (!success)

View File

@ -39,7 +39,7 @@ void DoMixAndRender
(AudacityProject &project, bool toNewTrack)
{
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto rate = project.GetRate();
auto defaultFormat = project.GetDefaultFormat();
auto trackPanel = project.GetTrackPanel();
@ -48,7 +48,7 @@ void DoMixAndRender
WaveTrack::Holder uNewLeft, uNewRight;
::MixAndRender(
&tracks, trackFactory, rate, defaultFormat, 0.0, 0.0, uNewLeft, uNewRight);
&tracks, &trackFactory, rate, defaultFormat, 0.0, 0.0, uNewLeft, uNewRight);
if (uNewLeft) {
// Remove originals, get stats on what tracks were mixed
@ -796,12 +796,12 @@ void OnNewWaveTrack(const CommandContext &context)
{
auto &project = context.project;
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto trackPanel = project.GetTrackPanel();
auto defaultFormat = project.GetDefaultFormat();
auto rate = project.GetRate();
auto t = tracks.Add(trackFactory->NewWaveTrack(defaultFormat, rate));
auto t = tracks.Add( trackFactory.NewWaveTrack( defaultFormat, rate ) );
SelectActions::SelectNone( project );
t->SetSelected(true);
@ -816,17 +816,17 @@ void OnNewStereoTrack(const CommandContext &context)
{
auto &project = context.project;
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto trackPanel = project.GetTrackPanel();
auto defaultFormat = project.GetDefaultFormat();
auto rate = project.GetRate();
SelectActions::SelectNone( project );
auto left = tracks.Add(trackFactory->NewWaveTrack(defaultFormat, rate));
auto left = tracks.Add( trackFactory.NewWaveTrack( defaultFormat, rate ) );
left->SetSelected(true);
auto right = tracks.Add(trackFactory->NewWaveTrack(defaultFormat, rate));
auto right = tracks.Add( trackFactory.NewWaveTrack( defaultFormat, rate ) );
right->SetSelected(true);
tracks.GroupChannels(*left, 2);
@ -841,10 +841,10 @@ void OnNewLabelTrack(const CommandContext &context)
{
auto &project = context.project;
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto trackPanel = project.GetTrackPanel();
auto t = tracks.Add(trackFactory->NewLabelTrack());
auto t = tracks.Add( trackFactory.NewLabelTrack() );
SelectActions::SelectNone( project );
@ -860,7 +860,7 @@ void OnNewTimeTrack(const CommandContext &context)
{
auto &project = context.project;
auto &tracks = TrackList::Get( project );
auto trackFactory = project.GetTrackFactory();
auto &trackFactory = TrackFactory::Get( project );
auto trackPanel = project.GetTrackPanel();
if (tracks.GetTimeTrack()) {
@ -868,7 +868,7 @@ void OnNewTimeTrack(const CommandContext &context)
return;
}
auto t = tracks.AddToHead(trackFactory->NewTimeTrack());
auto t = tracks.AddToHead( trackFactory.NewTimeTrack() );
SelectActions::SelectNone( project );

View File

@ -1144,7 +1144,7 @@ bool ControlToolBar::DoRecord(AudacityProject &project,
// Pad the recording track with silence, up to the
// maximum time.
auto newTrack = p->GetTrackFactory()->NewWaveTrack();
auto newTrack = TrackFactory::Get( *p ).NewWaveTrack();
newTrack->SetWaveColorIndex( wt->GetWaveColorIndex() );
newTrack->InsertSilence(0.0, t0 - endTime);
newTrack->Flush();
@ -1178,7 +1178,7 @@ bool ControlToolBar::DoRecord(AudacityProject &project,
Track *first {};
for (int c = 0; c < recordingChannels; c++) {
auto newTrack = p->GetTrackFactory()->NewWaveTrack();
auto newTrack = TrackFactory::Get( *p ).NewWaveTrack();
if (!first)
first = newTrack.get();

View File

@ -453,7 +453,7 @@ void TranscriptionToolBar::PlayAtSpeed(bool looped, bool cutPreview)
{
// Create a TimeTrack if we haven't done so already
if (!mTimeTrack) {
mTimeTrack = p->GetTrackFactory()->NewTimeTrack();
mTimeTrack = TrackFactory::Get( *p ).NewTimeTrack();
if (!mTimeTrack) {
return;
}