From cabe925ab72eceaae46fc8b26db3d0e111ca1b35 Mon Sep 17 00:00:00 2001 From: James Crook Date: Sun, 8 Sep 2019 14:22:40 +0100 Subject: [PATCH] Make exporting of Soloed Tracks WY(S/H)IWYG Now the export (should) exactly match the (selected) non greyed out tracks. i.e. what you see and hear is what you export - no matter which mode of mute/solo you choose. This is now applied not just to export but also to export multiple. --- src/Track.h | 2 ++ src/export/Export.cpp | 13 +++++++++---- src/export/ExportMultiple.cpp | 20 ++++++++++++++++---- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/Track.h b/src/Track.h index 8578b8a21..697f780ae 100644 --- a/src/Track.h +++ b/src/Track.h @@ -737,6 +737,8 @@ public: bool GetMute () const { return mMute; } bool GetSolo () const { return mSolo; } + bool GetNotMute () const { return !mMute; } + bool GetNotSolo () const { return !mSolo; } void SetMute (bool m); void SetSolo (bool s); diff --git a/src/export/Export.cpp b/src/export/Export.cpp index a1d42f59b..9d5cd8037 100644 --- a/src/export/Export.cpp +++ b/src/export/Export.cpp @@ -250,9 +250,12 @@ std::unique_ptr ExportPlugin::CreateMixer(const TrackList &tracks, bool highQuality, MixerSpec *mixerSpec) { WaveTrackConstArray inputTracks; + + bool anySolo = !(( tracks.Any() + &WaveTrack::GetSolo ).empty()); + auto range = tracks.Any< const WaveTrack >() + (selectionOnly ? &Track::IsSelected : &Track::Any ) - - &WaveTrack::GetMute; + - ( anySolo ? &WaveTrack::GetNotSolo : &WaveTrack::GetMute); for (auto pTrack: range) inputTracks.push_back( pTrack->SharedPointer< const WaveTrack >() ); @@ -503,10 +506,12 @@ bool Exporter::ExamineTracks() auto &tracks = TrackList::Get( *mProject ); + bool anySolo = !(( tracks.Any() + &WaveTrack::GetSolo ).empty()); + for (auto tr : tracks.Any< const WaveTrack >() + ( mSelectedOnly ? &Track::IsSelected : &Track::Any ) - - &WaveTrack::GetMute + - ( anySolo ? &WaveTrack::GetNotSolo : &WaveTrack::GetMute) ) { mNumSelected++; @@ -1364,8 +1369,8 @@ ExportMixerDialog::ExportMixerDialog( const TrackList *tracks, bool selectedOnly for (auto t : tracks->Any< const WaveTrack >() - + (anySolo ? &WaveTrack::GetSolo : ( selectedOnly ? &Track::IsSelected : &Track::Any ) ) - - &WaveTrack::GetMute + + ( selectedOnly ? &Track::IsSelected : &Track::Any ) + - ( anySolo ? &WaveTrack::GetNotSolo : &WaveTrack::GetMute) ) { numTracks++; const wxString sTrackName = (t->GetName()).Left(20); diff --git a/src/export/ExportMultiple.cpp b/src/export/ExportMultiple.cpp index fd018a5a9..32c06b663 100644 --- a/src/export/ExportMultiple.cpp +++ b/src/export/ExportMultiple.cpp @@ -168,8 +168,11 @@ ExportMultiple::~ExportMultiple() void ExportMultiple::CountTracksAndLabels() { + bool anySolo = !(( mTracks->Any() + &WaveTrack::GetSolo ).empty()); + mNumWaveTracks = - (mTracks->Leaders< const WaveTrack >() - &WaveTrack::GetMute).size(); + (mTracks->Leaders< const WaveTrack >() - + (anySolo ? &WaveTrack::GetNotSolo : &WaveTrack::GetMute)).size(); // only the first label track mLabels = *mTracks->Any< const LabelTrack >().begin(); @@ -654,9 +657,12 @@ static unsigned GetNumExportChannels( const TrackList &tracks ) //int numMono = 0; /* track iteration kit */ + bool anySolo = !(( tracks.Any() + &WaveTrack::GetSolo ).empty()); + // Want only unmuted wave tracks. for (auto tr : - tracks.Any< const WaveTrack >() - &WaveTrack::GetMute + tracks.Any< const WaveTrack >() - + (anySolo ? &WaveTrack::GetNotSolo : &WaveTrack::GetMute) ) { // Found a left channel if (tr->GetChannel() == Track::LeftChannel) { @@ -860,8 +866,11 @@ ProgressResult ExportMultiple::ExportMultipleByTrack(bool byName, for (auto tr : mTracks->Selected()) tr->SetSelected(false); + bool anySolo = !(( mTracks->Any() + &WaveTrack::GetSolo ).empty()); + /* Examine all tracks in turn, collecting export information */ - for (auto tr : mTracks->Leaders() - &WaveTrack::GetMute) { + for (auto tr : mTracks->Leaders() - + (anySolo ? &WaveTrack::GetNotSolo : &WaveTrack::GetMute)) { // Get the times for the track auto channels = TrackList::Channels(tr); @@ -940,7 +949,10 @@ 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 pDialog; - for (auto tr : mTracks->Leaders() - &WaveTrack::GetMute) { + + for (auto tr : mTracks->Leaders() - + (anySolo ? &WaveTrack::GetNotSolo : &WaveTrack::GetMute)) { + wxLogDebug( "Get setting %i", count ); /* get the settings to use for the export from the array */ activeSetting = exportSettings[count];