mirror of
https://github.com/cookiengineer/audacity
synced 2025-04-30 15:49:41 +02:00
More constructors for SnapManager...
one taking candidate list directly, the others delegating to it. Some members removed, some in-class initializers. The special constructor for TimeShift only has extra arguments. It will go away.
This commit is contained in:
parent
6337e1ccf4
commit
aa4b808714
179
src/Snap.cpp
179
src/Snap.cpp
@ -39,6 +39,108 @@ TrackClip::~TrackClip()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SnapManager::SnapManager(const AudacityProject &project,
|
||||||
|
SnapPointArray candidates,
|
||||||
|
const ZoomInfo &zoomInfo,
|
||||||
|
bool noTimeSnap,
|
||||||
|
int pixelTolerance)
|
||||||
|
: mProject{ &project }
|
||||||
|
, mZoomInfo{ &zoomInfo }
|
||||||
|
, mPixelTolerance{ pixelTolerance }
|
||||||
|
, mNoTimeSnap{ noTimeSnap }
|
||||||
|
, mCandidates{ std::move( candidates ) }
|
||||||
|
, mSnapPoints{}
|
||||||
|
, mConverter{ NumericConverter::TIME }
|
||||||
|
{
|
||||||
|
Reinit();
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
SnapPointArray FindCandidates( const TrackList &tracks )
|
||||||
|
{
|
||||||
|
SnapPointArray candidates;
|
||||||
|
for ( const auto track : tracks.Any() ) {
|
||||||
|
auto intervals = track->GetIntervals();
|
||||||
|
for (const auto &interval : intervals) {
|
||||||
|
candidates.emplace_back( interval.Start(), track );
|
||||||
|
if ( interval.Start() != interval.End() )
|
||||||
|
candidates.emplace_back( interval.End(), track );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return candidates;
|
||||||
|
}
|
||||||
|
|
||||||
|
SnapPointArray FindCandidates(
|
||||||
|
const TrackList &tracks,
|
||||||
|
const TrackClipArray *clipExclusions, const TrackArray *trackExclusions )
|
||||||
|
{
|
||||||
|
// Special case restricted candidates for time shift
|
||||||
|
SnapPointArray candidates;
|
||||||
|
auto trackRange =
|
||||||
|
tracks.Any()
|
||||||
|
- [&](const Track *pTrack){
|
||||||
|
return trackExclusions &&
|
||||||
|
make_iterator_range( *trackExclusions ).contains( pTrack );
|
||||||
|
};
|
||||||
|
trackRange.Visit(
|
||||||
|
[&](const LabelTrack *labelTrack) {
|
||||||
|
for (int i = 0, cnt = labelTrack->GetNumLabels(); i < cnt; ++i)
|
||||||
|
{
|
||||||
|
const LabelStruct *label = labelTrack->GetLabel(i);
|
||||||
|
const double t0 = label->getT0();
|
||||||
|
const double t1 = label->getT1();
|
||||||
|
candidates.emplace_back(t0, labelTrack);
|
||||||
|
if (t1 != t0)
|
||||||
|
candidates.emplace_back(t1, labelTrack);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[&](const WaveTrack *waveTrack) {
|
||||||
|
for (const auto &clip: waveTrack->GetClips())
|
||||||
|
{
|
||||||
|
if (clipExclusions)
|
||||||
|
{
|
||||||
|
bool skip = false;
|
||||||
|
for (size_t j = 0, cnt = clipExclusions->size(); j < cnt; ++j)
|
||||||
|
{
|
||||||
|
if ((*clipExclusions)[j].track == waveTrack &&
|
||||||
|
(*clipExclusions)[j].clip == clip.get())
|
||||||
|
{
|
||||||
|
skip = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skip)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
candidates.emplace_back(clip->GetStartTime(), waveTrack);
|
||||||
|
candidates.emplace_back(clip->GetEndTime(), waveTrack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#ifdef USE_MIDI
|
||||||
|
,
|
||||||
|
[&](const NoteTrack *track) {
|
||||||
|
candidates.emplace_back(track->GetStartTime(), track);
|
||||||
|
candidates.emplace_back(track->GetEndTime(), track);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
return candidates;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SnapManager::SnapManager(const AudacityProject &project,
|
||||||
|
const TrackList &tracks,
|
||||||
|
const ZoomInfo &zoomInfo,
|
||||||
|
bool noTimeSnap,
|
||||||
|
int pixelTolerance)
|
||||||
|
: SnapManager{ project,
|
||||||
|
FindCandidates( tracks ),
|
||||||
|
zoomInfo, noTimeSnap, pixelTolerance }
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
SnapManager::SnapManager(const AudacityProject &project,
|
SnapManager::SnapManager(const AudacityProject &project,
|
||||||
const TrackList &tracks,
|
const TrackList &tracks,
|
||||||
const ZoomInfo &zoomInfo,
|
const ZoomInfo &zoomInfo,
|
||||||
@ -46,26 +148,10 @@ SnapManager::SnapManager(const AudacityProject &project,
|
|||||||
int pixelTolerance,
|
int pixelTolerance,
|
||||||
const TrackClipArray *clipExclusions,
|
const TrackClipArray *clipExclusions,
|
||||||
const TrackArray *trackExclusions)
|
const TrackArray *trackExclusions)
|
||||||
: mConverter(NumericConverter::TIME)
|
: SnapManager{ project,
|
||||||
|
FindCandidates( tracks, clipExclusions, trackExclusions ),
|
||||||
|
zoomInfo, noTimeSnap, pixelTolerance }
|
||||||
{
|
{
|
||||||
mTracks = &tracks;
|
|
||||||
mZoomInfo = &zoomInfo;
|
|
||||||
mClipExclusions = clipExclusions;
|
|
||||||
mTrackExclusions = trackExclusions;
|
|
||||||
mPixelTolerance = pixelTolerance;
|
|
||||||
mNoTimeSnap = noTimeSnap;
|
|
||||||
|
|
||||||
mProject = &project;
|
|
||||||
wxASSERT(mProject);
|
|
||||||
|
|
||||||
mSnapTo = 0;
|
|
||||||
mRate = 0.0;
|
|
||||||
mFormat = {};
|
|
||||||
|
|
||||||
// Two time points closer than this are considered the same
|
|
||||||
mEpsilon = 1 / 44100.0;
|
|
||||||
|
|
||||||
Reinit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SnapManager::~SnapManager()
|
SnapManager::~SnapManager()
|
||||||
@ -106,58 +192,9 @@ void SnapManager::Reinit()
|
|||||||
// Add a SnapPoint at t=0
|
// Add a SnapPoint at t=0
|
||||||
mSnapPoints.push_back(SnapPoint{});
|
mSnapPoints.push_back(SnapPoint{});
|
||||||
|
|
||||||
auto trackRange =
|
// Adjust and filter the candidate points
|
||||||
mTracks->Any()
|
for (const auto &candidate : mCandidates)
|
||||||
- [&](const Track *pTrack){
|
CondListAdd( candidate.t, candidate.track );
|
||||||
return mTrackExclusions &&
|
|
||||||
make_iterator_range( *mTrackExclusions ).contains( pTrack );
|
|
||||||
};
|
|
||||||
trackRange.Visit(
|
|
||||||
[&](const LabelTrack *labelTrack) {
|
|
||||||
for (int i = 0, cnt = labelTrack->GetNumLabels(); i < cnt; ++i)
|
|
||||||
{
|
|
||||||
const LabelStruct *label = labelTrack->GetLabel(i);
|
|
||||||
const double t0 = label->getT0();
|
|
||||||
const double t1 = label->getT1();
|
|
||||||
CondListAdd(t0, labelTrack);
|
|
||||||
if (t1 != t0)
|
|
||||||
{
|
|
||||||
CondListAdd(t1, labelTrack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[&](const WaveTrack *waveTrack) {
|
|
||||||
for (const auto &clip: waveTrack->GetClips())
|
|
||||||
{
|
|
||||||
if (mClipExclusions)
|
|
||||||
{
|
|
||||||
bool skip = false;
|
|
||||||
for (size_t j = 0, cnt = mClipExclusions->size(); j < cnt; ++j)
|
|
||||||
{
|
|
||||||
if ((*mClipExclusions)[j].track == waveTrack &&
|
|
||||||
(*mClipExclusions)[j].clip == clip.get())
|
|
||||||
{
|
|
||||||
skip = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skip)
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CondListAdd(clip->GetStartTime(), waveTrack);
|
|
||||||
CondListAdd(clip->GetEndTime(), waveTrack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef USE_MIDI
|
|
||||||
,
|
|
||||||
[&](const NoteTrack *track) {
|
|
||||||
CondListAdd(track->GetStartTime(), track);
|
|
||||||
CondListAdd(track->GetEndTime(), track);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
// Sort all by time
|
// Sort all by time
|
||||||
std::sort(mSnapPoints.begin(), mSnapPoints.end());
|
std::sort(mSnapPoints.begin(), mSnapPoints.end());
|
||||||
|
29
src/Snap.h
29
src/Snap.h
@ -77,11 +77,23 @@ struct SnapResults {
|
|||||||
class SnapManager
|
class SnapManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
SnapManager(const AudacityProject &project,
|
||||||
|
SnapPointArray candidates,
|
||||||
|
const ZoomInfo &zoomInfo,
|
||||||
|
bool noTimeSnap = false,
|
||||||
|
int pixelTolerance = kPixelTolerance);
|
||||||
|
|
||||||
SnapManager(const AudacityProject &project,
|
SnapManager(const AudacityProject &project,
|
||||||
const TrackList &tracks,
|
const TrackList &tracks,
|
||||||
const ZoomInfo &zoomInfo,
|
const ZoomInfo &zoomInfo,
|
||||||
bool noTimeSnap = false,
|
bool noTimeSnap = false,
|
||||||
int pixelTolerance = kPixelTolerance,
|
int pixelTolerance = kPixelTolerance);
|
||||||
|
|
||||||
|
SnapManager(const AudacityProject &project,
|
||||||
|
const TrackList &tracks,
|
||||||
|
const ZoomInfo &zoomInfo,
|
||||||
|
bool noTimeSnap,
|
||||||
|
int pixelTolerance,
|
||||||
const TrackClipArray *clipExclusions = NULL,
|
const TrackClipArray *clipExclusions = NULL,
|
||||||
const TrackArray *trackExclusions = NULL);
|
const TrackArray *trackExclusions = NULL);
|
||||||
~SnapManager();
|
~SnapManager();
|
||||||
@ -112,23 +124,22 @@ private:
|
|||||||
private:
|
private:
|
||||||
|
|
||||||
const AudacityProject *mProject;
|
const AudacityProject *mProject;
|
||||||
const TrackList *mTracks;
|
|
||||||
const TrackClipArray *mClipExclusions;
|
|
||||||
const TrackArray *mTrackExclusions;
|
|
||||||
const ZoomInfo *mZoomInfo;
|
const ZoomInfo *mZoomInfo;
|
||||||
int mPixelTolerance;
|
int mPixelTolerance;
|
||||||
bool mNoTimeSnap;
|
bool mNoTimeSnap;
|
||||||
|
|
||||||
double mEpsilon;
|
//! Two time points closer than this are considered the same
|
||||||
|
double mEpsilon{ 1 / 44100.0 };
|
||||||
|
SnapPointArray mCandidates;
|
||||||
SnapPointArray mSnapPoints;
|
SnapPointArray mSnapPoints;
|
||||||
|
|
||||||
// Info for snap-to-time
|
// Info for snap-to-time
|
||||||
NumericConverter mConverter;
|
NumericConverter mConverter;
|
||||||
bool mSnapToTime;
|
bool mSnapToTime{ false };
|
||||||
|
|
||||||
int mSnapTo;
|
int mSnapTo{ 0 };
|
||||||
double mRate;
|
double mRate{ 0.0 };
|
||||||
NumericFormatSymbol mFormat;
|
NumericFormatSymbol mFormat{};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user