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