From 19ebdba1cbde4eca74af501fe500db05b1ac69d0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 27 Jan 2012 22:47:16 +0000 Subject: restore independent gain control over click/metronome git-svn-id: svn://localhost/ardour2/branches/3.0@11370 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/rc_configuration_vars.h | 1 + libs/ardour/ardour/session.h | 19 +++++++++++-------- libs/ardour/session.cc | 16 ++++++++++++---- libs/ardour/session_click.cc | 6 ++++-- libs/ardour/session_state.cc | 23 ++++++++++++++++++----- 5 files changed, 46 insertions(+), 19 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/rc_configuration_vars.h b/libs/ardour/ardour/rc_configuration_vars.h index 5c38c33af1..840a23601f 100644 --- a/libs/ardour/ardour/rc_configuration_vars.h +++ b/libs/ardour/ardour/rc_configuration_vars.h @@ -107,6 +107,7 @@ CONFIG_VARIABLE (bool, quieten_at_speed, "quieten-at-speed", true) CONFIG_VARIABLE (bool, clicking, "clicking", false) CONFIG_VARIABLE (std::string, click_sound, "click-sound", "") CONFIG_VARIABLE (std::string, click_emphasis_sound, "click-emphasis-sound", "") +CONFIG_VARIABLE (gain_t, click_gain, "click-gain", 1.0) /* transport control and related */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index fef6b7232e..823e5e4bbc 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -85,6 +85,7 @@ namespace Evoral { namespace ARDOUR { +class Amp; class AudioEngine; class AudioFileSource; class AudioRegion; @@ -723,6 +724,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi /* clicking */ boost::shared_ptr click_io() { return _click_io; } + boost::shared_ptr click_gain() { return _click_gain; } /* disk, buffer loads */ @@ -1377,14 +1379,15 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi /* click track */ typedef std::list Clicks; - Clicks clicks; - bool _clicking; - boost::shared_ptr _click_io; - Sample* click_data; - Sample* click_emphasis_data; - framecnt_t click_length; - framecnt_t click_emphasis_length; - mutable Glib::RWLock click_lock; + Clicks clicks; + bool _clicking; + boost::shared_ptr _click_io; + boost::shared_ptr _click_gain; + Sample* click_data; + Sample* click_emphasis_data; + framecnt_t click_length; + framecnt_t click_emphasis_length; + mutable Glib::RWLock click_lock; static const Sample default_click[]; static const framecnt_t default_click_length; diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index e205ac3e82..30e80b2627 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -377,19 +377,27 @@ Session::when_engine_running () XMLNode* child = 0; _click_io.reset (new ClickIO (*this, "click")); + _click_gain.reset (new Amp (*this)); + _click_gain->activate (); if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) { /* existing state for Click */ - int c; + int c = 0; if (Stateful::loading_state_version < 3000) { c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false); } else { - c = _click_io->set_state (*child->children().front(), Stateful::loading_state_version); + const XMLNodeList& children (child->children()); + XMLNodeList::const_iterator i = children.begin(); + if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) { + ++i; + if (i != children.end()) { + c = _click_gain->set_state (**i, Stateful::loading_state_version); + } + } } - - + if (c == 0) { _clicking = Config->get_clicking (); diff --git a/libs/ardour/session_click.cc b/libs/ardour/session_click.cc index 03892b6023..e36c871fae 100644 --- a/libs/ardour/session_click.cc +++ b/libs/ardour/session_click.cc @@ -20,6 +20,7 @@ #include #include +#include "ardour/amp.h" #include "ardour/ardour.h" #include "ardour/audio_buffer.h" #include "ardour/buffer_set.h" @@ -118,9 +119,9 @@ Session::click (framepos_t start, framecnt_t nframes) } copy = min (clk->duration - clk->offset, nframes - internal_offset); - + memcpy (buf + internal_offset, &clk->data[clk->offset], copy * sizeof (Sample)); - + clk->offset += copy; if (clk->offset >= clk->duration) { @@ -131,6 +132,7 @@ Session::click (framepos_t start, framecnt_t nframes) } } + _click_gain->run (bufs, 0, 0, nframes, false); _click_io->copy_to_outputs (bufs, DataType::AUDIO, nframes, 0); } diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index e4107649b5..4cf14cdaf9 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1167,15 +1167,16 @@ Session::state(bool full_state) } if (_click_io) { - child = node->add_child ("Click"); - child->add_child_nocopy (_click_io->state (full_state)); + XMLNode* gain_child = node->add_child ("Click"); + gain_child->add_child_nocopy (_click_io->state (full_state)); + gain_child->add_child_nocopy (_click_gain->state (full_state)); } if (full_state) { - child = node->add_child ("NamedSelections"); + XMLNode* ns_child = node->add_child ("NamedSelections"); for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) { if (full_state) { - child->add_child_nocopy ((*i)->get_state()); + ns_child->add_child_nocopy ((*i)->get_state()); } } } @@ -1409,7 +1410,13 @@ Session::set_state (const XMLNode& node, int version) if ((child = find_named_node (node, "Click")) == 0) { warning << _("Session: XML state has no click section") << endmsg; } else if (_click_io) { - _click_io->set_state (*child, version); + const XMLNodeList& children (child->children()); + XMLNodeList::const_iterator i = children.begin(); + _click_io->set_state (**i, version); + ++i; + if (i != children.end()) { + _click_gain->set_state (**i, version); + } } if ((child = find_named_node (node, "ControlProtocols")) != 0) { @@ -3481,6 +3488,12 @@ Session::config_changed (std::string p, bool ours) _clicking = false; } + } else if (p == "click-gain") { + + if (_click_gain) { + _click_gain->set_gain (Config->get_click_gain(), this); + } + } else if (p == "send-mtc") { if (Config->get_send_mtc ()) { -- cgit v1.2.3