mirror of
https://github.com/cookiengineer/audacity
synced 2025-06-17 16:40:07 +02:00
Remove GetLink(ed) in channel manipulation menu items
This commit is contained in:
parent
ecc869bdbe
commit
c107fb298b
@ -562,6 +562,8 @@ protected:
|
|||||||
void OnChannelChange(wxCommandEvent & event);
|
void OnChannelChange(wxCommandEvent & event);
|
||||||
void OnMergeStereo(wxCommandEvent & event);
|
void OnMergeStereo(wxCommandEvent & event);
|
||||||
|
|
||||||
|
// TODO: more-than-two-channels
|
||||||
|
// How should we define generalized channel manipulation operations?
|
||||||
void SplitStereo(bool stereo);
|
void SplitStereo(bool stereo);
|
||||||
|
|
||||||
void OnSwapChannels(wxCommandEvent & event);
|
void OnSwapChannels(wxCommandEvent & event);
|
||||||
@ -603,23 +605,28 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
|
|||||||
(display == WaveTrack::Spectrum) && !bAudioBusy);
|
(display == WaveTrack::Spectrum) && !bAudioBusy);
|
||||||
|
|
||||||
AudacityProject *const project = ::GetActiveProject();
|
AudacityProject *const project = ::GetActiveProject();
|
||||||
|
TrackList *const tracks = project->GetTracks();
|
||||||
bool unsafe = EffectManager::Get().RealtimeIsActive() &&
|
bool unsafe = EffectManager::Get().RealtimeIsActive() &&
|
||||||
project->IsAudioActive();
|
project->IsAudioActive();
|
||||||
|
|
||||||
const bool isMono = !pTrack->GetLink();
|
auto nChannels = TrackList::Channels(pTrack).size();
|
||||||
|
const bool isMono = ( nChannels == 1 );
|
||||||
|
const bool isStereo = ( nChannels == 2 );
|
||||||
|
// Maybe more than stereo tracks some time?
|
||||||
|
|
||||||
if ( isMono )
|
if ( isMono )
|
||||||
{
|
{
|
||||||
mpData = static_cast<TrackControls::InitMenuData*>(pUserData);
|
mpData = static_cast<TrackControls::InitMenuData*>(pUserData);
|
||||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||||
|
|
||||||
TrackList *const tracks = project->GetTracks();
|
|
||||||
auto next = * ++ tracks->Find(pTrack);
|
auto next = * ++ tracks->Find(pTrack);
|
||||||
|
|
||||||
if (isMono) {
|
if (isMono) {
|
||||||
const bool canMakeStereo =
|
const bool canMakeStereo =
|
||||||
(next && !next->GetLinked()
|
(next &&
|
||||||
&& pTrack->GetKind() == Track::Wave
|
TrackList::Channels(next).size() == 1 &&
|
||||||
&& next->GetKind() == Track::Wave);
|
track_cast<WaveTrack*>(next));
|
||||||
|
|
||||||
pMenu->Enable(OnMergeStereoID, canMakeStereo && !unsafe);
|
pMenu->Enable(OnMergeStereoID, canMakeStereo && !unsafe);
|
||||||
|
|
||||||
int itemId;
|
int itemId;
|
||||||
@ -647,8 +654,8 @@ void WaveTrackMenuTable::InitMenu(Menu *pMenu, void *pUserData)
|
|||||||
return end != std::find(checkedIds.begin(), end, id);
|
return end != std::find(checkedIds.begin(), end, id);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Enable this only for properly stereo tracks:
|
||||||
pMenu->Enable(OnSwapChannelsID, !isMono && !unsafe);
|
pMenu->Enable(OnSwapChannelsID, isStereo && !unsafe);
|
||||||
pMenu->Enable(OnSplitStereoID, !isMono && !unsafe);
|
pMenu->Enable(OnSplitStereoID, !isMono && !unsafe);
|
||||||
|
|
||||||
#ifndef EXPERIMENTAL_DA
|
#ifndef EXPERIMENTAL_DA
|
||||||
@ -836,11 +843,16 @@ void WaveTrackMenuTable::OnChannelChange(wxCommandEvent & event)
|
|||||||
/// Merge two tracks into one stereo track ??
|
/// Merge two tracks into one stereo track ??
|
||||||
void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &)
|
void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &)
|
||||||
{
|
{
|
||||||
|
AudacityProject *const project = ::GetActiveProject();
|
||||||
|
const auto tracks = project->GetTracks();
|
||||||
|
|
||||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||||
wxASSERT(pTrack);
|
wxASSERT(pTrack);
|
||||||
|
|
||||||
|
auto partner = static_cast< WaveTrack * >
|
||||||
|
( *tracks->Find( pTrack ).advance( 1 ) );
|
||||||
|
|
||||||
pTrack->SetLinked(true);
|
pTrack->SetLinked(true);
|
||||||
// Assume partner is wave or null
|
|
||||||
const auto partner = static_cast<WaveTrack*>(pTrack->GetLink());
|
|
||||||
|
|
||||||
if (partner) {
|
if (partner) {
|
||||||
// Set partner's parameters to match target.
|
// Set partner's parameters to match target.
|
||||||
@ -884,51 +896,40 @@ void WaveTrackMenuTable::OnMergeStereo(wxCommandEvent &)
|
|||||||
mpData->result = RefreshCode::RefreshAll;
|
mpData->result = RefreshCode::RefreshAll;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Split a stereo track into two tracks...
|
/// Split a stereo track (or more-than-stereo?) into two (or more) tracks...
|
||||||
void WaveTrackMenuTable::SplitStereo(bool stereo)
|
void WaveTrackMenuTable::SplitStereo(bool stereo)
|
||||||
{
|
{
|
||||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||||
wxASSERT(pTrack);
|
wxASSERT(pTrack);
|
||||||
|
AudacityProject *const project = ::GetActiveProject();
|
||||||
|
auto channels = TrackList::Channels( pTrack );
|
||||||
|
|
||||||
if (stereo)
|
|
||||||
pTrack->SetPanFromChannelType();
|
|
||||||
pTrack->SetChannel(Track::MonoChannel);
|
|
||||||
|
|
||||||
// Assume partner is present, and is wave
|
int totalHeight = 0;
|
||||||
const auto partner = static_cast<WaveTrack*>(pTrack->GetLink());
|
int nChannels = 0;
|
||||||
wxASSERT(partner);
|
for (auto channel : channels) {
|
||||||
if (!partner)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (partner)
|
|
||||||
{
|
|
||||||
// Keep original stereo track name.
|
// Keep original stereo track name.
|
||||||
partner->SetName(pTrack->GetName());
|
channel->SetName(pTrack->GetName());
|
||||||
if (stereo)
|
if (stereo)
|
||||||
partner->SetPanFromChannelType();
|
channel->SetPanFromChannelType();
|
||||||
partner->SetChannel(Track::MonoChannel);
|
channel->SetChannel(Track::MonoChannel);
|
||||||
|
|
||||||
//On Demand - have each channel add its own.
|
//On Demand - have each channel add its own.
|
||||||
if (ODManager::IsInstanceCreated() && partner->GetKind() == Track::Wave)
|
if (ODManager::IsInstanceCreated())
|
||||||
ODManager::Instance()->MakeWaveTrackIndependent(partner);
|
ODManager::Instance()->MakeWaveTrackIndependent(channel);
|
||||||
|
//make sure no channel is smaller than its minimum height
|
||||||
|
if (channel->GetHeight() < channel->GetMinimizedHeight())
|
||||||
|
channel->SetHeight(channel->GetMinimizedHeight());
|
||||||
|
totalHeight += channel->GetHeight();
|
||||||
|
++nChannels;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTrack->SetLinked(false);
|
pTrack->SetLinked(false);
|
||||||
//make sure neither track is smaller than its minimum height
|
int averageHeight = totalHeight / nChannels;
|
||||||
if (pTrack->GetHeight() < pTrack->GetMinimizedHeight())
|
|
||||||
pTrack->SetHeight(pTrack->GetMinimizedHeight());
|
|
||||||
if (partner)
|
|
||||||
{
|
|
||||||
if (partner->GetHeight() < partner->GetMinimizedHeight())
|
|
||||||
partner->SetHeight(partner->GetMinimizedHeight());
|
|
||||||
|
|
||||||
|
for (auto channel : channels)
|
||||||
// Make tracks the same height
|
// Make tracks the same height
|
||||||
if (pTrack->GetHeight() != partner->GetHeight())
|
channel->SetHeight( averageHeight );
|
||||||
{
|
|
||||||
pTrack->SetHeight((pTrack->GetHeight() + partner->GetHeight()) / 2.0);
|
|
||||||
partner->SetHeight(pTrack->GetHeight());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mpData->result = RefreshCode::RefreshAll;
|
mpData->result = RefreshCode::RefreshAll;
|
||||||
}
|
}
|
||||||
@ -939,14 +940,19 @@ void WaveTrackMenuTable::OnSwapChannels(wxCommandEvent &)
|
|||||||
AudacityProject *const project = ::GetActiveProject();
|
AudacityProject *const project = ::GetActiveProject();
|
||||||
|
|
||||||
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
WaveTrack *const pTrack = static_cast<WaveTrack*>(mpData->pTrack);
|
||||||
// Assume partner is wave or null
|
auto channels = TrackList::Channels( pTrack );
|
||||||
const auto partner = static_cast<WaveTrack*>(pTrack->GetLink());
|
if (channels.size() != 2)
|
||||||
|
return;
|
||||||
|
|
||||||
Track *const focused = project->GetTrackPanel()->GetFocusedTrack();
|
Track *const focused = project->GetTrackPanel()->GetFocusedTrack();
|
||||||
const bool hasFocus =
|
const bool hasFocus = channels.contains( focused );
|
||||||
(focused == pTrack || focused == partner);
|
|
||||||
|
auto first = *channels.begin();
|
||||||
|
auto partner = *channels.rbegin();
|
||||||
|
|
||||||
SplitStereo(false);
|
SplitStereo(false);
|
||||||
pTrack->SetChannel(Track::RightChannel);
|
|
||||||
|
first->SetChannel(Track::RightChannel);
|
||||||
partner->SetChannel(Track::LeftChannel);
|
partner->SetChannel(Track::LeftChannel);
|
||||||
|
|
||||||
TrackList *const tracks = project->GetTracks();
|
TrackList *const tracks = project->GetTracks();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user