- switch (_io->panner()->npanners()) {
- case 0:
- panning_link_direction_button.set_sensitive (false);
- panning_link_button.set_sensitive (false);
- return;
- case 1:
- panning_link_direction_button.set_sensitive (false);
- panning_link_button.set_sensitive (false);
- break;
- default:
- panning_link_direction_button.set_sensitive (true);
- panning_link_button.set_sensitive (true);
- }
-
- uint32_t nouts = _io->n_outputs().n_audio();
-
- switch (nouts) {
- case 0:
- case 1:
- /* relax */
- break;
-
- case 2:
- /* bring pan bar state up to date */
- update_pan_bars (false);
- break;
-
- default:
- // panner->move_puck (pan_value (pans[0], pans[1]), 0.5);
- break;
- }
-}
-
-void
-PannerUI::pan_adjustment_changed (uint32_t which)
-{
- if (!in_pan_update && which < _io->panner()->npanners()) {
-
- float xpos;
- float val = pan_adjustments[which]->get_value ();
- xpos = _io->panner()->pan_control( which )->get_value();
-
- /* add a kinda-sorta detent for the middle */
-
- if (val != 0.5 && Panner::equivalent (val, 0.5)) {
- /* this is going to be reentrant, so just
- return after it.
- */
-
- in_pan_update = true;
- pan_adjustments[which]->set_value (0.5);
- in_pan_update = false;
- return;
- }
-
- if (!Panner::equivalent (val, xpos)) {
-
- _io->panner()->streampanner(which).set_position (val);
- /* XXX
- the panner objects have no access to the session,
- so do this here. ick.
- */
- _session.set_dirty();
- }
- }
-}
-
-void
-PannerUI::pan_value_changed (uint32_t which)
-{
- ENSURE_GUI_THREAD (bind (mem_fun(*this, &PannerUI::pan_value_changed), which));
-
- if (_io->n_outputs().n_audio() > 1 && which < _io->panner()->npanners()) {
- float xpos;
- float val = pan_adjustments[which]->get_value ();
-
- _io->panner()->streampanner(which).get_position (xpos);
-
- if (!Panner::equivalent (val, xpos)) {
- in_pan_update = true;
- pan_adjustments[which]->set_value (xpos);
- in_pan_update = false;
- }
- }
-}
-
-void
-PannerUI::update_pan_bars (bool only_if_aplay)
-{
- uint32_t n;
- vector<Adjustment*>::iterator i;
-
- in_pan_update = true;
-
- /* this runs during automation playback, and moves the bar controllers
- and/or pucks around.
- */
-
- for (i = pan_adjustments.begin(), n = 0; i != pan_adjustments.end(); ++i, ++n) {
- float xpos, val;
-
- if (only_if_aplay) {
- boost::shared_ptr<AutomationList> alist (_io->panner()->streampanner(n).pan_control()->alist());
-
- if (!alist->automation_playback()) {
- continue;
- }
- }
-
- _io->panner()->streampanner(n).get_effective_position (xpos);
- val = (*i)->get_value ();
-
- if (!Panner::equivalent (val, xpos)) {
- (*i)->set_value (xpos);
- }
- }
-
- in_pan_update = false;
-}
-
-void
-PannerUI::pan_printer (char *buf, uint32_t len, Adjustment* adj)
-{
- float val = adj->get_value();
-
- if (val == 0.0f) {
- snprintf (buf, len, X_("L"));
- } else if (val == 1.0f) {
- snprintf (buf, len, X_("R"));
- } else if (Panner::equivalent (val, 0.5f)) {
- snprintf (buf, len, X_("C"));
- } else {
- /* don't print anything */
- buf[0] = '\0';
- }
-}
-
-void
-PannerUI::update_pan_sensitive ()
-{
- bool sensitive = !(_io->panner()->automation_state() & Play);
-
- switch (_io->n_outputs().n_audio()) {
- case 0:
- case 1:
- break;
- case 2:
- for (vector<PannerBar*>::iterator i = pan_bars.begin(); i != pan_bars.end(); ++i) {
- (*i)->set_sensitive (sensitive);
- }
- break;
- default:
- if (panner) {
- panner->set_sensitive (sensitive);
- }
- if (big_window) {
- big_window->set_sensitive (sensitive);
- }
- break;
- }