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

Rewrite many iterations over tracks and channels in src/import, src/export

This commit is contained in:
Paul Licameli 2018-09-18 12:00:42 -04:00
parent c7ab9f2338
commit 3eee8b8cf0
4 changed files with 74 additions and 182 deletions

View File

@ -459,51 +459,44 @@ bool Exporter::ExamineTracks()
double latestEnd = mT0;
const TrackList *tracks = mProject->GetTracks();
TrackListConstIterator iter1(tracks);
const Track *tr = iter1.First();
while (tr) {
if (tr->GetKind() == Track::Wave) {
auto wt = static_cast<const WaveTrack *>(tr);
if ( (tr->GetSelected() || !mSelectedOnly) &&
!wt->GetMute() ) { // don't count muted tracks
mNumSelected++;
for (auto tr :
tracks->Any< const WaveTrack >()
+ ( mSelectedOnly ? &Track::IsSelected : &Track::Any )
- &WaveTrack::GetMute
) {
mNumSelected++;
if (tr->GetChannel() == Track::LeftChannel) {
mNumLeft++;
}
else if (tr->GetChannel() == Track::RightChannel) {
mNumRight++;
}
else if (tr->GetChannel() == Track::MonoChannel) {
// It's a mono channel, but it may be panned
float pan = ((WaveTrack*)tr)->GetPan();
if (pan == -1.0)
mNumLeft++;
else if (pan == 1.0)
mNumRight++;
else if (pan == 0)
mNumMono++;
else {
// Panned partially off-center. Mix as stereo.
mNumLeft++;
mNumRight++;
}
}
if (tr->GetOffset() < earliestBegin) {
earliestBegin = tr->GetOffset();
}
if (tr->GetEndTime() > latestEnd) {
latestEnd = tr->GetEndTime();
}
if (tr->GetChannel() == Track::LeftChannel) {
mNumLeft++;
}
else if (tr->GetChannel() == Track::RightChannel) {
mNumRight++;
}
else if (tr->GetChannel() == Track::MonoChannel) {
// It's a mono channel, but it may be panned
float pan = tr->GetPan();
if (pan == -1.0)
mNumLeft++;
else if (pan == 1.0)
mNumRight++;
else if (pan == 0)
mNumMono++;
else {
// Panned partially off-center. Mix as stereo.
mNumLeft++;
mNumRight++;
}
}
tr = iter1.Next();
if (tr->GetOffset() < earliestBegin) {
earliestBegin = tr->GetOffset();
}
if (tr->GetEndTime() > latestEnd) {
latestEnd = tr->GetEndTime();
}
}
if (mNumSelected == 0) {
@ -1305,25 +1298,22 @@ ExportMixerDialog::ExportMixerDialog( const TrackList *tracks, bool selectedOnly
SetName(GetTitle());
unsigned numTracks = 0;
TrackListConstIterator iter( tracks );
for( const Track *t = iter.First(); t; t = iter.Next() )
{
auto wt = static_cast<const WaveTrack *>(t);
if( t->GetKind() == Track::Wave && ( t->GetSelected() || !selectedOnly ) &&
!wt->GetMute() )
{
numTracks++;
const wxString sTrackName = (t->GetName()).Left(20);
if( t->GetChannel() == Track::LeftChannel )
/* i18n-hint: track name and L abbreviating Left channel */
mTrackNames.Add( wxString::Format( _( "%s - L" ), sTrackName ) );
else if( t->GetChannel() == Track::RightChannel )
/* i18n-hint: track name and R abbreviating Right channel */
mTrackNames.Add( wxString::Format( _( "%s - R" ), sTrackName ) );
else
mTrackNames.Add(sTrackName);
}
for (auto t :
tracks->Any< const WaveTrack >()
+ ( selectedOnly ? &Track::IsSelected : &Track::Any )
- &WaveTrack::GetMute
) {
numTracks++;
const wxString sTrackName = (t->GetName()).Left(20);
if( t->GetChannel() == Track::LeftChannel )
/* i18n-hint: track name and L abbreviating Left channel */
mTrackNames.Add( wxString::Format( _( "%s - L" ), sTrackName ) );
else if( t->GetChannel() == Track::RightChannel )
/* i18n-hint: track name and R abbreviating Right channel */
mTrackNames.Add( wxString::Format( _( "%s - R" ), sTrackName ) );
else
mTrackNames.Add(sTrackName);
}
// JKC: This is an attempt to fix a 'watching brief' issue, where the slider is

View File

@ -140,37 +140,12 @@ ExportMultiple::~ExportMultiple()
void ExportMultiple::CountTracksAndLabels()
{
mLabels = NULL;
mNumLabels = 0;
mNumWaveTracks = 0;
mNumWaveTracks =
(mTracks->Leaders< const WaveTrack >() - &WaveTrack::GetMute).size();
const Track* pTrack;
TrackListConstIterator iter;
for (pTrack = iter.First(mTracks); pTrack != NULL; pTrack = iter.Next())
{
switch (pTrack->GetKind())
{
// Count WaveTracks, and for linked pairs, count only the second of the pair.
case Track::Wave:
{
auto wt = static_cast<const WaveTrack *>(pTrack);
if (!wt->GetMute() && !pTrack->GetLinked()) // Don't count muted tracks.
mNumWaveTracks++;
break;
}
// Only support one label track???
case Track::Label:
{
// Supports only one LabelTrack.
if (mLabels == NULL) {
mLabels = (LabelTrack*)pTrack;
mNumLabels = mLabels->GetNumLabels();
}
break;
}
}
}
// only the first label track
mLabels = *mTracks->Any< const LabelTrack >().begin();
mNumLabels = mLabels ? mLabels->GetNumLabels() : 0;
}
int ExportMultiple::ShowModal()
@ -777,7 +752,7 @@ ProgressResult ExportMultiple::ExportMultipleByTrack(bool byName,
{
wxASSERT(mProject);
bool tagsPrompt = mProject->GetShowId3Dialog();
Track *tr, *tr2;
Track *tr;
int l = 0; // track counter
auto ok = ProgressResult::Success;
wxArrayString otherNames;
@ -793,52 +768,22 @@ ProgressResult ExportMultiple::ExportMultipleByTrack(bool byName,
/* Remember which tracks were selected, and set them to unselected */
SelectionStateChanger changer{ mSelectionState, *mTracks };
TrackListIterator iter;
for (tr = iter.First(mTracks); tr != NULL; tr = iter.Next()) {
if (tr->GetKind() != Track::Wave) {
continue;
}
if (tr->GetSelected())
tr->SetSelected(false);
}
for (auto tr : mTracks->Selected<WaveTrack>())
tr->SetSelected(false);
/* Examine all tracks in turn, collecting export information */
for (tr = iter.First(mTracks); tr != NULL; tr = iter.Next()) {
// Want only non-muted wave tracks.
auto wt = static_cast<const WaveTrack *>(tr);
if ((tr->GetKind() != Track::Wave) ||
wt->GetMute())
continue;
for (auto tr : mTracks->Leaders<WaveTrack>() - &WaveTrack::GetMute) {
// Get the times for the track
setting.t0 = tr->GetStartTime();
setting.t1 = tr->GetEndTime();
// Check for a linked track
tr2 = NULL;
if (tr->GetLinked()) {
tr2 = iter.Next();
if (tr2) {
// Make sure it gets included
if (tr2->GetStartTime() < setting.t0) {
setting.t0 = tr2->GetStartTime();
}
if (tr2->GetEndTime() > setting.t1) {
setting.t1 = tr2->GetEndTime();
}
}
}
auto channels = TrackList::Channels(tr);
setting.t0 = channels.min( &Track::GetStartTime );
setting.t1 = channels.max( &Track::GetEndTime );
// number of export channels?
// Needs to be per track.
if (tr2 == NULL && tr->GetChannel() == WaveTrack::MonoChannel &&
((WaveTrack *)tr)->GetPan() == 0.0)
setting.channels = 1;
else
setting.channels = channels.size();
if (setting.channels == 1 &&
!(tr->GetChannel() == WaveTrack::MonoChannel &&
tr->GetPan() == 0.0))
setting.channels = 2;
// Get name and title
@ -894,21 +839,7 @@ ProgressResult ExportMultiple::ExportMultipleByTrack(bool byName,
int count = 0; // count the number of sucessful runs
ExportKit activeSetting; // pointer to the settings in use for this export
std::unique_ptr<ProgressDialog> pDialog;
for (tr = iter.First(mTracks); tr != NULL; tr = iter.Next()) {
// Want only non-muted wave tracks.
auto wt = static_cast<const WaveTrack *>(tr);
if ((tr->GetKind() != Track::Wave) || (wt->GetMute())) {
continue;
}
// Bug 1510 possibly increment iter, before deciding whether to export.
// Check for a linked track
tr2 = NULL;
if (tr->GetLinked()) {
tr2 = iter.Next();
}
for (auto tr : mTracks->Leaders<WaveTrack>() - &WaveTrack::GetMute) {
wxLogDebug( "Get setting %i", count );
/* get the settings to use for the export from the array */
activeSetting = exportSettings[count];
@ -919,10 +850,9 @@ ProgressResult ExportMultiple::ExportMultipleByTrack(bool byName,
/* Select the track */
SelectionStateChanger changer2{ mSelectionState, *mTracks };
tr->SetSelected(true);
if (tr2)
// Select it also
tr2->SetSelected(true);
const auto range = TrackList::Channels(tr);
for (auto channel : range)
channel->SetSelected(true);
// Export the data. "channels" are per track.
ok = DoExport(pDialog,

View File

@ -112,7 +112,7 @@ private:
AudacityProject *mProject;
TrackList *mTracks; /**< The list of tracks in the project that is
being exported */
LabelTrack *mLabels;
const LabelTrack *mLabels;
int mNumLabels;
int mNumWaveTracks;

View File

@ -268,22 +268,6 @@ ProgressResult LOFImportFileHandle::Import(TrackFactory * WXUNUSED(trackFactory)
return ProgressResult::Success;
}
static int CountNumTracks(AudacityProject *proj)
{
int count = 0;
Track *t;
TrackListIterator iter(proj->GetTracks());
t = iter.First();
while(t) {
count++;
t = iter.Next();
}
return count;
}
/** @brief Processes a single line from a LOF text file, doing whatever is
* indicated on the line.
*
@ -432,18 +416,14 @@ void LOFImportFileHandle::lofOpenFiles(wxString* ln)
;
else if (Internat::CompatibleToDouble(tokenholder, &offset))
{
Track *t;
TrackListIterator iter(mProject->GetTracks());
t = iter.First();
for (int i = 1; i < CountNumTracks(mProject) - 1; i++)
t = iter.Next();
auto tracks = mProject->GetTracks();
auto t = *tracks->Leaders().rbegin();
// t is now the last track in the project, unless the import of
// all tracks failed, in which case it will be null. In that
// case we return because we cannot offset a non-existent track.
if (t == NULL) return;
if (t == NULL)
return;
#ifdef USE_MIDI
if (targetfile.AfterLast(wxT('.')).IsSameAs(wxT("mid"), false) ||
targetfile.AfterLast(wxT('.')).IsSameAs(wxT("midi"), false))
@ -454,16 +434,8 @@ void LOFImportFileHandle::lofOpenFiles(wxString* ln)
else
#endif
{
if (CountNumTracks(mProject) == 1)
t->SetOffset(offset);
else
{
if (t->GetLinked())
t->SetOffset(offset);
t = iter.Next();
t->SetOffset(offset);
}
for (auto channel : TrackList::Channels(t))
channel->SetOffset(offset);
}
// Amend the undo transaction made by import