From 7f950f800aec1e1147188d4c7fc338c941bafa2b Mon Sep 17 00:00:00 2001 From: Grygorii Zharun Date: Wed, 21 May 2014 04:23:18 -0500 Subject: [PATCH] [Summary] Fixed issue with possibility to disable outputs in StereOut when we have 2 or 1 channel [git-p4: depot-paths = "//Abdaw/dev_main/tracks/": change = 462199] --- libs/ardour/engine_state_controller.cc | 58 +++++++++++++++----------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/libs/ardour/engine_state_controller.cc b/libs/ardour/engine_state_controller.cc index 73bc07d127..0bb9bd7c06 100644 --- a/libs/ardour/engine_state_controller.cc +++ b/libs/ardour/engine_state_controller.cc @@ -501,43 +501,53 @@ EngineStateController::set_physical_audio_output_state(const std::string& port_n // get next element ChannelStateList::iterator next_state_iter(target_state_iter); - + // loopback if (++next_state_iter == output_states.end() ) { next_state_iter = output_states.begin(); } + - // if current was set to active - activate next and disable the rest - if (target_state_iter->active ) { + // only two outputs should be enabled + if (output_states.size() <= 2) { + + target_state_iter->active = true; next_state_iter->active = true; + } else { - // if current was deactivated but the next is active - if (next_state_iter->active) { - if (++next_state_iter == output_states.end() ) { - next_state_iter = output_states.begin(); - } + + // if current was set to active - activate next and disable the rest + if (target_state_iter->active ) { next_state_iter->active = true; } else { - // if current was deactivated but the previous is active - restore the state of current - target_state_iter->active = true; // state restored; - --target_state_iter; // switch to previous to make it stop point - target_state_iter->active = true; - } - } - - while (++next_state_iter != target_state_iter) { - - if (next_state_iter == output_states.end() ) { - next_state_iter = output_states.begin(); - // we jumped, so additional check is required - if (next_state_iter == target_state_iter) { - break; + // if current was deactivated but the next is active + if (next_state_iter->active) { + if (++next_state_iter == output_states.end() ) { + next_state_iter = output_states.begin(); + } + next_state_iter->active = true; + } else { + // if current was deactivated but the previous is active - restore the state of current + target_state_iter->active = true; // state restored; + --target_state_iter; // switch to previous to make it stop point + target_state_iter->active = true; } } - next_state_iter->active = false; - } + while (++next_state_iter != target_state_iter) { + + if (next_state_iter == output_states.end() ) { + next_state_iter = output_states.begin(); + // we jumped, so additional check is required + if (next_state_iter == target_state_iter) { + break; + } + } + + next_state_iter->active = false; + } + } } AudioEngine::instance()->reconnect_session_routes();