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:
parent
c7ab9f2338
commit
3eee8b8cf0
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user