1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-03 00:59:43 +02:00

9224 Commits

Author SHA1 Message Date
Steve Daulton
a17af37c1e Fix bug 1992 2018-10-02 22:40:10 +01:00
Paul Licameli
526179b63e Remove a use of c_str 2018-10-01 19:48:10 -04:00
Paul Licameli
81385d7ebd Track type switch safety; simplified iterations & channel groupings...
A very extensive rewrite.

No longer:

1 Test a type field of a track and then do a C-style pointer down-cast
2 Use verbose old iterators over tracks that required those down-casts
3 Detect that a track has a stereo partner by testing Track::GetLink();
  Detect that a track is the left stereo channel by testing Track::GetLinked()
4 Do something to one channel of a pair, then repeat on the other channel
5 Set up new or imported stereo tracks with Track::SetLinked() and setting of
  channel types

Instead:

1 -- Use track_cast, which won't cast const away, to convert a pointer, getting
     null if the track is not of the specified type
  -- Or use Track::TypeSwitch which takes lambda expressions with arguments of
     desired subtypes, entering the lambda body only if the track has the
     right type
  -- Or use TrackIterRange<...>::Visit() or VisitWhile() to apply a
     type-switch over each of several tracks.

2 -- Use TrackList::Any() or Selected() or other new functions, which return
     TrackIterRange<...> objects that represent ranges of tracks to be visited.
  -- Use the template type parameter to restrict visitation to a subtype and
     cause the pointer down-cast to be built in to the iterator deferences.
  -- Use C++11 range-for or stl algorithms with TrackIterRanges for brevity
  -- Or even avoid loops by using size() or min() or similar member functions
     of TrackIterRange.
  -- Use StartingWith(), EndingAfter(), Excluding(), and operators + and -
     (which can take arbitrary predicates on tracks) to filter the range object
     and simplify loop bodies even further.

3 -- Use Track::IsLeader() to test whether a track is first in a channel group
     (which also returns true when it is not grouped with any other track, and
     maybe not even a WaveTrack)
  -- Or use TrackList::FindLeader() to get the first member of its group
  -- Or use TrackList::Leaders() to get a track range that includes leaders
     only, then visit that range as in (2).

4 -- Use TrackList::Channels() to get a TrackIterRange that includes only
     the members of the group of a given track and visit that as in (2).
  -- Do not needlessly assume or assert that the channels are at most two.

5 -- After all the channels have been added at the end of the TrackList, just
     call TrackList::GroupChannels() passing the leader track and number of
     channels.

Most rewrites covered by (3) and (4) generalize without any complications to
possible future more-than-stereo track groupings.  In other places, there may
be some difficulty about such generalization, and those are marked with the
comments:

// TODO: more-than-two-channels

or else

// TODO: more-than-two-channels-message

where it was merely a matter of more appropriate wording for the user.  This
branch makes no changes to user-visible messages.

What isn't changed in the interface exposed by TrackList and Track:

-- Grouped channels are always a contiguous sub-range of all tracks, and
   client code may rely on that assumption.

What isn't changed in the implementaion:

-- Channel groups are never yet actually more than two.
-- The grouping of channels is still represented by a boolean flag in each
   track that is true only for the first channel of each stereo pair.
-- The persistent representation of channel groups in .aup files.
2018-10-01 13:42:37 -04:00
Paul Licameli
8fcbbaeea9 Encapsulate details of setting-up of channel groups in TrackList...
... except that WaveTrack needs to be a friend, just for reloading from disk.

Nothing yet is changed in the internal or persistent representation of channel
groups.
2018-10-01 13:42:36 -04:00
Paul Licameli
32d767c7f5 Track::SetLinked() and Track::SetChannel() are private...
... but class WaveTrack needs to invoke SetLinked still during project load
2018-10-01 13:42:36 -04:00
Paul Licameli
beebe648fb Remove more uses of Track::SetLinked() and Track::SetChannel() 2018-10-01 13:42:36 -04:00
Paul Licameli
894f6f4f63 Remove SetLinked() and SetChannel() from importers 2018-10-01 13:42:36 -04:00
Paul Licameli
b0c5f42b9a Remove old iterators, type tests, GetLink(ed) from Track's interface 2018-10-01 13:42:35 -04:00
Paul Licameli
7e6a543473 Define TrackList::GroupChannels() 2018-10-01 13:42:35 -04:00
Paul Licameli
31d46ae624 Importer functions return a vector of vector of pointers to tracks...
... grouping the channels; rather than one flat vector.

OGG, GStreamer and FFmpeg import were written to allow multiple multi-channel
tracks; others always imported one group of channels.

All of that is reflected in the results returned by the importers, though it
makes no difference yet in AudacityProject::AddImportedTracks (where the
results are used).
2018-10-01 13:42:35 -04:00
Paul Licameli
2ee87082cb Track::GetLink and GetLinked are private, but SetLinked isn't yet 2018-10-01 13:42:34 -04:00
Paul Licameli
b36c3efec1 Track::GetKind is private 2018-10-01 13:42:34 -04:00
Paul Licameli
b5f52e7c1c Remove old style track iterator classes 2018-10-01 13:42:34 -04:00
Paul Licameli
fbec3efa0c Eliminate some unnecessary track type tests 2018-10-01 13:42:34 -04:00
Paul Licameli
7d55defde6 Rewrite channel iterations that don't generalize to more than two...
... requiring at least some message rewrites.

All these places have a comment:

// TODO: more-than-two-channels

or in simpler cases just

// TODO: more-than-two-channels-message
2018-10-01 13:42:33 -04:00
Paul Licameli
dbf44efc9f Iterations over channels in remaining places that won't generalize...
... simply to the more-than-stereo case.

All these places have the comment:

// TODO: more-than-two-channels
2018-10-01 13:42:33 -04:00
Paul Licameli
4aa990e835 Remove GetLink(ed) in various other places 2018-10-01 13:42:33 -04:00
Paul Licameli
c107fb298b Remove GetLink(ed) in channel manipulation menu items 2018-10-01 13:42:32 -04:00
Paul Licameli
ecc869bdbe Remove GetLink(ed) in TrackPanel resizing code 2018-10-01 13:42:32 -04:00
Paul Licameli
d2a18f01e3 Remove use of GetLink(ed) in AudacityProject::OnPaste 2018-10-01 13:42:32 -04:00
Paul Licameli
7eadd7a36f Iterations over channels involving third-party effects libraries...
... I don't know whether these libraries support more than two channels with
no problems.

All these places have the comment:

// TODO: more-than-two-channels
2018-10-01 13:42:31 -04:00
Paul Licameli
22c85dd99c Rewrite GetLink(ed) in SBSMS 2018-10-01 13:42:31 -04:00
Paul Licameli
48ae1eb3c9 Rewrite GetLink(ed) in SoundTouch 2018-10-01 13:42:31 -04:00
Paul Licameli
70f7b0f6ef Iterations over channels where more general messages may be needed...
... but otherwise the logic generalizes without a problem.

All these places have the comment:

// TODO: more-than-two-channels-message
2018-10-01 13:42:30 -04:00
Paul Licameli
518df314eb Rewrite GetLink(ed) in vamp effects 2018-10-01 13:42:30 -04:00
Paul Licameli
a68184f81d Remove GetLink(ed) in track panel drawing and refresh 2018-10-01 13:42:30 -04:00
Paul Licameli
46557a9a2d Rewrite many track type switches, track and channel iterations...
... that present no complications to more-than-stereo genralization
2018-10-01 13:42:29 -04:00
Paul Licameli
4c75175e41 Remove GetLink(ed) in Normalize effect...
... It's much simpler and should be easy to generalize, but what would be
appropriate messages?
2018-10-01 13:42:29 -04:00
Paul Licameli
f276373f3c Remove GetLink(ed) in clip-moving functions 2018-10-01 13:42:29 -04:00
Paul Licameli
3561154311 More rewrites of iterations over channels...
... that can generalize to more than stereo
2018-10-01 13:42:28 -04:00
Paul Licameli
669054b4f4 Remove many uses of GetLink in TrackPanel 2018-10-01 13:42:24 -04:00
Paul Licameli
0c0c2c0d1e Rewrite iteration over visible tracks in TrackArtist...
... also eliminating AudacityProject::GetFirstVisible.
2018-10-01 13:41:51 -04:00
Paul Licameli
51e0ae0447 Remove GetLink() in AudacityProject::AddImportedTracks...
... Be careful when you call IsLeader()!  It's correct only after the
tracks belong to the project's TrackList.
2018-10-01 13:41:51 -04:00
Paul Licameli
a7ca6db7c3 Rewrite many iterations over tracks and channels, track type tests...
... which do not require cautions for future more-than-stereo cases.
2018-10-01 13:41:50 -04:00
Paul Licameli
968d63d5fd Rewrite many iterations over tracks and channels in various places 2018-10-01 13:35:51 -04:00
Paul Licameli
fee0f284fe Rewrite many iterations over tracks and channels in src/toolbars 2018-10-01 11:25:07 -04:00
Paul Licameli
3eee8b8cf0 Rewrite many iterations over tracks and channels in src/import, src/export 2018-10-01 11:24:50 -04:00
Paul Licameli
c7ab9f2338 Rewrite many iterations over tracks and channels in src/commands 2018-10-01 11:24:37 -04:00
Paul Licameli
23a85893a1 Rewrite some iterations over tracks and channels in TrackPanel 2018-10-01 11:24:25 -04:00
Paul Licameli
aee4005044 Rewrite many iterations over tracks and channels in src/effects 2018-10-01 11:24:04 -04:00
Paul Licameli
b94e8fec96 Remove VisibleTrackIterator 2018-10-01 11:20:52 -04:00
Paul Licameli
ae2ce1ad90 Rewrite many iterations over tracks and channels in Project.cpp 2018-10-01 11:19:54 -04:00
Paul Licameli
d01013e0d0 Rewrite many iterations over tracks and channels in Menus.cpp 2018-10-01 11:19:35 -04:00
Paul Licameli
1e32309d24 Rewrite MenuCommandHandler::HandleAlign 2018-10-01 11:19:18 -04:00
Paul Licameli
b6a6b8e73e Rewrite iterations over sync-lock groups 2018-10-01 11:09:20 -04:00
Paul Licameli
bb3aa00f50 Effect::CopyInputTracks was only called with two values...
So now it simply takes a bool.
2018-10-01 11:06:31 -04:00
Paul Licameli
2e11844f6a Effect::inputTracks() now gives only const access 2018-10-01 10:59:48 -04:00
Paul Licameli
1be3187b99 Use TrackIterRange::Visit 2018-10-01 10:59:24 -04:00
Paul Licameli
17089d03bf Rewrite MenuCommandHandler::OnPaste with TypeSwitch and new iterators 2018-10-01 10:59:09 -04:00
Paul Licameli
51842fc78b Use TypeSwitch and track_cast 2018-10-01 10:58:47 -04:00