mirror of
https://github.com/cookiengineer/audacity
synced 2025-10-21 14:02:57 +02:00
Allow SelectTrack to select channels using 0.5 of a track.
This is a feature possibly only Audacity developers will actually use, but does allow for some cool use of stereo tracks.
This commit is contained in:
@@ -164,8 +164,8 @@ static const wxString kModes[nModes] =
|
|||||||
|
|
||||||
bool SelectTracksCommand::DefineParams( ShuttleParams & S ){
|
bool SelectTracksCommand::DefineParams( ShuttleParams & S ){
|
||||||
wxArrayString modes( nModes, kModes );
|
wxArrayString modes( nModes, kModes );
|
||||||
S.OptionalN( bHasFirstTrack).Define( mFirstTrack, wxT("First"), 0, 0, 100);
|
S.OptionalN( bHasFirstTrack).Define( mFirstTrack, wxT("Track"), 0.0, 0.0, 100.0);
|
||||||
S.OptionalN( bHasLastTrack ).Define( mLastTrack, wxT("Last"), 0, 0, 100);
|
S.OptionalN( bHasNumTracks ).Define( mNumTracks, wxT("TrackCount"), 1.0, 0.0, 100.0);
|
||||||
S.OptionalY( bHasMode ).DefineEnum( mMode, wxT("Mode"), 0, modes );
|
S.OptionalY( bHasMode ).DefineEnum( mMode, wxT("Mode"), 0, modes );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -180,7 +180,7 @@ void SelectTracksCommand::PopulateOrExchange(ShuttleGui & S)
|
|||||||
{
|
{
|
||||||
S.SetStretchyCol( 2 );
|
S.SetStretchyCol( 2 );
|
||||||
S.Optional( bHasFirstTrack).TieTextBox(_("First Track:"),mFirstTrack);
|
S.Optional( bHasFirstTrack).TieTextBox(_("First Track:"),mFirstTrack);
|
||||||
S.Optional( bHasLastTrack).TieTextBox(_("Last Track:"),mLastTrack);
|
S.Optional( bHasNumTracks).TieTextBox(_("Track Count:"),mNumTracks);
|
||||||
}
|
}
|
||||||
S.EndMultiColumn();
|
S.EndMultiColumn();
|
||||||
S.StartMultiColumn(2, wxALIGN_CENTER);
|
S.StartMultiColumn(2, wxALIGN_CENTER);
|
||||||
@@ -193,17 +193,19 @@ void SelectTracksCommand::PopulateOrExchange(ShuttleGui & S)
|
|||||||
|
|
||||||
bool SelectTracksCommand::Apply(const CommandContext &context)
|
bool SelectTracksCommand::Apply(const CommandContext &context)
|
||||||
{
|
{
|
||||||
if( !bHasFirstTrack && !bHasLastTrack )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
int index = 0;
|
int index = 0;
|
||||||
TrackList *tracks = context.GetProject()->GetTracks();
|
TrackList *tracks = context.GetProject()->GetTracks();
|
||||||
int last = wxMax( mFirstTrack, mLastTrack );
|
// Stereo second tracks count as 0.5 of a track.
|
||||||
|
double last = mFirstTrack+mNumTracks;
|
||||||
|
double first = mFirstTrack;
|
||||||
|
bool bIsSecondChannel = false;
|
||||||
TrackListIterator iter(tracks);
|
TrackListIterator iter(tracks);
|
||||||
Track *t = iter.First();
|
Track *t = iter.First();
|
||||||
while (t) {
|
while (t) {
|
||||||
bool sel = mFirstTrack <= index && index <= last;
|
// Add 0.01 so we are free of rounding errors in comparisons.
|
||||||
|
// Optionally add 0.5 for second track which counts as is half a track
|
||||||
|
double track = index + 0.01 + (bIsSecondChannel ? 0.5 : 0.0);
|
||||||
|
bool sel = first <= track && track <= last;
|
||||||
if( mMode == 0 ){ // Set
|
if( mMode == 0 ){ // Set
|
||||||
t->SetSelected(sel);
|
t->SetSelected(sel);
|
||||||
}
|
}
|
||||||
@@ -214,7 +216,8 @@ bool SelectTracksCommand::Apply(const CommandContext &context)
|
|||||||
t->SetSelected(!sel);
|
t->SetSelected(!sel);
|
||||||
}
|
}
|
||||||
// Do second channel in stereo track too.
|
// Do second channel in stereo track too.
|
||||||
if( !t->GetLinked() )
|
bIsSecondChannel = t->GetLinked();
|
||||||
|
if( !bIsSecondChannel )
|
||||||
++index;
|
++index;
|
||||||
t = iter.Next();
|
t = iter.Next();
|
||||||
}
|
}
|
||||||
|
@@ -88,11 +88,11 @@ public:
|
|||||||
wxString ManualPage() override {return wxT("Audio_Selection");};
|
wxString ManualPage() override {return wxT("Audio_Selection");};
|
||||||
|
|
||||||
bool bHasFirstTrack;
|
bool bHasFirstTrack;
|
||||||
bool bHasLastTrack;
|
bool bHasNumTracks;
|
||||||
bool bHasMode;
|
bool bHasMode;
|
||||||
|
|
||||||
int mFirstTrack;
|
double mFirstTrack;
|
||||||
int mLastTrack;
|
double mNumTracks;
|
||||||
int mMode;
|
int mMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user