merge robin gareus' libltc into ardour source tree for convenience
[ardour.git] / libs / ardour / session.cc
1 /*
2     Copyright (C) 1999-2010 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #include <stdint.h>
21
22 #include <algorithm>
23 #include <string>
24 #include <vector>
25 #include <sstream>
26 #include <fstream>
27 #include <cstdio> /* sprintf(3) ... grrr */
28 #include <cmath>
29 #include <cerrno>
30 #include <unistd.h>
31 #include <limits.h>
32
33 #include <glibmm/threads.h>
34 #include <glibmm/miscutils.h>
35 #include <glibmm/fileutils.h>
36
37 #include <boost/algorithm/string/erase.hpp>
38
39 #include "pbd/error.h"
40 #include "pbd/boost_debug.h"
41 #include "pbd/pathscanner.h"
42 #include "pbd/stl_delete.h"
43 #include "pbd/basename.h"
44 #include "pbd/stacktrace.h"
45 #include "pbd/file_utils.h"
46 #include "pbd/convert.h"
47 #include "pbd/strsplit.h"
48 #include "pbd/unwind.h"
49
50 #include "ardour/amp.h"
51 #include "ardour/analyser.h"
52 #include "ardour/audio_buffer.h"
53 #include "ardour/audio_diskstream.h"
54 #include "ardour/audio_port.h"
55 #include "ardour/audio_track.h"
56 #include "ardour/audioengine.h"
57 #include "ardour/audiofilesource.h"
58 #include "ardour/auditioner.h"
59 #include "ardour/buffer_manager.h"
60 #include "ardour/buffer_set.h"
61 #include "ardour/bundle.h"
62 #include "ardour/butler.h"
63 #include "ardour/click.h"
64 #include "ardour/control_protocol_manager.h"
65 #include "ardour/data_type.h"
66 #include "ardour/debug.h"
67 #include "ardour/filename_extensions.h"
68 #include "ardour/graph.h"
69 #include "ardour/midi_track.h"
70 #include "ardour/midi_ui.h"
71 #include "ardour/operations.h"
72 #include "ardour/playlist.h"
73 #include "ardour/plugin.h"
74 #include "ardour/plugin_insert.h"
75 #include "ardour/process_thread.h"
76 #include "ardour/rc_configuration.h"
77 #include "ardour/recent_sessions.h"
78 #include "ardour/region.h"
79 #include "ardour/region_factory.h"
80 #include "ardour/route_graph.h"
81 #include "ardour/route_group.h"
82 #include "ardour/send.h"
83 #include "ardour/session.h"
84 #include "ardour/session_directory.h"
85 #include "ardour/session_playlists.h"
86 #include "ardour/smf_source.h"
87 #include "ardour/source_factory.h"
88 #include "ardour/utils.h"
89
90 #include "midi++/port.h"
91 #include "midi++/jack_midi_port.h"
92 #include "midi++/mmc.h"
93 #include "midi++/manager.h"
94
95 #include "i18n.h"
96
97 namespace ARDOUR {
98 class MidiSource;
99 class Processor;
100 class Speakers;
101 }
102
103 using namespace std;
104 using namespace ARDOUR;
105 using namespace PBD;
106
107 bool Session::_disable_all_loaded_plugins = false;
108
109 PBD::Signal1<void,std::string> Session::Dialog;
110 PBD::Signal0<int> Session::AskAboutPendingState;
111 PBD::Signal2<int, framecnt_t, framecnt_t> Session::AskAboutSampleRateMismatch;
112 PBD::Signal0<void> Session::SendFeedback;
113 PBD::Signal3<int,Session*,std::string,DataType> Session::MissingFile;
114
115 PBD::Signal1<void, framepos_t> Session::StartTimeChanged;
116 PBD::Signal1<void, framepos_t> Session::EndTimeChanged;
117 PBD::Signal2<void,std::string, std::string> Session::Exported;
118 PBD::Signal1<int,boost::shared_ptr<Playlist> > Session::AskAboutPlaylistDeletion;
119 PBD::Signal0<void> Session::Quit;
120 PBD::Signal0<void> Session::FeedbackDetected;
121 PBD::Signal0<void> Session::SuccessfulGraphSort;
122
123 static void clean_up_session_event (SessionEvent* ev) { delete ev; }
124 const SessionEvent::RTeventCallback Session::rt_cleanup (clean_up_session_event);
125
126 /** @param snapshot_name Snapshot name, without .ardour suffix */
127 Session::Session (AudioEngine &eng,
128                   const string& fullpath,
129                   const string& snapshot_name,
130                   BusProfile* bus_profile,
131                   string mix_template)
132         : _engine (eng)
133         , _target_transport_speed (0.0)
134         , _requested_return_frame (-1)
135         , _session_dir (new SessionDirectory(fullpath))
136         , state_tree (0)
137         , _state_of_the_state (Clean)
138         , _butler (new Butler (*this))
139         , _post_transport_work (0)
140         , _send_timecode_update (false)
141         , _all_route_group (new RouteGroup (*this, "all"))
142         , routes (new RouteList)
143         , _total_free_4k_blocks (0)
144         , _total_free_4k_blocks_uncertain (false)
145         , _bundles (new BundleList)
146         , _bundle_xml_node (0)
147         , _current_trans (0)
148         , click_data (0)
149         , click_emphasis_data (0)
150         , main_outs (0)
151         , _have_rec_enabled_track (false)
152         , _suspend_timecode_transmission (0)
153 {
154         _locations = new Locations (*this);
155         ltc_encoder = NULL;
156
157         if (how_many_dsp_threads () > 1) {
158                 /* For now, only create the graph if we are using >1 DSP threads, as
159                    it is a bit slower than the old code with 1 thread.
160                 */
161                 _process_graph.reset (new Graph (*this));
162         }
163
164         playlists.reset (new SessionPlaylists);
165
166         _all_route_group->set_active (true, this);
167
168         interpolation.add_channel_to (0, 0);
169
170         if (!eng.connected()) {
171                 throw failed_constructor();
172         }
173
174         n_physical_outputs = _engine.n_physical_outputs ();
175         n_physical_inputs =  _engine.n_physical_inputs ();
176
177         first_stage_init (fullpath, snapshot_name);
178
179         _is_new = !Glib::file_test (_path, Glib::FileTest (G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR));
180
181         if (_is_new) {
182                 if (create (mix_template, bus_profile)) {
183                         destroy ();
184                         throw failed_constructor ();
185                 }
186         }
187
188         if (second_stage_init ()) {
189                 destroy ();
190                 throw failed_constructor ();
191         }
192
193         store_recent_sessions(_name, _path);
194
195         bool was_dirty = dirty();
196
197         _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
198
199         Config->ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, false));
200         config.ParameterChanged.connect_same_thread (*this, boost::bind (&Session::config_changed, this, _1, true));
201
202         if (was_dirty) {
203                 DirtyChanged (); /* EMIT SIGNAL */
204         }
205
206         StartTimeChanged.connect_same_thread (*this, boost::bind (&Session::start_time_changed, this, _1));
207         EndTimeChanged.connect_same_thread (*this, boost::bind (&Session::end_time_changed, this, _1));
208
209         _is_new = false;
210 }
211
212 Session::~Session ()
213 {
214 #ifdef PT_TIMING        
215         ST.dump ("ST.dump");
216 #endif  
217         destroy ();
218 }
219
220 void
221 Session::destroy ()
222 {
223         vector<void*> debug_pointers;
224
225         /* if we got to here, leaving pending capture state around
226            is a mistake.
227         */
228
229         remove_pending_capture_state ();
230
231         _state_of_the_state = StateOfTheState (CannotSave|Deletion);
232
233         /* disconnect from any and all signals that we are connected to */
234
235         drop_connections ();
236
237         _engine.remove_session ();
238
239         /* deregister all ports - there will be no process or any other
240          * callbacks from the engine any more.
241          */
242
243         Port::PortDrop (); /* EMIT SIGNAL */
244
245         ltc_tx_cleanup();
246
247         /* clear history so that no references to objects are held any more */
248
249         _history.clear ();
250
251         /* clear state tree so that no references to objects are held any more */
252
253         delete state_tree;
254
255         /* reset dynamic state version back to default */
256
257         Stateful::loading_state_version = 0;
258
259         _butler->drop_references ();
260         delete _butler;
261         _butler = 0;
262         
263         delete midi_control_ui;
264         delete _all_route_group;
265
266         if (click_data != default_click) {
267                 delete [] click_data;
268         }
269
270         if (click_emphasis_data != default_click_emphasis) {
271                 delete [] click_emphasis_data;
272         }
273
274         clear_clicks ();
275
276         /* clear out any pending dead wood from RCU managed objects */
277
278         routes.flush ();
279         _bundles.flush ();
280
281         AudioDiskstream::free_working_buffers();
282
283         /* tell everyone who is still standing that we're about to die */
284         drop_references ();
285
286         /* tell everyone to drop references and delete objects as we go */
287
288         DEBUG_TRACE (DEBUG::Destruction, "delete regions\n");
289         RegionFactory::delete_all_regions ();
290
291         DEBUG_TRACE (DEBUG::Destruction, "delete routes\n");
292
293         /* reset these three references to special routes before we do the usual route delete thing */
294
295         auditioner.reset ();
296         _master_out.reset ();
297         _monitor_out.reset ();
298
299         {
300                 RCUWriter<RouteList> writer (routes);
301                 boost::shared_ptr<RouteList> r = writer.get_copy ();
302
303                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
304                         DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for route %1 ; pre-ref = %2\n", (*i)->name(), (*i).use_count()));
305                         (*i)->drop_references ();
306                 }
307
308                 r->clear ();
309                 /* writer goes out of scope and updates master */
310         }
311         routes.flush ();
312
313         DEBUG_TRACE (DEBUG::Destruction, "delete sources\n");
314         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
315                 DEBUG_TRACE(DEBUG::Destruction, string_compose ("Dropping for source %1 ; pre-ref = %2\n", i->second->name(), i->second.use_count()));
316                 i->second->drop_references ();
317         }
318
319         sources.clear ();
320
321         DEBUG_TRACE (DEBUG::Destruction, "delete route groups\n");
322         for (list<RouteGroup *>::iterator i = _route_groups.begin(); i != _route_groups.end(); ++i) {
323
324                 delete *i;
325         }
326
327         /* not strictly necessary, but doing it here allows the shared_ptr debugging to work */
328         playlists.reset ();
329
330         delete _locations;
331
332         DEBUG_TRACE (DEBUG::Destruction, "Session::destroy() done\n");
333
334 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
335         boost_debug_list_ptrs ();
336 #endif
337 }
338
339 void
340 Session::when_engine_running ()
341 {
342         string first_physical_output;
343
344         BootMessage (_("Set block size and sample rate"));
345
346         set_block_size (_engine.frames_per_cycle());
347         set_frame_rate (_engine.frame_rate());
348
349         BootMessage (_("Using configuration"));
350
351         boost::function<void (std::string)> ff (boost::bind (&Session::config_changed, this, _1, false));
352         boost::function<void (std::string)> ft (boost::bind (&Session::config_changed, this, _1, true));
353
354         Config->map_parameters (ff);
355         config.map_parameters (ft);
356
357         /* every time we reconnect, recompute worst case output latencies */
358
359         _engine.Running.connect_same_thread (*this, boost::bind (&Session::initialize_latencies, this));
360
361         if (synced_to_jack()) {
362                 _engine.transport_stop ();
363         }
364
365         if (config.get_jack_time_master()) {
366                 _engine.transport_locate (_transport_frame);
367         }
368
369         _clicking = false;
370
371         try {
372                 XMLNode* child = 0;
373                 
374                 _ltc_input.reset (new IO (*this, _("LTC In"), IO::Input));
375                 _ltc_output.reset (new IO (*this, _("LTC Out"), IO::Output));
376
377                 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-In")) != 0) {
378                         _ltc_input->set_state (*(child->children().front()), Stateful::loading_state_version);
379                 } else {
380                         {
381                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
382                                 _ltc_input->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
383                         }
384                         reconnect_ltc_input ();
385                 }
386
387                 if (state_tree && (child = find_named_node (*state_tree->root(), "LTC-Out")) != 0) {
388                         _ltc_output->set_state (*(child->children().front()), Stateful::loading_state_version);
389                 } else {
390                         {
391                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
392                                 _ltc_output->ensure_io (ChanCount (DataType::AUDIO, 1), true, this);
393                         }
394                         reconnect_ltc_output ();
395                 }
396                                                 
397                 /* fix up names of LTC ports because we don't want the normal
398                  * IO style of NAME/TYPE-{in,out}N
399                  */
400                 
401                 _ltc_input->nth (0)->set_name (_("LTC-in"));
402                 _ltc_output->nth (0)->set_name (_("LTC-out"));
403
404                 _click_io.reset (new ClickIO (*this, "click"));
405                 _click_gain.reset (new Amp (*this));
406                 _click_gain->activate ();
407
408                 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
409
410                         /* existing state for Click */
411                         int c = 0;
412
413                         if (Stateful::loading_state_version < 3000) {
414                                 c = _click_io->set_state_2X (*child->children().front(), Stateful::loading_state_version, false);
415                         } else {
416                                 const XMLNodeList& children (child->children());
417                                 XMLNodeList::const_iterator i = children.begin();
418                                 if ((c = _click_io->set_state (**i, Stateful::loading_state_version)) == 0) {
419                                         ++i;
420                                         if (i != children.end()) {
421                                                 c = _click_gain->set_state (**i, Stateful::loading_state_version);
422                                         }
423                                 }
424                         }
425                         
426                         if (c == 0) {
427                                 _clicking = Config->get_clicking ();
428
429                         } else {
430
431                                 error << _("could not setup Click I/O") << endmsg;
432                                 _clicking = false;
433                         }
434
435
436                 } else {
437
438                         /* default state for Click: dual-mono to first 2 physical outputs */
439
440                         vector<string> outs;
441                         _engine.get_physical_outputs (DataType::AUDIO, outs);
442
443                         for (uint32_t physport = 0; physport < 2; ++physport) {
444                                 if (outs.size() > physport) {
445                                         if (_click_io->add_port (outs[physport], this)) {
446                                                 // relax, even though its an error
447                                         }
448                                 }
449                         }
450
451                         if (_click_io->n_ports () > ChanCount::ZERO) {
452                                 _clicking = Config->get_clicking ();
453                         }
454                 }
455         }
456
457         catch (failed_constructor& err) {
458                 error << _("cannot setup Click I/O") << endmsg;
459         }
460
461         BootMessage (_("Compute I/O Latencies"));
462
463         if (_clicking) {
464                 // XXX HOW TO ALERT UI TO THIS ? DO WE NEED TO?
465         }
466
467         BootMessage (_("Set up standard connections"));
468
469         vector<string> inputs[DataType::num_types];
470         vector<string> outputs[DataType::num_types];
471         for (uint32_t i = 0; i < DataType::num_types; ++i) {
472                 _engine.get_physical_inputs (DataType (DataType::Symbol (i)), inputs[i]);
473                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
474         }
475
476         /* Create a set of Bundle objects that map
477            to the physical I/O currently available.  We create both
478            mono and stereo bundles, so that the common cases of mono
479            and stereo tracks get bundles to put in their mixer strip
480            in / out menus.  There may be a nicer way of achieving that;
481            it doesn't really scale that well to higher channel counts
482         */
483
484         /* mono output bundles */
485
486         for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); ++np) {
487                 char buf[32];
488                 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
489
490                 boost::shared_ptr<Bundle> c (new Bundle (buf, true));
491                 c->add_channel (_("mono"), DataType::AUDIO);
492                 c->set_port (0, outputs[DataType::AUDIO][np]);
493
494                 add_bundle (c);
495         }
496
497         /* stereo output bundles */
498
499         for (uint32_t np = 0; np < outputs[DataType::AUDIO].size(); np += 2) {
500                 if (np + 1 < outputs[DataType::AUDIO].size()) {
501                         char buf[32];
502                         snprintf (buf, sizeof(buf), _("out %" PRIu32 "+%" PRIu32), np + 1, np + 2);
503                         boost::shared_ptr<Bundle> c (new Bundle (buf, true));
504                         c->add_channel (_("L"), DataType::AUDIO);
505                         c->set_port (0, outputs[DataType::AUDIO][np]);
506                         c->add_channel (_("R"), DataType::AUDIO);
507                         c->set_port (1, outputs[DataType::AUDIO][np + 1]);
508
509                         add_bundle (c);
510                 }
511         }
512
513         /* mono input bundles */
514
515         for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); ++np) {
516                 char buf[32];
517                 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
518
519                 boost::shared_ptr<Bundle> c (new Bundle (buf, false));
520                 c->add_channel (_("mono"), DataType::AUDIO);
521                 c->set_port (0, inputs[DataType::AUDIO][np]);
522
523                 add_bundle (c);
524         }
525
526         /* stereo input bundles */
527
528         for (uint32_t np = 0; np < inputs[DataType::AUDIO].size(); np += 2) {
529                 if (np + 1 < inputs[DataType::AUDIO].size()) {
530                         char buf[32];
531                         snprintf (buf, sizeof(buf), _("in %" PRIu32 "+%" PRIu32), np + 1, np + 2);
532
533                         boost::shared_ptr<Bundle> c (new Bundle (buf, false));
534                         c->add_channel (_("L"), DataType::AUDIO);
535                         c->set_port (0, inputs[DataType::AUDIO][np]);
536                         c->add_channel (_("R"), DataType::AUDIO);
537                         c->set_port (1, inputs[DataType::AUDIO][np + 1]);
538
539                         add_bundle (c);
540                 }
541         }
542
543         /* MIDI input bundles */
544
545         for (uint32_t np = 0; np < inputs[DataType::MIDI].size(); ++np) {
546                 string n = inputs[DataType::MIDI][np];
547                 boost::erase_first (n, X_("alsa_pcm:"));
548
549                 boost::shared_ptr<Bundle> c (new Bundle (n, false));
550                 c->add_channel ("", DataType::MIDI);
551                 c->set_port (0, inputs[DataType::MIDI][np]);
552                 add_bundle (c);
553         }
554
555         /* MIDI output bundles */
556
557         for (uint32_t np = 0; np < outputs[DataType::MIDI].size(); ++np) {
558                 string n = outputs[DataType::MIDI][np];
559                 boost::erase_first (n, X_("alsa_pcm:"));
560
561                 boost::shared_ptr<Bundle> c (new Bundle (n, true));
562                 c->add_channel ("", DataType::MIDI);
563                 c->set_port (0, outputs[DataType::MIDI][np]);
564                 add_bundle (c);
565         }
566
567         BootMessage (_("Setup signal flow and plugins"));
568
569         /* Reset all panners */
570
571         Delivery::reset_panners ();
572
573         /* this will cause the CPM to instantiate any protocols that are in use
574          * (or mandatory), which will pass it this Session, and then call
575          * set_state() on each instantiated protocol to match stored state.
576          */
577
578         ControlProtocolManager::instance().set_session (this);
579
580         /* This must be done after the ControlProtocolManager set_session above,
581            as it will set states for ports which the ControlProtocolManager creates.
582         */
583
584         MIDI::Manager::instance()->set_port_states (Config->midi_port_states ());
585
586         /* And this must be done after the MIDI::Manager::set_port_states as
587          * it will try to make connections whose details are loaded by set_port_states.
588          */
589
590         hookup_io ();
591
592         /* Let control protocols know that we are now all connected, so they
593          * could start talking to surfaces if they want to.
594          */
595
596         ControlProtocolManager::instance().midi_connectivity_established ();
597
598         if (_is_new && !no_auto_connect()) {
599                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock());
600                 auto_connect_master_bus ();
601         }
602
603         _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
604
605         /* update latencies */
606
607         initialize_latencies ();
608
609         /* hook us up to the engine */
610
611         BootMessage (_("Connect to engine"));
612         _engine.set_session (this);
613         _engine.reset_timebase ();
614 }
615
616 void
617 Session::auto_connect_master_bus ()
618 {
619         if (!_master_out || !Config->get_auto_connect_standard_busses() || _monitor_out) {
620                 return;
621         }
622                 
623         /* if requested auto-connect the outputs to the first N physical ports.
624          */
625         
626         uint32_t limit = _master_out->n_outputs().n_total();
627         vector<string> outputs[DataType::num_types];
628         
629         for (uint32_t i = 0; i < DataType::num_types; ++i) {
630                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
631         }
632         
633         for (uint32_t n = 0; n < limit; ++n) {
634                 boost::shared_ptr<Port> p = _master_out->output()->nth (n);
635                 string connect_to;
636                 if (outputs[p->type()].size() > n) {
637                         connect_to = outputs[p->type()][n];
638                 }
639                 
640                 if (!connect_to.empty() && p->connected_to (connect_to) == false) {
641                         if (_master_out->output()->connect (p, connect_to, this)) {
642                                 error << string_compose (_("cannot connect master output %1 to %2"), n, connect_to)
643                                       << endmsg;
644                                 break;
645                         }
646                 }
647         }
648 }
649
650 void
651 Session::remove_monitor_section ()
652 {
653         if (!_monitor_out) {
654                 return;
655         }
656
657         /* force reversion to Solo-In-Place */
658         Config->set_solo_control_is_listen_control (false);
659
660         {
661                 /* Hold process lock while doing this so that we don't hear bits and
662                  * pieces of audio as we work on each route.
663                  */
664                 
665                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
666                 
667                 /* Connect tracks to monitor section. Note that in an
668                    existing session, the internal sends will already exist, but we want the
669                    routes to notice that they connect to the control out specifically.
670                 */
671                 
672                 
673                 boost::shared_ptr<RouteList> r = routes.reader ();
674                 PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
675                 
676                 for (RouteList::iterator x = r->begin(); x != r->end(); ++x) {
677                         
678                         if ((*x)->is_monitor()) {
679                                 /* relax */
680                         } else if ((*x)->is_master()) {
681                                 /* relax */
682                         } else {
683                                 (*x)->remove_aux_or_listen (_monitor_out);
684                         }
685                 }
686         }
687
688         remove_route (_monitor_out);
689         auto_connect_master_bus ();
690 }
691
692 void
693 Session::add_monitor_section ()
694 {
695         RouteList rl;
696
697         if (_monitor_out || !_master_out) {
698                 return;
699         }
700
701         boost::shared_ptr<Route> r (new Route (*this, _("monitor"), Route::MonitorOut, DataType::AUDIO));
702
703         if (r->init ()) {
704                 return;
705         }
706
707 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
708         // boost_debug_shared_ptr_mark_interesting (r.get(), "Route");
709 #endif
710         {
711                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
712                 r->input()->ensure_io (_master_out->output()->n_ports(), false, this);
713                 r->output()->ensure_io (_master_out->output()->n_ports(), false, this);
714         }
715
716         rl.push_back (r);
717         add_routes (rl, false, false, false);
718         
719         assert (_monitor_out);
720
721         /* AUDIO ONLY as of june 29th 2009, because listen semantics for anything else
722            are undefined, at best.
723         */
724         
725         uint32_t limit = _monitor_out->n_inputs().n_audio();
726         
727         if (_master_out) {
728                 
729                 /* connect the inputs to the master bus outputs. this
730                  * represents a separate data feed from the internal sends from
731                  * each route. as of jan 2011, it allows the monitor section to
732                  * conditionally ignore either the internal sends or the normal
733                  * input feed, but we should really find a better way to do
734                  * this, i think.
735                  */
736
737                 _master_out->output()->disconnect (this);
738
739                 for (uint32_t n = 0; n < limit; ++n) {
740                         boost::shared_ptr<AudioPort> p = _monitor_out->input()->ports().nth_audio_port (n);
741                         boost::shared_ptr<AudioPort> o = _master_out->output()->ports().nth_audio_port (n);
742                         
743                         if (o) {
744                                 string connect_to = o->name();
745                                 if (_monitor_out->input()->connect (p, connect_to, this)) {
746                                         error << string_compose (_("cannot connect control input %1 to %2"), n, connect_to)
747                                               << endmsg;
748                                         break;
749                                 }
750                         }
751                 }
752         }
753         
754         /* if monitor section is not connected, connect it to physical outs
755          */
756         
757         if (Config->get_auto_connect_standard_busses() && !_monitor_out->output()->connected ()) {
758                 
759                 if (!Config->get_monitor_bus_preferred_bundle().empty()) {
760                         
761                         boost::shared_ptr<Bundle> b = bundle_by_name (Config->get_monitor_bus_preferred_bundle());
762                         
763                         if (b) {
764                                 _monitor_out->output()->connect_ports_to_bundle (b, true, this);
765                         } else {
766                                 warning << string_compose (_("The preferred I/O for the monitor bus (%1) cannot be found"),
767                                                            Config->get_monitor_bus_preferred_bundle())
768                                         << endmsg;
769                         }
770                         
771                 } else {
772                         
773                         /* Monitor bus is audio only */
774
775                         uint32_t mod = n_physical_outputs.get (DataType::AUDIO);
776                         uint32_t limit = _monitor_out->n_outputs().get (DataType::AUDIO);
777                         vector<string> outputs[DataType::num_types];
778
779                         for (uint32_t i = 0; i < DataType::num_types; ++i) {
780                                 _engine.get_physical_outputs (DataType (DataType::Symbol (i)), outputs[i]);
781                         }
782                         
783                         
784                         if (mod != 0) {
785                                 
786                                 for (uint32_t n = 0; n < limit; ++n) {
787                                         
788                                         boost::shared_ptr<Port> p = _monitor_out->output()->ports().port(DataType::AUDIO, n);
789                                         string connect_to;
790                                         if (outputs[DataType::AUDIO].size() > (n % mod)) {
791                                                 connect_to = outputs[DataType::AUDIO][n % mod];
792                                         }
793                                         
794                                         if (!connect_to.empty()) {
795                                                 if (_monitor_out->output()->connect (p, connect_to, this)) {
796                                                         error << string_compose (
797                                                                 _("cannot connect control output %1 to %2"),
798                                                                 n, connect_to)
799                                                               << endmsg;
800                                                         break;
801                                                 }
802                                         }
803                                 }
804                         }
805                 }
806         }
807
808         /* Hold process lock while doing this so that we don't hear bits and
809          * pieces of audio as we work on each route.
810          */
811          
812         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
813
814         /* Connect tracks to monitor section. Note that in an
815            existing session, the internal sends will already exist, but we want the
816            routes to notice that they connect to the control out specifically.
817         */
818
819
820         boost::shared_ptr<RouteList> rls = routes.reader ();
821
822         PBD::Unwinder<bool> uw (ignore_route_processor_changes, true);
823
824         for (RouteList::iterator x = rls->begin(); x != rls->end(); ++x) {
825                 
826                 if ((*x)->is_monitor()) {
827                         /* relax */
828                 } else if ((*x)->is_master()) {
829                         /* relax */
830                 } else {
831                         (*x)->enable_monitor_send ();
832                 }
833         }
834 }
835
836 void
837 Session::hookup_io ()
838 {
839         /* stop graph reordering notifications from
840            causing resorts, etc.
841         */
842
843         _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
844
845         if (!auditioner) {
846
847                 /* we delay creating the auditioner till now because
848                    it makes its own connections to ports.
849                 */
850
851                 try {
852                         boost::shared_ptr<Auditioner> a (new Auditioner (*this));
853                         if (a->init()) {
854                                 throw failed_constructor ();
855                         }
856                         a->use_new_diskstream ();
857                         auditioner = a;
858                 }
859
860                 catch (failed_constructor& err) {
861                         warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
862                 }
863         }
864
865         /* load bundles, which we may have postponed earlier on */
866         if (_bundle_xml_node) {
867                 load_bundles (*_bundle_xml_node);
868                 delete _bundle_xml_node;
869         }
870
871         /* Tell all IO objects to connect themselves together */
872
873         IO::enable_connecting ();
874         MIDI::JackMIDIPort::MakeConnections ();
875
876         /* Anyone who cares about input state, wake up and do something */
877
878         IOConnectionsComplete (); /* EMIT SIGNAL */
879
880         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
881
882         /* now handle the whole enchilada as if it was one
883            graph reorder event.
884         */
885
886         graph_reordered ();
887
888         /* update the full solo state, which can't be
889            correctly determined on a per-route basis, but
890            needs the global overview that only the session
891            has.
892         */
893
894         update_route_solo_state ();
895 }
896
897 void
898 Session::track_playlist_changed (boost::weak_ptr<Track> wp)
899 {
900         boost::shared_ptr<Track> track = wp.lock ();
901         if (!track) {
902                 return;
903         }
904
905         boost::shared_ptr<Playlist> playlist;
906
907         if ((playlist = track->playlist()) != 0) {
908                 playlist->RegionAdded.connect_same_thread (*this, boost::bind (&Session::playlist_region_added, this, _1));
909                 playlist->RangesMoved.connect_same_thread (*this, boost::bind (&Session::playlist_ranges_moved, this, _1));
910                 playlist->RegionsExtended.connect_same_thread (*this, boost::bind (&Session::playlist_regions_extended, this, _1));
911         }
912 }
913
914 bool
915 Session::record_enabling_legal () const
916 {
917         /* this used to be in here, but survey says.... we don't need to restrict it */
918         // if (record_status() == Recording) {
919         //      return false;
920         // }
921
922         if (Config->get_all_safe()) {
923                 return false;
924         }
925         return true;
926 }
927
928 void
929 Session::set_track_monitor_input_status (bool yn)
930 {
931         boost::shared_ptr<RouteList> rl = routes.reader ();
932         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
933                 boost::shared_ptr<AudioTrack> tr = boost::dynamic_pointer_cast<AudioTrack> (*i);
934                 if (tr && tr->record_enabled ()) {
935                         //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
936                         tr->request_jack_monitors_input (yn);
937                 }
938         }
939 }
940
941 void
942 Session::auto_punch_start_changed (Location* location)
943 {
944         replace_event (SessionEvent::PunchIn, location->start());
945
946         if (get_record_enabled() && config.get_punch_in()) {
947                 /* capture start has been changed, so save new pending state */
948                 save_state ("", true);
949         }
950 }
951
952 void
953 Session::auto_punch_end_changed (Location* location)
954 {
955         framepos_t when_to_stop = location->end();
956         // when_to_stop += _worst_output_latency + _worst_input_latency;
957         replace_event (SessionEvent::PunchOut, when_to_stop);
958 }
959
960 void
961 Session::auto_punch_changed (Location* location)
962 {
963         framepos_t when_to_stop = location->end();
964
965         replace_event (SessionEvent::PunchIn, location->start());
966         //when_to_stop += _worst_output_latency + _worst_input_latency;
967         replace_event (SessionEvent::PunchOut, when_to_stop);
968 }
969
970 /** @param loc A loop location.
971  *  @param pos Filled in with the start time of the required fade-out (in session frames).
972  *  @param length Filled in with the length of the required fade-out.
973  */
974 void
975 Session::auto_loop_declick_range (Location* loc, framepos_t & pos, framepos_t & length)
976 {
977         pos = max (loc->start(), loc->end() - 64);
978         length = loc->end() - pos;
979 }
980
981 void
982 Session::auto_loop_changed (Location* location)
983 {
984         replace_event (SessionEvent::AutoLoop, location->end(), location->start());
985         framepos_t dcp;
986         framecnt_t dcl;
987         auto_loop_declick_range (location, dcp, dcl);
988         replace_event (SessionEvent::AutoLoopDeclick, dcp, dcl);
989
990         if (transport_rolling() && play_loop) {
991
992
993                 // if (_transport_frame > location->end()) {
994
995                 if (_transport_frame < location->start() || _transport_frame > location->end()) {
996                         // relocate to beginning of loop
997                         clear_events (SessionEvent::LocateRoll);
998
999                         request_locate (location->start(), true);
1000
1001                 }
1002                 else if (Config->get_seamless_loop() && !loop_changing) {
1003
1004                         // schedule a locate-roll to refill the diskstreams at the
1005                         // previous loop end
1006                         loop_changing = true;
1007
1008                         if (location->end() > last_loopend) {
1009                                 clear_events (SessionEvent::LocateRoll);
1010                                 SessionEvent *ev = new SessionEvent (SessionEvent::LocateRoll, SessionEvent::Add, last_loopend, last_loopend, 0, true);
1011                                 queue_event (ev);
1012                         }
1013
1014                 }
1015         }
1016
1017         last_loopend = location->end();
1018 }
1019
1020 void
1021 Session::set_auto_punch_location (Location* location)
1022 {
1023         Location* existing;
1024
1025         if ((existing = _locations->auto_punch_location()) != 0 && existing != location) {
1026                 punch_connections.drop_connections();
1027                 existing->set_auto_punch (false, this);
1028                 remove_event (existing->start(), SessionEvent::PunchIn);
1029                 clear_events (SessionEvent::PunchOut);
1030                 auto_punch_location_changed (0);
1031         }
1032
1033         set_dirty();
1034
1035         if (location == 0) {
1036                 return;
1037         }
1038
1039         if (location->end() <= location->start()) {
1040                 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1041                 return;
1042         }
1043
1044         punch_connections.drop_connections ();
1045
1046         location->start_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_start_changed, this, _1));
1047         location->end_changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_end_changed, this, _1));
1048         location->changed.connect_same_thread (punch_connections, boost::bind (&Session::auto_punch_changed, this, _1));
1049
1050         location->set_auto_punch (true, this);
1051
1052         auto_punch_changed (location);
1053
1054         auto_punch_location_changed (location);
1055 }
1056
1057 void
1058 Session::set_auto_loop_location (Location* location)
1059 {
1060         Location* existing;
1061
1062         if ((existing = _locations->auto_loop_location()) != 0 && existing != location) {
1063                 loop_connections.drop_connections ();
1064                 existing->set_auto_loop (false, this);
1065                 remove_event (existing->end(), SessionEvent::AutoLoop);
1066                 framepos_t dcp;
1067                 framecnt_t dcl;
1068                 auto_loop_declick_range (existing, dcp, dcl);
1069                 remove_event (dcp, SessionEvent::AutoLoopDeclick);
1070                 auto_loop_location_changed (0);
1071         }
1072
1073         set_dirty();
1074
1075         if (location == 0) {
1076                 return;
1077         }
1078
1079         if (location->end() <= location->start()) {
1080                 error << _("Session: you can't use a mark for auto loop") << endmsg;
1081                 return;
1082         }
1083
1084         last_loopend = location->end();
1085
1086         loop_connections.drop_connections ();
1087
1088         location->start_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1089         location->end_changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1090         location->changed.connect_same_thread (loop_connections, boost::bind (&Session::auto_loop_changed, this, _1));
1091
1092         location->set_auto_loop (true, this);
1093
1094         /* take care of our stuff first */
1095
1096         auto_loop_changed (location);
1097
1098         /* now tell everyone else */
1099
1100         auto_loop_location_changed (location);
1101 }
1102
1103 void
1104 Session::locations_added (Location *)
1105 {
1106         set_dirty ();
1107 }
1108
1109 void
1110 Session::locations_changed ()
1111 {
1112         _locations->apply (*this, &Session::handle_locations_changed);
1113 }
1114
1115 void
1116 Session::handle_locations_changed (Locations::LocationList& locations)
1117 {
1118         Locations::LocationList::iterator i;
1119         Location* location;
1120         bool set_loop = false;
1121         bool set_punch = false;
1122
1123         for (i = locations.begin(); i != locations.end(); ++i) {
1124
1125                 location =* i;
1126
1127                 if (location->is_auto_punch()) {
1128                         set_auto_punch_location (location);
1129                         set_punch = true;
1130                 }
1131                 if (location->is_auto_loop()) {
1132                         set_auto_loop_location (location);
1133                         set_loop = true;
1134                 }
1135
1136                 if (location->is_session_range()) {
1137                         _session_range_location = location;
1138                 }
1139         }
1140
1141         if (!set_loop) {
1142                 set_auto_loop_location (0);
1143         }
1144         if (!set_punch) {
1145                 set_auto_punch_location (0);
1146         }
1147
1148         set_dirty();
1149 }
1150
1151 void
1152 Session::enable_record ()
1153 {
1154         if (_transport_speed != 0.0 && _transport_speed != 1.0) {
1155                 /* no recording at anything except normal speed */
1156                 return;
1157         }
1158
1159         while (1) {
1160                 RecordState rs = (RecordState) g_atomic_int_get (&_record_status);
1161
1162                 if (rs == Recording) {
1163                         break;
1164                 }
1165                 
1166                 if (g_atomic_int_compare_and_exchange (&_record_status, rs, Recording)) {
1167
1168                         _last_record_location = _transport_frame;
1169                         MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordStrobe));
1170
1171                         if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1172                                 set_track_monitor_input_status (true);
1173                         }
1174
1175                         RecordStateChanged ();
1176                         break;
1177                 }
1178         }
1179 }
1180
1181 void
1182 Session::disable_record (bool rt_context, bool force)
1183 {
1184         RecordState rs;
1185
1186         if ((rs = (RecordState) g_atomic_int_get (&_record_status)) != Disabled) {
1187
1188                 if ((!Config->get_latched_record_enable () && !play_loop) || force) {
1189                         g_atomic_int_set (&_record_status, Disabled);
1190                         MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordExit));
1191                 } else {
1192                         if (rs == Recording) {
1193                                 g_atomic_int_set (&_record_status, Enabled);
1194                         }
1195                 }
1196
1197                 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1198                         set_track_monitor_input_status (false);
1199                 }
1200
1201                 RecordStateChanged (); /* emit signal */
1202
1203                 if (!rt_context) {
1204                         remove_pending_capture_state ();
1205                 }
1206         }
1207 }
1208
1209 void
1210 Session::step_back_from_record ()
1211 {
1212         if (g_atomic_int_compare_and_exchange (&_record_status, Recording, Enabled)) {
1213
1214                 if (Config->get_monitoring_model() == HardwareMonitoring && config.get_auto_input()) {
1215                         set_track_monitor_input_status (false);
1216                 }
1217
1218                 RecordStateChanged (); /* emit signal */
1219         }
1220 }
1221
1222 void
1223 Session::maybe_enable_record ()
1224 {
1225         if (_step_editors > 0) {
1226                 return;
1227         }
1228
1229         g_atomic_int_set (&_record_status, Enabled);
1230
1231         /* This function is currently called from somewhere other than an RT thread.
1232            This save_state() call therefore doesn't impact anything.  Doing it here
1233            means that we save pending state of which sources the next record will use,
1234            which gives us some chance of recovering from a crash during the record.
1235         */
1236
1237         save_state ("", true);
1238
1239         if (_transport_speed) {
1240                 if (!config.get_punch_in()) {
1241                         enable_record ();
1242                 }
1243         } else {
1244                 MIDI::Manager::instance()->mmc()->send (MIDI::MachineControlCommand (MIDI::MachineControl::cmdRecordPause));
1245                 RecordStateChanged (); /* EMIT SIGNAL */
1246         }
1247
1248         set_dirty();
1249 }
1250
1251 framepos_t
1252 Session::audible_frame () const
1253 {
1254         framepos_t ret;
1255         framepos_t tf;
1256         framecnt_t offset;
1257
1258         /* the first of these two possible settings for "offset"
1259            mean that the audible frame is stationary until
1260            audio emerges from the latency compensation
1261            "pseudo-pipeline".
1262
1263            the second means that the audible frame is stationary
1264            until audio would emerge from a physical port
1265            in the absence of any plugin latency compensation
1266         */
1267
1268         offset = worst_playback_latency ();
1269
1270         if (offset > current_block_size) {
1271                 offset -= current_block_size;
1272         } else {
1273                 /* XXX is this correct? if we have no external
1274                    physical connections and everything is internal
1275                    then surely this is zero? still, how
1276                    likely is that anyway?
1277                 */
1278                 offset = current_block_size;
1279         }
1280
1281         if (synced_to_jack()) {
1282                 tf = _engine.transport_frame();
1283         } else {
1284                 tf = _transport_frame;
1285         }
1286
1287         ret = tf;
1288
1289         if (!non_realtime_work_pending()) {
1290
1291                 /* MOVING */
1292
1293                 /* Check to see if we have passed the first guaranteed
1294                    audible frame past our last start position. if not,
1295                    return that last start point because in terms
1296                    of audible frames, we have not moved yet.
1297
1298                    `Start position' in this context means the time we last
1299                    either started, located, or changed transport direction.
1300                 */
1301
1302                 if (_transport_speed > 0.0f) {
1303
1304                         if (!play_loop || !have_looped) {
1305                                 if (tf < _last_roll_or_reversal_location + offset) {
1306                                         return _last_roll_or_reversal_location;
1307                                 }
1308                         }
1309
1310
1311                         /* forwards */
1312                         ret -= offset;
1313
1314                 } else if (_transport_speed < 0.0f) {
1315
1316                         /* XXX wot? no backward looping? */
1317
1318                         if (tf > _last_roll_or_reversal_location - offset) {
1319                                 return _last_roll_or_reversal_location;
1320                         } else {
1321                                 /* backwards */
1322                                 ret += offset;
1323                         }
1324                 }
1325         }
1326
1327         return ret;
1328 }
1329
1330 void
1331 Session::set_frame_rate (framecnt_t frames_per_second)
1332 {
1333         /** \fn void Session::set_frame_size(framecnt_t)
1334                 the AudioEngine object that calls this guarantees
1335                 that it will not be called while we are also in
1336                 ::process(). Its fine to do things that block
1337                 here.
1338         */
1339
1340         _base_frame_rate = frames_per_second;
1341
1342         sync_time_vars();
1343
1344         clear_clicks ();
1345
1346         // XXX we need some equivalent to this, somehow
1347         // SndFileSource::setup_standard_crossfades (frames_per_second);
1348
1349         set_dirty();
1350
1351         /* XXX need to reset/reinstantiate all LADSPA plugins */
1352 }
1353
1354 void
1355 Session::set_block_size (pframes_t nframes)
1356 {
1357         /* the AudioEngine guarantees
1358            that it will not be called while we are also in
1359            ::process(). It is therefore fine to do things that block
1360            here.
1361         */
1362         
1363         {
1364                 current_block_size = nframes;
1365
1366                 ensure_buffers ();
1367
1368                 boost::shared_ptr<RouteList> r = routes.reader ();
1369
1370                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1371                         (*i)->set_block_size (nframes);
1372                 }
1373
1374                 boost::shared_ptr<RouteList> rl = routes.reader ();
1375                 for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1376                         boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1377                         if (tr) {
1378                                 tr->set_block_size (nframes);
1379                         }
1380                 }
1381
1382                 set_worst_io_latencies ();
1383         }
1384 }
1385
1386
1387 static void
1388 trace_terminal (boost::shared_ptr<Route> r1, boost::shared_ptr<Route> rbase)
1389 {
1390         boost::shared_ptr<Route> r2;
1391
1392         if (r1->feeds (rbase) && rbase->feeds (r1)) {
1393                 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1394                 return;
1395         }
1396
1397         /* make a copy of the existing list of routes that feed r1 */
1398
1399         Route::FedBy existing (r1->fed_by());
1400
1401         /* for each route that feeds r1, recurse, marking it as feeding
1402            rbase as well.
1403         */
1404
1405         for (Route::FedBy::iterator i = existing.begin(); i != existing.end(); ++i) {
1406                 if (!(r2 = i->r.lock ())) {
1407                         /* (*i) went away, ignore it */
1408                         continue;
1409                 }
1410
1411                 /* r2 is a route that feeds r1 which somehow feeds base. mark
1412                    base as being fed by r2
1413                 */
1414
1415                 rbase->add_fed_by (r2, i->sends_only);
1416
1417                 if (r2 != rbase) {
1418
1419                         /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1420                            stop here.
1421                         */
1422
1423                         if (r1->feeds (r2) && r2->feeds (r1)) {
1424                                 continue;
1425                         }
1426
1427                         /* now recurse, so that we can mark base as being fed by
1428                            all routes that feed r2
1429                         */
1430
1431                         trace_terminal (r2, rbase);
1432                 }
1433
1434         }
1435 }
1436
1437 void
1438 Session::resort_routes ()
1439 {
1440         /* don't do anything here with signals emitted
1441            by Routes during initial setup or while we
1442            are being destroyed.
1443         */
1444
1445         if (_state_of_the_state & (InitialConnecting | Deletion)) {
1446                 return;
1447         }
1448
1449         {
1450                 RCUWriter<RouteList> writer (routes);
1451                 boost::shared_ptr<RouteList> r = writer.get_copy ();
1452                 resort_routes_using (r);
1453                 /* writer goes out of scope and forces update */
1454         }
1455
1456 #ifndef NDEBUG
1457         boost::shared_ptr<RouteList> rl = routes.reader ();
1458         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
1459                 DEBUG_TRACE (DEBUG::Graph, string_compose ("%1 fed by ...\n", (*i)->name()));
1460
1461                 const Route::FedBy& fb ((*i)->fed_by());
1462
1463                 for (Route::FedBy::const_iterator f = fb.begin(); f != fb.end(); ++f) {
1464                         boost::shared_ptr<Route> sf = f->r.lock();
1465                         if (sf) {
1466                                 DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 (sends only ? %2)\n", sf->name(), f->sends_only));
1467                         }
1468                 }
1469         }
1470 #endif
1471
1472 }
1473
1474 /** This is called whenever we need to rebuild the graph of how we will process
1475  *  routes.
1476  *  @param r List of routes, in any order.
1477  */
1478
1479 void
1480 Session::resort_routes_using (boost::shared_ptr<RouteList> r)
1481 {
1482         /* We are going to build a directed graph of our routes;
1483            this is where the edges of that graph are put.
1484         */
1485         
1486         GraphEdges edges;
1487
1488         /* Go through all routes doing two things:
1489          *
1490          * 1. Collect the edges of the route graph.  Each of these edges
1491          *    is a pair of routes, one of which directly feeds the other
1492          *    either by a JACK connection or by an internal send.
1493          *
1494          * 2. Begin the process of making routes aware of which other
1495          *    routes directly or indirectly feed them.  This information
1496          *    is used by the solo code.
1497          */
1498            
1499         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1500
1501                 /* Clear out the route's list of direct or indirect feeds */
1502                 (*i)->clear_fed_by ();
1503
1504                 for (RouteList::iterator j = r->begin(); j != r->end(); ++j) {
1505
1506                         bool via_sends_only;
1507
1508                         /* See if this *j feeds *i according to the current state of the JACK
1509                            connections and internal sends.
1510                         */
1511                         if ((*j)->direct_feeds_according_to_reality (*i, &via_sends_only)) {
1512                                 /* add the edge to the graph (part #1) */
1513                                 edges.add (*j, *i, via_sends_only);
1514                                 /* tell the route (for part #2) */
1515                                 (*i)->add_fed_by (*j, via_sends_only);
1516                         }
1517                 }
1518         }
1519
1520         /* Attempt a topological sort of the route graph */
1521         boost::shared_ptr<RouteList> sorted_routes = topological_sort (r, edges);
1522         
1523         if (sorted_routes) {
1524                 /* We got a satisfactory topological sort, so there is no feedback;
1525                    use this new graph.
1526
1527                    Note: the process graph rechain does not require a
1528                    topologically-sorted list, but hey ho.
1529                 */
1530                 if (_process_graph) {
1531                         _process_graph->rechain (sorted_routes, edges);
1532                 }
1533                 
1534                 _current_route_graph = edges;
1535
1536                 /* Complete the building of the routes' lists of what directly
1537                    or indirectly feeds them.
1538                 */
1539                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1540                         trace_terminal (*i, *i);
1541                 }
1542
1543                 *r = *sorted_routes;
1544
1545 #ifndef NDEBUG
1546                 DEBUG_TRACE (DEBUG::Graph, "Routes resorted, order follows:\n");
1547                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1548                         DEBUG_TRACE (DEBUG::Graph, string_compose ("\t%1 signal order %2\n",
1549                                                                    (*i)->name(), (*i)->order_key (MixerSort)));
1550                 }
1551 #endif
1552
1553                 SuccessfulGraphSort (); /* EMIT SIGNAL */
1554
1555         } else {
1556                 /* The topological sort failed, so we have a problem.  Tell everyone
1557                    and stick to the old graph; this will continue to be processed, so
1558                    until the feedback is fixed, what is played back will not quite
1559                    reflect what is actually connected.  Note also that we do not
1560                    do trace_terminal here, as it would fail due to an endless recursion,
1561                    so the solo code will think that everything is still connected
1562                    as it was before.
1563                 */
1564                 
1565                 FeedbackDetected (); /* EMIT SIGNAL */
1566         }
1567
1568 }
1569
1570 /** Find a route name starting with \a base, maybe followed by the
1571  *  lowest \a id.  \a id will always be added if \a definitely_add_number
1572  *  is true on entry; otherwise it will only be added if required
1573  *  to make the name unique.
1574  *
1575  *  Names are constructed like e.g. "Audio 3" for base="Audio" and id=3.
1576  *  The available route name with the lowest ID will be used, and \a id
1577  *  will be set to the ID.
1578  *
1579  *  \return false if a route name could not be found, and \a track_name
1580  *  and \a id do not reflect a free route name.
1581  */
1582 bool
1583 Session::find_route_name (string const & base, uint32_t& id, char* name, size_t name_len, bool definitely_add_number)
1584 {
1585         if (!definitely_add_number && route_by_name (base) == 0) {
1586                 /* juse use the base */
1587                 snprintf (name, name_len, "%s", base.c_str());
1588                 return true;
1589         }
1590
1591         do {
1592                 snprintf (name, name_len, "%s %" PRIu32, base.c_str(), id);
1593
1594                 if (route_by_name (name) == 0) {
1595                         return true;
1596                 }
1597
1598                 ++id;
1599
1600         } while (id < (UINT_MAX-1));
1601
1602         return false;
1603 }
1604
1605 /** Count the total ins and outs of all non-hidden tracks in the session and return them in in and out */
1606 void
1607 Session::count_existing_track_channels (ChanCount& in, ChanCount& out)
1608 {
1609         in  = ChanCount::ZERO;
1610         out = ChanCount::ZERO;
1611
1612         boost::shared_ptr<RouteList> r = routes.reader ();
1613
1614         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
1615                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
1616                 if (tr && !tr->is_hidden()) {
1617                         in  += tr->n_inputs();
1618                         out += tr->n_outputs();
1619                 }
1620         }
1621 }
1622
1623 /** Caller must not hold process lock
1624  *  @param name_template string to use for the start of the name, or "" to use "MIDI".
1625  *  @param instrument plugin info for the instrument to insert pre-fader, if any
1626  */
1627 list<boost::shared_ptr<MidiTrack> >
1628 Session::new_midi_track (const ChanCount& input, const ChanCount& output, boost::shared_ptr<PluginInfo> instrument, 
1629                          TrackMode mode, RouteGroup* route_group, uint32_t how_many, string name_template)
1630 {
1631         char track_name[32];
1632         uint32_t track_id = 0;
1633         string port;
1634         RouteList new_routes;
1635         list<boost::shared_ptr<MidiTrack> > ret;
1636
1637         cerr << "Adding MIDI track with in = " << input << " out = " << output << endl;
1638
1639         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("MIDI");
1640
1641         while (how_many) {
1642                 if (!find_route_name (name_template.empty() ? _("MIDI") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1643                         error << "cannot find name for new midi track" << endmsg;
1644                         goto failed;
1645                 }
1646
1647                 boost::shared_ptr<MidiTrack> track;
1648
1649                 try {
1650                         track.reset (new MidiTrack (*this, track_name, Route::Flag (0), mode));
1651
1652                         if (track->init ()) {
1653                                 goto failed;
1654                         }
1655
1656                         track->use_new_diskstream();
1657
1658 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1659                         // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1660 #endif
1661                         {
1662                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1663                                 if (track->input()->ensure_io (input, false, this)) {
1664                                         error << "cannot configure " << input << " out configuration for new midi track" << endmsg;     
1665                                         goto failed;
1666                                 }
1667
1668                                 if (track->output()->ensure_io (output, false, this)) {
1669                                         error << "cannot configure " << output << " out configuration for new midi track" << endmsg;
1670                                         goto failed;
1671                                 }
1672                         }
1673
1674                         track->non_realtime_input_change();
1675
1676                         if (route_group) {
1677                                 route_group->add (track);
1678                         }
1679
1680                         track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1681
1682                         if (Config->get_remote_model() == UserOrdered) {
1683                                 track->set_remote_control_id (next_control_id());
1684                         }
1685
1686                         new_routes.push_back (track);
1687                         ret.push_back (track);
1688                 }
1689
1690                 catch (failed_constructor &err) {
1691                         error << _("Session: could not create new midi track.") << endmsg;
1692                         goto failed;
1693                 }
1694
1695                 catch (AudioEngine::PortRegistrationFailure& pfe) {
1696
1697                         error << string_compose (_("No more JACK ports are available. You will need to stop %1 and restart JACK with ports if you need this many tracks."), PROGRAM_NAME) << endmsg;
1698                         goto failed;
1699                 }
1700
1701                 --how_many;
1702         }
1703
1704   failed:
1705         if (!new_routes.empty()) {
1706                 add_routes (new_routes, true, true, true);
1707
1708                 if (instrument) {
1709                         for (RouteList::iterator r = new_routes.begin(); r != new_routes.end(); ++r) {
1710                                 PluginPtr plugin = instrument->load (*this);
1711                                 boost::shared_ptr<Processor> p (new PluginInsert (*this, plugin));
1712                                 (*r)->add_processor (p, PreFader);
1713                                 
1714                         }
1715                 }
1716         }
1717
1718         return ret;
1719 }
1720
1721 void
1722 Session::midi_output_change_handler (IOChange change, void * /*src*/, boost::weak_ptr<Route> wmt)
1723 {
1724         boost::shared_ptr<Route> midi_track (wmt.lock());
1725
1726         if (!midi_track) {
1727                 return;
1728         }
1729
1730         if ((change.type & IOChange::ConfigurationChanged) && Config->get_output_auto_connect() != ManualConnect) {
1731
1732                 if (change.after.n_audio() <= change.before.n_audio()) {
1733                         return;
1734                 }
1735
1736                 /* new audio ports: make sure the audio goes somewhere useful,
1737                    unless the user has no-auto-connect selected.
1738
1739                    The existing ChanCounts don't matter for this call as they are only
1740                    to do with matching input and output indices, and we are only changing
1741                    outputs here.
1742                 */
1743
1744                 ChanCount dummy;
1745
1746                 auto_connect_route (midi_track, dummy, dummy, false, false, ChanCount(), change.before);
1747         }
1748 }
1749
1750 /** @param connect_inputs true to connect inputs as well as outputs, false to connect just outputs.
1751  *  @param input_start Where to start from when auto-connecting inputs; e.g. if this is 0, auto-connect starting from input 0.
1752  *  @param output_start As \a input_start, but for outputs.
1753  */
1754 void
1755 Session::auto_connect_route (boost::shared_ptr<Route> route, ChanCount& existing_inputs, ChanCount& existing_outputs,
1756                              bool with_lock, bool connect_inputs, ChanCount input_start, ChanCount output_start)
1757 {
1758         if (!IO::connecting_legal) {
1759                 return;
1760         }
1761
1762         Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock (), Glib::Threads::NOT_LOCK);
1763
1764         if (with_lock) {
1765                 lm.acquire ();
1766         }
1767
1768         /* If both inputs and outputs are auto-connected to physical ports,
1769            use the max of input and output offsets to ensure auto-connected
1770            port numbers always match up (e.g. the first audio input and the
1771            first audio output of the route will have the same physical
1772            port number).  Otherwise just use the lowest input or output
1773            offset possible.
1774         */
1775
1776         DEBUG_TRACE (DEBUG::Graph,
1777                      string_compose("Auto-connect: existing in = %1 out = %2\n",
1778                                     existing_inputs, existing_outputs));
1779
1780         const bool in_out_physical =
1781                 (Config->get_input_auto_connect() & AutoConnectPhysical)
1782                 && (Config->get_output_auto_connect() & AutoConnectPhysical)
1783                 && connect_inputs;
1784
1785         const ChanCount in_offset = in_out_physical
1786                 ? ChanCount::max(existing_inputs, existing_outputs)
1787                 : existing_inputs;
1788
1789         const ChanCount out_offset = in_out_physical
1790                 ? ChanCount::max(existing_inputs, existing_outputs)
1791                 : existing_outputs;
1792
1793         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1794                 vector<string> physinputs;
1795                 vector<string> physoutputs;
1796
1797                 _engine.get_physical_outputs (*t, physoutputs);
1798                 _engine.get_physical_inputs (*t, physinputs);
1799
1800                 if (!physinputs.empty() && connect_inputs) {
1801                         uint32_t nphysical_in = physinputs.size();
1802
1803                         DEBUG_TRACE (DEBUG::Graph,
1804                                      string_compose("There are %1 physical inputs of type %2\n",
1805                                                     nphysical_in, *t));
1806
1807                         for (uint32_t i = input_start.get(*t); i < route->n_inputs().get(*t) && i < nphysical_in; ++i) {
1808                                 string port;
1809
1810                                 if (Config->get_input_auto_connect() & AutoConnectPhysical) {
1811                                         DEBUG_TRACE (DEBUG::Graph,
1812                                                      string_compose("Get index %1 + %2 % %3 = %4\n",
1813                                                                     in_offset.get(*t), i, nphysical_in,
1814                                                                     (in_offset.get(*t) + i) % nphysical_in));
1815                                         port = physinputs[(in_offset.get(*t) + i) % nphysical_in];
1816                                 }
1817
1818                                 DEBUG_TRACE (DEBUG::Graph,
1819                                              string_compose("Connect route %1 IN to %2\n",
1820                                                             route->name(), port));
1821
1822                                 if (!port.empty() && route->input()->connect (route->input()->ports().port(*t, i), port, this)) {
1823                                         break;
1824                                 }
1825
1826                                 ChanCount one_added (*t, 1);
1827                                 existing_inputs += one_added;
1828                         }
1829                 }
1830
1831                 if (!physoutputs.empty()) {
1832                         uint32_t nphysical_out = physoutputs.size();
1833                         for (uint32_t i = output_start.get(*t); i < route->n_outputs().get(*t); ++i) {
1834                                 string port;
1835
1836                                 if ((*t) == DataType::MIDI || Config->get_output_auto_connect() & AutoConnectPhysical) {
1837                                         port = physoutputs[(out_offset.get(*t) + i) % nphysical_out];
1838                                 } else if ((*t) == DataType::AUDIO && Config->get_output_auto_connect() & AutoConnectMaster) {
1839                                         /* master bus is audio only */
1840                                         if (_master_out && _master_out->n_inputs().get(*t) > 0) {
1841                                                 port = _master_out->input()->ports().port(*t,
1842                                                                 i % _master_out->input()->n_ports().get(*t))->name();
1843                                         }
1844                                 }
1845
1846                                 DEBUG_TRACE (DEBUG::Graph,
1847                                              string_compose("Connect route %1 OUT to %2\n",
1848                                                             route->name(), port));
1849
1850                                 if (!port.empty() && route->output()->connect (route->output()->ports().port(*t, i), port, this)) {
1851                                         break;
1852                                 }
1853
1854                                 ChanCount one_added (*t, 1);
1855                                 existing_outputs += one_added;
1856                         }
1857                 }
1858         }
1859 }
1860
1861 /** Caller must not hold process lock
1862  *  @param name_template string to use for the start of the name, or "" to use "Audio".
1863  */
1864 list< boost::shared_ptr<AudioTrack> >
1865 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode, RouteGroup* route_group, 
1866                           uint32_t how_many, string name_template)
1867 {
1868         char track_name[32];
1869         uint32_t track_id = 0;
1870         string port;
1871         RouteList new_routes;
1872         list<boost::shared_ptr<AudioTrack> > ret;
1873
1874         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Audio");
1875
1876         while (how_many) {
1877                 if (!find_route_name (name_template.empty() ? _("Audio") : name_template, ++track_id, track_name, sizeof(track_name), use_number)) {
1878                         error << "cannot find name for new audio track" << endmsg;
1879                         goto failed;
1880                 }
1881
1882                 boost::shared_ptr<AudioTrack> track;
1883
1884                 try {
1885                         track.reset (new AudioTrack (*this, track_name, Route::Flag (0), mode));
1886
1887                         if (track->init ()) {
1888                                 goto failed;
1889                         }
1890
1891                         track->use_new_diskstream();
1892
1893 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1894                         // boost_debug_shared_ptr_mark_interesting (track.get(), "Track");
1895 #endif
1896                         {
1897                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1898
1899                                 if (track->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1900                                         error << string_compose (
1901                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
1902                                                 input_channels, output_channels)
1903                                               << endmsg;
1904                                         goto failed;
1905                                 }
1906
1907                                 if (track->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1908                                         error << string_compose (
1909                                                 _("cannot configure %1 in/%2 out configuration for new audio track"),
1910                                                 input_channels, output_channels)
1911                                               << endmsg;
1912                                         goto failed;
1913                                 }
1914                         }
1915
1916                         if (route_group) {
1917                                 route_group->add (track);
1918                         }
1919
1920                         track->non_realtime_input_change();
1921
1922                         track->DiskstreamChanged.connect_same_thread (*this, boost::bind (&Session::resort_routes, this));
1923                         if (Config->get_remote_model() == UserOrdered) {
1924                                 track->set_remote_control_id (next_control_id());
1925                         }
1926
1927                         new_routes.push_back (track);
1928                         ret.push_back (track);
1929                 }
1930
1931                 catch (failed_constructor &err) {
1932                         error << _("Session: could not create new audio track.") << endmsg;
1933                         goto failed;
1934                 }
1935
1936                 catch (AudioEngine::PortRegistrationFailure& pfe) {
1937
1938                         error << pfe.what() << endmsg;
1939                         goto failed;
1940                 }
1941
1942                 --how_many;
1943         }
1944
1945   failed:
1946         if (!new_routes.empty()) {
1947                 add_routes (new_routes, true, true, true);
1948         }
1949
1950         return ret;
1951 }
1952
1953 /** Caller must not hold process lock.
1954  *  @param name_template string to use for the start of the name, or "" to use "Bus".
1955  */
1956 RouteList
1957 Session::new_audio_route (int input_channels, int output_channels, RouteGroup* route_group, uint32_t how_many, string name_template)
1958 {
1959         char bus_name[32];
1960         uint32_t bus_id = 0;
1961         string port;
1962         RouteList ret;
1963
1964         bool const use_number = (how_many != 1) || name_template.empty () || name_template == _("Bus");
1965         
1966         while (how_many) {
1967                 if (!find_route_name (name_template.empty () ? _("Bus") : name_template, ++bus_id, bus_name, sizeof(bus_name), use_number)) {
1968                         error << "cannot find name for new audio bus" << endmsg;
1969                         goto failure;
1970                 }
1971
1972                 try {
1973                         boost::shared_ptr<Route> bus (new Route (*this, bus_name, Route::Flag(0), DataType::AUDIO));
1974
1975                         if (bus->init ()) {
1976                                 goto failure;
1977                         }
1978
1979 #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS
1980                         // boost_debug_shared_ptr_mark_interesting (bus.get(), "Route");
1981 #endif
1982                         {
1983                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
1984
1985                                 if (bus->input()->ensure_io (ChanCount(DataType::AUDIO, input_channels), false, this)) {
1986                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1987                                                                  input_channels, output_channels)
1988                                               << endmsg;
1989                                         goto failure;
1990                                 }
1991
1992
1993                                 if (bus->output()->ensure_io (ChanCount(DataType::AUDIO, output_channels), false, this)) {
1994                                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1995                                                                  input_channels, output_channels)
1996                                               << endmsg;
1997                                         goto failure;
1998                                 }
1999                         }
2000
2001                         if (route_group) {
2002                                 route_group->add (bus);
2003                         }
2004                         if (Config->get_remote_model() == UserOrdered) {
2005                                 bus->set_remote_control_id (next_control_id());
2006                         }
2007
2008                         bus->add_internal_return ();
2009
2010                         ret.push_back (bus);
2011                         
2012                         ARDOUR::GUIIdle ();
2013                 }
2014
2015
2016                 catch (failed_constructor &err) {
2017                         error << _("Session: could not create new audio route.") << endmsg;
2018                         goto failure;
2019                 }
2020
2021                 catch (AudioEngine::PortRegistrationFailure& pfe) {
2022                         error << pfe.what() << endmsg;
2023                         goto failure;
2024                 }
2025
2026
2027                 --how_many;
2028         }
2029
2030   failure:
2031         if (!ret.empty()) {
2032                 add_routes (ret, false, true, true); // autoconnect outputs only
2033         }
2034
2035         return ret;
2036
2037 }
2038
2039 RouteList
2040 Session::new_route_from_template (uint32_t how_many, const std::string& template_path)
2041 {
2042         RouteList ret;
2043         uint32_t control_id;
2044         XMLTree tree;
2045         uint32_t number = 0;
2046
2047         if (!tree.read (template_path.c_str())) {
2048                 return ret;
2049         }
2050
2051         XMLNode* node = tree.root();
2052
2053         IO::disable_connecting ();
2054
2055         control_id = next_control_id ();
2056
2057         while (how_many) {
2058
2059                 XMLNode node_copy (*node);
2060
2061                 /* Remove IDs of everything so that new ones are used */
2062                 node_copy.remove_property_recursively (X_("id"));
2063
2064                 try {
2065                         string const route_name = node_copy.property(X_("name"))->value ();
2066                         
2067                         /* generate a new name by adding a number to the end of the template name */
2068                         char name[32];
2069                         if (!find_route_name (route_name.c_str(), ++number, name, sizeof(name), true)) {
2070                                 fatal << _("Session: UINT_MAX routes? impossible!") << endmsg;
2071                                 /*NOTREACHED*/
2072                         }
2073
2074                         /* set this name in the XML description that we are about to use */
2075                         Route::set_name_in_state (node_copy, name);
2076
2077                         /* trim bitslots from listen sends so that new ones are used */
2078                         XMLNodeList children = node_copy.children ();
2079                         for (XMLNodeList::iterator i = children.begin(); i != children.end(); ++i) {
2080                                 if ((*i)->name() == X_("Processor")) {
2081                                         XMLProperty* role = (*i)->property (X_("role"));
2082                                         if (role && role->value() == X_("Listen")) {
2083                                                 (*i)->remove_property (X_("bitslot"));
2084                                         }
2085                                 }
2086                         }
2087                         
2088                         boost::shared_ptr<Route> route (XMLRouteFactory (node_copy, 3000));
2089
2090                         if (route == 0) {
2091                                 error << _("Session: cannot create track/bus from template description") << endmsg;
2092                                 goto out;
2093                         }
2094
2095                         if (boost::dynamic_pointer_cast<Track>(route)) {
2096                                 /* force input/output change signals so that the new diskstream
2097                                    picks up the configuration of the route. During session
2098                                    loading this normally happens in a different way.
2099                                 */
2100
2101                                 Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
2102
2103                                 IOChange change (IOChange::Type (IOChange::ConfigurationChanged | IOChange::ConnectionsChanged));
2104                                 change.after = route->input()->n_ports();
2105                                 route->input()->changed (change, this);
2106                                 change.after = route->output()->n_ports();
2107                                 route->output()->changed (change, this);
2108                         }
2109
2110                         route->set_remote_control_id (control_id);
2111                         ++control_id;
2112
2113                         ret.push_back (route);
2114                 }
2115
2116                 catch (failed_constructor &err) {
2117                         error << _("Session: could not create new route from template") << endmsg;
2118                         goto out;
2119                 }
2120
2121                 catch (AudioEngine::PortRegistrationFailure& pfe) {
2122                         error << pfe.what() << endmsg;
2123                         goto out;
2124                 }
2125
2126                 --how_many;
2127         }
2128
2129   out:
2130         if (!ret.empty()) {
2131                 add_routes (ret, true, true, true);
2132                 IO::enable_connecting ();
2133         }
2134
2135         return ret;
2136 }
2137
2138 void
2139 Session::add_routes (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect, bool save)
2140 {
2141         try {
2142                 PBD::Unwinder<bool> aip (_adding_routes_in_progress, true);
2143                 add_routes_inner (new_routes, input_auto_connect, output_auto_connect);
2144
2145         } catch (...) {
2146                 error << _("Adding new tracks/busses failed") << endmsg;
2147         }
2148
2149         graph_reordered ();
2150
2151         update_latency (true);
2152         update_latency (false);
2153                 
2154         set_dirty();
2155         
2156         if (save) {
2157                 save_state (_current_snapshot_name);
2158         }
2159         
2160         RouteAdded (new_routes); /* EMIT SIGNAL */
2161 }
2162
2163 void
2164 Session::add_routes_inner (RouteList& new_routes, bool input_auto_connect, bool output_auto_connect)
2165 {
2166         ChanCount existing_inputs;
2167         ChanCount existing_outputs;
2168         uint32_t order = next_control_id();
2169
2170         count_existing_track_channels (existing_inputs, existing_outputs);
2171
2172         {
2173                 RCUWriter<RouteList> writer (routes);
2174                 boost::shared_ptr<RouteList> r = writer.get_copy ();
2175                 r->insert (r->end(), new_routes.begin(), new_routes.end());
2176
2177                 /* if there is no control out and we're not in the middle of loading,
2178                    resort the graph here. if there is a control out, we will resort
2179                    toward the end of this method. if we are in the middle of loading,
2180                    we will resort when done.
2181                 */
2182
2183                 if (!_monitor_out && IO::connecting_legal) {
2184                         resort_routes_using (r);
2185                 }
2186         }
2187
2188         for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2189
2190                 boost::weak_ptr<Route> wpr (*x);
2191                 boost::shared_ptr<Route> r (*x);
2192
2193                 r->listen_changed.connect_same_thread (*this, boost::bind (&Session::route_listen_changed, this, _1, wpr));
2194                 r->solo_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_changed, this, _1, _2, wpr));
2195                 r->solo_isolated_changed.connect_same_thread (*this, boost::bind (&Session::route_solo_isolated_changed, this, _1, wpr));
2196                 r->mute_changed.connect_same_thread (*this, boost::bind (&Session::route_mute_changed, this, _1));
2197                 r->output()->changed.connect_same_thread (*this, boost::bind (&Session::set_worst_io_latencies_x, this, _1, _2));
2198                 r->processors_changed.connect_same_thread (*this, boost::bind (&Session::route_processors_changed, this, _1));
2199
2200                 if (r->is_master()) {
2201                         _master_out = r;
2202                 }
2203
2204                 if (r->is_monitor()) {
2205                         _monitor_out = r;
2206                 }
2207
2208                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (r);
2209                 if (tr) {
2210                         tr->PlaylistChanged.connect_same_thread (*this, boost::bind (&Session::track_playlist_changed, this, boost::weak_ptr<Track> (tr)));
2211                         track_playlist_changed (boost::weak_ptr<Track> (tr));
2212                         tr->RecordEnableChanged.connect_same_thread (*this, boost::bind (&Session::update_have_rec_enabled_track, this));
2213
2214                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (tr);
2215                         if (mt) {
2216                                 mt->StepEditStatusChange.connect_same_thread (*this, boost::bind (&Session::step_edit_status_change, this, _1));
2217                                 mt->output()->changed.connect_same_thread (*this, boost::bind (&Session::midi_output_change_handler, this, _1, _2, boost::weak_ptr<Route>(mt)));
2218                         }
2219                 }
2220
2221
2222                 if (input_auto_connect || output_auto_connect) {
2223                         auto_connect_route (r, existing_inputs, existing_outputs, true, input_auto_connect);
2224                 }
2225
2226                 /* order keys are a GUI responsibility but we need to set up
2227                    reasonable defaults because they also affect the remote control
2228                    ID in most situations.
2229                 */
2230
2231                 if (!r->has_order_key (EditorSort)) {
2232                         if (r->is_hidden()) {
2233                                 /* use an arbitrarily high value */
2234                                 r->set_order_key (EditorSort, UINT_MAX);
2235                                 r->set_order_key (MixerSort, UINT_MAX);
2236                         } else {
2237                                 DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("while adding, set %1 to order key %2\n", r->name(), order));
2238                                 r->set_order_key (EditorSort, order);
2239                                 r->set_order_key (MixerSort, order);
2240                                 order++;
2241                         }
2242                 }
2243
2244                 ARDOUR::GUIIdle ();
2245         }
2246
2247         if (_monitor_out && IO::connecting_legal) {
2248                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());         
2249                 
2250                 for (RouteList::iterator x = new_routes.begin(); x != new_routes.end(); ++x) {
2251                         if ((*x)->is_monitor()) {
2252                                 /* relax */
2253                         } else if ((*x)->is_master()) {
2254                                         /* relax */
2255                         } else {
2256                                 (*x)->enable_monitor_send ();
2257                         }
2258                 }
2259         }
2260 }
2261
2262 void
2263 Session::globally_set_send_gains_to_zero (boost::shared_ptr<Route> dest)
2264 {
2265         boost::shared_ptr<RouteList> r = routes.reader ();
2266         boost::shared_ptr<Send> s;
2267
2268         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2269                 if ((s = (*i)->internal_send_for (dest)) != 0) {
2270                         s->amp()->gain_control()->set_value (0.0);
2271                 }
2272         }
2273 }
2274
2275 void
2276 Session::globally_set_send_gains_to_unity (boost::shared_ptr<Route> dest)
2277 {
2278         boost::shared_ptr<RouteList> r = routes.reader ();
2279         boost::shared_ptr<Send> s;
2280
2281         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2282                 if ((s = (*i)->internal_send_for (dest)) != 0) {
2283                         s->amp()->gain_control()->set_value (1.0);
2284                 }
2285         }
2286 }
2287
2288 void
2289 Session::globally_set_send_gains_from_track(boost::shared_ptr<Route> dest)
2290 {
2291         boost::shared_ptr<RouteList> r = routes.reader ();
2292         boost::shared_ptr<Send> s;
2293
2294         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2295                 if ((s = (*i)->internal_send_for (dest)) != 0) {
2296                         s->amp()->gain_control()->set_value ((*i)->gain_control()->get_value());
2297                 }
2298         }
2299 }
2300
2301 /** @param include_buses true to add sends to buses and tracks, false for just tracks */
2302 void
2303 Session::globally_add_internal_sends (boost::shared_ptr<Route> dest, Placement p, bool include_buses)
2304 {
2305         boost::shared_ptr<RouteList> r = routes.reader ();
2306         boost::shared_ptr<RouteList> t (new RouteList);
2307
2308         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2309                 /* no MIDI sends because there are no MIDI busses yet */
2310                 if (include_buses || boost::dynamic_pointer_cast<AudioTrack>(*i)) {
2311                         t->push_back (*i);
2312                 }
2313         }
2314
2315         add_internal_sends (dest, p, t);
2316 }
2317
2318 void
2319 Session::add_internal_sends (boost::shared_ptr<Route> dest, Placement p, boost::shared_ptr<RouteList> senders)
2320 {
2321         for (RouteList::iterator i = senders->begin(); i != senders->end(); ++i) {
2322                 add_internal_send (dest, (*i)->before_processor_for_placement (p), *i);
2323         }
2324 }
2325
2326 void
2327 Session::add_internal_send (boost::shared_ptr<Route> dest, int index, boost::shared_ptr<Route> sender)
2328 {
2329         add_internal_send (dest, sender->before_processor_for_index (index), sender);
2330 }
2331
2332 void
2333 Session::add_internal_send (boost::shared_ptr<Route> dest, boost::shared_ptr<Processor> before, boost::shared_ptr<Route> sender)
2334 {
2335         if (sender->is_monitor() || sender->is_master() || sender == dest || dest->is_monitor() || dest->is_master()) {
2336                 return;
2337         }
2338
2339         if (!dest->internal_return()) {
2340                 dest->add_internal_return ();
2341         }
2342
2343         sender->add_aux_send (dest, before);
2344
2345         graph_reordered ();
2346 }
2347
2348 void
2349 Session::remove_route (boost::shared_ptr<Route> route)
2350 {
2351         if (route == _master_out) {
2352                 return;
2353         }
2354
2355         route->set_solo (false, this);
2356
2357         {
2358                 RCUWriter<RouteList> writer (routes);
2359                 boost::shared_ptr<RouteList> rs = writer.get_copy ();
2360
2361                 rs->remove (route);
2362
2363                 /* deleting the master out seems like a dumb
2364                    idea, but its more of a UI policy issue
2365                    than our concern.
2366                 */
2367
2368                 if (route == _master_out) {
2369                         _master_out = boost::shared_ptr<Route> ();
2370                 }
2371
2372                 if (route == _monitor_out) {
2373                         _monitor_out.reset ();
2374                 }
2375
2376                 /* writer goes out of scope, forces route list update */
2377         }
2378
2379         update_route_solo_state ();
2380
2381         // We need to disconnect the route's inputs and outputs
2382
2383         route->input()->disconnect (0);
2384         route->output()->disconnect (0);
2385
2386         /* if the route had internal sends sending to it, remove them */
2387         if (route->internal_return()) {
2388
2389                 boost::shared_ptr<RouteList> r = routes.reader ();
2390                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2391                         boost::shared_ptr<Send> s = (*i)->internal_send_for (route);
2392                         if (s) {
2393                                 (*i)->remove_processor (s);
2394                         }
2395                 }
2396         }
2397
2398         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (route);
2399         if (mt && mt->step_editing()) {
2400                 if (_step_editors > 0) {
2401                         _step_editors--;
2402                 }
2403         }
2404
2405         update_latency_compensation ();
2406         set_dirty();
2407
2408         /* Re-sort routes to remove the graph's current references to the one that is
2409          * going away, then flush old references out of the graph.
2410          */
2411
2412         resort_routes ();
2413         if (_process_graph) {
2414                 _process_graph->clear_other_chain ();
2415         }
2416
2417         /* get rid of it from the dead wood collection in the route list manager */
2418
2419         /* XXX i think this is unsafe as it currently stands, but i am not sure. (pd, october 2nd, 2006) */
2420
2421         routes.flush ();
2422
2423         /* try to cause everyone to drop their references */
2424
2425         route->drop_references ();
2426
2427         Route::RemoteControlIDChange(); /* EMIT SIGNAL */
2428
2429         /* save the new state of the world */
2430
2431         if (save_state (_current_snapshot_name)) {
2432                 save_history (_current_snapshot_name);
2433         }
2434 }
2435
2436 void
2437 Session::route_mute_changed (void* /*src*/)
2438 {
2439         set_dirty ();
2440 }
2441
2442 void
2443 Session::route_listen_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2444 {
2445         boost::shared_ptr<Route> route = wpr.lock();
2446         if (!route) {
2447                 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2448                 return;
2449         }
2450
2451         if (route->listening_via_monitor ()) {
2452
2453                 if (Config->get_exclusive_solo()) {
2454                         /* new listen: disable all other listen */
2455                         boost::shared_ptr<RouteList> r = routes.reader ();
2456                         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2457                                 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
2458                                         continue;
2459                                 }
2460                                 (*i)->set_listen (false, this);
2461                         }
2462                 }
2463
2464                 _listen_cnt++;
2465
2466         } else if (_listen_cnt > 0) {
2467
2468                 _listen_cnt--;
2469         }
2470
2471         update_route_solo_state ();
2472 }
2473 void
2474 Session::route_solo_isolated_changed (void* /*src*/, boost::weak_ptr<Route> wpr)
2475 {
2476         boost::shared_ptr<Route> route = wpr.lock ();
2477
2478         if (!route) {
2479                 /* should not happen */
2480                 error << string_compose (_("programming error: %1"), X_("invalid route weak ptr passed to route_solo_changed")) << endmsg;
2481                 return;
2482         }
2483
2484         bool send_changed = false;
2485
2486         if (route->solo_isolated()) {
2487                 if (_solo_isolated_cnt == 0) {
2488                         send_changed = true;
2489                 }
2490                 _solo_isolated_cnt++;
2491         } else if (_solo_isolated_cnt > 0) {
2492                 _solo_isolated_cnt--;
2493                 if (_solo_isolated_cnt == 0) {
2494                         send_changed = true;
2495                 }
2496         }
2497
2498         if (send_changed) {
2499                 IsolatedChanged (); /* EMIT SIGNAL */
2500         }
2501 }
2502
2503 void
2504 Session::route_solo_changed (bool self_solo_change, void* /*src*/, boost::weak_ptr<Route> wpr)
2505 {
2506         DEBUG_TRACE (DEBUG::Solo, string_compose ("route solo change, self = %1\n", self_solo_change));
2507
2508         if (!self_solo_change) {
2509                 // session doesn't care about changes to soloed-by-others
2510                 return;
2511         }
2512
2513         if (solo_update_disabled) {
2514                 // We know already
2515                 DEBUG_TRACE (DEBUG::Solo, "solo update disabled - changed ignored\n");
2516                 return;
2517         }
2518
2519         boost::shared_ptr<Route> route = wpr.lock ();
2520         assert (route);
2521
2522         boost::shared_ptr<RouteList> r = routes.reader ();
2523         int32_t delta;
2524
2525         if (route->self_soloed()) {
2526                 delta = 1;
2527         } else {
2528                 delta = -1;
2529         }
2530
2531         RouteGroup* rg = route->route_group ();
2532         bool leave_group_alone = (rg && rg->is_active() && rg->is_solo());
2533
2534         if (delta == 1 && Config->get_exclusive_solo()) {
2535                 
2536                 /* new solo: disable all other solos, but not the group if its solo-enabled */
2537
2538                 for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2539                         if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2540                             (leave_group_alone && ((*i)->route_group() == rg))) {
2541                                 continue;
2542                         }
2543                         (*i)->set_solo (false, this);
2544                 }
2545         }
2546
2547         DEBUG_TRACE (DEBUG::Solo, string_compose ("propagate solo change, delta = %1\n", delta));
2548
2549         solo_update_disabled = true;
2550
2551         RouteList uninvolved;
2552
2553         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1\n", route->name()));
2554
2555         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2556                 bool via_sends_only;
2557                 bool in_signal_flow;
2558
2559                 if ((*i) == route || (*i)->solo_isolated() || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden() ||
2560                     (leave_group_alone && ((*i)->route_group() == rg))) {
2561                         continue;
2562                 }
2563
2564                 in_signal_flow = false;
2565
2566                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed from %1\n", (*i)->name()));
2567                 
2568                 if ((*i)->feeds (route, &via_sends_only)) {
2569                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a feed from %1\n", (*i)->name()));
2570                         if (!via_sends_only) {
2571                                 if (!route->soloed_by_others_upstream()) {
2572                                         (*i)->mod_solo_by_others_downstream (delta);
2573                                 }
2574                         } else {
2575                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tthere is a send-only feed from %1\n", (*i)->name()));
2576                         }
2577                         in_signal_flow = true;
2578                 } else {
2579                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tno feed from %1\n", (*i)->name()));
2580                 }
2581                 
2582                 DEBUG_TRACE (DEBUG::Solo, string_compose ("check feed to %1\n", (*i)->name()));
2583
2584                 if (route->feeds (*i, &via_sends_only)) {
2585                         /* propagate solo upstream only if routing other than
2586                            sends is involved, but do consider the other route
2587                            (*i) to be part of the signal flow even if only
2588                            sends are involved.
2589                         */
2590                         DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 feeds %2 via sends only %3 sboD %4 sboU %5\n",
2591                                                                   route->name(),
2592                                                                   (*i)->name(),
2593                                                                   via_sends_only,
2594                                                                   route->soloed_by_others_downstream(),
2595                                                                   route->soloed_by_others_upstream()));
2596                         if (!via_sends_only) {
2597                                 if (!route->soloed_by_others_downstream()) {
2598                                         DEBUG_TRACE (DEBUG::Solo, string_compose ("\tmod %1 by %2\n", (*i)->name(), delta));
2599                                         (*i)->mod_solo_by_others_upstream (delta);
2600                                 } else {
2601                                         DEBUG_TRACE (DEBUG::Solo, "\talready soloed by others downstream\n");
2602                                 }
2603                         } else {
2604                                 DEBUG_TRACE (DEBUG::Solo, string_compose ("\tfeed to %1 ignored, sends-only\n", (*i)->name()));
2605                         }
2606                         in_signal_flow = true;
2607                 } else {
2608                         DEBUG_TRACE (DEBUG::Solo, "\tno feed to\n");
2609                 }
2610
2611                 if (!in_signal_flow) {
2612                         uninvolved.push_back (*i);
2613                 }
2614         }
2615
2616         solo_update_disabled = false;
2617         DEBUG_TRACE (DEBUG::Solo, "propagation complete\n");
2618
2619         update_route_solo_state (r);
2620
2621         /* now notify that the mute state of the routes not involved in the signal
2622            pathway of the just-solo-changed route may have altered.
2623         */
2624
2625         for (RouteList::iterator i = uninvolved.begin(); i != uninvolved.end(); ++i) {
2626                 DEBUG_TRACE (DEBUG::Solo, string_compose ("mute change for %1, which neither feeds or is fed by %2\n", (*i)->name(), route->name()));
2627                 (*i)->mute_changed (this);
2628         }
2629
2630         SoloChanged (); /* EMIT SIGNAL */
2631         set_dirty();
2632 }
2633
2634 void
2635 Session::update_route_solo_state (boost::shared_ptr<RouteList> r)
2636 {
2637         /* now figure out if anything that matters is soloed (or is "listening")*/
2638
2639         bool something_soloed = false;
2640         uint32_t listeners = 0;
2641         uint32_t isolated = 0;
2642
2643         if (!r) {
2644                 r = routes.reader();
2645         }
2646
2647         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2648                 if (!(*i)->is_master() && !(*i)->is_monitor() && !(*i)->is_hidden() && (*i)->self_soloed()) {
2649                         something_soloed = true;
2650                 }
2651
2652                 if (!(*i)->is_hidden() && (*i)->listening_via_monitor()) {
2653                         if (Config->get_solo_control_is_listen_control()) {
2654                                 listeners++;
2655                         } else {
2656                                 (*i)->set_listen (false, this);
2657                         }
2658                 }
2659
2660                 if ((*i)->solo_isolated()) {
2661                         isolated++;
2662                 }
2663         }
2664
2665         if (something_soloed != _non_soloed_outs_muted) {
2666                 _non_soloed_outs_muted = something_soloed;
2667                 SoloActive (_non_soloed_outs_muted); /* EMIT SIGNAL */
2668         }
2669
2670         _listen_cnt = listeners;
2671
2672         if (isolated != _solo_isolated_cnt) {
2673                 _solo_isolated_cnt = isolated;
2674                 IsolatedChanged (); /* EMIT SIGNAL */
2675         }
2676
2677         DEBUG_TRACE (DEBUG::Solo, string_compose ("solo state updated by session, soloed? %1 listeners %2 isolated %3\n",
2678                                                   something_soloed, listeners, isolated));
2679 }
2680
2681 boost::shared_ptr<RouteList>
2682 Session::get_routes_with_internal_returns() const
2683 {
2684         boost::shared_ptr<RouteList> r = routes.reader ();
2685         boost::shared_ptr<RouteList> rl (new RouteList);
2686
2687         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2688                 if ((*i)->internal_return ()) {
2689                         rl->push_back (*i);
2690                 }
2691         }
2692         return rl;
2693 }
2694
2695 bool
2696 Session::io_name_is_legal (const std::string& name)
2697 {
2698         boost::shared_ptr<RouteList> r = routes.reader ();
2699
2700         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2701                 if ((*i)->name() == name) {
2702                         return false;
2703                 }
2704
2705                 if ((*i)->has_io_processor_named (name)) {
2706                         return false;
2707                 }
2708         }
2709
2710         return true;
2711 }
2712
2713 void
2714 Session::set_exclusive_input_active (boost::shared_ptr<RouteList> rl, bool onoff, bool flip_others)
2715 {
2716         RouteList rl2;
2717         vector<string> connections;
2718
2719         /* if we are passed only a single route and we're not told to turn
2720          * others off, then just do the simple thing.
2721          */
2722
2723         if (flip_others == false && rl->size() == 1) {
2724                 boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (rl->front());
2725                 if (mt) {
2726                         mt->set_input_active (onoff);
2727                         return;
2728                 }
2729         }
2730
2731         for (RouteList::iterator rt = rl->begin(); rt != rl->end(); ++rt) {
2732
2733                 PortSet& ps ((*rt)->input()->ports());
2734                 
2735                 for (PortSet::iterator p = ps.begin(); p != ps.end(); ++p) {
2736                         p->get_connections (connections);
2737                 }
2738                 
2739                 for (vector<string>::iterator s = connections.begin(); s != connections.end(); ++s) {
2740                         routes_using_input_from (*s, rl2);
2741                 }
2742                 
2743                 /* scan all relevant routes to see if others are on or off */
2744                 
2745                 bool others_are_already_on = false;
2746                 
2747                 for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2748
2749                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2750
2751                         if (!mt) {
2752                                 continue;
2753                         }
2754
2755                         if ((*r) != (*rt)) {
2756                                 if (mt->input_active()) {
2757                                         others_are_already_on = true;
2758                                 }
2759                         } else {
2760                                 /* this one needs changing */
2761                                 mt->set_input_active (onoff);
2762                         }
2763                 }
2764                 
2765                 if (flip_others) {
2766
2767                         /* globally reverse other routes */
2768                         
2769                         for (RouteList::iterator r = rl2.begin(); r != rl2.end(); ++r) {
2770                                 if ((*r) != (*rt)) {
2771                                         boost::shared_ptr<MidiTrack> mt = boost::dynamic_pointer_cast<MidiTrack> (*r);
2772                                         if (mt) {
2773                                                 mt->set_input_active (!others_are_already_on);
2774                                         }
2775                                 }
2776                         }
2777                 }
2778         }
2779 }
2780
2781 void
2782 Session::routes_using_input_from (const string& str, RouteList& rl)
2783 {
2784         boost::shared_ptr<RouteList> r = routes.reader();
2785
2786         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2787                 if ((*i)->input()->connected_to (str)) {
2788                         rl.push_back (*i);
2789                 }
2790         }
2791 }
2792
2793 boost::shared_ptr<Route>
2794 Session::route_by_name (string name)
2795 {
2796         boost::shared_ptr<RouteList> r = routes.reader ();
2797
2798         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2799                 if ((*i)->name() == name) {
2800                         return *i;
2801                 }
2802         }
2803
2804         return boost::shared_ptr<Route> ((Route*) 0);
2805 }
2806
2807 boost::shared_ptr<Route>
2808 Session::route_by_id (PBD::ID id)
2809 {
2810         boost::shared_ptr<RouteList> r = routes.reader ();
2811
2812         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2813                 if ((*i)->id() == id) {
2814                         return *i;
2815                 }
2816         }
2817
2818         return boost::shared_ptr<Route> ((Route*) 0);
2819 }
2820
2821 boost::shared_ptr<Track>
2822 Session::track_by_diskstream_id (PBD::ID id)
2823 {
2824         boost::shared_ptr<RouteList> r = routes.reader ();
2825
2826         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2827                 boost::shared_ptr<Track> t = boost::dynamic_pointer_cast<Track> (*i);
2828                 if (t && t->using_diskstream_id (id)) {
2829                         return t;
2830                 }
2831         }
2832
2833         return boost::shared_ptr<Track> ();
2834 }
2835
2836 boost::shared_ptr<Route>
2837 Session::route_by_remote_id (uint32_t id)
2838 {
2839         boost::shared_ptr<RouteList> r = routes.reader ();
2840
2841         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
2842                 if ((*i)->remote_control_id() == id) {
2843                         return *i;
2844                 }
2845         }
2846
2847         return boost::shared_ptr<Route> ((Route*) 0);
2848 }
2849
2850 void
2851 Session::playlist_region_added (boost::weak_ptr<Region> w)
2852 {
2853         boost::shared_ptr<Region> r = w.lock ();
2854         if (!r) {
2855                 return;
2856         }
2857
2858         /* These are the operations that are currently in progress... */
2859         list<GQuark> curr = _current_trans_quarks;
2860         curr.sort ();
2861
2862         /* ...and these are the operations during which we want to update
2863            the session range location markers.
2864         */
2865         list<GQuark> ops;
2866         ops.push_back (Operations::capture);
2867         ops.push_back (Operations::paste);
2868         ops.push_back (Operations::duplicate_region);
2869         ops.push_back (Operations::insert_file);
2870         ops.push_back (Operations::insert_region);
2871         ops.push_back (Operations::drag_region_brush);
2872         ops.push_back (Operations::region_drag);
2873         ops.push_back (Operations::selection_grab);
2874         ops.push_back (Operations::region_fill);
2875         ops.push_back (Operations::fill_selection);
2876         ops.push_back (Operations::create_region);
2877         ops.push_back (Operations::region_copy);
2878         ops.push_back (Operations::fixed_time_region_copy);
2879         ops.sort ();
2880
2881         /* See if any of the current operations match the ones that we want */
2882         list<GQuark> in;
2883         set_intersection (_current_trans_quarks.begin(), _current_trans_quarks.end(), ops.begin(), ops.end(), back_inserter (in));
2884
2885         /* If so, update the session range markers */
2886         if (!in.empty ()) {
2887                 maybe_update_session_range (r->position (), r->last_frame ());
2888         }
2889 }
2890
2891 /** Update the session range markers if a is before the current start or
2892  *  b is after the current end.
2893  */
2894 void
2895 Session::maybe_update_session_range (framepos_t a, framepos_t b)
2896 {
2897         if (_state_of_the_state & Loading) {
2898                 return;
2899         }
2900
2901         if (_session_range_location == 0) {
2902
2903                 add_session_range_location (a, b);
2904
2905         } else {
2906
2907                 if (a < _session_range_location->start()) {
2908                         _session_range_location->set_start (a);
2909                 }
2910
2911                 if (b > _session_range_location->end()) {
2912                         _session_range_location->set_end (b);
2913                 }
2914         }
2915 }
2916
2917 void
2918 Session::playlist_ranges_moved (list<Evoral::RangeMove<framepos_t> > const & ranges)
2919 {
2920         for (list<Evoral::RangeMove<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2921                 maybe_update_session_range (i->to, i->to + i->length);
2922         }
2923 }
2924
2925 void
2926 Session::playlist_regions_extended (list<Evoral::Range<framepos_t> > const & ranges)
2927 {
2928         for (list<Evoral::Range<framepos_t> >::const_iterator i = ranges.begin(); i != ranges.end(); ++i) {
2929                 maybe_update_session_range (i->from, i->to);
2930         }
2931 }
2932
2933 /* Region management */
2934
2935 boost::shared_ptr<Region>
2936 Session::find_whole_file_parent (boost::shared_ptr<Region const> child) const
2937 {
2938         const RegionFactory::RegionMap& regions (RegionFactory::regions());
2939         RegionFactory::RegionMap::const_iterator i;
2940         boost::shared_ptr<Region> region;
2941
2942         Glib::Threads::Mutex::Lock lm (region_lock);
2943
2944         for (i = regions.begin(); i != regions.end(); ++i) {
2945
2946                 region = i->second;
2947
2948                 if (region->whole_file()) {
2949
2950                         if (child->source_equivalent (region)) {
2951                                 return region;
2952                         }
2953                 }
2954         }
2955
2956         return boost::shared_ptr<Region> ();
2957 }
2958
2959 int
2960 Session::destroy_sources (list<boost::shared_ptr<Source> > srcs)
2961 {
2962         set<boost::shared_ptr<Region> > relevant_regions;
2963
2964         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ++s) {
2965                 RegionFactory::get_regions_using_source (*s, relevant_regions);
2966         }
2967
2968         for (set<boost::shared_ptr<Region> >::iterator r = relevant_regions.begin(); r != relevant_regions.end(); ) {
2969                 set<boost::shared_ptr<Region> >::iterator tmp;
2970
2971                 tmp = r;
2972                 ++tmp;
2973
2974                 playlists->destroy_region (*r);
2975                 RegionFactory::map_remove (*r);
2976
2977                 (*r)->drop_sources ();
2978                 (*r)->drop_references ();
2979
2980                 relevant_regions.erase (r);
2981
2982                 r = tmp;
2983         }
2984
2985         for (list<boost::shared_ptr<Source> >::iterator s = srcs.begin(); s != srcs.end(); ) {
2986
2987                 {
2988                         Glib::Threads::Mutex::Lock ls (source_lock);
2989                         /* remove from the main source list */
2990                         sources.erase ((*s)->id());
2991                 }
2992
2993                 (*s)->mark_for_remove ();
2994                 (*s)->drop_references ();
2995
2996                 s = srcs.erase (s);
2997         }
2998
2999         return 0;
3000 }
3001
3002 int
3003 Session::remove_last_capture ()
3004 {
3005         list<boost::shared_ptr<Source> > srcs;
3006
3007         boost::shared_ptr<RouteList> rl = routes.reader ();
3008         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3009                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3010                 if (!tr) {
3011                         continue;
3012                 }
3013
3014                 list<boost::shared_ptr<Source> >& l = tr->last_capture_sources();
3015
3016                 if (!l.empty()) {
3017                         srcs.insert (srcs.end(), l.begin(), l.end());
3018                         l.clear ();
3019                 }
3020         }
3021
3022         destroy_sources (srcs);
3023
3024         save_state (_current_snapshot_name);
3025
3026         return 0;
3027 }
3028
3029 /* Source Management */
3030
3031 void
3032 Session::add_source (boost::shared_ptr<Source> source)
3033 {
3034         pair<SourceMap::key_type, SourceMap::mapped_type> entry;
3035         pair<SourceMap::iterator,bool> result;
3036
3037         entry.first = source->id();
3038         entry.second = source;
3039
3040         {
3041                 Glib::Threads::Mutex::Lock lm (source_lock);
3042                 result = sources.insert (entry);
3043         }
3044
3045         if (result.second) {
3046
3047                 /* yay, new source */
3048
3049                 boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (source);
3050                 
3051                 if (fs) {
3052                         if (!fs->within_session()) {
3053                                 ensure_search_path_includes (Glib::path_get_dirname (fs->path()), fs->type());
3054                         }
3055                 }
3056                 
3057                 set_dirty();
3058
3059                 boost::shared_ptr<AudioFileSource> afs;
3060
3061                 if ((afs = boost::dynamic_pointer_cast<AudioFileSource>(source)) != 0) {
3062                         if (Config->get_auto_analyse_audio()) {
3063                                 Analyser::queue_source_for_analysis (source, false);
3064                         }
3065                 }
3066
3067                 source->DropReferences.connect_same_thread (*this, boost::bind (&Session::remove_source, this, boost::weak_ptr<Source> (source)));
3068         }
3069 }
3070
3071 void
3072 Session::remove_source (boost::weak_ptr<Source> src)
3073 {
3074         if (_state_of_the_state & Deletion) {
3075                 return;
3076         }
3077
3078         SourceMap::iterator i;
3079         boost::shared_ptr<Source> source = src.lock();
3080
3081         if (!source) {
3082                 return;
3083         }
3084
3085         {
3086                 Glib::Threads::Mutex::Lock lm (source_lock);
3087
3088                 if ((i = sources.find (source->id())) != sources.end()) {
3089                         sources.erase (i);
3090                 }
3091         }
3092
3093         if (!(_state_of_the_state & InCleanup)) {
3094
3095                 /* save state so we don't end up with a session file
3096                    referring to non-existent sources.
3097                 */
3098
3099                 save_state (_current_snapshot_name);
3100         }
3101 }
3102
3103 boost::shared_ptr<Source>
3104 Session::source_by_id (const PBD::ID& id)
3105 {
3106         Glib::Threads::Mutex::Lock lm (source_lock);
3107         SourceMap::iterator i;
3108         boost::shared_ptr<Source> source;
3109
3110         if ((i = sources.find (id)) != sources.end()) {
3111                 source = i->second;
3112         }
3113
3114         return source;
3115 }
3116
3117 boost::shared_ptr<Source>
3118 Session::source_by_path_and_channel (const string& path, uint16_t chn)
3119 {
3120         Glib::Threads::Mutex::Lock lm (source_lock);
3121
3122         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3123                 boost::shared_ptr<AudioFileSource> afs
3124                         = boost::dynamic_pointer_cast<AudioFileSource>(i->second);
3125
3126                 if (afs && afs->path() == path && chn == afs->channel()) {
3127                         return afs;
3128                 }
3129         }
3130         return boost::shared_ptr<Source>();
3131 }
3132
3133 uint32_t
3134 Session::count_sources_by_origin (const string& path)
3135 {
3136         uint32_t cnt = 0;
3137         Glib::Threads::Mutex::Lock lm (source_lock);
3138
3139         for (SourceMap::iterator i = sources.begin(); i != sources.end(); ++i) {
3140                 boost::shared_ptr<FileSource> fs
3141                         = boost::dynamic_pointer_cast<FileSource>(i->second);
3142
3143                 if (fs && fs->origin() == path) {
3144                         ++cnt;
3145                 }
3146         }
3147
3148         return cnt;
3149 }
3150
3151
3152 string
3153 Session::change_source_path_by_name (string path, string oldname, string newname, bool destructive)
3154 {
3155         string look_for;
3156         string old_basename = PBD::basename_nosuffix (oldname);
3157         string new_legalized = legalize_for_path (newname);
3158
3159         /* note: we know (or assume) the old path is already valid */
3160
3161         if (destructive) {
3162
3163                 /* destructive file sources have a name of the form:
3164
3165                     /path/to/Tnnnn-NAME(%[LR])?.wav
3166
3167                     the task here is to replace NAME with the new name.
3168                 */
3169
3170                 string dir;
3171                 string prefix;
3172                 string::size_type dash;
3173
3174                 dir = Glib::path_get_dirname (path);
3175                 path = Glib::path_get_basename (path);
3176
3177                 /* '-' is not a legal character for the NAME part of the path */
3178
3179                 if ((dash = path.find_last_of ('-')) == string::npos) {
3180                         return "";
3181                 }
3182
3183                 prefix = path.substr (0, dash);
3184
3185                 path += prefix;
3186                 path += '-';
3187                 path += new_legalized;
3188                 path += native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3189                 path = Glib::build_filename (dir, path);
3190
3191         } else {
3192
3193                 /* non-destructive file sources have a name of the form:
3194
3195                     /path/to/NAME-nnnnn(%[LR])?.ext
3196
3197                     the task here is to replace NAME with the new name.
3198                 */
3199
3200                 string dir;
3201                 string suffix;
3202                 string::size_type dash;
3203                 string::size_type postfix;
3204
3205                 dir = Glib::path_get_dirname (path);
3206                 path = Glib::path_get_basename (path);
3207
3208                 /* '-' is not a legal character for the NAME part of the path */
3209
3210                 if ((dash = path.find_last_of ('-')) == string::npos) {
3211                         return "";
3212                 }
3213
3214                 suffix = path.substr (dash+1);
3215
3216                 // Suffix is now everything after the dash. Now we need to eliminate
3217                 // the nnnnn part, which is done by either finding a '%' or a '.'
3218
3219                 postfix = suffix.find_last_of ("%");
3220                 if (postfix == string::npos) {
3221                         postfix = suffix.find_last_of ('.');
3222                 }
3223
3224                 if (postfix != string::npos) {
3225                         suffix = suffix.substr (postfix);
3226                 } else {
3227                         error << "Logic error in Session::change_source_path_by_name(), please report" << endl;
3228                         return "";
3229                 }
3230
3231                 const uint32_t limit = 10000;
3232                 char buf[PATH_MAX+1];
3233
3234                 for (uint32_t cnt = 1; cnt <= limit; ++cnt) {
3235
3236                         snprintf (buf, sizeof(buf), "%s-%u%s", newname.c_str(), cnt, suffix.c_str());
3237
3238                         if (!matching_unsuffixed_filename_exists_in (dir, buf)) {
3239                                 path = Glib::build_filename (dir, buf);
3240                                 break;
3241                         }
3242
3243                         path = "";
3244                 }
3245
3246                 if (path.empty()) {
3247                         fatal << string_compose (_("FATAL ERROR! Could not find a suitable version of %1 for a rename"),
3248                                                  newname) << endl;
3249                         /*NOTREACHED*/
3250                 }
3251         }
3252
3253         return path;
3254 }
3255
3256 /** Return the full path (in some session directory) for a new within-session source.
3257  * \a name must be a session-unique name that does not contain slashes
3258  *         (e.g. as returned by new_*_source_name)
3259  */
3260 string
3261 Session::new_source_path_from_name (DataType type, const string& name)
3262 {
3263         assert(name.find("/") == string::npos);
3264
3265         SessionDirectory sdir(get_best_session_directory_for_new_source());
3266
3267         std::string p;
3268         if (type == DataType::AUDIO) {
3269                 p = sdir.sound_path();
3270         } else if (type == DataType::MIDI) {
3271                 p = sdir.midi_path();
3272         } else {
3273                 error << "Unknown source type, unable to create file path" << endmsg;
3274                 return "";
3275         }
3276
3277         return Glib::build_filename (p, name);
3278 }
3279
3280 string
3281 Session::peak_path (string base) const
3282 {
3283         return Glib::build_filename (_session_dir->peak_path(), base + peakfile_suffix);
3284 }
3285
3286 /** Return a unique name based on \a base for a new internal audio source */
3287 string
3288 Session::new_audio_source_name (const string& base, uint32_t nchan, uint32_t chan, bool destructive)
3289 {
3290         uint32_t cnt;
3291         char buf[PATH_MAX+1];
3292         const uint32_t limit = 10000;
3293         string legalized;
3294         string ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3295
3296         buf[0] = '\0';
3297         legalized = legalize_for_path (base);
3298
3299         // Find a "version" of the base name that doesn't exist in any of the possible directories.
3300         for (cnt = (destructive ? ++destructive_index : 1); cnt <= limit; ++cnt) {
3301
3302                 vector<space_and_path>::iterator i;
3303                 uint32_t existing = 0;
3304
3305                 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3306
3307                         if (destructive) {
3308
3309                                 if (nchan < 2) {
3310                                         snprintf (buf, sizeof(buf), "T%04d-%s%s",
3311                                                   cnt, legalized.c_str(), ext.c_str());
3312                                 } else if (nchan == 2) {
3313                                         if (chan == 0) {
3314                                                 snprintf (buf, sizeof(buf), "T%04d-%s%%L%s",
3315                                                           cnt, legalized.c_str(), ext.c_str());
3316                                         } else {
3317                                                 snprintf (buf, sizeof(buf), "T%04d-%s%%R%s",
3318                                                           cnt, legalized.c_str(), ext.c_str());
3319                                         }
3320                                 } else if (nchan < 26) {
3321                                         snprintf (buf, sizeof(buf), "T%04d-%s%%%c%s",
3322                                                   cnt, legalized.c_str(), 'a' + chan, ext.c_str());
3323                                 } else {
3324                                         snprintf (buf, sizeof(buf), "T%04d-%s%s",
3325                                                   cnt, legalized.c_str(), ext.c_str());
3326                                 }
3327
3328                         } else {
3329
3330                                 if (nchan < 2) {
3331                                         snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3332                                 } else if (nchan == 2) {
3333                                         if (chan == 0) {
3334                                                 snprintf (buf, sizeof(buf), "%s-%u%%L%s", legalized.c_str(), cnt, ext.c_str());
3335                                         } else {
3336                                                 snprintf (buf, sizeof(buf), "%s-%u%%R%s", legalized.c_str(), cnt, ext.c_str());
3337                                         }
3338                                 } else if (nchan < 26) {
3339                                         snprintf (buf, sizeof(buf), "%s-%u%%%c%s", legalized.c_str(), cnt, 'a' + chan, ext.c_str());
3340                                 } else {
3341                                         snprintf (buf, sizeof(buf), "%s-%u%s", legalized.c_str(), cnt, ext.c_str());
3342                                 }
3343                         }
3344
3345                         SessionDirectory sdir((*i).path);
3346
3347                         string spath = sdir.sound_path();
3348
3349                         /* note that we search *without* the extension so that
3350                            we don't end up both "Audio 1-1.wav" and "Audio 1-1.caf"
3351                            in the event that this new name is required for
3352                            a file format change.
3353                         */
3354
3355                         if (matching_unsuffixed_filename_exists_in (spath, buf)) {
3356                                 existing++;
3357                                 break;
3358                         }
3359                 }
3360
3361                 if (existing == 0) {
3362                         break;
3363                 }
3364
3365                 if (cnt > limit) {
3366                         error << string_compose(
3367                                         _("There are already %1 recordings for %2, which I consider too many."),
3368                                         limit, base) << endmsg;
3369                         destroy ();
3370                         throw failed_constructor();
3371                 }
3372         }
3373
3374         return Glib::path_get_basename (buf);
3375 }
3376
3377 /** Create a new within-session audio source */
3378 boost::shared_ptr<AudioFileSource>
3379 Session::create_audio_source_for_session (size_t n_chans, string const & n, uint32_t chan, bool destructive)
3380 {
3381         const string name    = new_audio_source_name (n, n_chans, chan, destructive);
3382         const string path    = new_source_path_from_name(DataType::AUDIO, name);
3383
3384         return boost::dynamic_pointer_cast<AudioFileSource> (
3385                 SourceFactory::createWritable (DataType::AUDIO, *this, path, string(), destructive, frame_rate()));
3386 }
3387
3388 /** Return a unique name based on \a base for a new internal MIDI source */
3389 string
3390 Session::new_midi_source_name (const string& base)
3391 {
3392         uint32_t cnt;
3393         char buf[PATH_MAX+1];
3394         const uint32_t limit = 10000;
3395         string legalized;
3396
3397         buf[0] = '\0';
3398         legalized = legalize_for_path (base);
3399
3400         // Find a "version" of the file name that doesn't exist in any of the possible directories.
3401         for (cnt = 1; cnt <= limit; ++cnt) {
3402
3403                 vector<space_and_path>::iterator i;
3404                 uint32_t existing = 0;
3405
3406                 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
3407
3408                         SessionDirectory sdir((*i).path);
3409
3410                         std::string p = Glib::build_filename (sdir.midi_path(), legalized);
3411
3412                         snprintf (buf, sizeof(buf), "%s-%u.mid", p.c_str(), cnt);
3413
3414                         if (Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
3415                                 existing++;
3416                         }
3417                 }
3418
3419                 if (existing == 0) {
3420                         break;
3421                 }
3422
3423                 if (cnt > limit) {
3424                         error << string_compose(
3425                                         _("There are already %1 recordings for %2, which I consider too many."),
3426                                         limit, base) << endmsg;
3427                         destroy ();
3428                         throw failed_constructor();
3429                 }
3430         }
3431
3432         return Glib::path_get_basename(buf);
3433 }
3434
3435
3436 /** Create a new within-session MIDI source */
3437 boost::shared_ptr<MidiSource>
3438 Session::create_midi_source_for_session (Track* track, string const & n)
3439 {
3440         /* try to use the existing write source for the track, to keep numbering sane
3441          */
3442
3443         if (track) {
3444                 /*MidiTrack* mt = dynamic_cast<Track*> (track);
3445                   assert (mt);
3446                 */
3447
3448                 list<boost::shared_ptr<Source> > l = track->steal_write_sources ();
3449
3450                 if (!l.empty()) {
3451                         assert (boost::dynamic_pointer_cast<MidiSource> (l.front()));
3452                         return boost::dynamic_pointer_cast<MidiSource> (l.front());
3453                 }
3454         }
3455
3456         const string name = new_midi_source_name (n);
3457         const string path = new_source_path_from_name (DataType::MIDI, name);
3458
3459         return boost::dynamic_pointer_cast<SMFSource> (
3460                 SourceFactory::createWritable (
3461                         DataType::MIDI, *this, path, string(), false, frame_rate()));
3462 }
3463
3464
3465 void
3466 Session::add_playlist (boost::shared_ptr<Playlist> playlist, bool unused)
3467 {
3468         if (playlist->hidden()) {
3469                 return;
3470         }
3471
3472         playlists->add (playlist);
3473
3474         if (unused) {
3475                 playlist->release();
3476         }
3477
3478         set_dirty();
3479 }
3480
3481 void
3482 Session::remove_playlist (boost::weak_ptr<Playlist> weak_playlist)
3483 {
3484         if (_state_of_the_state & Deletion) {
3485                 return;
3486         }
3487
3488         boost::shared_ptr<Playlist> playlist (weak_playlist.lock());
3489
3490         if (!playlist) {
3491                 return;
3492         }
3493
3494         playlists->remove (playlist);
3495
3496         set_dirty();
3497 }
3498
3499 void
3500 Session::set_audition (boost::shared_ptr<Region> r)
3501 {
3502         pending_audition_region = r;
3503         add_post_transport_work (PostTransportAudition);
3504         _butler->schedule_transport_work ();
3505 }
3506
3507 void
3508 Session::audition_playlist ()
3509 {
3510         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3511         ev->region.reset ();
3512         queue_event (ev);
3513 }
3514
3515 void
3516 Session::non_realtime_set_audition ()
3517 {
3518         assert (pending_audition_region);
3519         auditioner->audition_region (pending_audition_region);
3520         pending_audition_region.reset ();
3521         AuditionActive (true); /* EMIT SIGNAL */
3522 }
3523
3524 void
3525 Session::audition_region (boost::shared_ptr<Region> r)
3526 {
3527         SessionEvent* ev = new SessionEvent (SessionEvent::Audition, SessionEvent::Add, SessionEvent::Immediate, 0, 0.0);
3528         ev->region = r;
3529         queue_event (ev);
3530 }
3531
3532 void
3533 Session::cancel_audition ()
3534 {
3535         if (auditioner->auditioning()) {
3536                 auditioner->cancel_audition ();
3537                 AuditionActive (false); /* EMIT SIGNAL */
3538         }
3539 }
3540
3541 bool
3542 Session::RoutePublicOrderSorter::operator() (boost::shared_ptr<Route> a, boost::shared_ptr<Route> b)
3543 {
3544         if (a->is_monitor()) {
3545                 return true;
3546         }
3547         if (b->is_monitor()) {
3548                 return false;
3549         }
3550         return a->order_key (MixerSort) < b->order_key (MixerSort);
3551 }
3552
3553 bool
3554 Session::is_auditioning () const
3555 {
3556         /* can be called before we have an auditioner object */
3557         if (auditioner) {
3558                 return auditioner->auditioning();
3559         } else {
3560                 return false;
3561         }
3562 }
3563
3564 void
3565 Session::graph_reordered ()
3566 {
3567         /* don't do this stuff if we are setting up connections
3568            from a set_state() call or creating new tracks. Ditto for deletion.
3569         */
3570
3571         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
3572                 return;
3573         }
3574
3575         /* every track/bus asked for this to be handled but it was deferred because
3576            we were connecting. do it now.
3577         */
3578
3579         request_input_change_handling ();
3580
3581         resort_routes ();
3582
3583         /* force all diskstreams to update their capture offset values to
3584            reflect any changes in latencies within the graph.
3585         */
3586
3587         boost::shared_ptr<RouteList> rl = routes.reader ();
3588         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3589                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3590                 if (tr) {
3591                         tr->set_capture_offset ();
3592                 }
3593         }
3594 }
3595
3596 /** @return Number of frames that there is disk space available to write,
3597  *  if known.
3598  */
3599 boost::optional<framecnt_t>
3600 Session::available_capture_duration ()
3601 {
3602         Glib::Threads::Mutex::Lock lm (space_lock);
3603
3604         if (_total_free_4k_blocks_uncertain) {
3605                 return boost::optional<framecnt_t> ();
3606         }
3607         
3608         float sample_bytes_on_disk = 4.0; // keep gcc happy
3609
3610         switch (config.get_native_file_data_format()) {
3611         case FormatFloat:
3612                 sample_bytes_on_disk = 4.0;
3613                 break;
3614
3615         case FormatInt24:
3616                 sample_bytes_on_disk = 3.0;
3617                 break;
3618
3619         case FormatInt16:
3620                 sample_bytes_on_disk = 2.0;
3621                 break;
3622
3623         default:
3624                 /* impossible, but keep some gcc versions happy */
3625                 fatal << string_compose (_("programming error: %1"),
3626                                          X_("illegal native file data format"))
3627                       << endmsg;
3628                 /*NOTREACHED*/
3629         }
3630
3631         double scale = 4096.0 / sample_bytes_on_disk;
3632
3633         if (_total_free_4k_blocks * scale > (double) max_framecnt) {
3634                 return max_framecnt;
3635         }
3636
3637         return (framecnt_t) floor (_total_free_4k_blocks * scale);
3638 }
3639
3640 void
3641 Session::add_bundle (boost::shared_ptr<Bundle> bundle)
3642 {
3643         {
3644                 RCUWriter<BundleList> writer (_bundles);
3645                 boost::shared_ptr<BundleList> b = writer.get_copy ();
3646                 b->push_back (bundle);
3647         }
3648
3649         BundleAdded (bundle); /* EMIT SIGNAL */
3650
3651         set_dirty();
3652 }
3653
3654 void
3655 Session::remove_bundle (boost::shared_ptr<Bundle> bundle)
3656 {
3657         bool removed = false;
3658
3659         {
3660                 RCUWriter<BundleList> writer (_bundles);
3661                 boost::shared_ptr<BundleList> b = writer.get_copy ();
3662                 BundleList::iterator i = find (b->begin(), b->end(), bundle);
3663
3664                 if (i != b->end()) {
3665                         b->erase (i);
3666                         removed = true;
3667                 }
3668         }
3669
3670         if (removed) {
3671                  BundleRemoved (bundle); /* EMIT SIGNAL */
3672         }
3673
3674         set_dirty();
3675 }
3676
3677 boost::shared_ptr<Bundle>
3678 Session::bundle_by_name (string name) const
3679 {
3680         boost::shared_ptr<BundleList> b = _bundles.reader ();
3681
3682         for (BundleList::const_iterator i = b->begin(); i != b->end(); ++i) {
3683                 if ((*i)->name() == name) {
3684                         return* i;
3685                 }
3686         }
3687
3688         return boost::shared_ptr<Bundle> ();
3689 }
3690
3691 void
3692 Session::tempo_map_changed (const PropertyChange&)
3693 {
3694         clear_clicks ();
3695
3696         playlists->update_after_tempo_map_change ();
3697
3698         _locations->apply (*this, &Session::update_locations_after_tempo_map_change);
3699
3700         set_dirty ();
3701 }
3702
3703 void
3704 Session::update_locations_after_tempo_map_change (Locations::LocationList& loc)
3705 {
3706         for (Locations::LocationList::iterator i = loc.begin(); i != loc.end(); ++i) {
3707                 (*i)->recompute_frames_from_bbt ();
3708         }
3709 }
3710
3711 /** Ensures that all buffers (scratch, send, silent, etc) are allocated for
3712  * the given count with the current block size.
3713  */
3714 void
3715 Session::ensure_buffers (ChanCount howmany)
3716 {
3717         BufferManager::ensure_buffers (howmany);
3718 }
3719
3720 void
3721 Session::ensure_buffer_set(BufferSet& buffers, const ChanCount& count)
3722 {
3723         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3724                 buffers.ensure_buffers(*t, count.get(*t), _engine.raw_buffer_size(*t));
3725         }
3726 }
3727
3728 uint32_t
3729 Session::next_insert_id ()
3730 {
3731         /* this doesn't really loop forever. just think about it */
3732
3733         while (true) {
3734                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < insert_bitset.size(); ++n) {
3735                         if (!insert_bitset[n]) {
3736                                 insert_bitset[n] = true;
3737                                 return n;
3738
3739                         }
3740                 }
3741
3742                 /* none available, so resize and try again */
3743
3744                 insert_bitset.resize (insert_bitset.size() + 16, false);
3745         }
3746 }
3747
3748 uint32_t
3749 Session::next_send_id ()
3750 {
3751         /* this doesn't really loop forever. just think about it */
3752
3753         while (true) {
3754                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < send_bitset.size(); ++n) {
3755                         if (!send_bitset[n]) {
3756                                 send_bitset[n] = true;
3757                                 return n;
3758
3759                         }
3760                 }
3761
3762                 /* none available, so resize and try again */
3763
3764                 send_bitset.resize (send_bitset.size() + 16, false);
3765         }
3766 }
3767
3768 uint32_t
3769 Session::next_aux_send_id ()
3770 {
3771         /* this doesn't really loop forever. just think about it */
3772
3773         while (true) {
3774                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < aux_send_bitset.size(); ++n) {
3775                         if (!aux_send_bitset[n]) {
3776                                 aux_send_bitset[n] = true;
3777                                 return n;
3778
3779                         }
3780                 }
3781
3782                 /* none available, so resize and try again */
3783
3784                 aux_send_bitset.resize (aux_send_bitset.size() + 16, false);
3785         }
3786 }
3787
3788 uint32_t
3789 Session::next_return_id ()
3790 {
3791         /* this doesn't really loop forever. just think about it */
3792
3793         while (true) {
3794                 for (boost::dynamic_bitset<uint32_t>::size_type n = 0; n < return_bitset.size(); ++n) {
3795                         if (!return_bitset[n]) {
3796                                 return_bitset[n] = true;
3797                                 return n;
3798
3799                         }
3800                 }
3801
3802                 /* none available, so resize and try again */
3803
3804                 return_bitset.resize (return_bitset.size() + 16, false);
3805         }
3806 }
3807
3808 void
3809 Session::mark_send_id (uint32_t id)
3810 {
3811         if (id >= send_bitset.size()) {
3812                 send_bitset.resize (id+16, false);
3813         }
3814         if (send_bitset[id]) {
3815                 warning << string_compose (_("send ID %1 appears to be in use already"), id) << endmsg;
3816         }
3817         send_bitset[id] = true;
3818 }
3819
3820 void
3821 Session::mark_aux_send_id (uint32_t id)
3822 {
3823         if (id >= aux_send_bitset.size()) {
3824                 aux_send_bitset.resize (id+16, false);
3825         }
3826         if (aux_send_bitset[id]) {
3827                 warning << string_compose (_("aux send ID %1 appears to be in use already"), id) << endmsg;
3828         }
3829         aux_send_bitset[id] = true;
3830 }
3831
3832 void
3833 Session::mark_return_id (uint32_t id)
3834 {
3835         if (id >= return_bitset.size()) {
3836                 return_bitset.resize (id+16, false);
3837         }
3838         if (return_bitset[id]) {
3839                 warning << string_compose (_("return ID %1 appears to be in use already"), id) << endmsg;
3840         }
3841         return_bitset[id] = true;
3842 }
3843
3844 void
3845 Session::mark_insert_id (uint32_t id)
3846 {
3847         if (id >= insert_bitset.size()) {
3848                 insert_bitset.resize (id+16, false);
3849         }
3850         if (insert_bitset[id]) {
3851                 warning << string_compose (_("insert ID %1 appears to be in use already"), id) << endmsg;
3852         }
3853         insert_bitset[id] = true;
3854 }
3855
3856 void
3857 Session::unmark_send_id (uint32_t id)
3858 {
3859         if (id < send_bitset.size()) {
3860                 send_bitset[id] = false;
3861         }
3862 }
3863
3864 void
3865 Session::unmark_aux_send_id (uint32_t id)
3866 {
3867         if (id < aux_send_bitset.size()) {
3868                 aux_send_bitset[id] = false;
3869         }
3870 }
3871
3872 void
3873 Session::unmark_return_id (uint32_t id)
3874 {
3875         if (id < return_bitset.size()) {
3876                 return_bitset[id] = false;
3877         }
3878 }
3879
3880 void
3881 Session::unmark_insert_id (uint32_t id)
3882 {
3883         if (id < insert_bitset.size()) {
3884                 insert_bitset[id] = false;
3885         }
3886 }
3887
3888 void
3889 Session::reset_native_file_format ()
3890 {
3891         boost::shared_ptr<RouteList> rl = routes.reader ();
3892         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
3893                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
3894                 if (tr) {
3895                         /* don't save state as we do this, there's no point
3896                          */
3897
3898                         _state_of_the_state = StateOfTheState (_state_of_the_state|InCleanup);
3899                         tr->reset_write_sources (false);
3900                         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InCleanup);
3901                 }
3902         }
3903 }
3904
3905 bool
3906 Session::route_name_unique (string n) const
3907 {
3908         boost::shared_ptr<RouteList> r = routes.reader ();
3909
3910         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
3911                 if ((*i)->name() == n) {
3912                         return false;
3913                 }
3914         }
3915
3916         return true;
3917 }
3918
3919 bool
3920 Session::route_name_internal (string n) const
3921 {
3922         if (auditioner && auditioner->name() == n) {
3923                 return true;
3924         }
3925
3926         if (_click_io && _click_io->name() == n) {
3927                 return true;
3928         }
3929
3930         return false;
3931 }
3932
3933 int
3934 Session::freeze_all (InterThreadInfo& itt)
3935 {
3936         boost::shared_ptr<RouteList> r = routes.reader ();
3937
3938         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
3939
3940                 boost::shared_ptr<Track> t;
3941
3942                 if ((t = boost::dynamic_pointer_cast<Track>(*i)) != 0) {
3943                         /* XXX this is wrong because itt.progress will keep returning to zero at the start
3944                            of every track.
3945                         */
3946                         t->freeze_me (itt);
3947                 }
3948         }
3949
3950         return 0;
3951 }
3952
3953 boost::shared_ptr<Region>
3954 Session::write_one_track (AudioTrack& track, framepos_t start, framepos_t end,
3955                           bool /*overwrite*/, vector<boost::shared_ptr<Source> >& srcs,
3956                           InterThreadInfo& itt, 
3957                           boost::shared_ptr<Processor> endpoint, bool include_endpoint,
3958                           bool for_export)
3959 {
3960         boost::shared_ptr<Region> result;
3961         boost::shared_ptr<Playlist> playlist;
3962         boost::shared_ptr<AudioFileSource> fsource;
3963         uint32_t x;
3964         char buf[PATH_MAX+1];
3965         ChanCount diskstream_channels (track.n_channels());
3966         framepos_t position;
3967         framecnt_t this_chunk;
3968         framepos_t to_do;
3969         BufferSet buffers;
3970         SessionDirectory sdir(get_best_session_directory_for_new_source ());
3971         const string sound_dir = sdir.sound_path();
3972         framepos_t len = end - start;
3973         bool need_block_size_reset = false;
3974         string ext;
3975         ChanCount const max_proc = track.max_processor_streams ();
3976
3977         if (end <= start) {
3978                 error << string_compose (_("Cannot write a range where end <= start (e.g. %1 <= %2)"),
3979                                          end, start) << endmsg;
3980                 return result;
3981         }
3982
3983         const framecnt_t chunk_size = (256 * 1024)/4;
3984
3985         // block all process callback handling
3986
3987         block_processing ();
3988
3989         /* call tree *MUST* hold route_lock */
3990
3991         if ((playlist = track.playlist()) == 0) {
3992                 goto out;
3993         }
3994
3995         ext = native_header_format_extension (config.get_native_file_header_format(), DataType::AUDIO);
3996
3997         for (uint32_t chan_n = 0; chan_n < diskstream_channels.n_audio(); ++chan_n) {
3998
3999                 for (x = 0; x < 99999; ++x) {
4000                         snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 "%s", sound_dir.c_str(), playlist->name().c_str(), chan_n, x+1, ext.c_str());
4001                         if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) {
4002                                 break;
4003                         }
4004                 }
4005
4006                 if (x == 99999) {
4007                         error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
4008                         goto out;
4009                 }
4010
4011                 try {
4012                         fsource = boost::dynamic_pointer_cast<AudioFileSource> (
4013                                 SourceFactory::createWritable (DataType::AUDIO, *this, buf, string(), false, frame_rate()));
4014                 }
4015
4016                 catch (failed_constructor& err) {
4017                         error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
4018                         goto out;
4019                 }
4020
4021                 srcs.push_back (fsource);
4022         }
4023
4024         /* tell redirects that care that we are about to use a much larger
4025          * blocksize. this will flush all plugins too, so that they are ready
4026          * to be used for this process.
4027          */
4028
4029         need_block_size_reset = true;
4030         track.set_block_size (chunk_size);
4031
4032         position = start;
4033         to_do = len;
4034
4035         /* create a set of reasonably-sized buffers */
4036         buffers.ensure_buffers (DataType::AUDIO, max_proc.n_audio(), chunk_size);
4037         buffers.set_count (max_proc);
4038
4039         for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4040                 boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4041                 if (afs)
4042                         afs->prepare_for_peakfile_writes ();
4043         }
4044
4045         while (to_do && !itt.cancel) {
4046
4047                 this_chunk = min (to_do, chunk_size);
4048
4049                 if (track.export_stuff (buffers, start, this_chunk, endpoint, include_endpoint, for_export)) {
4050                         goto out;
4051                 }
4052
4053                 uint32_t n = 0;
4054                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
4055                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4056
4057                         if (afs) {
4058                                 if (afs->write (buffers.get_audio(n).data(), this_chunk) != this_chunk) {
4059                                         goto out;
4060                                 }
4061                         }
4062                 }
4063
4064                 start += this_chunk;
4065                 to_do -= this_chunk;
4066
4067                 itt.progress = (float) (1.0 - ((double) to_do / len));
4068
4069         }
4070
4071         if (!itt.cancel) {
4072
4073                 time_t now;
4074                 struct tm* xnow;
4075                 time (&now);
4076                 xnow = localtime (&now);
4077
4078                 for (vector<boost::shared_ptr<Source> >::iterator src=srcs.begin(); src != srcs.end(); ++src) {
4079                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4080
4081                         if (afs) {
4082                                 afs->update_header (position, *xnow, now);
4083                                 afs->flush_header ();
4084                         }
4085                 }
4086
4087                 /* construct a region to represent the bounced material */
4088
4089                 PropertyList plist;
4090
4091                 plist.add (Properties::start, 0);
4092                 plist.add (Properties::length, srcs.front()->length(srcs.front()->timeline_position()));
4093                 plist.add (Properties::name, region_name_from_path (srcs.front()->name(), true));
4094
4095                 result = RegionFactory::create (srcs, plist);
4096
4097         }
4098
4099   out:
4100         if (!result) {
4101                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4102                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4103
4104                         if (afs) {
4105                                 afs->mark_for_remove ();
4106                         }
4107
4108                         (*src)->drop_references ();
4109                 }
4110
4111         } else {
4112                 for (vector<boost::shared_ptr<Source> >::iterator src = srcs.begin(); src != srcs.end(); ++src) {
4113                         boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*src);
4114
4115                         if (afs)
4116                                 afs->done_with_peakfile_writes ();
4117                 }
4118         }
4119
4120
4121         if (need_block_size_reset) {
4122                 track.set_block_size (get_block_size());
4123         }
4124
4125         unblock_processing ();
4126
4127         return result;
4128 }
4129
4130 gain_t*
4131 Session::gain_automation_buffer() const
4132 {
4133         return ProcessThread::gain_automation_buffer ();
4134 }
4135
4136 gain_t*
4137 Session::send_gain_automation_buffer() const
4138 {
4139         return ProcessThread::send_gain_automation_buffer ();
4140 }
4141
4142 pan_t**
4143 Session::pan_automation_buffer() const
4144 {
4145         return ProcessThread::pan_automation_buffer ();
4146 }
4147
4148 BufferSet&
4149 Session::get_silent_buffers (ChanCount count)
4150 {
4151         return ProcessThread::get_silent_buffers (count);
4152 }
4153
4154 BufferSet&
4155 Session::get_scratch_buffers (ChanCount count)
4156 {
4157         return ProcessThread::get_scratch_buffers (count);
4158 }
4159
4160 BufferSet&
4161 Session::get_mix_buffers (ChanCount count)
4162 {
4163         return ProcessThread::get_mix_buffers (count);
4164 }
4165
4166 uint32_t
4167 Session::ntracks () const
4168 {
4169         uint32_t n = 0;
4170         boost::shared_ptr<RouteList> r = routes.reader ();
4171
4172         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4173                 if (boost::dynamic_pointer_cast<Track> (*i)) {
4174                         ++n;
4175                 }
4176         }
4177
4178         return n;
4179 }
4180
4181 uint32_t
4182 Session::nbusses () const
4183 {
4184         uint32_t n = 0;
4185         boost::shared_ptr<RouteList> r = routes.reader ();
4186
4187         for (RouteList::const_iterator i = r->begin(); i != r->end(); ++i) {
4188                 if (boost::dynamic_pointer_cast<Track>(*i) == 0) {
4189                         ++n;
4190                 }
4191         }
4192
4193         return n;
4194 }
4195
4196 void
4197 Session::add_automation_list(AutomationList *al)
4198 {
4199         automation_lists[al->id()] = al;
4200 }
4201
4202 /** @return true if there is at least one record-enabled track, otherwise false */
4203 bool
4204 Session::have_rec_enabled_track () const
4205 {
4206         return g_atomic_int_get (&_have_rec_enabled_track) == 1;
4207 }
4208
4209 /** Update the state of our rec-enabled tracks flag */
4210 void
4211 Session::update_have_rec_enabled_track ()
4212 {
4213         boost::shared_ptr<RouteList> rl = routes.reader ();
4214         RouteList::iterator i = rl->begin();
4215         while (i != rl->end ()) {
4216
4217                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4218                 if (tr && tr->record_enabled ()) {
4219                         break;
4220                 }
4221
4222                 ++i;
4223         }
4224
4225         int const old = g_atomic_int_get (&_have_rec_enabled_track);
4226
4227         g_atomic_int_set (&_have_rec_enabled_track, i != rl->end () ? 1 : 0);
4228
4229         if (g_atomic_int_get (&_have_rec_enabled_track) != old) {
4230                 RecordStateChanged (); /* EMIT SIGNAL */
4231         }
4232 }
4233
4234 void
4235 Session::listen_position_changed ()
4236 {
4237         boost::shared_ptr<RouteList> r = routes.reader ();
4238
4239         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4240                 (*i)->listen_position_changed ();
4241         }
4242 }
4243
4244 void
4245 Session::solo_control_mode_changed ()
4246 {
4247         /* cancel all solo or all listen when solo control mode changes */
4248
4249         if (soloing()) {
4250                 set_solo (get_routes(), false);
4251         } else if (listening()) {
4252                 set_listen (get_routes(), false);
4253         }
4254 }
4255
4256 /** Called when a property of one of our route groups changes */
4257 void
4258 Session::route_group_property_changed (RouteGroup* rg)
4259 {
4260         RouteGroupPropertyChanged (rg); /* EMIT SIGNAL */
4261 }
4262
4263 /** Called when a route is added to one of our route groups */
4264 void
4265 Session::route_added_to_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4266 {
4267         RouteAddedToRouteGroup (rg, r);
4268 }
4269
4270 /** Called when a route is removed from one of our route groups */
4271 void
4272 Session::route_removed_from_route_group (RouteGroup* rg, boost::weak_ptr<Route> r)
4273 {
4274         RouteRemovedFromRouteGroup (rg, r);
4275 }
4276
4277 boost::shared_ptr<RouteList>
4278 Session::get_routes_with_regions_at (framepos_t const p) const
4279 {
4280         boost::shared_ptr<RouteList> r = routes.reader ();
4281         boost::shared_ptr<RouteList> rl (new RouteList);
4282
4283         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4284                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4285                 if (!tr) {
4286                         continue;
4287                 }
4288
4289                 boost::shared_ptr<Playlist> pl = tr->playlist ();
4290                 if (!pl) {
4291                         continue;
4292                 }
4293
4294                 if (pl->has_region_at (p)) {
4295                         rl->push_back (*i);
4296                 }
4297         }
4298
4299         return rl;
4300 }
4301
4302 void
4303 Session::goto_end ()
4304 {
4305         if (_session_range_location) {
4306                 request_locate (_session_range_location->end(), false);
4307         } else {
4308                 request_locate (0, false);
4309         }
4310 }
4311
4312 void
4313 Session::goto_start ()
4314 {
4315         if (_session_range_location) {
4316                 request_locate (_session_range_location->start(), false);
4317         } else {
4318                 request_locate (0, false);
4319         }
4320 }
4321
4322 framepos_t
4323 Session::current_start_frame () const
4324 {
4325         return _session_range_location ? _session_range_location->start() : 0;
4326 }
4327
4328 framepos_t
4329 Session::current_end_frame () const
4330 {
4331         return _session_range_location ? _session_range_location->end() : 0;
4332 }
4333
4334 void
4335 Session::add_session_range_location (framepos_t start, framepos_t end)
4336 {
4337         _session_range_location = new Location (*this, start, end, _("session"), Location::IsSessionRange);
4338         _locations->add (_session_range_location);
4339 }
4340
4341 void
4342 Session::step_edit_status_change (bool yn)
4343 {
4344         bool send = false;
4345
4346         bool val = false;
4347         if (yn) {
4348                 send = (_step_editors == 0);
4349                 val = true;
4350
4351                 _step_editors++;
4352         } else {
4353                 send = (_step_editors == 1);
4354                 val = false;
4355
4356                 if (_step_editors > 0) {
4357                         _step_editors--;
4358                 }
4359         }
4360
4361         if (send) {
4362                 StepEditStatusChange (val);
4363         }
4364 }
4365
4366
4367 void
4368 Session::start_time_changed (framepos_t old)
4369 {
4370         /* Update the auto loop range to match the session range
4371            (unless the auto loop range has been changed by the user)
4372         */
4373
4374         Location* s = _locations->session_range_location ();
4375         if (s == 0) {
4376                 return;
4377         }
4378
4379         Location* l = _locations->auto_loop_location ();
4380
4381         if (l && l->start() == old) {
4382                 l->set_start (s->start(), true);
4383         }
4384 }
4385
4386 void
4387 Session::end_time_changed (framepos_t old)
4388 {
4389         /* Update the auto loop range to match the session range
4390            (unless the auto loop range has been changed by the user)
4391         */
4392
4393         Location* s = _locations->session_range_location ();
4394         if (s == 0) {
4395                 return;
4396         }
4397
4398         Location* l = _locations->auto_loop_location ();
4399
4400         if (l && l->end() == old) {
4401                 l->set_end (s->end(), true);
4402         }
4403 }
4404
4405 string
4406 Session::source_search_path (DataType type) const
4407 {
4408         vector<string> s;
4409
4410         if (session_dirs.size() == 1) {
4411                 switch (type) {
4412                 case DataType::AUDIO:
4413                         s.push_back (_session_dir->sound_path());
4414                         break;
4415                 case DataType::MIDI:
4416                         s.push_back (_session_dir->midi_path());
4417                         break;
4418                 }
4419         } else {
4420                 for (vector<space_and_path>::const_iterator i = session_dirs.begin(); i != session_dirs.end(); ++i) {
4421                         SessionDirectory sdir (i->path);
4422                         switch (type) {
4423                         case DataType::AUDIO:
4424                                 s.push_back (sdir.sound_path());
4425                                 break;
4426                         case DataType::MIDI:
4427                                 s.push_back (sdir.midi_path());
4428                                 break;
4429                         }
4430                 }
4431         }
4432
4433         if (type == DataType::AUDIO) {
4434                 const string sound_path_2X = _session_dir->sound_path_2X();
4435                 if (Glib::file_test (sound_path_2X, Glib::FILE_TEST_EXISTS|Glib::FILE_TEST_IS_DIR)) {
4436                         if (find (s.begin(), s.end(), sound_path_2X) == s.end()) {
4437                                 s.push_back (sound_path_2X);
4438                         }
4439                 }
4440         }
4441
4442         /* now check the explicit (possibly user-specified) search path
4443          */
4444
4445         vector<string> dirs;
4446
4447         switch (type) {
4448         case DataType::AUDIO:
4449                 split (config.get_audio_search_path (), dirs, ':');
4450                 break;
4451         case DataType::MIDI:
4452                 split (config.get_midi_search_path (), dirs, ':');
4453                 break;
4454         }
4455
4456         for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4457                 if (find (s.begin(), s.end(), *i) == s.end()) {
4458                         s.push_back (*i);
4459                 }
4460         }
4461         
4462         string search_path;
4463
4464         for (vector<string>::iterator si = s.begin(); si != s.end(); ++si) {
4465                 if (!search_path.empty()) {
4466                         search_path += ':';
4467                 }
4468                 search_path += *si;
4469         }
4470
4471         return search_path;
4472 }
4473
4474 void
4475 Session::ensure_search_path_includes (const string& path, DataType type)
4476 {
4477         string search_path;
4478         vector<string> dirs;
4479
4480         if (path == ".") {
4481                 return;
4482         }
4483
4484         switch (type) {
4485         case DataType::AUDIO:
4486                 search_path = config.get_audio_search_path ();
4487                 break;
4488         case DataType::MIDI:
4489                 search_path = config.get_midi_search_path ();
4490                 break;
4491         }
4492
4493         split (search_path, dirs, ':');
4494
4495         for (vector<string>::iterator i = dirs.begin(); i != dirs.end(); ++i) {
4496                 /* No need to add this new directory if it has the same inode as
4497                    an existing one; checking inode rather than name prevents duplicated
4498                    directories when we are using symlinks.
4499
4500                    On Windows, I think we could just do if (*i == path) here.
4501                 */
4502                 if (PBD::equivalent_paths (*i, path)) {
4503                         return;
4504                 }
4505         }
4506
4507         if (!search_path.empty()) {
4508                 search_path += ':';
4509         }
4510
4511         search_path += path;
4512
4513         switch (type) {
4514         case DataType::AUDIO:
4515                 config.set_audio_search_path (search_path);
4516                 break;
4517         case DataType::MIDI:
4518                 config.set_midi_search_path (search_path);
4519                 break;
4520         }
4521 }
4522
4523 boost::shared_ptr<Speakers>
4524 Session::get_speakers()
4525 {
4526         return _speakers;
4527 }
4528
4529 list<string>
4530 Session::unknown_processors () const
4531 {
4532         list<string> p;
4533
4534         boost::shared_ptr<RouteList> r = routes.reader ();
4535         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4536                 list<string> t = (*i)->unknown_processors ();
4537                 copy (t.begin(), t.end(), back_inserter (p));
4538         }
4539
4540         p.sort ();
4541         p.unique ();
4542
4543         return p;
4544 }
4545
4546 void
4547 Session::update_latency (bool playback)
4548 {
4549         DEBUG_TRACE (DEBUG::Latency, string_compose ("JACK latency callback: %1\n", (playback ? "PLAYBACK" : "CAPTURE")));
4550
4551         if ((_state_of_the_state & (InitialConnecting|Deletion)) || _adding_routes_in_progress) {
4552                 return;
4553         }
4554
4555         boost::shared_ptr<RouteList> r = routes.reader ();
4556         framecnt_t max_latency = 0;
4557
4558         if (playback) {
4559                 /* reverse the list so that we work backwards from the last route to run to the first */
4560                 RouteList* rl = routes.reader().get();
4561                 r.reset (new RouteList (*rl));
4562                 reverse (r->begin(), r->end());
4563         }
4564
4565         /* compute actual latency values for the given direction and store them all in per-port
4566            structures. this will also publish the same values (to JACK) so that computation of latency
4567            for routes can consistently use public latency values.
4568         */
4569
4570         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4571                 max_latency = max (max_latency, (*i)->set_private_port_latencies (playback));
4572         }
4573
4574         /* because we latency compensate playback, our published playback latencies should
4575            be the same for all output ports - all material played back by ardour has
4576            the same latency, whether its caused by plugins or by latency compensation. since
4577            these may differ from the values computed above, reset all playback port latencies
4578            to the same value.
4579         */
4580
4581         DEBUG_TRACE (DEBUG::Latency, string_compose ("Set public port latencies to %1\n", max_latency));
4582
4583         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4584                 (*i)->set_public_port_latencies (max_latency, playback);
4585         }
4586
4587         if (playback) {
4588
4589                 post_playback_latency ();
4590
4591         } else {
4592
4593                 post_capture_latency ();
4594         }
4595
4596         DEBUG_TRACE (DEBUG::Latency, "JACK latency callback: DONE\n");
4597 }
4598
4599 void
4600 Session::post_playback_latency ()
4601 {
4602         set_worst_playback_latency ();
4603
4604         boost::shared_ptr<RouteList> r = routes.reader ();
4605
4606         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4607                 if (!(*i)->is_hidden() && ((*i)->active())) {
4608                         _worst_track_latency = max (_worst_track_latency, (*i)->update_signal_latency ());
4609                 }
4610         }
4611
4612         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4613                 (*i)->set_latency_compensation (_worst_track_latency);
4614         }
4615 }
4616
4617 void
4618 Session::post_capture_latency ()
4619 {
4620         set_worst_capture_latency ();
4621
4622         /* reflect any changes in capture latencies into capture offsets
4623          */
4624
4625         boost::shared_ptr<RouteList> rl = routes.reader();
4626         for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
4627                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4628                 if (tr) {
4629                         tr->set_capture_offset ();
4630                 }
4631         }
4632 }
4633
4634 void
4635 Session::initialize_latencies ()
4636 {
4637         {
4638                 Glib::Threads::Mutex::Lock lm (_engine.process_lock());
4639                 update_latency (false);
4640                 update_latency (true);
4641         }
4642
4643         set_worst_io_latencies ();
4644 }
4645
4646 void
4647 Session::set_worst_io_latencies ()
4648 {
4649         set_worst_playback_latency ();
4650         set_worst_capture_latency ();
4651 }
4652
4653 void
4654 Session::set_worst_playback_latency ()
4655 {
4656         if (_state_of_the_state & (InitialConnecting|Deletion)) {
4657                 return;
4658         }
4659
4660         _worst_output_latency = 0;
4661
4662         if (!_engine.connected()) {
4663                 return;
4664         }
4665
4666         boost::shared_ptr<RouteList> r = routes.reader ();
4667
4668         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4669                 _worst_output_latency = max (_worst_output_latency, (*i)->output()->latency());
4670         }
4671
4672         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst output latency: %1\n", _worst_output_latency));
4673 }
4674
4675 void
4676 Session::set_worst_capture_latency ()
4677 {
4678         if (_state_of_the_state & (InitialConnecting|Deletion)) {
4679                 return;
4680         }
4681
4682         _worst_input_latency = 0;
4683
4684         if (!_engine.connected()) {
4685                 return;
4686         }
4687
4688         boost::shared_ptr<RouteList> r = routes.reader ();
4689
4690         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4691                 _worst_input_latency = max (_worst_input_latency, (*i)->input()->latency());
4692         }
4693
4694         DEBUG_TRACE (DEBUG::Latency, string_compose ("Worst input latency: %1\n", _worst_input_latency));
4695 }
4696
4697 void
4698 Session::update_latency_compensation (bool force_whole_graph)
4699 {
4700         bool some_track_latency_changed = false;
4701
4702         if (_state_of_the_state & (InitialConnecting|Deletion)) {
4703                 return;
4704         }
4705
4706         DEBUG_TRACE(DEBUG::Latency, "---------------------------- update latency compensation\n\n");
4707
4708         _worst_track_latency = 0;
4709
4710         boost::shared_ptr<RouteList> r = routes.reader ();
4711
4712         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4713                 if (!(*i)->is_hidden() && ((*i)->active())) {
4714                         framecnt_t tl;
4715                         if ((*i)->signal_latency () != (tl = (*i)->update_signal_latency ())) {
4716                                 some_track_latency_changed = true;
4717                         }
4718                         _worst_track_latency = max (tl, _worst_track_latency);
4719                 }
4720         }
4721
4722         DEBUG_TRACE (DEBUG::Latency, string_compose ("worst signal processing latency: %1 (changed ? %2)\n", _worst_track_latency,
4723                                                      (some_track_latency_changed ? "yes" : "no")));
4724
4725         DEBUG_TRACE(DEBUG::Latency, "---------------------------- DONE update latency compensation\n\n");
4726         
4727         if (some_track_latency_changed || force_whole_graph)  {
4728                 _engine.update_latencies ();
4729         }
4730
4731
4732         for (RouteList::iterator i = r->begin(); i != r->end(); ++i) {
4733                 boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
4734                 if (!tr) {
4735                         continue;
4736                 }
4737                 tr->set_capture_offset ();
4738         }
4739 }
4740
4741 char
4742 Session::session_name_is_legal (const string& path)
4743 {
4744         char illegal_chars[] = { '/', '\\', ':', ';', '\0' };
4745
4746         for (int i = 0; illegal_chars[i]; ++i) {
4747                 if (path.find (illegal_chars[i]) != string::npos) {
4748                         return illegal_chars[i];
4749                 }
4750         }
4751
4752         return 0;
4753 }
4754
4755 uint32_t 
4756 Session::next_control_id () const
4757 {
4758         int subtract = 0;
4759
4760         /* the monitor bus remote ID is in a different
4761          * "namespace" than regular routes. its existence doesn't
4762          * affect normal (low) numbered routes.
4763          */
4764
4765         if (_monitor_out) {
4766                 subtract++;
4767         }
4768
4769         return nroutes() - subtract;
4770 }
4771
4772 void
4773 Session::notify_remote_id_change ()
4774 {
4775         if (deletion_in_progress()) {
4776                 return;
4777         }
4778
4779         switch (Config->get_remote_model()) {
4780         case MixerSort:
4781         case EditorSort:
4782                 Route::RemoteControlIDChange (); /* EMIT SIGNAL */
4783                 break;
4784         default:
4785                 break;
4786         }
4787 }
4788
4789 void
4790 Session::sync_order_keys (RouteSortOrderKey sort_key_changed)
4791 {
4792         if (deletion_in_progress()) {
4793                 return;
4794         }
4795
4796         /* tell everyone that something has happened to the sort keys
4797            and let them sync up with the change(s)
4798            this will give objects that manage the sort order keys the
4799            opportunity to keep them in sync if they wish to.
4800         */
4801
4802         DEBUG_TRACE (DEBUG::OrderKeys, string_compose ("Sync Order Keys, based on %1\n", enum_2_string (sort_key_changed)));
4803
4804         Route::SyncOrderKeys (sort_key_changed); /* EMIT SIGNAL */
4805
4806         DEBUG_TRACE (DEBUG::OrderKeys, "\tsync done\n");
4807 }
4808
4809 bool
4810 Session::operation_in_progress (GQuark op) const
4811 {
4812         return (find (_current_trans_quarks.begin(), _current_trans_quarks.end(), op) != _current_trans_quarks.end());
4813 }
4814
4815 boost::shared_ptr<Port>
4816 Session::ltc_input_port () const
4817 {
4818         return _ltc_input->nth (0);
4819 }
4820
4821 boost::shared_ptr<Port>
4822 Session::ltc_output_port () const
4823 {
4824         return _ltc_output->nth (0);
4825 }
4826
4827 void
4828 Session::reconnect_ltc_input ()
4829 {
4830         if (_ltc_input) {
4831
4832                 string src = Config->get_ltc_source_port();
4833
4834                 _ltc_input->disconnect (this);
4835
4836                 if (src != _("None") && !src.empty())  {
4837                         _ltc_input->nth (0)->connect (src);
4838                 }
4839         }
4840 }
4841
4842 void
4843 Session::reconnect_ltc_output ()
4844 {
4845         if (_ltc_output) {
4846
4847 #if 0
4848                 string src = Config->get_ltc_sink_port();
4849
4850                 _ltc_output->disconnect (this);
4851
4852                 if (src != _("None") && !src.empty())  {
4853                         _ltc_output->nth (0)->connect (src);
4854                 }
4855 #endif
4856         }
4857 }