along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- $Id$
*/
#ifndef __ardour_route_h__
#include <ardour/ardour.h>
#include <ardour/io.h>
#include <ardour/session.h>
-#include <ardour/redirect.h>
+#include <ardour/io_processor.h>
#include <ardour/types.h>
namespace ARDOUR {
-class Insert;
+class Processor;
class Send;
class RouteGroup;
{
protected:
- typedef list<boost::shared_ptr<Redirect> > RedirectList;
+ typedef list<boost::shared_ptr<Processor> > ProcessorList;
+
public:
enum Flag {
Route (Session&, const XMLNode&, DataType default_type = DataType::AUDIO);
virtual ~Route();
+ static std::string ensure_track_or_route_name(std::string, Session &);
+
std::string comment() { return _comment; }
void set_comment (std::string str, void *src);
long order_key (const char* name) const;
void set_order_key (const char* name, long n);
- bool hidden() const { return _flags & Hidden; }
- bool master() const { return _flags & MasterOut; }
- bool control() const { return _flags & ControlOut; }
+ bool is_hidden() const { return _flags & Hidden; }
+ bool is_master() const { return _flags & MasterOut; }
+ bool is_control() const { return _flags & ControlOut; }
/* these are the core of the API of a Route. see the protected sections as well */
virtual bool can_record() { return false; }
virtual void set_record_enable (bool yn, void *src) {}
virtual bool record_enabled() const { return false; }
- virtual void handle_transport_stopped (bool abort, bool did_locate, bool flush_redirects);
+ virtual void handle_transport_stopped (bool abort, bool did_locate, bool flush_processors);
virtual void set_pending_declick (int);
/* end of vfunc-based API */
void set_gain (gain_t val, void *src);
void inc_gain (gain_t delta, void *src);
-
- bool active() const { return _active; }
- void set_active (bool yn);
-
+
void set_solo (bool yn, void *src);
bool soloed() const { return _soloed; }
void set_mute (bool yn, void *src);
bool muted() const { return _muted; }
+ bool solo_muted() const { return desired_solo_gain == 0.0; }
void set_mute_config (mute_type, bool, void *src);
bool get_mute_config (mute_type);
- void set_phase_invert (bool yn, void *src);
- bool phase_invert() const { return _phase_invert; }
-
void set_edit_group (RouteGroup *, void *);
void drop_edit_group (void *);
RouteGroup *edit_group () { return _edit_group; }
virtual void set_meter_point (MeterPoint, void *src);
MeterPoint meter_point() const { return _meter_point; }
- /* Redirects */
+ /* Processors */
- void flush_redirects ();
+ void flush_processors ();
- template<class T> void foreach_redirect (T *obj, void (T::*func)(boost::shared_ptr<Redirect>)) {
- Glib::RWLock::ReaderLock lm (redirect_lock);
- for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
+ template<class T> void foreach_processor (T *obj, void (T::*func)(boost::shared_ptr<Processor>)) {
+ Glib::RWLock::ReaderLock lm (_processor_lock);
+ for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
(obj->*func) (*i);
}
}
- boost::shared_ptr<Redirect> nth_redirect (uint32_t n) {
- Glib::RWLock::ReaderLock lm (redirect_lock);
- RedirectList::iterator i;
- for (i = _redirects.begin(); i != _redirects.end() && n; ++i, --n);
- if (i == _redirects.end()) {
- return boost::shared_ptr<Redirect> ();
+ boost::shared_ptr<Processor> nth_processor (uint32_t n) {
+ Glib::RWLock::ReaderLock lm (_processor_lock);
+ ProcessorList::iterator i;
+ for (i = _processors.begin(); i != _processors.end() && n; ++i, --n);
+ if (i == _processors.end()) {
+ return boost::shared_ptr<IOProcessor> ();
} else {
return *i;
}
}
- uint32_t max_redirect_outs () const { return redirect_max_outs; }
-
- int add_redirect (boost::shared_ptr<Redirect>, void *src, uint32_t* err_streams = 0);
- int add_redirects (const RedirectList&, void *src, uint32_t* err_streams = 0);
- int remove_redirect (boost::shared_ptr<Redirect>, void *src, uint32_t* err_streams = 0);
- int copy_redirects (const Route&, Placement, uint32_t* err_streams = 0);
- int sort_redirects (uint32_t* err_streams = 0);
-
- void clear_redirects (void *src);
- void all_redirects_flip();
- void all_redirects_active (bool state);
+ ChanCount max_processor_outs () const { return processor_max_outs; }
+ ChanCount pre_fader_streams() const;
+
+ /** A record of the stream configuration at some point in the processor list.
+ * Used to return where and why an processor list configuration request failed.
+ */
+ struct ProcessorStreams {
+ ProcessorStreams(size_t i=0, ChanCount c=ChanCount()) : index(i), count(c) {}
+
+ size_t index; ///< Index of processor where configuration failed
+ ChanCount count; ///< Input requested of processor
+ };
+
+ int add_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0);
+ int add_processors (const ProcessorList&, ProcessorStreams* err = 0);
+ int remove_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0);
+ int copy_processors (const Route&, Placement, ProcessorStreams* err = 0);
+ int sort_processors (ProcessorStreams* err = 0);
+ void disable_processors (Placement);
+ void disable_processors ();
+ void disable_plugins (Placement);
+ void disable_plugins ();
+ void ab_plugins (bool forward);
+ void clear_processors (Placement);
+ void all_processors_flip();
+ void all_processors_active (Placement, bool state);
virtual nframes_t update_total_latency();
- nframes_t signal_latency() const { return _own_latency; }
- virtual void set_latency_delay (nframes_t);
+ void set_latency_delay (nframes_t);
+ void set_user_latency (nframes_t);
+ nframes_t initial_delay() const { return _initial_delay; }
sigc::signal<void,void*> solo_changed;
sigc::signal<void,void*> solo_safe_changed;
sigc::signal<void,void*> post_fader_changed;
sigc::signal<void,void*> control_outs_changed;
sigc::signal<void,void*> main_outs_changed;
- sigc::signal<void,void*> redirects_changed;
+ sigc::signal<void> processors_changed;
sigc::signal<void,void*> record_enable_changed;
sigc::signal<void,void*> edit_group_changed;
sigc::signal<void,void*> mix_group_changed;
- sigc::signal<void> active_changed;
sigc::signal<void,void*> meter_change;
+ sigc::signal<void> signal_latency_changed;
+ sigc::signal<void> initial_delay_changed;
/* gui's call this for their own purposes. */
int set_state(const XMLNode& node);
virtual XMLNode& get_template();
+ XMLNode& get_processor_state ();
+ int set_processor_state (const XMLNode&);
+
sigc::signal<void,void*> SelectedChanged;
int set_control_outs (const vector<std::string>& ports);
ToggleType type;
};
- PBD::Controllable& solo_control() {
+ boost::shared_ptr<PBD::Controllable> solo_control() {
return _solo_control;
}
- PBD::Controllable& mute_control() {
+ boost::shared_ptr<PBD::Controllable> mute_control() {
return _mute_control;
}
- void automation_snapshot (nframes_t now);
+ void automation_snapshot (nframes_t now, bool force=false);
void protect_automation ();
void set_remote_control_id (uint32_t id);
uint32_t remote_control_id () const;
sigc::signal<void> RemoteControlIDChanged;
+ void sync_order_keys ();
+ static sigc::signal<void> SyncOrderKeys;
+
protected:
friend class Session;
bool _muted : 1;
bool _soloed : 1;
- bool _solo_muted : 1;
bool _solo_safe : 1;
- bool _phase_invert : 1;
bool _recordable : 1;
- bool _active : 1;
bool _mute_affects_pre_fader : 1;
bool _mute_affects_post_fader : 1;
bool _mute_affects_control_outs : 1;
gain_t desired_solo_gain;
gain_t desired_mute_gain;
- nframes_t check_initial_delay (nframes_t, nframes_t&, nframes_t&);
+
nframes_t _initial_delay;
nframes_t _roll_delay;
- nframes_t _own_latency;
- RedirectList _redirects;
- Glib::RWLock redirect_lock;
- IO *_control_outs;
- Glib::Mutex control_outs_lock;
- RouteGroup *_edit_group;
- RouteGroup *_mix_group;
- std::string _comment;
- bool _have_internal_generator;
-
- ToggleControllable _solo_control;
- ToggleControllable _mute_control;
+ ProcessorList _processors;
+ Glib::RWLock _processor_lock;
+ IO *_control_outs;
+ Glib::Mutex _control_outs_lock;
+ RouteGroup *_edit_group;
+ RouteGroup *_mix_group;
+ std::string _comment;
+ bool _have_internal_generator;
+
+ boost::shared_ptr<ToggleControllable> _solo_control;
+ boost::shared_ptr<ToggleControllable> _mute_control;
+
+ nframes_t check_initial_delay (nframes_t, nframes_t&, nframes_t&);
void passthru (nframes_t start_frame, nframes_t end_frame,
nframes_t nframes, nframes_t offset, int declick, bool meter_inputs);
- void process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
+ virtual void process_output_buffers (BufferSet& bufs,
nframes_t start_frame, nframes_t end_frame,
- nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
+ nframes_t nframes, nframes_t offset, bool with_processors, int declick,
bool meter);
protected:
- /* for derived classes */
virtual XMLNode& state(bool);
+ void passthru_silence (nframes_t start_frame, nframes_t end_frame,
+ nframes_t nframes, nframes_t offset, int declick,
+ bool meter);
+
void silence (nframes_t nframes, nframes_t offset);
+
sigc::connection input_signal_connection;
- uint32_t redirect_max_outs;
+ ChanCount processor_max_outs;
uint32_t _remote_control_id;
uint32_t pans_required() const;
- uint32_t n_process_buffers ();
+ ChanCount n_process_buffers ();
- virtual int _set_state (const XMLNode&, bool call_base);
+ virtual int _set_state (const XMLNode&, bool call_base);
+ virtual void _set_processor_states (const XMLNodeList&);
private:
void init ();
void input_change_handler (IOChange, void *src);
void output_change_handler (IOChange, void *src);
- bool legal_redirect (Redirect&);
- int reset_plugin_counts (uint32_t*); /* locked */
- int _reset_plugin_counts (uint32_t*); /* unlocked */
+ int reset_processor_counts (ProcessorStreams*); /* locked */
+ int _reset_processor_counts (ProcessorStreams*); /* unlocked */
- /* plugin count handling */
+ /* processor I/O channels and plugin count handling */
- struct InsertCount {
- boost::shared_ptr<ARDOUR::Insert> insert;
- int32_t cnt;
- int32_t in;
- int32_t out;
+ struct ProcessorCount {
+ boost::shared_ptr<ARDOUR::Processor> processor;
+ ChanCount in;
+ ChanCount out;
- InsertCount (boost::shared_ptr<ARDOUR::Insert> ins) : insert (ins), cnt (-1) {}
+ ProcessorCount (boost::shared_ptr<ARDOUR::Processor> ins) : processor(ins) {}
};
- int32_t apply_some_plugin_counts (std::list<InsertCount>& iclist);
- int32_t check_some_plugin_counts (std::list<InsertCount>& iclist, int32_t required_inputs, uint32_t* err_streams);
+ int32_t apply_some_processor_counts (std::list<ProcessorCount>& iclist);
+ bool check_some_processor_counts (std::list<ProcessorCount>& iclist, ChanCount required_inputs, ProcessorStreams* err_streams);
void set_deferred_state ();
- void add_redirect_from_xml (const XMLNode&);
- void redirect_active_proxy (Redirect*, void*);
+ void add_processor_from_xml (const XMLNode&);
};
} // namespace ARDOUR