would you look at that! all those changes just to make the auditioner work again...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 25 Mar 2010 03:40:07 +0000 (03:40 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 25 Mar 2010 03:40:07 +0000 (03:40 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@6794 d708f5d6-7413-0410-9779-e7cbd77b26cf

16 files changed:
libs/ardour/ardour/audio_track.h
libs/ardour/ardour/auditioner.h
libs/ardour/ardour/midi_track.h
libs/ardour/ardour/route.h
libs/ardour/ardour/track.h
libs/ardour/audio_diskstream.cc
libs/ardour/audio_track.cc
libs/ardour/auditioner.cc
libs/ardour/delivery.cc
libs/ardour/midi_track.cc
libs/ardour/route.cc
libs/ardour/session.cc
libs/ardour/session_process.cc
libs/ardour/session_state.cc
libs/ardour/session_transport.cc
libs/ardour/track.cc

index faae97d85a34fc3bb097807a65d7855bdf3333a8..11c1090a63905d3a53fee450f5063528c729694f 100644 (file)
@@ -43,8 +43,8 @@ class AudioTrack : public Track
 
        boost::shared_ptr<AudioDiskstream> audio_diskstream() const;
 
-       int use_diskstream (std::string name);
-       int use_diskstream (const PBD::ID& id);
+       void use_new_diskstream ();
+        void set_diskstream (boost::shared_ptr<Diskstream>);
 
        int export_stuff (BufferSet& bufs, sframes_t start_frame, nframes_t nframes, bool enable_processing = true);
 
@@ -62,9 +62,7 @@ class AudioTrack : public Track
        int _set_state (const XMLNode&, int, bool call_base);
 
   private:
-       int  set_diskstream (boost::shared_ptr<AudioDiskstream>, void *);
        int  deprecated_use_diskstream_connections ();
-       void use_new_diskstream ();
        void set_state_part_two ();
        void set_state_part_three ();
 };
index aa525b68c9dee35b9d6de3ac9814c2d709cf1a29..f779fa845711f0f0295b68fef77ee85065344882 100644 (file)
@@ -39,6 +39,8 @@ class Auditioner : public AudioTrack
        Auditioner (Session&);
        ~Auditioner ();
 
+        int init ();
+
        void audition_region (boost::shared_ptr<Region>);
 
        ARDOUR::AudioPlaylist& prepare_playlist ();
@@ -47,15 +49,15 @@ class Auditioner : public AudioTrack
        int  play_audition (nframes_t nframes);
 
        void cancel_audition () {
-               g_atomic_int_set (&_active, 0);
+               g_atomic_int_set (&_auditioning, 0);
        }
 
-       bool active() const { return g_atomic_int_get (&_active); }
+       bool auditioning() const { return g_atomic_int_get (&_auditioning); }
 
   private:
        boost::shared_ptr<AudioRegion> the_region;
        nframes_t current_frame;
-       mutable gint _active;
+       mutable gint _auditioning;
        Glib::Mutex lock;
        nframes_t length;
 
index 1d77889d398906efcd8e4023ab71314218e2df95..133db881fb269a0660627b3a7044a41cdf5a7d2c 100644 (file)
@@ -45,8 +45,8 @@ public:
 
        boost::shared_ptr<MidiDiskstream> midi_diskstream() const;
 
-       int use_diskstream (string name);
-       int use_diskstream (const PBD::ID& id);
+       void use_new_diskstream ();
+        void set_diskstream (boost::shared_ptr<Diskstream>);
 
        void set_latency_delay (nframes_t);
 
@@ -98,8 +98,6 @@ protected:
 private:
        void write_out_of_band_data (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes);
 
-       int set_diskstream (boost::shared_ptr<MidiDiskstream> ds);
-       void use_new_diskstream ();
        void set_state_part_two ();
        void set_state_part_three ();
 
index 681d8b76812ffaee09d7252cc4d4e544152f2036..2696b500ac81fc5141b99a4aa0399791927b7b99 100644 (file)
@@ -71,6 +71,8 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
        Route (Session&, std::string name, Flag flags = Flag(0), DataType default_type = DataType::AUDIO);
        virtual ~Route();
 
+       virtual int init ();
+
        boost::shared_ptr<IO> input() const { return _input; }
        boost::shared_ptr<IO> output() const { return _output; }
 
@@ -393,9 +395,10 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
         virtual ChanCount input_streams () const;
 
   protected:
-
        virtual XMLNode& state(bool);
 
+       int configure_processors (ProcessorStreams*);
+
        void passthru_silence (sframes_t start_frame, sframes_t end_frame,
                               nframes_t nframes, int declick);
 
@@ -413,7 +416,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
        boost::shared_ptr<PeakMeter> _meter;
 
   private:
-       void init ();
        int _set_state_2X (const XMLNode&, int);
        void set_processor_state_2X (XMLNodeList const &, int);
 
@@ -427,7 +429,6 @@ class Route : public SessionObject, public AutomatableControls, public RouteGrou
 
        bool _in_configure_processors;
 
-       int configure_processors (ProcessorStreams*);
        int configure_processors_unlocked (ProcessorStreams*);
 
        bool add_processor_from_xml (const XMLNode&, ProcessorList::iterator iter);     
index 2b6704a1cb5118f26e868be56d55d642602ad13c..21428f4d2155d0de1fce1167cfa419cc442ef453 100644 (file)
@@ -35,9 +35,10 @@ class Track : public Route
 {
   public:
        Track (Session&, std::string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal, DataType default_type = DataType::AUDIO);
-
        virtual ~Track ();
 
+        int init ();
+
        bool set_name (const std::string& str);
 
        TrackMode mode () const { return _mode; }
@@ -60,8 +61,8 @@ class Track : public Route
 
        boost::shared_ptr<Diskstream> diskstream() const { return _diskstream; }
 
-       virtual int use_diskstream (std::string name) = 0;
-       virtual int use_diskstream (const PBD::ID& id) = 0;
+        virtual void use_new_diskstream () = 0;
+        virtual void set_diskstream (boost::shared_ptr<Diskstream>) = 0;
 
        nframes_t update_total_latency();
        void           set_latency_delay (nframes_t);
index e5dfb238db9058a8fe1c272cdd182c15238c7dec..b9cc41d7c50db651900c586397972c6997653312 100644 (file)
@@ -498,7 +498,6 @@ AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can
                }
        }
 
-
        if (can_record && !_last_capture_regions.empty()) {
                _last_capture_regions.clear ();
        }
@@ -666,7 +665,7 @@ AudioDiskstream::process (nframes_t transport_frame, nframes_t nframes, bool can
 
                _speed = _target_speed;
 
-       }
+       } 
 
        ret = 0;
 
index cbfef29b17e01fa6a92a79fae6d98b4d084863b2..2f4363444762b04ba68b64658efec9d36972a458 100644 (file)
@@ -52,7 +52,6 @@ using namespace PBD;
 AudioTrack::AudioTrack (Session& sess, string name, Route::Flag flag, TrackMode mode)
        : Track (sess, name, flag, mode)
 {
-       use_new_diskstream ();
 }
 
 AudioTrack::~AudioTrack ()
@@ -81,7 +80,36 @@ AudioTrack::use_new_diskstream ()
 
        _session.add_diskstream (ds);
 
-       set_diskstream (boost::dynamic_pointer_cast<AudioDiskstream> (ds), this);
+       set_diskstream (ds);
+}
+
+void
+AudioTrack::set_diskstream (boost::shared_ptr<Diskstream> ds)
+{
+       _diskstream = ds;
+        _diskstream->set_route (*this);
+       _diskstream->set_destructive (_mode == Destructive);
+       _diskstream->set_non_layered (_mode == NonLayered);
+
+       if (audio_diskstream()->deprecated_io_node) {
+
+               if (!IO::connecting_legal) {
+                       IO::ConnectingLegal.connect_same_thread (*this, boost::bind (&AudioTrack::deprecated_use_diskstream_connections, this));
+               } else {
+                       deprecated_use_diskstream_connections ();
+               }
+       }
+
+       _diskstream->set_record_enabled (false);
+       _diskstream->monitor_input (false);
+
+       DiskstreamChanged (); /* EMIT SIGNAL */
+}
+
+boost::shared_ptr<AudioDiskstream>
+AudioTrack::audio_diskstream() const
+{
+       return boost::dynamic_pointer_cast<AudioDiskstream>(_diskstream);
 }
 
 int
@@ -165,63 +193,6 @@ AudioTrack::deprecated_use_diskstream_connections ()
        return 0;
 }
 
-int
-AudioTrack::set_diskstream (boost::shared_ptr<AudioDiskstream> ds, void * /*src*/)
-{
-       _diskstream = ds;
-       _diskstream->set_route (*this);
-       _diskstream->set_destructive (_mode == Destructive);
-       _diskstream->set_non_layered (_mode == NonLayered);
-
-       if (audio_diskstream()->deprecated_io_node) {
-
-               if (!IO::connecting_legal) {
-                       IO::ConnectingLegal.connect_same_thread (*this, boost::bind (&AudioTrack::deprecated_use_diskstream_connections, this));
-               } else {
-                       deprecated_use_diskstream_connections ();
-               }
-       }
-
-       _diskstream->set_record_enabled (false);
-       _diskstream->monitor_input (false);
-
-       DiskstreamChanged (); /* EMIT SIGNAL */
-
-       return 0;
-}
-
-int
-AudioTrack::use_diskstream (string name)
-{
-       boost::shared_ptr<AudioDiskstream> dstream;
-
-       if ((dstream = boost::dynamic_pointer_cast<AudioDiskstream>(_session.diskstream_by_name (name))) == 0) {
-               error << string_compose(_("AudioTrack: audio diskstream \"%1\" not known by session"), name) << endmsg;
-               return -1;
-       }
-
-       return set_diskstream (dstream, this);
-}
-
-int
-AudioTrack::use_diskstream (const PBD::ID& id)
-{
-       boost::shared_ptr<AudioDiskstream> dstream;
-
-       if ((dstream = boost::dynamic_pointer_cast<AudioDiskstream> (_session.diskstream_by_id (id))) == 0) {
-               error << string_compose(_("AudioTrack: audio diskstream \"%1\" not known by session"), id) << endmsg;
-               return -1;
-       }
-
-       return set_diskstream (dstream, this);
-}
-
-boost::shared_ptr<AudioDiskstream>
-AudioTrack::audio_diskstream() const
-{
-       return boost::dynamic_pointer_cast<AudioDiskstream>(_diskstream);
-}
-
 int
 AudioTrack::set_state (const XMLNode& node, int version)
 {
@@ -246,41 +217,6 @@ AudioTrack::_set_state (const XMLNode& node, int version, bool call_base)
                _mode = Normal;
        }
 
-       if ((prop = node.property ("diskstream-id")) == 0) {
-
-               /* some old sessions use the diskstream name rather than the ID */
-
-               if ((prop = node.property ("diskstream")) == 0) {
-                       fatal << _("programming error: AudioTrack given state without diskstream!") << endmsg;
-                       /*NOTREACHED*/
-                       return -1;
-               }
-
-               if (use_diskstream (prop->value())) {
-                       return -1;
-               }
-
-       } else {
-
-               PBD::ID id (prop->value());
-               PBD::ID zero ("0");
-
-               /* this wierd hack is used when creating tracks from a template. there isn't
-                  a particularly good time to interpose between setting the first part of
-                  the track state (notably Route::set_state() and the track mode), and the
-                  second part (diskstream stuff). So, we have a special ID for the diskstream
-                  that means "you should create a new diskstream here, not look for
-                  an old one.
-               */
-
-               if (id == zero) {
-                       use_new_diskstream ();
-               } else if (use_diskstream (id)) {
-                       return -1;
-               }
-       }
-
-
        XMLNodeList nlist;
        XMLNodeConstIterator niter;
        XMLNode *child;
@@ -512,24 +448,13 @@ AudioTrack::roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
 
                /* copy the diskstream data to all output buffers */
 
-               size_t limit = _input->n_ports().n_audio();
+               size_t limit = input_streams ().n_audio();
                BufferSet& bufs = _session.get_scratch_buffers ();
                const size_t blimit = bufs.count().n_audio();
 
-                if (limit == 0) {
-                        /* no inputs, try for diskstream channel count */
-                        limit = diskstream->n_channels().n_audio();
-                }
-
                uint32_t n;
                uint32_t i;
 
-                cerr << _name << " Input = " << _input->n_ports() 
-                     << " Output " << _output->n_ports ()
-                     << " limit " << limit 
-                     << " blimit " << blimit
-                     << endl;
-
                if (limit > blimit) {
 
                        /* example case: auditioner configured for stereo output,
index dec9452977a5390d85583ea7023392893a308e61..f955c75ea4877c3afcef51708d58a232561ac513 100644 (file)
@@ -43,6 +43,15 @@ using namespace PBD;
 Auditioner::Auditioner (Session& s)
        : AudioTrack (s, "auditioner", Route::Hidden)
 {
+}
+
+int
+Auditioner::init ()
+{
+        if (Track::init ()) {
+                return -1;
+        }
+
        string left = _session.config.get_auditioner_output_left();
        string right = _session.config.get_auditioner_output_right();
 
@@ -64,19 +73,16 @@ Auditioner::Auditioner (Session& s)
 
        if ((left.length() == 0) && (right.length() == 0)) {
                warning << _("no outputs available for auditioner - manual connection required") << endmsg;
-               return;
+               return -1;
        }
 
        _main_outs->defer_pan_reset ();
 
-        cerr << "Aud connect " << left << " + " << right << endl;
-
        if (left.length()) {
                _output->add_port (left, this, DataType::AUDIO);
        }
 
        if (right.length()) {
-               audio_diskstream()->add_channel (1);
                _output->add_port (right, this, DataType::AUDIO);
        }
 
@@ -86,7 +92,9 @@ Auditioner::Auditioner (Session& s)
        _output->changed.connect_same_thread (*this, boost::bind (&Auditioner::output_changed, this, _1, _2));
 
        the_region.reset ((AudioRegion*) 0);
-       g_atomic_int_set (&_active, 0);
+       g_atomic_int_set (&_auditioning, 0);
+
+        return 0;
 }
 
 Auditioner::~Auditioner ()
@@ -107,7 +115,7 @@ Auditioner::prepare_playlist ()
 void
 Auditioner::audition_current_playlist ()
 {
-       if (g_atomic_int_get (&_active)) {
+       if (g_atomic_int_get (&_auditioning)) {
                /* don't go via session for this, because we are going
                   to remain active.
                */
@@ -123,13 +131,13 @@ Auditioner::audition_current_playlist ()
 
        _main_outs->panner()->reset (n_outputs().n_audio(), _diskstream->n_channels().n_audio());
 
-       g_atomic_int_set (&_active, 1);
+       g_atomic_int_set (&_auditioning, 1);
 }
 
 void
 Auditioner::audition_region (boost::shared_ptr<Region> region)
 {
-       if (g_atomic_int_get (&_active)) {
+       if (g_atomic_int_get (&_auditioning)) {
                /* don't go via session for this, because we are going
                   to remain active.
                */
@@ -157,6 +165,13 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
                audio_diskstream()->remove_channel (_diskstream->n_channels().n_audio() - the_region->n_channels());
        }
 
+        ProcessorStreams ps;
+        if (configure_processors (&ps)) {
+                error << string_compose (_("Cannot setup auditioner processing flow for %1 channels"), 
+                                         _diskstream->n_channels()) << endmsg;
+                return;
+        }
+
        /* force a panner reset now that we have all channels */
 
        _main_outs->reset_panner();
@@ -175,7 +190,7 @@ Auditioner::audition_region (boost::shared_ptr<Region> region)
        _diskstream->seek (offset);
        current_frame = offset;
 
-       g_atomic_int_set (&_active, 1);
+       g_atomic_int_set (&_auditioning, 1);
 }
 
 int
@@ -185,7 +200,7 @@ Auditioner::play_audition (nframes_t nframes)
        nframes_t this_nframes;
        int ret;
 
-       if (g_atomic_int_get (&_active) == 0) {
+       if (g_atomic_int_get (&_auditioning) == 0) {
                silence (nframes);
                return 0;
        }
@@ -194,10 +209,7 @@ Auditioner::play_audition (nframes_t nframes)
 
        _diskstream->prepare ();
 
-        cerr << "Auditioner rolls, gain = " << gain_control()->get_value() << endl;
-
        if ((ret = roll (this_nframes, current_frame, current_frame + nframes, false, false, false)) != 0) {
-                cerr << "\troll failed\n";
                silence (nframes);
                return ret;
        }
index eaf58c0a9bca120ba15eef119a4cdd4417090d9e..50ca18cb6dd785651babf4662e414f10d47f20ba 100644 (file)
@@ -290,6 +290,7 @@ Delivery::run (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nfra
                }
 
        } else {
+
                // Do a 1:1 copy of data to output ports
 
                if (bufs.count().n_audio() > 0 && ports.count().n_audio () > 0) {
index 8d04610d0aac5263b21323c5c1e21ee218693381..15a749d0519cf2a68f70c59650d714dc535690d3 100644 (file)
@@ -57,12 +57,6 @@ MidiTrack::MidiTrack (Session& sess, string name, Route::Flag flag, TrackMode mo
        , _default_channel (0)
        , _midi_thru (true)
 {
-       use_new_diskstream ();
-
-       _declickable = true;
-       _freeze_record.state = NoFreeze;
-       _saved_meter_point = _meter_point;
-       _mode = mode;
 }
 
 MidiTrack::~MidiTrack ()
@@ -88,8 +82,8 @@ MidiTrack::use_new_diskstream ()
        set_diskstream (boost::dynamic_pointer_cast<MidiDiskstream> (ds));
 }
 
-int
-MidiTrack::set_diskstream (boost::shared_ptr<MidiDiskstream> ds)
+void
+MidiTrack::set_diskstream (boost::shared_ptr<Diskstream> ds)
 {
        _diskstream = ds;
        _diskstream->set_route (*this);
@@ -99,34 +93,6 @@ MidiTrack::set_diskstream (boost::shared_ptr<MidiDiskstream> ds)
        //_diskstream->monitor_input (false);
 
        DiskstreamChanged (); /* EMIT SIGNAL */
-
-       return 0;
-}
-
-int
-MidiTrack::use_diskstream (string name)
-{
-       boost::shared_ptr<MidiDiskstream> dstream;
-
-       if ((dstream = boost::dynamic_pointer_cast<MidiDiskstream>(_session.diskstream_by_name (name))) == 0) {
-               error << string_compose(_("MidiTrack: midi diskstream \"%1\" not known by session"), name) << endmsg;
-               return -1;
-       }
-
-       return set_diskstream (dstream);
-}
-
-int
-MidiTrack::use_diskstream (const PBD::ID& id)
-{
-       boost::shared_ptr<MidiDiskstream> dstream;
-
-       if ((dstream = boost::dynamic_pointer_cast<MidiDiskstream> (_session.diskstream_by_id (id))) == 0) {
-               error << string_compose(_("MidiTrack: midi diskstream \"%1\" not known by session"), id) << endmsg;
-               return -1;
-       }
-
-       return set_diskstream (dstream);
 }
 
 boost::shared_ptr<MidiDiskstream>
@@ -168,40 +134,6 @@ MidiTrack::_set_state (const XMLNode& node, int version, bool call_base)
                set_default_channel ((uint8_t) atoi (prop->value()));
        }
 
-       if ((prop = node.property ("diskstream-id")) == 0) {
-
-               /* some old sessions use the diskstream name rather than the ID */
-
-               if ((prop = node.property ("diskstream")) == 0) {
-                       fatal << _("programming error: MidiTrack given state without diskstream!") << endmsg;
-                       /*NOTREACHED*/
-                       return -1;
-               }
-
-               if (use_diskstream (prop->value())) {
-                       return -1;
-               }
-
-       } else {
-
-               PBD::ID id (prop->value());
-               PBD::ID zero ("0");
-
-               /* this wierd hack is used when creating tracks from a template. there isn't
-                  a particularly good time to interpose between setting the first part of
-                  the track state (notably Route::set_state() and the track mode), and the
-                  second part (diskstream stuff). So, we have a special ID for the diskstream
-                  that means "you should create a new diskstream here, not look for
-                  an old one.
-               */
-
-               if (id == zero) {
-                       use_new_diskstream ();
-               } else if (use_diskstream (id)) {
-                       return -1;
-               }
-       }
-
        XMLNodeList nlist;
        XMLNodeConstIterator niter;
        XMLNode *child;
index f0c52daa6fb72c5d41a9e01d1eb68576c96d078b..aee3bdf2c34b9ec7fc5a42ab6bd87790acf21bb7 100644 (file)
@@ -72,14 +72,57 @@ PBD::Signal0<void> Route::RemoteControlIDChange;
 Route::Route (Session& sess, string name, Flag flg, DataType default_type)
        : SessionObject (sess, name)
        , AutomatableControls (sess)
+        , _active (true)
+        , _initial_delay (0)
+        , _roll_delay (0)
        , _flags (flg)
+        , _pending_declick (true)
+        , _meter_point (MeterPostFader)
+        , _phase_invert (0)
+        , _self_solo (false)
+        , _soloed_by_others (0)
+        , _solo_isolated (0)
+        , _denormal_protection (false)
+        , _recordable (true)
+        , _silent (false)
+        , _declickable (false)
        , _solo_control (new SoloControllable (X_("solo"), *this))
        , _mute_control (new MuteControllable (X_("mute"), *this))
        , _mute_master (new MuteMaster (sess, name))
+        , _mute_points (MuteMaster::AllPoints)
+        , _have_internal_generator (false)
+        , _solo_safe (false)
        , _default_type (default_type)
+        , _remote_control_id (0)
+        , _in_configure_processors (false)
+{
+       processor_max_streams.reset();
+       order_keys[N_("signal")] = order_key_cnt++;
+}
 
+int
+Route::init ()
 {
-       init ();
+       /* add standard controls */
+
+       _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
+       _mute_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
+       
+       add_control (_solo_control);
+       add_control (_mute_control);
+
+       /* input and output objects */
+
+       _input.reset (new IO (_session, _name, IO::Input, _default_type));
+       _output.reset (new IO (_session, _name, IO::Output, _default_type));
+
+       _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
+       _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
+
+       /* add amp processor  */
+
+       _amp.reset (new Amp (_session, _mute_master));
+       add_processor (_amp, PostFader);
 
        /* add standard processors other than amp (added by ::init()) */
 
@@ -119,53 +162,8 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
        /* now that we have _meter, its safe to connect to this */
 
        Metering::Meter.connect_same_thread (*this, (boost::bind (&Route::meter, this)));
-}
 
-void
-Route::init ()
-{
-       _self_solo = false;
-       _soloed_by_others = 0;
-       _solo_isolated = 0;
-       _solo_safe = false;
-       _active = true;
-       processor_max_streams.reset();
-       _recordable = true;
-       order_keys[N_("signal")] = order_key_cnt++;
-       _silent = false;
-       _meter_point = MeterPostFader;
-       _initial_delay = 0;
-       _roll_delay = 0;
-       _have_internal_generator = false;
-       _declickable = false;
-       _pending_declick = true;
-       _remote_control_id = 0;
-       _in_configure_processors = false;
-       _mute_points = MuteMaster::AllPoints;
-
-       _phase_invert = 0;
-       _denormal_protection = false;
-
-       /* add standard controls */
-
-       _solo_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
-       _mute_control->set_flags (Controllable::Flag (_solo_control->flags() | Controllable::Toggle));
-       
-       add_control (_solo_control);
-       add_control (_mute_control);
-
-       /* input and output objects */
-
-       _input.reset (new IO (_session, _name, IO::Input, _default_type));
-       _output.reset (new IO (_session, _name, IO::Output, _default_type));
-
-       _input->changed.connect_same_thread (*this, boost::bind (&Route::input_change_handler, this, _1, _2));
-       _output->changed.connect_same_thread (*this, boost::bind (&Route::output_change_handler, this, _1, _2));
-
-       /* add amp processor  */
-
-       _amp.reset (new Amp (_session, _mute_master));
-       add_processor (_amp, PostFader);
+        return 0;
 }
 
 Route::~Route ()
@@ -455,7 +453,7 @@ Route::process_output_buffers (BufferSet& bufs,
                                     << endl;
                        }
                        assert (bufs.count() == (*i)->input_streams());
-                        
+
                        (*i)->run (bufs, start_frame, end_frame, nframes, *i != _processors.back());
                        bufs.set_count ((*i)->output_streams());
                }
@@ -475,15 +473,15 @@ Route::passthru (sframes_t start_frame, sframes_t end_frame, nframes_t nframes,
 
        _silent = false;
 
-       assert (bufs.available() >= _input->n_ports());
+       assert (bufs.available() >= input_streams());
 
        if (_input->n_ports() == ChanCount::ZERO) {
                silence (nframes);
        }
 
-       bufs.set_count (_input->n_ports());
+       bufs.set_count (input_streams());
 
-       if (is_monitor() && _session.listening()) {
+       if (is_monitor() && _session.listening() && !_session.is_auditioning()) {
 
                /* control/monitor bus ignores input ports when something is
                   feeding the listen "stream". data will "arrive" into the
@@ -1547,7 +1545,6 @@ Route::configure_processors (ProcessorStreams* err)
 ChanCount
 Route::input_streams () const
 {
-        cerr << "!!!!!!!!!" << _name << " ::input_streams()\n";
         return _input->n_ports ();
 }
 
@@ -1564,9 +1561,6 @@ Route::configure_processors_unlocked (ProcessorStreams* err)
        _in_configure_processors = true;
 
        // Check each processor in order to see if we can configure as requested
-        if (_name == "auditioner") {
-                cerr << "AUD conf\n";
-        }
        ChanCount in = input_streams ();
        ChanCount out;
        list< pair<ChanCount,ChanCount> > configuration;
index 398c1259354518a18ba84a8474ada4e04e0f5a56..c29a6fe6758620d7309d6b31de738fa21e8576f9 100644 (file)
@@ -638,7 +638,13 @@ Session::hookup_io ()
                */
 
                try {
-                       auditioner.reset (new Auditioner (*this));
+                        Auditioner* a = new Auditioner (*this);
+                        if (a->init()) {
+                                delete a;
+                                throw failed_constructor();
+                        }
+                        a->use_new_diskstream ();
+                       auditioner.reset (a);
                }
 
                catch (failed_constructor& err) {
@@ -1454,6 +1460,14 @@ Session::new_midi_track (TrackMode mode, RouteGroup* route_group, uint32_t how_m
 
                try {
                        MidiTrack* mt = new MidiTrack (*this, track_name, Route::Flag (0), mode);
+
+                        if (mt->init ()) {
+                                delete mt;
+                                goto failed;
+                        }
+
+                        mt->use_new_diskstream();
+
                        boost_debug_shared_ptr_mark_interesting (mt, "Track");
                        track = boost::shared_ptr<MidiTrack>(mt);
 
@@ -1630,6 +1644,14 @@ Session::new_audio_track (int input_channels, int output_channels, TrackMode mod
 
                try {
                        AudioTrack* at = new AudioTrack (*this, track_name, Route::Flag (0), mode);
+
+                        if (at->init ()) {
+                                delete at;
+                                goto failed;
+                        }
+
+                        at->use_new_diskstream();
+
                        boost_debug_shared_ptr_mark_interesting (at, "Track");
                        track = boost::shared_ptr<AudioTrack>(at);
 
@@ -1762,6 +1784,12 @@ Session::new_audio_route (bool aux, int input_channels, int output_channels, Rou
 
                try {
                        Route* rt = new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO);
+
+                        if (rt->init ()) {
+                                delete rt;
+                                goto failure;
+                        }
+
                        boost_debug_shared_ptr_mark_interesting (rt, "Route");
                        shared_ptr<Route> bus (rt);
 
@@ -3154,7 +3182,7 @@ Session::audition_region (boost::shared_ptr<Region> r)
 void
 Session::cancel_audition ()
 {
-       if (auditioner->active()) {
+       if (auditioner->auditioning()) {
                auditioner->cancel_audition ();
                AuditionActive (false); /* EMIT SIGNAL */
        }
@@ -3213,7 +3241,7 @@ Session::is_auditioning () const
 {
        /* can be called before we have an auditioner object */
        if (auditioner) {
-               return auditioner->active();
+               return auditioner->auditioning();
        } else {
                return false;
        }
index 9baa0aea9e81dc6657bb08c8ed3e82b42f0426f9..306df524a8c9113e9ff9d552ffdb7dbc26d72bf2 100644 (file)
@@ -878,6 +878,12 @@ Session::process_audition (nframes_t nframes)
                _butler->summon ();
        }
 
+        /* if using a monitor section, run it because otherwise we don't hear anything */
+
+        if (_monitor_out) {
+                _monitor_out->passthru (_transport_frame, _transport_frame + nframes, nframes, false);
+        }
+        
        /* handle pending events */
 
        while (pending_events.read (&ev, 1) == 1) {
@@ -895,7 +901,7 @@ Session::process_audition (nframes_t nframes)
                process_event (ev);
        }
 
-       if (!auditioner->active()) {
+       if (!auditioner->auditioning()) {
                /* auditioner no longer active, so go back to the normal process callback */
                process_function = &Session::process_with_events;
        }
index 40cbe533892a62f0f640fe3c7ac86907d2b2e2c6..4c0dcfd72d51735c5d7b91fe9ba0581327b00d8a 100644 (file)
@@ -561,6 +561,10 @@ Session::create (const string& mix_template, nframes_t initial_length, BusProfil
 
                if (bus_profile->master_out_channels) {
                        Route* rt = new Route (*this, _("master"), Route::MasterOut, DataType::AUDIO);
+                        if (rt->init ()) {
+                                delete rt;
+                                return -1;
+                        }
                        boost_debug_shared_ptr_mark_interesting (rt, "Route");
                        boost::shared_ptr<Route> r (rt);
                        r->input()->ensure_io (count, false, this);
@@ -571,6 +575,10 @@ Session::create (const string& mix_template, nframes_t initial_length, BusProfil
 
                         if (Config->get_use_monitor_bus()) {
                                 Route* rt = new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO);
+                                if (rt->init ()) {
+                                        delete rt;
+                                        return -1;
+                                }
                                 boost_debug_shared_ptr_mark_interesting (rt, "Route");
                                 boost::shared_ptr<Route> r (rt);
                                 r->input()->ensure_io (count, false, this);
@@ -1425,8 +1433,12 @@ Session::XMLRouteFactory (const XMLNode& node, int version)
                return ret;
        }
 
-       bool has_diskstream = (node.property ("diskstream") != 0 || node.property ("diskstream-id") != 0);
+        const XMLProperty* dsprop;
 
+        if ((dsprop = node.property (X_("diskstream-id"))) == 0) {
+                dsprop = node.property (X_("diskstream"));
+        }
+        
        DataType type = DataType::AUDIO;
        const XMLProperty* prop = node.property("default-type");
 
@@ -1436,25 +1448,65 @@ Session::XMLRouteFactory (const XMLNode& node, int version)
 
        assert (type != DataType::NIL);
 
-       if (has_diskstream) {
-               if (type == DataType::AUDIO) {
-                       AudioTrack* at = new AudioTrack (*this, X_("toBeResetFroXML"));
-                        if (at->set_state (node, version) == 0) {
-                                boost_debug_shared_ptr_mark_interesting (at, "Track");
-                                ret.reset (at);
+       if (dsprop) {
+
+                boost::shared_ptr<Diskstream> ds;
+                PBD::ID diskstream_id (dsprop->value());
+               PBD::ID zero ("0");
+
+               /* this wierd hack is used when creating
+                  tracks from a template. We have a special
+                  ID for the diskstream that means "you
+                  should create a new diskstream here, not
+                  look for an old one."
+               */
+                
+               if (diskstream_id != zero) {
+
+                        ds = diskstream_by_id (diskstream_id);
+
+                        if (!ds) {
+                                error << string_compose (_("cannot find diskstream ID %1"), diskstream_id.to_s()) << endmsg;
+                                return ret;
                         }
+               } 
+
+                Track* track;
+                
+                if (type == DataType::AUDIO) {
+                        track = new AudioTrack (*this, X_("toBeResetFroXML"));
                         
-               } else {
-                        MidiTrack* mt = new MidiTrack (*this, X_("toBeResetFroXML"));
-                        if (mt->set_state (node, version) == 0) {
-                                ret.reset (mt);
-                        }
-               }
+                } else {
+                        track = new MidiTrack (*this, X_("toBeResetFroXML"));
+                }
+                
+                if (track->init()) {
+                        delete track;
+                        return ret;
+                }
+                
+                if (ds) {
+                        track->set_diskstream (ds);
+                } else {
+                        track->use_new_diskstream ();
+                }
+                
+                if (track->set_state (node, version)) {
+                        delete track;
+                        return ret;
+                }
+                
+                boost_debug_shared_ptr_mark_interesting (track, "Track");
+                ret.reset (track);
+                
        } else {
                Route* rt = new Route (*this, X_("toBeResetFroXML"));
-                if (rt->set_state (node, version) == 0) {
+
+                if (rt->init () == 0 && rt->set_state (node, version) == 0) {
                         boost_debug_shared_ptr_mark_interesting (rt, "Route");
                         ret.reset (rt);
+                } else {
+                        delete rt;
                 }
        }
 
index 7d08c621130758a525435a98898e7bbcb0dce2c1..db06a2d7036b2db308dda3c95729d7065153cf28 100644 (file)
@@ -1106,7 +1106,7 @@ Session::post_transport ()
        PostTransportWork ptw = post_transport_work ();
 
        if (ptw & PostTransportAudition) {
-               if (auditioner && auditioner->active()) {
+               if (auditioner && auditioner->auditioning()) {
                        process_function = &Session::process_audition;
                } else {
                        process_function = &Session::process_with_events;
index 92b776f7f28aea8b8bf08308c373461cade9784b..7929640b64ff7f568bc49957196555565ec9bc63 100644 (file)
@@ -41,12 +41,12 @@ using namespace PBD;
 
 Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
        : Route (sess, name, flag, default_type)
+        , _saved_meter_point (_meter_point)
+        , _mode (mode)
        , _rec_enable_control (new RecEnableControllable(*this))
 {
-       _declickable = true;
        _freeze_record.state = NoFreeze;
-       _saved_meter_point = _meter_point;
-       _mode = mode;
+        _declickable = true;
 }
 
 Track::~Track ()
@@ -54,6 +54,15 @@ Track::~Track ()
        DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
 }
 
+int
+Track::init ()
+{
+        if (Route::init ()) {
+                return -1;
+        }
+
+        return 0;
+}
 XMLNode&
 Track::get_state ()
 {
@@ -345,10 +354,7 @@ Track::input_streams () const
 {
         ChanCount cc = _input->n_ports ();
 
-        cerr << "**************" << _name << " IS = " << cc << endl;
-
         if (cc.n_total() == 0 && _diskstream) {
-                cerr << "*******" << _name << " use diskstream channel count\n";
                 return cc = _diskstream->n_channels();
         }