9b61b5d816f726a5503a45a3234daa3670afd08e
[ardour.git] / libs / ardour / session.cc
1 /*
2     Copyright (C) 1999-2004 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     $Id$
19 */
20
21 #include <algorithm>
22 #include <string>
23 #include <vector>
24 #include <sstream>
25 #include <fstream>
26 #include <cstdio> /* sprintf(3) ... grrr */
27 #include <cmath>
28 #include <cerrno>
29 #include <unistd.h>
30 #include <limits.h>
31
32 #include <sigc++/bind.h>
33 #include <sigc++/retype.h>
34
35 #include <pbd/error.h>
36 #include <pbd/lockmonitor.h>
37 #include <pbd/pathscanner.h>
38 #include <pbd/stl_delete.h>
39 #include <pbd/basename.h>
40 #include <pbd/dirname.h>
41
42 #include <ardour/audioengine.h>
43 #include <ardour/configuration.h>
44 #include <ardour/session.h>
45 #include <ardour/diskstream.h>
46 #include <ardour/utils.h>
47 #include <ardour/audioplaylist.h>
48 #include <ardour/audioregion.h>
49 #include <ardour/source.h>
50 #include <ardour/filesource.h>
51 #include <ardour/destructive_filesource.h>
52 #include <ardour/sndfilesource.h>
53 #include <ardour/auditioner.h>
54 #include <ardour/recent_sessions.h>
55 #include <ardour/redirect.h>
56 #include <ardour/send.h>
57 #include <ardour/insert.h>
58 #include <ardour/connection.h>
59 #include <ardour/slave.h>
60 #include <ardour/tempo.h>
61 #include <ardour/audio_track.h>
62 #include <ardour/cycle_timer.h>
63 #include <ardour/named_selection.h>
64 #include <ardour/crossfade.h>
65 #include <ardour/playlist.h>
66 #include <ardour/click.h>
67 #include <ardour/timestamps.h>
68
69 #include "i18n.h"
70
71 using namespace std;
72 using namespace ARDOUR;
73 //using namespace sigc;
74
75 const char* Session::_template_suffix = X_(".template");
76 const char* Session::_statefile_suffix = X_(".ardour");
77 const char* Session::_pending_suffix = X_(".pending");
78 const char* Session::sound_dir_name = X_("sounds");
79 const char* Session::tape_dir_name = X_("tapes");
80 const char* Session::peak_dir_name = X_("peaks");
81 const char* Session::dead_sound_dir_name = X_("dead_sounds");
82
83 Session::compute_peak_t                         Session::compute_peak                   = 0;
84 Session::apply_gain_to_buffer_t         Session::apply_gain_to_buffer   = 0;
85 Session::mix_buffers_with_gain_t        Session::mix_buffers_with_gain  = 0;
86 Session::mix_buffers_no_gain_t          Session::mix_buffers_no_gain    = 0;
87
88 sigc::signal<int> Session::AskAboutPendingState;
89
90 int
91 Session::find_session (string str, string& path, string& snapshot, bool& isnew)
92 {
93         struct stat statbuf;
94         char buf[PATH_MAX+1];
95
96         isnew = false;
97
98         if (!realpath (str.c_str(), buf) && (errno != ENOENT && errno != ENOTDIR)) {
99                 error << string_compose (_("Could not resolve path: %1 (%2)"), buf, strerror(errno)) << endmsg;
100                 return -1;
101         }
102
103         str = buf;
104         
105         /* check to see if it exists, and what it is */
106
107         if (stat (str.c_str(), &statbuf)) {
108                 if (errno == ENOENT) {
109                         isnew = true;
110                 } else {
111                         error << string_compose (_("cannot check session path %1 (%2)"), str, strerror (errno))
112                               << endmsg;
113                         return -1;
114                 }
115         }
116
117         if (!isnew) {
118
119                 /* it exists, so it must either be the name
120                    of the directory, or the name of the statefile
121                    within it.
122                 */
123
124                 if (S_ISDIR (statbuf.st_mode)) {
125
126                         string::size_type slash = str.find_last_of ('/');
127                 
128                         if (slash == string::npos) {
129                                 
130                                 /* a subdirectory of cwd, so statefile should be ... */
131
132                                 string tmp;
133                                 tmp = str;
134                                 tmp += '/';
135                                 tmp += str;
136                                 tmp += _statefile_suffix;
137
138                                 /* is it there ? */
139                                 
140                                 if (stat (tmp.c_str(), &statbuf)) {
141                                         error << string_compose (_("cannot check statefile %1 (%2)"), tmp, strerror (errno))
142                                               << endmsg;
143                                         return -1;
144                                 }
145
146                                 path = str;
147                                 snapshot = str;
148
149                         } else {
150
151                                 /* some directory someplace in the filesystem.
152                                    the snapshot name is the directory name
153                                    itself.
154                                 */
155
156                                 path = str;
157                                 snapshot = str.substr (slash+1);
158                                         
159                         }
160
161                 } else if (S_ISREG (statbuf.st_mode)) {
162                         
163                         string::size_type slash = str.find_last_of ('/');
164                         string::size_type suffix;
165
166                         /* remove the suffix */
167                         
168                         if (slash != string::npos) {
169                                 snapshot = str.substr (slash+1);
170                         } else {
171                                 snapshot = str;
172                         }
173
174                         suffix = snapshot.find (_statefile_suffix);
175                         
176                         if (suffix == string::npos) {
177                                 error << string_compose (_("%1 is not an Ardour snapshot file"), str) << endmsg;
178                                 return -1;
179                         }
180
181                         /* remove suffix */
182
183                         snapshot = snapshot.substr (0, suffix);
184                         
185                         if (slash == string::npos) {
186                                 
187                                 /* we must be in the directory where the 
188                                    statefile lives. get it using cwd().
189                                 */
190
191                                 char cwd[PATH_MAX+1];
192
193                                 if (getcwd (cwd, sizeof (cwd)) == 0) {
194                                         error << string_compose (_("cannot determine current working directory (%1)"), strerror (errno))
195                                               << endmsg;
196                                         return -1;
197                                 }
198
199                                 path = cwd;
200
201                         } else {
202
203                                 /* full path to the statefile */
204
205                                 path = str.substr (0, slash);
206                         }
207                                 
208                 } else {
209
210                         /* what type of file is it? */
211                         error << string_compose (_("unknown file type for session %1"), str) << endmsg;
212                         return -1;
213                 }
214
215         } else {
216
217                 /* its the name of a new directory. get the name
218                    as "dirname" does.
219                 */
220
221                 string::size_type slash = str.find_last_of ('/');
222
223                 if (slash == string::npos) {
224                         
225                         /* no slash, just use the name, but clean it up */
226                         
227                         path = legalize_for_path (str);
228                         snapshot = path;
229                         
230                 } else {
231                         
232                         path = str;
233                         snapshot = str.substr (slash+1);
234                 }
235         }
236
237         return 0;
238 }
239
240 Session::Session (AudioEngine &eng,
241                   string fullpath,
242                   string snapshot_name,
243                   string* mix_template)
244
245         : _engine (eng),
246           _mmc_port (default_mmc_port),
247           _mtc_port (default_mtc_port),
248           _midi_port (default_midi_port),
249           pending_events (2048),
250           midi_requests (128), // the size of this should match the midi request pool size
251           main_outs (0)
252 {
253         bool new_session;
254
255         cerr << "Loading session " << fullpath << " using snapshot " << snapshot_name << endl;
256
257         n_physical_outputs = _engine.n_physical_outputs();
258         n_physical_inputs =  _engine.n_physical_inputs();
259
260         first_stage_init (fullpath, snapshot_name);
261         
262         if (create (new_session, mix_template, _engine.frame_rate() * 60 * 5)) {
263                 throw failed_constructor ();
264         }
265         
266         if (second_stage_init (new_session)) {
267                 throw failed_constructor ();
268         }
269         
270         store_recent_sessions(_name, _path);
271         
272         bool was_dirty = dirty();
273
274         _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
275
276         if (was_dirty) {
277                 DirtyChanged (); /* EMIT SIGNAL */
278         }
279 }
280
281 Session::Session (AudioEngine &eng,
282                   string fullpath,
283                   string snapshot_name,
284                   AutoConnectOption input_ac,
285                   AutoConnectOption output_ac,
286                   uint32_t control_out_channels,
287                   uint32_t master_out_channels,
288                   uint32_t requested_physical_in,
289                   uint32_t requested_physical_out,
290                   jack_nframes_t initial_length)
291
292         : _engine (eng),
293           _mmc_port (default_mmc_port),
294           _mtc_port (default_mtc_port),
295           _midi_port (default_midi_port),
296           pending_events (2048),
297           midi_requests (16),
298           main_outs (0)
299
300 {
301         bool new_session;
302
303         cerr << "Loading session " << fullpath << " using snapshot " << snapshot_name << endl;
304
305         n_physical_outputs = max (requested_physical_out, _engine.n_physical_outputs());
306         n_physical_inputs = max (requested_physical_in, _engine.n_physical_inputs());
307
308         first_stage_init (fullpath, snapshot_name);
309         
310         if (create (new_session, 0, initial_length)) {
311                 throw failed_constructor ();
312         }
313
314         if (control_out_channels) {
315                 Route* r;
316                 r = new Route (*this, _("monitor"), -1, control_out_channels, -1, control_out_channels, Route::ControlOut);
317                 add_route (r);
318                 _control_out = r;
319         }
320
321         if (master_out_channels) {
322                 Route* r;
323                 r = new Route (*this, _("master"), -1, master_out_channels, -1, master_out_channels, Route::MasterOut);
324                 add_route (r);
325                 _master_out = r;
326         } else {
327                 /* prohibit auto-connect to master, because there isn't one */
328                 output_ac = AutoConnectOption (output_ac & ~AutoConnectMaster);
329         }
330
331         input_auto_connect = input_ac;
332         output_auto_connect = output_ac;
333
334         if (second_stage_init (new_session)) {
335                 throw failed_constructor ();
336         }
337         
338         store_recent_sessions(_name, _path);
339         
340         bool was_dirty = dirty ();
341
342         _state_of_the_state = StateOfTheState (_state_of_the_state & ~Dirty);
343
344         if (was_dirty) {
345                 DirtyChanged (); /* EMIT SIGNAL */
346         }
347 }
348
349 Session::~Session ()
350 {
351         /* if we got to here, leaving pending capture state around
352            is a mistake.
353         */
354
355         remove_pending_capture_state ();
356
357         _state_of_the_state = StateOfTheState (CannotSave|Deletion);
358         _engine.remove_session ();
359         
360         going_away (); /* EMIT SIGNAL */
361         
362         terminate_butler_thread ();
363         terminate_midi_thread ();
364         terminate_feedback ();
365         
366         if (click_data && click_data != default_click) {
367                 delete [] click_data;
368         }
369
370         if (click_emphasis_data && click_emphasis_data != default_click_emphasis) {
371                 delete [] click_emphasis_data;
372         }
373
374         clear_clicks ();
375
376         if (_click_io) {
377                 delete _click_io;
378         }
379
380
381         if (auditioner) {
382                 delete auditioner;
383         }
384
385         for (vector<Sample*>::iterator i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i) {
386                 free(*i);
387         }
388
389         for (vector<Sample*>::iterator i = _silent_buffers.begin(); i != _silent_buffers.end(); ++i) {
390                 free(*i);
391         }
392
393         for (vector<Sample*>::iterator i = _send_buffers.begin(); i != _send_buffers.end(); ++i) {
394                 free(*i);
395         }
396
397         for (map<RunContext,char*>::iterator i = _conversion_buffers.begin(); i != _conversion_buffers.end(); ++i) {
398                 delete [] (i->second);
399         }
400         
401 #undef TRACK_DESTRUCTION
402 #ifdef TRACK_DESTRUCTION
403         cerr << "delete named selections\n";
404 #endif /* TRACK_DESTRUCTION */
405         for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ) {
406                 NamedSelectionList::iterator tmp;
407
408                 tmp = i;
409                 ++tmp;
410
411                 delete *i;
412                 i = tmp;
413         }
414
415 #ifdef TRACK_DESTRUCTION
416         cerr << "delete playlists\n";
417 #endif /* TRACK_DESTRUCTION */
418         for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ) {
419                 PlaylistList::iterator tmp;
420
421                 tmp = i;
422                 ++tmp;
423
424                 delete *i;
425                 
426                 i = tmp;
427         }
428
429 #ifdef TRACK_DESTRUCTION
430         cerr << "delete audio regions\n";
431 #endif /* TRACK_DESTRUCTION */
432         for (AudioRegionList::iterator i = audio_regions.begin(); i != audio_regions.end(); ) {
433                 AudioRegionList::iterator tmp;
434
435                 tmp =i;
436                 ++tmp;
437
438                 delete (*i).second;
439
440                 i = tmp;
441         }
442         
443 #ifdef TRACK_DESTRUCTION
444         cerr << "delete routes\n";
445 #endif /* TRACK_DESTRUCTION */
446         for (RouteList::iterator i = routes.begin(); i != routes.end(); ) {
447                 RouteList::iterator tmp;
448                 tmp = i;
449                 ++tmp;
450                 delete *i;
451                 i = tmp;
452         }
453
454 #ifdef TRACK_DESTRUCTION
455         cerr << "delete diskstreams\n";
456 #endif /* TRACK_DESTRUCTION */
457         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ) {
458                 DiskStreamList::iterator tmp;
459
460                 tmp = i;
461                 ++tmp;
462
463                 delete *i;
464
465                 i = tmp;
466         }
467
468 #ifdef TRACK_DESTRUCTION
469         cerr << "delete sources\n";
470 #endif /* TRACK_DESTRUCTION */
471         for (SourceList::iterator i = sources.begin(); i != sources.end(); ) {
472                 SourceList::iterator tmp;
473
474                 tmp = i;
475                 ++tmp;
476
477                 delete (*i).second;
478
479                 i = tmp;
480         }
481
482 #ifdef TRACK_DESTRUCTION
483         cerr << "delete mix groups\n";
484 #endif /* TRACK_DESTRUCTION */
485         for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); ) {
486                 list<RouteGroup*>::iterator tmp;
487
488                 tmp = i;
489                 ++tmp;
490
491                 delete *i;
492
493                 i = tmp;
494         }
495
496 #ifdef TRACK_DESTRUCTION
497         cerr << "delete edit groups\n";
498 #endif /* TRACK_DESTRUCTION */
499         for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); ) {
500                 list<RouteGroup*>::iterator tmp;
501                 
502                 tmp = i;
503                 ++tmp;
504
505                 delete *i;
506
507                 i = tmp;
508         }
509         
510 #ifdef TRACK_DESTRUCTION
511         cerr << "delete connections\n";
512 #endif /* TRACK_DESTRUCTION */
513         for (ConnectionList::iterator i = _connections.begin(); i != _connections.end(); ) {
514                 ConnectionList::iterator tmp;
515
516                 tmp = i;
517                 ++tmp;
518
519                 delete *i;
520
521                 i = tmp;
522         }
523
524         if (butler_mixdown_buffer) {
525                 delete [] butler_mixdown_buffer;
526         }
527
528         if (butler_gain_buffer) {
529                 delete [] butler_gain_buffer;
530         }
531
532         Crossfade::set_buffer_size (0);
533
534         if (mmc) {
535                 delete mmc;
536         }
537
538         if (state_tree) {
539                 delete state_tree;
540         }
541 }
542
543 void
544 Session::set_worst_io_latencies (bool take_lock)
545 {
546         _worst_output_latency = 0;
547         _worst_input_latency = 0;
548
549         if (!_engine.connected()) {
550                 return;
551         }
552
553         if (take_lock) {
554                 route_lock.read_lock ();
555         }
556         
557         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
558                 _worst_output_latency = max (_worst_output_latency, (*i)->output_latency());
559                 _worst_input_latency = max (_worst_input_latency, (*i)->input_latency());
560         }
561
562         if (take_lock) {
563                 route_lock.unlock ();
564         }
565 }
566
567 void
568 Session::when_engine_running ()
569 {
570         string first_physical_output;
571
572         /* we don't want to run execute this again */
573
574         first_time_running.disconnect ();
575
576         set_block_size (_engine.frames_per_cycle());
577         set_frame_rate (_engine.frame_rate());
578
579         /* every time we reconnect, recompute worst case output latencies */
580
581         _engine.Running.connect (sigc::bind (mem_fun (*this, &Session::set_worst_io_latencies), true));
582
583         if (synced_to_jack()) {
584                 _engine.transport_stop ();
585         }
586
587         if (Config->get_jack_time_master()) {
588                 _engine.transport_locate (_transport_frame);
589         }
590
591         _clicking = false;
592
593         try {
594                 XMLNode* child = 0;
595                 
596                 _click_io = new ClickIO (*this, "click", 0, 0, -1, -1);
597
598                 if (state_tree && (child = find_named_node (*state_tree->root(), "Click")) != 0) {
599
600                         /* existing state for Click */
601                         
602                         if (_click_io->set_state (*child->children().front()) == 0) {
603                                 
604                                 _clicking = click_requested;
605
606                         } else {
607
608                                 error << _("could not setup Click I/O") << endmsg;
609                                 _clicking = false;
610                         }
611
612                 } else {
613                         
614                         /* default state for Click */
615
616                         first_physical_output = _engine.get_nth_physical_output (0);
617                         
618                         if (first_physical_output.length()) {
619                                 if (_click_io->add_output_port (first_physical_output, this)) {
620                                         // relax, even though its an error
621                                 } else {
622                                         _clicking = click_requested;
623                                 }
624                         }
625                 }
626         }
627
628         catch (failed_constructor& err) {
629                 error << _("cannot setup Click I/O") << endmsg;
630         }
631
632         set_worst_io_latencies (true);
633
634         if (_clicking) {
635                  ControlChanged (Clicking); /* EMIT SIGNAL */
636         }
637
638         if (auditioner == 0) {
639
640                 /* we delay creating the auditioner till now because
641                    it makes its own connections to ports named
642                    in the ARDOUR_RC config file. the engine has
643                    to be running for this to work.
644                 */
645
646                 try {
647                         auditioner = new Auditioner (*this);
648                 }
649
650                 catch (failed_constructor& err) {
651                         warning << _("cannot create Auditioner: no auditioning of regions possible") << endmsg;
652                 }
653         }
654
655         /* Create a set of Connection objects that map
656            to the physical outputs currently available
657         */
658
659         /* ONE: MONO */
660
661         for (uint32_t np = 0; np < n_physical_outputs; ++np) {
662                 char buf[32];
663                 snprintf (buf, sizeof (buf), _("out %" PRIu32), np+1);
664
665                 Connection* c = new OutputConnection (buf, true);
666
667                 c->add_port ();
668                 c->add_connection (0, _engine.get_nth_physical_output (np));
669
670                 add_connection (c);
671         }
672
673         for (uint32_t np = 0; np < n_physical_inputs; ++np) {
674                 char buf[32];
675                 snprintf (buf, sizeof (buf), _("in %" PRIu32), np+1);
676
677                 Connection* c = new InputConnection (buf, true);
678
679                 c->add_port ();
680                 c->add_connection (0, _engine.get_nth_physical_input (np));
681
682                 add_connection (c);
683         }
684
685         /* TWO: STEREO */
686
687         for (uint32_t np = 0; np < n_physical_outputs; np +=2) {
688                 char buf[32];
689                 snprintf (buf, sizeof (buf), _("out %" PRIu32 "+%" PRIu32), np+1, np+2);
690
691                 Connection* c = new OutputConnection (buf, true);
692
693                 c->add_port ();
694                 c->add_port ();
695                 c->add_connection (0, _engine.get_nth_physical_output (np));
696                 c->add_connection (1, _engine.get_nth_physical_output (np+1));
697
698                 add_connection (c);
699         }
700
701         for (uint32_t np = 0; np < n_physical_inputs; np +=2) {
702                 char buf[32];
703                 snprintf (buf, sizeof (buf), _("in %" PRIu32 "+%" PRIu32), np+1, np+2);
704
705                 Connection* c = new InputConnection (buf, true);
706
707                 c->add_port ();
708                 c->add_port ();
709                 c->add_connection (0, _engine.get_nth_physical_input (np));
710                 c->add_connection (1, _engine.get_nth_physical_input (np+1));
711
712                 add_connection (c);
713         }
714
715         /* THREE MASTER */
716
717         if (_master_out) {
718
719                 /* create master/control ports */
720                 
721                 if (_master_out) {
722                         uint32_t n;
723
724                         /* force the master to ignore any later call to this */
725                         
726                         if (_master_out->pending_state_node) {
727                                 _master_out->ports_became_legal();
728                         }
729
730                         /* no panner resets till we are through */
731                         
732                         _master_out->defer_pan_reset ();
733                         
734                         while ((int) _master_out->n_inputs() < _master_out->input_maximum()) {
735                                 if (_master_out->add_input_port ("", this)) {
736                                         error << _("cannot setup master inputs") 
737                                               << endmsg;
738                                         break;
739                                 }
740                         }
741                         n = 0;
742                         while ((int) _master_out->n_outputs() < _master_out->output_maximum()) {
743                                 if (_master_out->add_output_port (_engine.get_nth_physical_output (n), this)) {
744                                         error << _("cannot setup master outputs")
745                                               << endmsg;
746                                         break;
747                                 }
748                                 n++;
749                         }
750
751                         _master_out->allow_pan_reset ();
752                         
753                 }
754
755                 Connection* c = new OutputConnection (_("Master Out"), true);
756
757                 for (uint32_t n = 0; n < _master_out->n_inputs (); ++n) {
758                         c->add_port ();
759                         c->add_connection ((int) n, _master_out->input(n)->name());
760                 }
761                 add_connection (c);
762         } 
763
764         hookup_io ();
765
766         /* catch up on send+insert cnts */
767
768         insert_cnt = 0;
769         
770         for (slist<PortInsert*>::iterator i = _port_inserts.begin(); i != _port_inserts.end(); ++i) {
771                 uint32_t id;
772
773                 if (sscanf ((*i)->name().c_str(), "%*s %u", &id) == 1) {
774                         if (id > insert_cnt) {
775                                 insert_cnt = id;
776                         }
777                 }
778         }
779
780         send_cnt = 0;
781
782         for (slist<Send*>::iterator i = _sends.begin(); i != _sends.end(); ++i) {
783                 uint32_t id;
784                 
785                 if (sscanf ((*i)->name().c_str(), "%*s %u", &id) == 1) {
786                         if (id > send_cnt) {
787                                 send_cnt = id;
788                         }
789                 }
790         }
791
792         _state_of_the_state = StateOfTheState (_state_of_the_state & ~(CannotSave|Dirty));
793
794         /* hook us up to the engine */
795
796         _engine.set_session (this);
797
798         _state_of_the_state = Clean;
799
800         DirtyChanged (); /* EMIT SIGNAL */
801 }
802
803 void
804 Session::hookup_io ()
805 {
806         /* stop graph reordering notifications from
807            causing resorts, etc.
808         */
809
810         _state_of_the_state = StateOfTheState (_state_of_the_state | InitialConnecting);
811
812         /* Tell all IO objects to create their ports */
813
814         IO::enable_ports ();
815
816         if (_control_out) {
817                 uint32_t n;
818
819                 while ((int) _control_out->n_inputs() < _control_out->input_maximum()) {
820                         if (_control_out->add_input_port ("", this)) {
821                                 error << _("cannot setup control inputs")
822                                       << endmsg;
823                                 break;
824                         }
825                 }
826                 n = 0;
827                 while ((int) _control_out->n_outputs() < _control_out->output_maximum()) {
828                         if (_control_out->add_output_port (_engine.get_nth_physical_output (n), this)) {
829                                 error << _("cannot set up master outputs")
830                                       << endmsg;
831                                 break;
832                         }
833                         n++;
834                 }
835         }
836
837         /* Tell all IO objects to connect themselves together */
838
839         IO::enable_connecting ();
840
841         /* Now reset all panners */
842
843         IO::reset_panners ();
844
845         /* Anyone who cares about input state, wake up and do something */
846
847         IOConnectionsComplete (); /* EMIT SIGNAL */
848
849         _state_of_the_state = StateOfTheState (_state_of_the_state & ~InitialConnecting);
850
851         /* now handle the whole enchilada as if it was one
852            graph reorder event.
853         */
854
855         graph_reordered ();
856
857         /* update mixer solo state */
858
859         catch_up_on_solo();
860 }
861
862 void
863 Session::playlist_length_changed (Playlist* pl)
864 {
865         /* we can't just increase end_location->end() if pl->get_maximum_extent() 
866            if larger. if the playlist used to be the longest playlist,
867            and its now shorter, we have to decrease end_location->end(). hence,
868            we have to iterate over all diskstreams and check the 
869            playlists currently in use.
870         */
871         find_current_end ();
872 }
873
874 void
875 Session::diskstream_playlist_changed (DiskStream* dstream)
876 {
877         Playlist *playlist;
878
879         if ((playlist = dstream->playlist()) != 0) {
880           playlist->LengthChanged.connect (sigc::bind (mem_fun (this, &Session::playlist_length_changed), playlist));
881         }
882         
883         /* see comment in playlist_length_changed () */
884         find_current_end ();
885 }
886
887 bool
888 Session::record_enabling_legal () const
889 {
890         /* this used to be in here, but survey says.... we don't need to restrict it */
891         // if (record_status() == Recording) {
892         //      return false;
893         // }
894
895         if (all_safe) {
896                 return false;
897         }
898         return true;
899 }
900
901 void
902 Session::set_auto_play (bool yn)
903 {
904         if (auto_play != yn) {
905                 auto_play = yn; 
906                 set_dirty ();
907                 ControlChanged (AutoPlay);
908         }
909 }
910
911 void
912 Session::set_auto_return (bool yn)
913 {
914         if (auto_return != yn) {
915                 auto_return = yn; 
916                 set_dirty ();
917                 ControlChanged (AutoReturn);
918         }
919 }
920
921 void
922 Session::set_crossfades_active (bool yn)
923 {
924         if (crossfades_active != yn) {
925                 crossfades_active = yn; 
926                 set_dirty ();
927                 ControlChanged (CrossFadesActive);
928         }
929 }
930
931 void
932 Session::set_do_not_record_plugins (bool yn)
933 {
934         if (do_not_record_plugins != yn) {
935                 do_not_record_plugins = yn; 
936                 set_dirty ();
937                 ControlChanged (RecordingPlugins); 
938         }
939 }
940
941 void
942 Session::set_auto_input (bool yn)
943 {
944         if (auto_input != yn) {
945                 auto_input = yn;
946                 
947                 if (Config->get_use_hardware_monitoring() && transport_rolling()) {
948                         /* auto-input only makes a difference if we're rolling */
949
950                         /* Even though this can called from RT context we are using
951                            a non-tentative rwlock here,  because the action must occur.
952                            The rarity and short potential lock duration makes this "OK"
953                         */
954                         RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
955                         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
956                                 if ((*i)->record_enabled ()) {
957                                         //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
958                                         (*i)->monitor_input (!auto_input);   
959                                 }
960                         }
961                 }
962
963                 set_dirty();
964                 ControlChanged (AutoInput);
965         }
966 }
967
968 void
969 Session::reset_input_monitor_state ()
970 {
971         if (transport_rolling()) {
972                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
973                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
974                         if ((*i)->record_enabled ()) {
975                                 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
976                                 (*i)->monitor_input (Config->get_use_hardware_monitoring() && !auto_input);
977                         }
978                 }
979         } else {
980                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
981                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
982                         if ((*i)->record_enabled ()) {
983                                 //cerr << "switching to input = " << !auto_input << __FILE__ << __LINE__ << endl << endl;
984                                 (*i)->monitor_input (Config->get_use_hardware_monitoring());
985                         }
986                 }
987         }
988 }
989
990
991 void
992 Session::set_input_auto_connect (bool yn)
993 {
994         if (yn) {
995                 input_auto_connect = AutoConnectOption (input_auto_connect|AutoConnectPhysical);
996         } else {
997                 input_auto_connect = AutoConnectOption (input_auto_connect|~AutoConnectPhysical);
998         }
999         set_dirty ();
1000 }
1001
1002 bool
1003 Session::get_input_auto_connect () const
1004 {
1005         return (input_auto_connect & AutoConnectPhysical);
1006 }
1007
1008 void
1009 Session::set_output_auto_connect (AutoConnectOption aco)
1010 {
1011         output_auto_connect = aco;
1012         set_dirty ();
1013 }
1014
1015 void
1016 Session::auto_punch_start_changed (Location* location)
1017 {
1018         replace_event (Event::PunchIn, location->start());
1019
1020         if (get_record_enabled() && get_punch_in()) {
1021                 /* capture start has been changed, so save new pending state */
1022                 save_state ("", true);
1023         }
1024 }       
1025
1026 void
1027 Session::auto_punch_end_changed (Location* location)
1028 {
1029         jack_nframes_t when_to_stop = location->end();
1030         // when_to_stop += _worst_output_latency + _worst_input_latency;
1031         replace_event (Event::PunchOut, when_to_stop);
1032 }       
1033
1034 void
1035 Session::auto_punch_changed (Location* location)
1036 {
1037         jack_nframes_t when_to_stop = location->end();
1038
1039         replace_event (Event::PunchIn, location->start());
1040         //when_to_stop += _worst_output_latency + _worst_input_latency;
1041         replace_event (Event::PunchOut, when_to_stop);
1042 }       
1043
1044 void
1045 Session::auto_loop_changed (Location* location)
1046 {
1047         replace_event (Event::AutoLoop, location->end(), location->start());
1048
1049         if (transport_rolling() && get_auto_loop()) {
1050
1051                 //if (_transport_frame < location->start() || _transport_frame > location->end()) {
1052
1053                 if (_transport_frame > location->end()) {
1054                         // relocate to beginning of loop
1055                         clear_events (Event::LocateRoll);
1056                         
1057                         request_locate (location->start(), true);
1058
1059                 }
1060                 else if (seamless_loop && !loop_changing) {
1061                         
1062                         // schedule a locate-roll to refill the diskstreams at the
1063                         // previous loop end
1064                         loop_changing = true;
1065
1066                         if (location->end() > last_loopend) {
1067                                 clear_events (Event::LocateRoll);
1068                                 Event *ev = new Event (Event::LocateRoll, Event::Add, last_loopend, last_loopend, 0, true);
1069                                 queue_event (ev);
1070                         }
1071
1072                 }
1073         }       
1074
1075         last_loopend = location->end();
1076         
1077 }
1078
1079 void
1080 Session::set_auto_punch_location (Location* location)
1081 {
1082         Location* existing;
1083
1084         if ((existing = _locations.auto_punch_location()) != 0 && existing != location) {
1085                 auto_punch_start_changed_connection.disconnect();
1086                 auto_punch_end_changed_connection.disconnect();
1087                 auto_punch_changed_connection.disconnect();
1088                 existing->set_auto_punch (false, this);
1089                 remove_event (existing->start(), Event::PunchIn);
1090                 clear_events (Event::PunchOut);
1091                 auto_punch_location_changed (0);
1092         }
1093
1094         set_dirty();
1095
1096         if (location == 0) {
1097                 return;
1098         }
1099         
1100         if (location->end() <= location->start()) {
1101                 error << _("Session: you can't use that location for auto punch (start <= end)") << endmsg;
1102                 return;
1103         }
1104
1105         auto_punch_start_changed_connection.disconnect();
1106         auto_punch_end_changed_connection.disconnect();
1107         auto_punch_changed_connection.disconnect();
1108                 
1109         auto_punch_start_changed_connection = location->start_changed.connect (mem_fun (this, &Session::auto_punch_start_changed));
1110         auto_punch_end_changed_connection = location->end_changed.connect (mem_fun (this, &Session::auto_punch_end_changed));
1111         auto_punch_changed_connection = location->changed.connect (mem_fun (this, &Session::auto_punch_changed));
1112
1113         location->set_auto_punch (true, this);
1114         auto_punch_location_changed (location);
1115 }
1116
1117 void
1118 Session::set_punch_in (bool yn)
1119 {
1120         if (punch_in == yn) {
1121                 return;
1122         }
1123
1124         Location* location;
1125
1126         if ((location = _locations.auto_punch_location()) != 0) {
1127                 if ((punch_in = yn) == true) {
1128                         replace_event (Event::PunchIn, location->start());
1129                 } else {
1130                         remove_event (location->start(), Event::PunchIn);
1131                 }
1132         }
1133
1134         set_dirty();
1135         ControlChanged (PunchIn); /* EMIT SIGNAL */
1136 }
1137
1138 void
1139 Session::set_punch_out (bool yn)
1140 {
1141         if (punch_out == yn) {
1142                 return;
1143         }
1144
1145         Location* location;
1146
1147         if ((location = _locations.auto_punch_location()) != 0) {
1148                 if ((punch_out = yn) == true) {
1149                         replace_event (Event::PunchOut, location->end());
1150                 } else {
1151                         clear_events (Event::PunchOut);
1152                 }
1153         }
1154
1155         set_dirty();
1156         ControlChanged (PunchOut); /* EMIT SIGNAL */
1157 }
1158
1159 void
1160 Session::set_auto_loop_location (Location* location)
1161 {
1162         Location* existing;
1163
1164         if ((existing = _locations.auto_loop_location()) != 0 && existing != location) {
1165                 auto_loop_start_changed_connection.disconnect();
1166                 auto_loop_end_changed_connection.disconnect();
1167                 auto_loop_changed_connection.disconnect();
1168                 existing->set_auto_loop (false, this);
1169                 remove_event (existing->end(), Event::AutoLoop);
1170                 auto_loop_location_changed (0);
1171         }
1172         
1173         set_dirty();
1174
1175         if (location == 0) {
1176                 return;
1177         }
1178
1179         if (location->end() <= location->start()) {
1180                 error << _("Session: you can't use a mark for auto loop") << endmsg;
1181                 return;
1182         }
1183
1184         last_loopend = location->end();
1185         
1186         auto_loop_start_changed_connection.disconnect();
1187         auto_loop_end_changed_connection.disconnect();
1188         auto_loop_changed_connection.disconnect();
1189         
1190         auto_loop_start_changed_connection = location->start_changed.connect (mem_fun (this, &Session::auto_loop_changed));
1191         auto_loop_end_changed_connection = location->end_changed.connect (mem_fun (this, &Session::auto_loop_changed));
1192         auto_loop_changed_connection = location->changed.connect (mem_fun (this, &Session::auto_loop_changed));
1193
1194         location->set_auto_loop (true, this);
1195         auto_loop_location_changed (location);
1196 }
1197
1198 void
1199 Session::locations_added (Location* ignored)
1200 {
1201         set_dirty ();
1202 }
1203
1204 void
1205 Session::locations_changed ()
1206 {
1207         _locations.apply (*this, &Session::handle_locations_changed);
1208 }
1209
1210 void
1211 Session::handle_locations_changed (Locations::LocationList& locations)
1212 {
1213         Locations::LocationList::iterator i;
1214         Location* location;
1215         bool set_loop = false;
1216         bool set_punch = false;
1217
1218         for (i = locations.begin(); i != locations.end(); ++i) {
1219
1220                 location =* i;
1221
1222                 if (location->is_auto_punch()) {
1223                         set_auto_punch_location (location);
1224                         set_punch = true;
1225                 }
1226                 if (location->is_auto_loop()) {
1227                         set_auto_loop_location (location);
1228                         set_loop = true;
1229                 }
1230                 
1231         }
1232
1233         if (!set_loop) {
1234                 set_auto_loop_location (0);
1235         }
1236         if (!set_punch) {
1237                 set_auto_punch_location (0);
1238         }
1239
1240         set_dirty();
1241 }                                                    
1242
1243 void
1244 Session::enable_record ()
1245 {
1246         /* XXX really atomic compare+swap here */
1247         if (atomic_read (&_record_status) != Recording) {
1248                 atomic_set (&_record_status, Recording);
1249                 _last_record_location = _transport_frame;
1250                 send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordStrobe);
1251
1252                 if (Config->get_use_hardware_monitoring() && auto_input) {
1253                         /* Even though this can be called from RT context we are using
1254                            a non-tentative rwlock here,  because the action must occur.
1255                            The rarity and short potential lock duration makes this "OK"
1256                         */
1257                         RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1258                         
1259                         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1260                                 if ((*i)->record_enabled ()) {
1261                                         (*i)->monitor_input (true);   
1262                                 }
1263                         }
1264                 }
1265
1266                 RecordStateChanged ();
1267         }
1268 }
1269
1270 void
1271 Session::disable_record (bool force)
1272 {
1273         RecordState rs;
1274
1275         if ((rs = (RecordState) atomic_read (&_record_status)) != Disabled) {
1276
1277                 if (!Config->get_latched_record_enable () || force) {
1278                         atomic_set (&_record_status, Disabled);
1279                 } else {
1280                         if (rs == Recording) {
1281                                 atomic_set (&_record_status, Enabled);
1282                         }
1283                 }
1284
1285                 send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordExit);
1286
1287                 if (Config->get_use_hardware_monitoring() && auto_input) {
1288                         /* Even though this can be called from RT context we are using
1289                            a non-tentative rwlock here,  because the action must occur.
1290                            The rarity and short potential lock duration makes this "OK"
1291                         */
1292                         RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1293                         
1294                         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1295                                 if ((*i)->record_enabled ()) {
1296                                         (*i)->monitor_input (false);   
1297                                 }
1298                         }
1299                 }
1300                 
1301                 RecordStateChanged (); /* emit signal */
1302                 remove_pending_capture_state ();
1303         }
1304 }
1305
1306 void
1307 Session::step_back_from_record ()
1308 {
1309         atomic_set (&_record_status, Enabled);
1310
1311         if (Config->get_use_hardware_monitoring()) {
1312                 /* Even though this can be called from RT context we are using
1313                    a non-tentative rwlock here,  because the action must occur.
1314                    The rarity and short potential lock duration makes this "OK"
1315                 */
1316                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1317                 
1318                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1319                         if (auto_input && (*i)->record_enabled ()) {
1320                                 //cerr << "switching from input" << __FILE__ << __LINE__ << endl << endl;
1321                                 (*i)->monitor_input (false);   
1322                         }
1323                 }
1324         }
1325 }
1326
1327 void
1328 Session::maybe_enable_record ()
1329 {
1330         atomic_set (&_record_status, Enabled);
1331
1332         /* XXX this save should really happen in another thread. its needed so that
1333            pending capture state can be recovered if we crash.
1334         */
1335
1336         save_state ("", true);
1337
1338         if (_transport_speed) {
1339                 if (!punch_in) {
1340                         enable_record ();
1341                 } 
1342         } else {
1343                 send_mmc_in_another_thread (MIDI::MachineControl::cmdRecordPause);
1344                 RecordStateChanged (); /* EMIT SIGNAL */
1345         }
1346
1347         set_dirty();
1348 }
1349
1350 jack_nframes_t
1351 Session::audible_frame () const
1352 {
1353         jack_nframes_t ret;
1354         jack_nframes_t offset;
1355         jack_nframes_t tf;
1356
1357         /* the first of these two possible settings for "offset"
1358            mean that the audible frame is stationary until 
1359            audio emerges from the latency compensation
1360            "pseudo-pipeline".
1361
1362            the second means that the audible frame is stationary
1363            until audio would emerge from a physical port
1364            in the absence of any plugin latency compensation
1365         */
1366
1367         offset = _worst_output_latency;
1368
1369         if (offset > current_block_size) {
1370                 offset -= current_block_size;
1371         } else { 
1372                 /* XXX is this correct? if we have no external
1373                    physical connections and everything is internal
1374                    then surely this is zero? still, how
1375                    likely is that anyway?
1376                 */
1377                 offset = current_block_size;
1378         }
1379
1380         if (synced_to_jack()) {
1381                 tf = _engine.transport_frame();
1382         } else {
1383                 tf = _transport_frame;
1384         }
1385
1386         if (_transport_speed == 0) {
1387                 return tf;
1388         }
1389
1390         if (tf < offset) {
1391                 return 0;
1392         }
1393
1394         ret = tf;
1395
1396         if (!non_realtime_work_pending()) {
1397
1398                 /* MOVING */
1399
1400                 /* take latency into account */
1401                 
1402                 ret -= offset;
1403         }
1404
1405         return ret;
1406 }
1407
1408 void
1409 Session::set_frame_rate (jack_nframes_t frames_per_second)
1410 {
1411         /** \fn void Session::set_frame_size(jack_nframes_t)
1412                 the AudioEngine object that calls this guarantees 
1413                 that it will not be called while we are also in
1414                 ::process(). Its fine to do things that block
1415                 here.
1416         */
1417
1418         _current_frame_rate = frames_per_second;
1419         _frames_per_smpte_frame = (double) _current_frame_rate / (double) smpte_frames_per_second;
1420
1421         Route::set_automation_interval ((jack_nframes_t) ceil ((double) frames_per_second * 0.25));
1422
1423         set_dirty();
1424
1425         /* XXX need to reset/reinstantiate all LADSPA plugins */
1426 }
1427
1428 void
1429 Session::set_block_size (jack_nframes_t nframes)
1430 {
1431         /* the AudioEngine guarantees 
1432            that it will not be called while we are also in
1433            ::process(). It is therefore fine to do things that block
1434            here.
1435         */
1436
1437         { 
1438                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1439                 RWLockMonitor dsm (diskstream_lock, false, __LINE__, __FILE__);
1440                 vector<Sample*>::iterator i;
1441                 uint32_t np;
1442                         
1443                 current_block_size = nframes;
1444                 
1445                 for (np = 0, i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i, ++np) {
1446                         free (*i);
1447                 }
1448
1449                 for (vector<Sample*>::iterator i = _silent_buffers.begin(); i != _silent_buffers.end(); ++i) {
1450                         free (*i);
1451                 }
1452
1453                 _passthru_buffers.clear ();
1454                 _silent_buffers.clear ();
1455
1456                 ensure_passthru_buffers (np);
1457
1458                 for (vector<Sample*>::iterator i = _send_buffers.begin(); i != _send_buffers.end(); ++i) {
1459                         free(*i);
1460
1461                         Sample *buf;
1462 #ifdef NO_POSIX_MEMALIGN
1463                         buf = (Sample *) malloc(current_block_size * sizeof(Sample));
1464 #else
1465                         posix_memalign((void **)&buf,16,current_block_size * 4);
1466 #endif                  
1467                         *i = buf;
1468
1469                         memset (*i, 0, sizeof (Sample) * current_block_size);
1470                 }
1471
1472                 
1473                 if (_gain_automation_buffer) {
1474                         delete [] _gain_automation_buffer;
1475                 }
1476                 _gain_automation_buffer = new gain_t[nframes];
1477
1478                 allocate_pan_automation_buffers (nframes, _npan_buffers, true);
1479
1480                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1481                         (*i)->set_block_size (nframes);
1482                 }
1483                 
1484                 for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
1485                         (*i)->set_block_size (nframes);
1486                 }
1487
1488                 set_worst_io_latencies (false);
1489         }
1490 }
1491
1492 void
1493 Session::set_default_fade (float steepness, float fade_msecs)
1494 {
1495 #if 0
1496         jack_nframes_t fade_frames;
1497         
1498         /* Don't allow fade of less 1 frame */
1499         
1500         if (fade_msecs < (1000.0 * (1.0/_current_frame_rate))) {
1501
1502                 fade_msecs = 0;
1503                 fade_frames = 0;
1504
1505         } else {
1506                 
1507                 fade_frames = (jack_nframes_t) floor (fade_msecs * _current_frame_rate * 0.001);
1508                 
1509         }
1510
1511         default_fade_msecs = fade_msecs;
1512         default_fade_steepness = steepness;
1513
1514         {
1515                 // jlc, WTF is this!
1516                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1517                 AudioRegion::set_default_fade (steepness, fade_frames);
1518         }
1519
1520         set_dirty();
1521
1522         /* XXX have to do this at some point */
1523         /* foreach region using default fade, reset, then 
1524            refill_all_diskstream_buffers ();
1525         */
1526 #endif
1527 }
1528
1529 struct RouteSorter {
1530     bool operator() (Route* r1, Route* r2) {
1531             if (r1->fed_by.find (r2) != r1->fed_by.end()) {
1532                     return false;
1533             } else if (r2->fed_by.find (r1) != r2->fed_by.end()) {
1534                     return true;
1535             } else {
1536                     if (r1->fed_by.empty()) {
1537                             if (r2->fed_by.empty()) {
1538                                     /* no ardour-based connections inbound to either route. just use signal order */
1539                                     return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1540                             } else {
1541                                     /* r2 has connections, r1 does not; run r1 early */
1542                                     return true;
1543                             }
1544                     } else {
1545                             return r1->order_key(N_("signal")) < r2->order_key(N_("signal"));
1546                     }
1547             }
1548     }
1549 };
1550
1551 static void
1552 trace_terminal (Route* r1, Route* rbase)
1553 {
1554         Route* r2;
1555
1556         if ((r1->fed_by.find (rbase) != r1->fed_by.end()) && (rbase->fed_by.find (r1) != rbase->fed_by.end())) {
1557                 info << string_compose(_("feedback loop setup between %1 and %2"), r1->name(), rbase->name()) << endmsg;
1558                 return;
1559         } 
1560
1561         /* make a copy of the existing list of routes that feed r1 */
1562
1563         set<Route *> existing = r1->fed_by;
1564
1565         /* for each route that feeds r1, recurse, marking it as feeding
1566            rbase as well.
1567         */
1568
1569         for (set<Route *>::iterator i = existing.begin(); i != existing.end(); ++i) {
1570                 r2 =* i;
1571
1572                 /* r2 is a route that feeds r1 which somehow feeds base. mark
1573                    base as being fed by r2
1574                 */
1575
1576                 rbase->fed_by.insert (r2);
1577
1578                 if (r2 != rbase) {
1579
1580                         /* 2nd level feedback loop detection. if r1 feeds or is fed by r2,
1581                            stop here.
1582                          */
1583
1584                         if ((r1->fed_by.find (r2) != r1->fed_by.end()) && (r2->fed_by.find (r1) != r2->fed_by.end())) {
1585                                 continue;
1586                         }
1587
1588                         /* now recurse, so that we can mark base as being fed by
1589                            all routes that feed r2
1590                         */
1591
1592                         trace_terminal (r2, rbase);
1593                 }
1594
1595         }
1596 }
1597
1598 void
1599 Session::resort_routes (void* src)
1600 {
1601         /* don't do anything here with signals emitted
1602            by Routes while we are being destroyed.
1603         */
1604
1605         if (_state_of_the_state & Deletion) {
1606                 return;
1607         }
1608
1609         /* Caller MUST hold the route_lock */
1610
1611         RouteList::iterator i, j;
1612
1613         for (i = routes.begin(); i != routes.end(); ++i) {
1614
1615                 (*i)->fed_by.clear ();
1616                 
1617                 for (j = routes.begin(); j != routes.end(); ++j) {
1618
1619                         /* although routes can feed themselves, it will
1620                            cause an endless recursive descent if we
1621                            detect it. so don't bother checking for
1622                            self-feeding.
1623                         */
1624
1625                         if (*j == *i) {
1626                                 continue;
1627                         }
1628
1629                         if ((*j)->feeds (*i)) {
1630                                 (*i)->fed_by.insert (*j);
1631                         } 
1632                 }
1633         }
1634         
1635         for (i = routes.begin(); i != routes.end(); ++i) {
1636                 trace_terminal (*i, *i);
1637         }
1638
1639         RouteSorter cmp;
1640         routes.sort (cmp);
1641
1642 #if 0
1643         cerr << "finished route resort\n";
1644         
1645         for (i = routes.begin(); i != routes.end(); ++i) {
1646                 cerr << " " << (*i)->name() << " signal order = " << (*i)->order_key ("signal") << endl;
1647         }
1648         cerr << endl;
1649 #endif
1650
1651 }
1652
1653 AudioTrack*
1654 Session::new_audio_track (int input_channels, int output_channels, TrackMode mode)
1655 {
1656         AudioTrack *track;
1657         char track_name[32];
1658         uint32_t n = 0;
1659         uint32_t channels_used = 0;
1660         string port;
1661         uint32_t nphysical_in;
1662         uint32_t nphysical_out;
1663
1664         /* count existing audio tracks */
1665
1666         {
1667                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1668                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1669                         if (dynamic_cast<AudioTrack*>(*i) != 0) {
1670                                 if (!(*i)->hidden()) {
1671                                         n++;
1672                                         channels_used += (*i)->n_inputs();
1673                                 }
1674                         }
1675                 }
1676         }
1677
1678         /* check for duplicate route names, since we might have pre-existing
1679            routes with this name (e.g. create Audio1, Audio2, delete Audio1,
1680            save, close,restart,add new route - first named route is now
1681            Audio2)
1682         */
1683
1684         do {
1685                 snprintf (track_name, sizeof(track_name), "Audio %" PRIu32, n+1);
1686                 if (route_by_name (track_name) == 0) {
1687                         break;
1688                 }
1689                 n++;
1690
1691         } while (n < (UINT_MAX-1));
1692
1693         if (input_auto_connect & AutoConnectPhysical) {
1694                 nphysical_in = n_physical_inputs;
1695         } else {
1696                 nphysical_in = 0;
1697         }
1698
1699         if (output_auto_connect & AutoConnectPhysical) {
1700                 nphysical_out = n_physical_outputs;
1701         } else {
1702                 nphysical_out = 0;
1703         }
1704
1705         try {
1706                 track = new AudioTrack (*this, track_name, Route::Flag (0), mode);
1707
1708                 if (track->ensure_io (input_channels, output_channels, false, this)) {
1709                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1710                                           input_channels, output_channels)
1711                               << endmsg;
1712                 }
1713
1714                 if (nphysical_in) {
1715                         for (uint32_t x = 0; x < track->n_inputs() && x < nphysical_in; ++x) {
1716                                 
1717                                 port = "";
1718                                 
1719                                 if (input_auto_connect & AutoConnectPhysical) {
1720                                         port = _engine.get_nth_physical_input ((channels_used+x)%nphysical_in);
1721                                 } 
1722                                 
1723                                 if (port.length() && track->connect_input (track->input (x), port, this)) {
1724                                         break;
1725                                 }
1726                         }
1727                 }
1728                 
1729                 for (uint32_t x = 0; x < track->n_outputs(); ++x) {
1730                         
1731                         port = "";
1732
1733                         if (nphysical_out && (output_auto_connect & AutoConnectPhysical)) {
1734                                 port = _engine.get_nth_physical_output ((channels_used+x)%nphysical_out);
1735                         } else if (output_auto_connect & AutoConnectMaster) {
1736                                 if (_master_out) {
1737                                         port = _master_out->input (x%_master_out->n_inputs())->name();
1738                                 }
1739                         }
1740
1741                         if (port.length() && track->connect_output (track->output (x), port, this)) {
1742                                 break;
1743                         }
1744                 }
1745
1746                 if (_control_out) {
1747                         vector<string> cports;
1748                         uint32_t ni = _control_out->n_inputs();
1749
1750                         for (n = 0; n < ni; ++n) {
1751                                 cports.push_back (_control_out->input(n)->name());
1752                         }
1753
1754                         track->set_control_outs (cports);
1755                 }
1756
1757                 track->diskstream_changed.connect (mem_fun (this, &Session::resort_routes));
1758
1759                 add_route (track);
1760
1761                 track->set_remote_control_id (ntracks());
1762         }
1763
1764         catch (failed_constructor &err) {
1765                 error << _("Session: could not create new audio track.") << endmsg;
1766                 return 0;
1767         }
1768
1769         return track;
1770 }
1771
1772 Route*
1773 Session::new_audio_route (int input_channels, int output_channels)
1774 {
1775         Route *bus;
1776         char bus_name[32];
1777         uint32_t n = 0;
1778         string port;
1779
1780         /* count existing audio busses */
1781
1782         {
1783                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1784                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1785                         if (dynamic_cast<AudioTrack*>(*i) == 0) {
1786                                 if (!(*i)->hidden()) {
1787                                         n++;
1788                                 }
1789                         }
1790                 }
1791         }
1792
1793         do {
1794                 snprintf (bus_name, sizeof(bus_name), "Bus %" PRIu32, n+1);
1795                 if (route_by_name (bus_name) == 0) {
1796                         break;
1797                 }
1798                 n++;
1799
1800         } while (n < (UINT_MAX-1));
1801
1802         try {
1803                 bus = new Route (*this, bus_name, -1, -1, -1, -1);
1804
1805                 if (bus->ensure_io (input_channels, output_channels, false, this)) {
1806                         error << string_compose (_("cannot configure %1 in/%2 out configuration for new audio track"),
1807                                           input_channels, output_channels)
1808                               << endmsg;
1809                 }
1810
1811                 for (uint32_t x = 0; x < bus->n_inputs(); ++x) {
1812                         
1813                         port = "";
1814
1815                         if (input_auto_connect & AutoConnectPhysical) {
1816                                 port = _engine.get_nth_physical_input ((n+x)%n_physical_inputs);
1817                         } 
1818                         
1819                         if (port.length() && bus->connect_input (bus->input (x), port, this)) {
1820                                 break;
1821                         }
1822                 }
1823
1824                 for (uint32_t x = 0; x < bus->n_outputs(); ++x) {
1825                         
1826                         port = "";
1827
1828                         if (output_auto_connect & AutoConnectPhysical) {
1829                                 port = _engine.get_nth_physical_input ((n+x)%n_physical_outputs);
1830                         } else if (output_auto_connect & AutoConnectMaster) {
1831                                 if (_master_out) {
1832                                         port = _master_out->input (x%_master_out->n_inputs())->name();
1833                                 }
1834                         }
1835
1836                         if (port.length() && bus->connect_output (bus->output (x), port, this)) {
1837                                 break;
1838                         }
1839                 }
1840
1841                 if (_control_out) {
1842                         vector<string> cports;
1843                         uint32_t ni = _control_out->n_inputs();
1844
1845                         for (uint32_t n = 0; n < ni; ++n) {
1846                                 cports.push_back (_control_out->input(n)->name());
1847                         }
1848                         bus->set_control_outs (cports);
1849                 }
1850                 
1851                 add_route (bus);
1852         }
1853
1854         catch (failed_constructor &err) {
1855                 error << _("Session: could not create new route.") << endmsg;
1856                 return 0;
1857         }
1858
1859         return bus;
1860 }
1861
1862 void
1863 Session::add_route (Route* route)
1864 {
1865         { 
1866                 RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
1867                 routes.push_front (route);
1868                 resort_routes(0);
1869         }
1870
1871         route->solo_changed.connect (sigc::bind (mem_fun (*this, &Session::route_solo_changed), route));
1872         route->mute_changed.connect (mem_fun (*this, &Session::route_mute_changed));
1873         route->output_changed.connect (mem_fun (*this, &Session::set_worst_io_latencies_x));
1874         route->redirects_changed.connect (mem_fun (*this, &Session::update_latency_compensation_proxy));
1875
1876         if (route->master()) {
1877                 _master_out = route;
1878         }
1879
1880         if (route->control()) {
1881                 _control_out = route;
1882         }
1883
1884         set_dirty();
1885         save_state (_current_snapshot_name);
1886
1887         RouteAdded (route); /* EMIT SIGNAL */
1888 }
1889
1890 void
1891 Session::add_diskstream (DiskStream* dstream)
1892 {
1893         /* need to do this in case we're rolling at the time, to prevent false underruns */
1894         dstream->do_refill(0, 0, 0);
1895         
1896         { 
1897                 RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__);
1898                 diskstreams.push_back (dstream);
1899         }
1900
1901         /* take a reference to the diskstream, preventing it from
1902            ever being deleted until the session itself goes away,
1903            or chooses to remove it for its own purposes.
1904         */
1905
1906         dstream->ref();
1907         dstream->set_block_size (current_block_size);
1908
1909         dstream->PlaylistChanged.connect (sigc::bind (mem_fun (*this, &Session::diskstream_playlist_changed), dstream));
1910         /* this will connect to future changes, and check the current length */
1911         diskstream_playlist_changed (dstream);
1912
1913         dstream->prepare ();
1914
1915         set_dirty();
1916         save_state (_current_snapshot_name);
1917
1918         DiskStreamAdded (dstream); /* EMIT SIGNAL */
1919 }
1920
1921 void
1922 Session::remove_route (Route& route)
1923 {
1924         {       
1925                 RWLockMonitor lm (route_lock, true, __LINE__, __FILE__);
1926                 routes.remove (&route);
1927                 
1928                 /* deleting the master out seems like a dumb
1929                    idea, but its more of a UI policy issue
1930                    than our concern.
1931                 */
1932
1933                 if (&route == _master_out) {
1934                         _master_out = 0;
1935                 }
1936
1937                 if (&route == _control_out) {
1938                         _control_out = 0;
1939
1940                         /* cancel control outs for all routes */
1941
1942                         vector<string> empty;
1943
1944                         for (RouteList::iterator r = routes.begin(); r != routes.end(); ++r) {
1945                                 (*r)->set_control_outs (empty);
1946                         }
1947                 }
1948
1949                 update_route_solo_state ();
1950         }
1951
1952         {
1953                 RWLockMonitor lm (diskstream_lock, true, __LINE__, __FILE__);
1954
1955                 AudioTrack* at;
1956
1957                 if ((at = dynamic_cast<AudioTrack*>(&route)) != 0) {
1958                         diskstreams.remove (&at->disk_stream());
1959                         at->disk_stream().unref ();
1960                 }
1961
1962                 find_current_end ();
1963         }
1964         
1965         update_latency_compensation (false, false);
1966         set_dirty();
1967         
1968         /* XXX should we disconnect from the Route's signals ? */
1969
1970         save_state (_current_snapshot_name);
1971
1972         delete &route;
1973 }       
1974
1975 void
1976 Session::route_mute_changed (void* src)
1977 {
1978         set_dirty ();
1979 }
1980
1981 void
1982 Session::route_solo_changed (void* src, Route* route)
1983 {      
1984         if (solo_update_disabled) {
1985                 // We know already
1986                 return;
1987         }
1988         
1989         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
1990         bool is_track;
1991         
1992         is_track = (dynamic_cast<AudioTrack*>(route) != 0);
1993         
1994         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
1995                 
1996                 /* soloing a track mutes all other tracks, soloing a bus mutes all other busses */
1997                 
1998                 if (is_track) {
1999                         
2000                         /* don't mess with busses */
2001                         
2002                         if (dynamic_cast<AudioTrack*>(*i) == 0) {
2003                                 continue;
2004                         }
2005                         
2006                 } else {
2007                         
2008                         /* don't mess with tracks */
2009                         
2010                         if (dynamic_cast<AudioTrack*>(*i) != 0) {
2011                                 continue;
2012                         }
2013                 }
2014                 
2015                 if ((*i) != route &&
2016                     ((*i)->mix_group () == 0 ||
2017                      (*i)->mix_group () != route->mix_group () ||
2018                      !route->mix_group ()->is_active())) {
2019                         
2020                         if ((*i)->soloed()) {
2021                                 
2022                                 /* if its already soloed, and solo latching is enabled,
2023                                    then leave it as it is.
2024                                 */
2025                                 
2026                                 if (_solo_latched) {
2027                                         continue;
2028                                 } 
2029                         }
2030                         
2031                         /* do it */
2032
2033                         solo_update_disabled = true;
2034                         (*i)->set_solo (false, src);
2035                         solo_update_disabled = false;
2036                 }
2037         }
2038         
2039         bool something_soloed = false;
2040         bool same_thing_soloed = false;
2041         bool signal = false;
2042
2043         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2044                 if ((*i)->soloed()) {
2045                         something_soloed = true;
2046                         if (dynamic_cast<AudioTrack*>(*i)) {
2047                                 if (is_track) {
2048                                         same_thing_soloed = true;
2049                                         break;
2050                                 }
2051                         } else {
2052                                 if (!is_track) {
2053                                         same_thing_soloed = true;
2054                                         break;
2055                                 }
2056                         }
2057                         break;
2058                 }
2059         }
2060         
2061         if (something_soloed != currently_soloing) {
2062                 signal = true;
2063                 currently_soloing = something_soloed;
2064         }
2065         
2066         modify_solo_mute (is_track, same_thing_soloed);
2067
2068         if (signal) {
2069                 SoloActive (currently_soloing);
2070         }
2071
2072         set_dirty();
2073 }
2074
2075 void
2076 Session::set_solo_latched (bool yn)
2077 {
2078         if (yn != _solo_latched) {
2079                 _solo_latched = yn;
2080                 set_dirty ();
2081                 ControlChanged (SoloLatch);
2082         }
2083 }
2084
2085 void
2086 Session::update_route_solo_state ()
2087 {
2088         bool mute = false;
2089         bool is_track = false;
2090         bool signal = false;
2091
2092         /* caller must hold RouteLock */
2093
2094         /* this is where we actually implement solo by changing
2095            the solo mute setting of each track.
2096         */
2097                 
2098         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2099                 if ((*i)->soloed()) {
2100                         mute = true;
2101                         if (dynamic_cast<AudioTrack*>(*i)) {
2102                                 is_track = true;
2103                         }
2104                         break;
2105                 }
2106         }
2107
2108         if (mute != currently_soloing) {
2109                 signal = true;
2110                 currently_soloing = mute;
2111         }
2112
2113         if (!is_track && !mute) {
2114
2115                 /* nothing is soloed */
2116
2117                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2118                         (*i)->set_solo_mute (false);
2119                 }
2120                 
2121                 if (signal) {
2122                         SoloActive (false);
2123                 }
2124
2125                 return;
2126         }
2127
2128         modify_solo_mute (is_track, mute);
2129
2130         if (signal) {
2131                 SoloActive (currently_soloing);
2132         }
2133 }
2134
2135 void
2136 Session::modify_solo_mute (bool is_track, bool mute)
2137 {
2138         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2139                 
2140                 if (is_track) {
2141                         
2142                         /* only alter track solo mute */
2143                         
2144                         if (dynamic_cast<AudioTrack*>(*i)) {
2145                                 if ((*i)->soloed()) {
2146                                         (*i)->set_solo_mute (!mute);
2147                                 } else {
2148                                         (*i)->set_solo_mute (mute);
2149                                 }
2150                         }
2151
2152                 } else {
2153
2154                         /* only alter bus solo mute */
2155
2156                         if (!dynamic_cast<AudioTrack*>(*i)) {
2157
2158                                 if ((*i)->soloed()) {
2159
2160                                         (*i)->set_solo_mute (false);
2161
2162                                 } else {
2163
2164                                         /* don't mute master or control outs
2165                                            in response to another bus solo
2166                                         */
2167                                         
2168                                         if ((*i) != _master_out &&
2169                                             (*i) != _control_out) {
2170                                                 (*i)->set_solo_mute (mute);
2171                                         }
2172                                 }
2173                         }
2174
2175                 }
2176         }
2177 }       
2178
2179
2180 void
2181 Session::catch_up_on_solo ()
2182 {
2183         /* this is called after set_state() to catch the full solo
2184            state, which can't be correctly determined on a per-route
2185            basis, but needs the global overview that only the session
2186            has.
2187         */
2188         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
2189         update_route_solo_state();
2190 }       
2191                 
2192 Route *
2193 Session::route_by_name (string name)
2194 {
2195         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
2196
2197         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2198                 if ((*i)->name() == name) {
2199                         return* i;
2200                 }
2201         }
2202
2203         return 0;
2204 }
2205
2206 void
2207 Session::find_current_end ()
2208 {
2209         jack_nframes_t max = 0;
2210         jack_nframes_t me; 
2211
2212         if (_state_of_the_state & Loading) {
2213                 return;
2214         }
2215
2216         /* Don't take the diskstream lock. Caller must have other ways to
2217            ensure atomicity.
2218         */
2219
2220         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2221                 Playlist* pl = (*i)->playlist();
2222                 if ((me = pl->get_maximum_extent()) > max) {
2223                         max = me;
2224                 }
2225         }
2226         
2227         if (max > end_location->end()) {
2228                 end_location->set_end (max);
2229                 set_dirty();
2230                 DurationChanged(); /* EMIT SIGNAL */
2231         }
2232 }
2233
2234 DiskStream *
2235 Session::diskstream_by_name (string name)
2236 {
2237         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2238
2239         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2240                 if ((*i)->name() == name) {
2241                         return* i;
2242                 }
2243         }
2244
2245         return 0;
2246 }
2247
2248 DiskStream *
2249 Session::diskstream_by_id (id_t id)
2250 {
2251         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2252
2253         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2254                 if ((*i)->id() == id) {
2255                         return *i;
2256                 }
2257         }
2258
2259         return 0;
2260 }
2261
2262 /* AudioRegion management */
2263
2264 string
2265 Session::new_region_name (string old)
2266 {
2267         string::size_type last_period;
2268         uint32_t number;
2269         string::size_type len = old.length() + 64;
2270         char buf[len];
2271
2272         if ((last_period = old.find_last_of ('.')) == string::npos) {
2273                 
2274                 /* no period present - add one explicitly */
2275
2276                 old += '.';
2277                 last_period = old.length() - 1;
2278                 number = 0;
2279
2280         } else {
2281
2282                 number = atoi (old.substr (last_period+1).c_str());
2283
2284         }
2285
2286         while (number < (UINT_MAX-1)) {
2287
2288                 AudioRegionList::const_iterator i;
2289                 string sbuf;
2290
2291                 number++;
2292
2293                 snprintf (buf, len, "%s%" PRIu32, old.substr (0, last_period + 1).c_str(), number);
2294                 sbuf = buf;
2295
2296                 for (i = audio_regions.begin(); i != audio_regions.end(); ++i) {
2297                         if ((*i).second->name() == sbuf) {
2298                                 break;
2299                         }
2300                 }
2301                 
2302                 if (i == audio_regions.end()) {
2303                         break;
2304                 }
2305         }
2306
2307         if (number != (UINT_MAX-1)) {
2308                 return buf;
2309         } 
2310
2311         error << string_compose (_("cannot create new name for region \"%1\""), old) << endmsg;
2312         return old;
2313 }
2314
2315 int
2316 Session::region_name (string& result, string base, bool newlevel) const
2317 {
2318         char buf[16];
2319         string subbase;
2320
2321         if (base == "") {
2322                 
2323                 LockMonitor lm (region_lock, __LINE__, __FILE__);
2324
2325                 snprintf (buf, sizeof (buf), "%d", (int)audio_regions.size() + 1);
2326
2327                 
2328                 result = "region.";
2329                 result += buf;
2330
2331         } else {
2332
2333                 /* XXX this is going to be slow. optimize me later */
2334                 
2335                 if (newlevel) {
2336                         subbase = base;
2337                 } else {
2338                         string::size_type pos;
2339
2340                         if ((pos = base.find_last_of ('-')) == string::npos) {
2341                                 pos = base.find_last_of ('.');
2342                         }
2343
2344                         /* pos may be npos, but then we just use entire base */
2345
2346                         subbase = base.substr (0, pos);
2347                 }
2348                 
2349                 bool name_taken = true;
2350                 
2351                 {
2352                         LockMonitor lm (region_lock, __LINE__, __FILE__);
2353                         
2354                         for (int n = 1; n < 5000; ++n) {
2355                                 
2356                                 result = subbase;
2357                                 snprintf (buf, sizeof (buf), ".%d", n);
2358                                 result += buf;
2359                                 
2360                                 name_taken = false;
2361                                 
2362                                 for (AudioRegionList::const_iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) {
2363                                         if ((*i).second->name() == result) {
2364                                                 name_taken = true;
2365                                                 break;
2366                                         }
2367                                 }
2368                                 
2369                                 if (!name_taken) {
2370                                         break;
2371                                 }
2372                         }
2373                 }
2374                         
2375                 if (name_taken) {
2376                         fatal << string_compose(_("too many regions with names like %1"), base) << endmsg;
2377                         /*NOTREACHED*/
2378                 }
2379         }
2380
2381         return 0;
2382 }       
2383
2384 void
2385 Session::add_region (Region* region)
2386 {
2387         AudioRegion* ar = 0;
2388         AudioRegion* oar = 0;
2389         bool added = false;
2390
2391         { 
2392                 LockMonitor lm (region_lock, __LINE__, __FILE__);
2393
2394                 if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) {
2395
2396                         AudioRegionList::iterator x;
2397
2398                         for (x = audio_regions.begin(); x != audio_regions.end(); ++x) {
2399
2400                                 oar = dynamic_cast<AudioRegion*> (x->second);
2401
2402                                 if (ar->region_list_equivalent (*oar)) {
2403                                         break;
2404                                 }
2405                         }
2406
2407                         if (x == audio_regions.end()) {
2408
2409                                 pair<AudioRegionList::key_type, AudioRegionList::mapped_type> entry;
2410         
2411                                 entry.first = region->id();
2412                                 entry.second = ar;
2413
2414                                 pair<AudioRegionList::iterator,bool> x = audio_regions.insert (entry);
2415                                 
2416                                 if (!x.second) {
2417                                         return;
2418                                 }
2419
2420                                 added = true;
2421                         } 
2422
2423                 } else {
2424
2425                         fatal << _("programming error: ")
2426                               << X_("unknown region type passed to Session::add_region()")
2427                               << endmsg;
2428                         /*NOTREACHED*/
2429
2430                 }
2431         }
2432
2433         /* mark dirty because something has changed even if we didn't
2434            add the region to the region list.
2435         */
2436         
2437         set_dirty();
2438         
2439         if (added) {
2440                 region->GoingAway.connect (mem_fun (*this, &Session::remove_region));
2441                 region->StateChanged.connect (sigc::bind (mem_fun (*this, &Session::region_changed), region));
2442                 AudioRegionAdded (ar); /* EMIT SIGNAL */
2443         }
2444 }
2445
2446 void
2447 Session::region_changed (Change what_changed, Region* region)
2448 {
2449         if (what_changed & Region::HiddenChanged) {
2450                 /* relay hidden changes */
2451                 RegionHiddenChange (region);
2452         }
2453 }
2454
2455 void
2456 Session::region_renamed (Region* region)
2457 {
2458         add_region (region);
2459 }
2460
2461 void
2462 Session::remove_region (Region* region)
2463 {
2464         AudioRegionList::iterator i;
2465         AudioRegion* ar = 0;
2466         bool removed = false;
2467
2468         { 
2469                 LockMonitor lm (region_lock, __LINE__, __FILE__);
2470
2471                 if ((ar = dynamic_cast<AudioRegion*> (region)) != 0) {
2472                         if ((i = audio_regions.find (region->id())) != audio_regions.end()) {
2473                                 audio_regions.erase (i);
2474                                 removed = true;
2475                         } 
2476                 } else {
2477                         fatal << _("programming error: ") 
2478                               << X_("unknown region type passed to Session::remove_region()")
2479                               << endmsg;
2480                         /*NOTREACHED*/
2481                 }
2482         }
2483
2484         /* mark dirty because something has changed even if we didn't
2485            remove the region from the region list.
2486         */
2487
2488         set_dirty();
2489
2490         if (removed) {
2491                  AudioRegionRemoved(ar); /* EMIT SIGNAL */
2492         }
2493 }
2494
2495 AudioRegion*
2496 Session::find_whole_file_parent (AudioRegion& child)
2497 {
2498         AudioRegionList::iterator i;
2499         AudioRegion* region;
2500         LockMonitor lm (region_lock, __LINE__, __FILE__);
2501
2502         for (i = audio_regions.begin(); i != audio_regions.end(); ++i) {
2503
2504                 region = (*i).second;
2505
2506                 if (region->whole_file()) {
2507
2508                         if (child.source_equivalent (*region)) {
2509                                 return region;
2510                         }
2511                 }
2512         } 
2513
2514         return 0;
2515 }       
2516
2517 void
2518 Session::find_equivalent_playlist_regions (AudioRegion& region, vector<AudioRegion*>& result)
2519 {
2520         for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
2521
2522                 AudioPlaylist* pl;
2523
2524                 if ((pl = dynamic_cast<AudioPlaylist*>(*i)) == 0) {
2525                         continue;
2526                 }
2527
2528                 pl->get_region_list_equivalent_regions (region, result);
2529         }
2530 }
2531
2532 int
2533 Session::destroy_region (Region* region)
2534 {
2535         AudioRegion* aregion;
2536
2537         if ((aregion = dynamic_cast<AudioRegion*> (region)) == 0) {
2538                 return 0;
2539         }
2540
2541         if (aregion->playlist()) {
2542                 aregion->playlist()->destroy_region (region);
2543         }
2544
2545         vector<Source*> srcs;
2546         
2547         for (uint32_t n = 0; n < aregion->n_channels(); ++n) {
2548                 srcs.push_back (&aregion->source (n));
2549         }
2550
2551         for (vector<Source*>::iterator i = srcs.begin(); i != srcs.end(); ++i) {
2552                 
2553                 if ((*i)->use_cnt() == 0) {
2554                         (*i)->mark_for_remove ();
2555                         delete *i;
2556                 }
2557         }
2558
2559         return 0;
2560 }
2561
2562 int
2563 Session::destroy_regions (list<Region*> regions)
2564 {
2565         for (list<Region*>::iterator i = regions.begin(); i != regions.end(); ++i) {
2566                 destroy_region (*i);
2567         }
2568         return 0;
2569 }
2570
2571 int
2572 Session::remove_last_capture ()
2573 {
2574         list<Region*> r;
2575
2576         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
2577         
2578         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
2579                 list<Region*>& l = (*i)->last_capture_regions();
2580                 
2581                 if (!l.empty()) {
2582                         r.insert (r.end(), l.begin(), l.end());
2583                         l.clear ();
2584                 }
2585         }
2586
2587         destroy_regions (r);
2588         return 0;
2589 }
2590
2591 int
2592 Session::remove_region_from_region_list (Region& r)
2593 {
2594         remove_region (&r);
2595         return 0;
2596 }
2597
2598 /* Source Management */
2599
2600 void
2601 Session::add_source (Source* source)
2602 {
2603         pair<SourceList::key_type, SourceList::mapped_type> entry;
2604         
2605         {
2606                 LockMonitor lm (source_lock, __LINE__, __FILE__);
2607                 entry.first = source->id();
2608                 entry.second = source;
2609                 sources.insert (entry);
2610         }
2611         
2612         source->GoingAway.connect (mem_fun (this, &Session::remove_source));
2613         set_dirty();
2614         
2615         SourceAdded (source); /* EMIT SIGNAL */
2616 }
2617
2618 void
2619 Session::remove_source (Source* source)
2620 {
2621         SourceList::iterator i;
2622
2623         { 
2624                 LockMonitor lm (source_lock, __LINE__, __FILE__);
2625
2626                 if ((i = sources.find (source->id())) != sources.end()) {
2627                         sources.erase (i);
2628                 }
2629         }
2630
2631         if (!_state_of_the_state & InCleanup) {
2632
2633                 /* save state so we don't end up with a session file
2634                    referring to non-existent sources.
2635                 */
2636                 
2637                 save_state (_current_snapshot_name);
2638         }
2639
2640         SourceRemoved(source); /* EMIT SIGNAL */
2641 }
2642
2643 Source *
2644 Session::get_source (ARDOUR::id_t id)
2645 {
2646         LockMonitor lm (source_lock, __LINE__, __FILE__);
2647         SourceList::iterator i;
2648         Source* source = 0;
2649
2650         if ((i = sources.find (id)) != sources.end()) {
2651                 source = (*i).second;
2652         }
2653
2654         return source;
2655 }
2656
2657 FileSource *
2658 Session::create_file_source (DiskStream& ds, int32_t chan, bool destructive)
2659 {
2660         string spath;
2661         uint32_t cnt;
2662         char buf[PATH_MAX+1];
2663         const uint32_t limit = 10000;
2664         string legalized;
2665
2666         buf[0] = '\0';
2667         legalized = legalize_for_path (ds.name());
2668
2669         /* find a "version" of the file name that doesn't exist in
2670            any of the possible directories.
2671         */
2672         
2673         for (cnt = 1; cnt <= limit; ++cnt) {
2674
2675                 vector<space_and_path>::iterator i;
2676                 uint32_t existing = 0;
2677
2678                 for (i = session_dirs.begin(); i != session_dirs.end(); ++i) {
2679
2680                         spath = (*i).path;
2681
2682                         if (destructive) {
2683                                 spath += tape_dir_name;
2684                         } else {
2685                                 spath += sound_dir_name;
2686                         }
2687                         spath += '/';
2688                         spath += legalized;
2689
2690                         if (ds.n_channels() < 2) {
2691                                 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2692                         } else if (ds.n_channels() == 2) {
2693                                 if (chan == 0) {
2694                                         snprintf (buf, sizeof(buf), "%s-%u%%L.wav", spath.c_str(), cnt);
2695                                 } else {
2696                                         snprintf (buf, sizeof(buf), "%s-%u%%R.wav", spath.c_str(), cnt);
2697                                 }
2698                         } else if (ds.n_channels() < 26) {
2699                                 snprintf (buf, sizeof(buf), "%s-%u%%%c.wav", spath.c_str(), cnt, 'a' + chan);
2700                         } else {
2701                                 snprintf (buf, sizeof(buf), "%s-%u.wav", spath.c_str(), cnt);
2702                         }
2703
2704                         if (access (buf, F_OK) == 0) {
2705                                 existing++;
2706                         }
2707                 }
2708
2709                 if (existing == 0) {
2710                         break;
2711                 }
2712         }
2713
2714         if (cnt > limit) {
2715                 error << string_compose(_("There are already %1 recordings for %2, which I consider too many."), limit, ds.name()) << endmsg;
2716                 throw failed_constructor();
2717         }
2718
2719         /* we now have a unique name for the file, but figure out where to
2720            actually put it.
2721         */
2722
2723         string foo = buf;
2724
2725         spath = discover_best_sound_dir ();
2726
2727         string::size_type pos = foo.find_last_of ('/');
2728         
2729         if (pos == string::npos) {
2730                 spath += foo;
2731         } else {
2732                 spath += foo.substr (pos + 1);
2733         }
2734
2735         /* this might throw failed_constructor(), which is OK */
2736
2737         if (destructive) {
2738                 return new DestructiveFileSource (spath, frame_rate());
2739         } else {
2740                 return new FileSource (spath, frame_rate());
2741         }
2742 }
2743
2744 /* Playlist management */
2745
2746 Playlist *
2747 Session::get_playlist (string name)
2748 {
2749         Playlist* ret = 0;
2750
2751         if ((ret = playlist_by_name (name)) == 0) {
2752                 ret = new AudioPlaylist (*this, name);
2753         }
2754
2755         return ret;
2756 }
2757
2758 Playlist *
2759 Session::playlist_by_name (string name)
2760 {
2761         LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2762         for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
2763                 if ((*i)->name() == name) {
2764                         return* i;
2765                 }
2766         }
2767         for (PlaylistList::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
2768                 if ((*i)->name() == name) {
2769                         return* i;
2770                 }
2771         }
2772         return 0;
2773 }
2774
2775 void
2776 Session::add_playlist (Playlist* playlist)
2777 {
2778         if (playlist->hidden()) {
2779                 return;
2780         }
2781
2782         { 
2783                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2784                 if (find (playlists.begin(), playlists.end(), playlist) == playlists.end()) {
2785                         playlists.insert (playlists.begin(), playlist);
2786                         // playlist->ref();
2787                         playlist->InUse.connect (mem_fun (*this, &Session::track_playlist));
2788                         playlist->GoingAway.connect (mem_fun (*this, &Session::remove_playlist));
2789                 }
2790         }
2791
2792         set_dirty();
2793
2794         PlaylistAdded (playlist); /* EMIT SIGNAL */
2795 }
2796
2797 void
2798 Session::track_playlist (Playlist* pl, bool inuse)
2799 {
2800         PlaylistList::iterator x;
2801
2802         { 
2803                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2804
2805                 if (!inuse) {
2806                         //cerr << "shifting playlist to unused: " << pl->name() << endl;
2807
2808                         unused_playlists.insert (pl);
2809                         
2810                         if ((x = playlists.find (pl)) != playlists.end()) {
2811                                 playlists.erase (x);
2812                         }
2813
2814                         
2815                 } else {
2816                         //cerr << "shifting playlist to used: " << pl->name() << endl;
2817                         
2818                         playlists.insert (pl);
2819                         
2820                         if ((x = unused_playlists.find (pl)) != unused_playlists.end()) {
2821                                 unused_playlists.erase (x);
2822                         }
2823                 }
2824         }
2825 }
2826
2827 void
2828 Session::remove_playlist (Playlist* playlist)
2829 {
2830         if (_state_of_the_state & Deletion) {
2831                 return;
2832         }
2833
2834         { 
2835                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
2836                 // cerr << "removing playlist: " << playlist->name() << endl;
2837
2838                 PlaylistList::iterator i;
2839
2840                 i = find (playlists.begin(), playlists.end(), playlist);
2841
2842                 if (i != playlists.end()) {
2843                         playlists.erase (i);
2844                 }
2845
2846                 i = find (unused_playlists.begin(), unused_playlists.end(), playlist);
2847                 if (i != unused_playlists.end()) {
2848                         unused_playlists.erase (i);
2849                 }
2850                 
2851         }
2852
2853         set_dirty();
2854
2855         PlaylistRemoved (playlist); /* EMIT SIGNAL */
2856 }
2857
2858 void 
2859 Session::set_audition (AudioRegion* r)
2860 {
2861         pending_audition_region = r;
2862         post_transport_work = PostTransportWork (post_transport_work | PostTransportAudition);
2863         schedule_butler_transport_work ();
2864 }
2865
2866 void
2867 Session::non_realtime_set_audition ()
2868 {
2869         if (pending_audition_region == (AudioRegion*) 0xfeedface) {
2870                 auditioner->audition_current_playlist ();
2871         } else if (pending_audition_region) {
2872                 auditioner->audition_region (*pending_audition_region);
2873         }
2874         pending_audition_region = 0;
2875         AuditionActive (true); /* EMIT SIGNAL */
2876 }
2877
2878 void
2879 Session::audition_playlist ()
2880 {
2881         Event* ev = new Event (Event::Audition, Event::Add, Event::Immediate, 0, 0.0);
2882         ev->set_ptr ((void*) 0xfeedface);
2883         queue_event (ev);
2884 }
2885
2886 void
2887 Session::audition_region (AudioRegion& r)
2888 {
2889         Event* ev = new Event (Event::Audition, Event::Add, Event::Immediate, 0, 0.0);
2890         ev->set_ptr (&r);
2891         queue_event (ev);
2892 }
2893
2894 void
2895 Session::cancel_audition ()
2896 {
2897         if (auditioner->active()) {
2898                 auditioner->cancel_audition ();
2899                  AuditionActive (false); /* EMIT SIGNAL */
2900         }
2901 }
2902
2903 bool
2904 Session::RoutePublicOrderSorter::operator() (Route* a, Route* b)
2905 {
2906         return a->order_key(N_("signal")) < b->order_key(N_("signal"));
2907 }
2908
2909 void
2910 Session::remove_empty_sounds ()
2911 {
2912
2913         PathScanner scanner;
2914         string dir;
2915
2916         dir = sound_dir ();
2917
2918         vector<string *>* possible_audiofiles = scanner (dir, "\\.wav$", false, true);
2919         
2920         for (vector<string *>::iterator i = possible_audiofiles->begin(); i != possible_audiofiles->end(); ++i) {
2921
2922                 if (FileSource::is_empty (*(*i))) {
2923
2924                         unlink ((*i)->c_str());
2925                         
2926                         string peak_path = peak_path_from_audio_path (**i);
2927                         unlink (peak_path.c_str());
2928                 }
2929
2930                 delete* i;
2931         }
2932
2933         delete possible_audiofiles;
2934 }
2935
2936 bool
2937 Session::is_auditioning () const
2938 {
2939         /* can be called before we have an auditioner object */
2940         if (auditioner) {
2941                 return auditioner->active();
2942         } else {
2943                 return false;
2944         }
2945 }
2946
2947
2948 string
2949 Session::peak_path_from_audio_path (string audio_path)
2950 {
2951         /* XXX hardly bombproof! fix me */
2952
2953         string res;
2954
2955         res = PBD::dirname (audio_path);
2956         res = PBD::dirname (res);
2957         res += '/';
2958         res += peak_dir_name;
2959         res += '/';
2960         res += PBD::basename_nosuffix (audio_path);
2961         res += ".peak";
2962
2963         return res;
2964 }
2965
2966 string
2967 Session::old_peak_path_from_audio_path (string audio_path)
2968 {
2969         /* This is a hangover from when audio and peak files
2970            lived in the same directory. We need it to to 
2971            be able to open old sessions.
2972         */
2973
2974         /* XXX hardly bombproof! fix me */
2975
2976         string res = audio_path.substr (0, audio_path.find_last_of ('.'));
2977         res += ".peak";
2978         return res;
2979 }
2980
2981 void
2982 Session::set_all_solo (bool yn)
2983 {
2984         {
2985                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
2986                 
2987                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
2988                         if (!(*i)->hidden()) {
2989                                 (*i)->set_solo (yn, this);
2990                         }
2991                 }
2992         }
2993
2994         set_dirty();
2995 }
2996                 
2997 void
2998 Session::set_all_mute (bool yn)
2999 {
3000         {
3001                 RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3002                 
3003                 for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
3004                         if (!(*i)->hidden()) {
3005                                 (*i)->set_mute (yn, this);
3006                         }
3007                 }
3008         }
3009
3010         set_dirty();
3011 }
3012                 
3013 uint32_t
3014 Session::n_diskstreams () const
3015 {
3016         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
3017         uint32_t n = 0;
3018
3019         for (DiskStreamList::const_iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
3020                 if (!(*i)->hidden()) {
3021                         n++;
3022                 }
3023         }
3024         return n;
3025 }
3026
3027 void 
3028 Session::foreach_diskstream (void (DiskStream::*func)(void)) 
3029 {
3030         RWLockMonitor lm (diskstream_lock, false, __LINE__, __FILE__);
3031         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
3032                 if (!(*i)->hidden()) {
3033                         ((*i)->*func)();
3034                 }
3035         }
3036 }
3037
3038 void
3039 Session::graph_reordered ()
3040 {
3041         /* don't do this stuff if we are setting up connections
3042            from a set_state() call.
3043         */
3044
3045         if (_state_of_the_state & InitialConnecting) {
3046                 return;
3047         }
3048
3049         RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__);
3050         RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__);
3051
3052         resort_routes (0);
3053
3054         /* force all diskstreams to update their capture offset values to 
3055            reflect any changes in latencies within the graph.
3056         */
3057         
3058         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
3059                 (*i)->set_capture_offset ();
3060         }
3061 }
3062
3063 void
3064 Session::record_disenable_all ()
3065 {
3066         record_enable_change_all (false);
3067 }
3068
3069 void
3070 Session::record_enable_all ()
3071 {
3072         record_enable_change_all (true);
3073 }
3074
3075 void
3076 Session::record_enable_change_all (bool yn)
3077 {
3078         RWLockMonitor lm1 (route_lock, false, __LINE__, __FILE__);
3079         
3080         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
3081                 AudioTrack* at;
3082
3083                 if ((at = dynamic_cast<AudioTrack*>(*i)) != 0) {
3084                         at->set_record_enable (yn, this);
3085                 }
3086         }
3087         
3088         /* since we don't keep rec-enable state, don't mark session dirty */
3089 }
3090
3091 void
3092 Session::add_redirect (Redirect* redirect)
3093 {
3094         Send* send;
3095         Insert* insert;
3096         PortInsert* port_insert;
3097         PluginInsert* plugin_insert;
3098
3099         if ((insert = dynamic_cast<Insert *> (redirect)) != 0) {
3100                 if ((port_insert = dynamic_cast<PortInsert *> (insert)) != 0) {
3101                         _port_inserts.insert (_port_inserts.begin(), port_insert);
3102                 } else if ((plugin_insert = dynamic_cast<PluginInsert *> (insert)) != 0) {
3103                         _plugin_inserts.insert (_plugin_inserts.begin(), plugin_insert);
3104                 } else {
3105                         fatal << _("programming error: unknown type of Insert created!") << endmsg;
3106                         /*NOTREACHED*/
3107                 }
3108         } else if ((send = dynamic_cast<Send *> (redirect)) != 0) {
3109                 _sends.insert (_sends.begin(), send);
3110         } else {
3111                 fatal << _("programming error: unknown type of Redirect created!") << endmsg;
3112                 /*NOTREACHED*/
3113         }
3114
3115         redirect->GoingAway.connect (mem_fun (*this, &Session::remove_redirect));
3116
3117         set_dirty();
3118 }
3119
3120 void
3121 Session::remove_redirect (Redirect* redirect)
3122 {
3123         Send* send;
3124         Insert* insert;
3125         PortInsert* port_insert;
3126         PluginInsert* plugin_insert;
3127
3128         if ((insert = dynamic_cast<Insert *> (redirect)) != 0) {
3129                 if ((port_insert = dynamic_cast<PortInsert *> (insert)) != 0) {
3130                         _port_inserts.remove (port_insert);
3131                 } else if ((plugin_insert = dynamic_cast<PluginInsert *> (insert)) != 0) {
3132                         _plugin_inserts.remove (plugin_insert);
3133                 } else {
3134                         fatal << _("programming error: unknown type of Insert deleted!") << endmsg;
3135                         /*NOTREACHED*/
3136                 }
3137         } else if ((send = dynamic_cast<Send *> (redirect)) != 0) {
3138                 _sends.remove (send);
3139         } else {
3140                 fatal << _("programming error: unknown type of Redirect deleted!") << endmsg;
3141                 /*NOTREACHED*/
3142         }
3143
3144         set_dirty();
3145 }
3146
3147 jack_nframes_t
3148 Session::available_capture_duration ()
3149 {
3150         const double scale = 4096.0 / sizeof (Sample);
3151         
3152         if (_total_free_4k_blocks * scale > (double) max_frames) {
3153                 return max_frames;
3154         }
3155         
3156         return (jack_nframes_t) floor (_total_free_4k_blocks * scale);
3157 }
3158
3159 void
3160 Session::add_connection (ARDOUR::Connection* connection)
3161 {
3162         {
3163                 LockMonitor (connection_lock, __LINE__, __FILE__);
3164                 _connections.push_back (connection);
3165         }
3166         
3167         ConnectionAdded (connection); /* EMIT SIGNAL */
3168
3169         set_dirty();
3170 }
3171
3172 void
3173 Session::remove_connection (ARDOUR::Connection* connection)
3174 {
3175         bool removed = false;
3176
3177         {
3178                 LockMonitor (connection_lock, __LINE__, __FILE__);
3179                 ConnectionList::iterator i = find (_connections.begin(), _connections.end(), connection);
3180                 
3181                 if (i != _connections.end()) {
3182                         _connections.erase (i);
3183                         removed = true;
3184                 }
3185         }
3186
3187         if (removed) {
3188                  ConnectionRemoved (connection); /* EMIT SIGNAL */
3189         }
3190
3191         set_dirty();
3192 }
3193
3194 ARDOUR::Connection *
3195 Session::connection_by_name (string name) const
3196 {
3197         LockMonitor lm (connection_lock, __LINE__, __FILE__);
3198
3199         for (ConnectionList::const_iterator i = _connections.begin(); i != _connections.end(); ++i) {
3200                 if ((*i)->name() == name) {
3201                         return* i;
3202                 }
3203         }
3204
3205         return 0;
3206 }
3207
3208 void
3209 Session::set_edit_mode (EditMode mode)
3210 {
3211         _edit_mode = mode;
3212         
3213         { 
3214                 LockMonitor lm (playlist_lock, __LINE__, __FILE__);
3215                 
3216                 for (PlaylistList::iterator i = playlists.begin(); i != playlists.end(); ++i) {
3217                         (*i)->set_edit_mode (mode);
3218                 }
3219         }
3220
3221         set_dirty ();
3222         ControlChanged (EditingMode); /* EMIT SIGNAL */
3223 }
3224
3225 void
3226 Session::tempo_map_changed (Change ignored)
3227 {
3228         clear_clicks ();
3229         set_dirty ();
3230 }
3231
3232 void
3233 Session::ensure_passthru_buffers (uint32_t howmany)
3234 {
3235         while (howmany > _passthru_buffers.size()) {
3236                 Sample *p;
3237 #ifdef NO_POSIX_MEMALIGN
3238                 p =  (Sample *) malloc(current_block_size * sizeof(Sample));
3239 #else
3240                 posix_memalign((void **)&p,16,current_block_size * 4);
3241 #endif                  
3242                 _passthru_buffers.push_back (p);
3243
3244                 *p = 0;
3245                 
3246 #ifdef NO_POSIX_MEMALIGN
3247                 p =  (Sample *) malloc(current_block_size * sizeof(Sample));
3248 #else
3249                 posix_memalign((void **)&p,16,current_block_size * 4);
3250 #endif                  
3251                 memset (p, 0, sizeof (Sample) * current_block_size);
3252                 _silent_buffers.push_back (p);
3253
3254                 *p = 0;
3255                 
3256 #ifdef NO_POSIX_MEMALIGN
3257                 p =  (Sample *) malloc(current_block_size * sizeof(Sample));
3258 #else
3259                 posix_memalign((void **)&p,16,current_block_size * 4);
3260 #endif                  
3261                 memset (p, 0, sizeof (Sample) * current_block_size);
3262                 _send_buffers.push_back (p);
3263                 
3264         }
3265         allocate_pan_automation_buffers (current_block_size, howmany, false);
3266 }
3267
3268 string
3269 Session::next_send_name ()
3270 {
3271         char buf[32];
3272         snprintf (buf, sizeof (buf), "send %" PRIu32, ++send_cnt);
3273         return buf;
3274 }
3275
3276 string
3277 Session::next_insert_name ()
3278 {
3279         char buf[32];
3280         snprintf (buf, sizeof (buf), "insert %" PRIu32, ++insert_cnt);
3281         return buf;
3282 }
3283
3284 /* Named Selection management */
3285
3286 NamedSelection *
3287 Session::named_selection_by_name (string name)
3288 {
3289         LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
3290         for (NamedSelectionList::iterator i = named_selections.begin(); i != named_selections.end(); ++i) {
3291                 if ((*i)->name == name) {
3292                         return* i;
3293                 }
3294         }
3295         return 0;
3296 }
3297
3298 void
3299 Session::add_named_selection (NamedSelection* named_selection)
3300 {
3301         { 
3302                 LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
3303                 named_selections.insert (named_selections.begin(), named_selection);
3304         }
3305
3306         set_dirty();
3307
3308          NamedSelectionAdded (); /* EMIT SIGNAL */
3309 }
3310
3311 void
3312 Session::remove_named_selection (NamedSelection* named_selection)
3313 {
3314         bool removed = false;
3315
3316         { 
3317                 LockMonitor lm (named_selection_lock, __LINE__, __FILE__);
3318
3319                 NamedSelectionList::iterator i = find (named_selections.begin(), named_selections.end(), named_selection);
3320
3321                 if (i != named_selections.end()) {
3322                         delete (*i);
3323                         named_selections.erase (i);
3324                         set_dirty();
3325                         removed = true;
3326                 }
3327         }
3328
3329         if (removed) {
3330                  NamedSelectionRemoved (); /* EMIT SIGNAL */
3331         }
3332 }
3333
3334 void
3335 Session::reset_native_file_format ()
3336 {
3337         // jlc - WHY take routelock?
3338         //RWLockMonitor lm1 (route_lock, true, __LINE__, __FILE__);
3339         RWLockMonitor lm2 (diskstream_lock, false, __LINE__, __FILE__);
3340
3341         for (DiskStreamList::iterator i = diskstreams.begin(); i != diskstreams.end(); ++i) {
3342                 (*i)->reset_write_sources (false);
3343         }
3344 }
3345
3346 bool
3347 Session::route_name_unique (string n) const
3348 {
3349         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3350         
3351         for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
3352                 if ((*i)->name() == n) {
3353                         return false;
3354                 }
3355         }
3356         
3357         return true;
3358 }
3359
3360 int
3361 Session::remove_file_source (FileSource& fs)
3362 {
3363         return fs.move_to_trash (dead_sound_dir_name);
3364 }
3365
3366 uint32_t
3367 Session::n_playlists () const
3368 {
3369         LockMonitor lm (playlist_lock, __LINE__, __FILE__);
3370         return playlists.size();
3371 }
3372
3373 void
3374 Session::set_solo_model (SoloModel sm)
3375 {
3376         if (sm != _solo_model) {
3377                 _solo_model = sm;
3378                 ControlChanged (SoloingModel);
3379                 set_dirty ();
3380         }
3381 }
3382
3383 void
3384 Session::allocate_pan_automation_buffers (jack_nframes_t nframes, uint32_t howmany, bool force)
3385 {
3386         if (!force && howmany <= _npan_buffers) {
3387                 return;
3388         }
3389
3390         if (_pan_automation_buffer) {
3391
3392                 for (uint32_t i = 0; i < _npan_buffers; ++i) {
3393                         delete [] _pan_automation_buffer[i];
3394                 }
3395
3396                 delete [] _pan_automation_buffer;
3397         }
3398
3399         _pan_automation_buffer = new pan_t*[howmany];
3400         
3401         for (uint32_t i = 0; i < howmany; ++i) {
3402                 _pan_automation_buffer[i] = new pan_t[nframes];
3403         }
3404
3405         _npan_buffers = howmany;
3406 }
3407
3408 void 
3409 Session::add_instant_xml (XMLNode& node, const std::string& dir)
3410 {
3411         Stateful::add_instant_xml (node, dir);
3412         Config->add_instant_xml (node, get_user_ardour_path());
3413 }
3414
3415 int
3416 Session::freeze (InterThreadInfo& itt)
3417 {
3418         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3419
3420         for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) {
3421
3422                 AudioTrack *at;
3423
3424                 if ((at = dynamic_cast<AudioTrack*>(*i)) != 0) {
3425                         /* XXX this is wrong because itt.progress will keep returning to zero at the start
3426                            of every track.
3427                         */
3428                         at->freeze (itt);
3429                 }
3430         }
3431
3432         return 0;
3433 }
3434
3435 int
3436 Session::write_one_track (AudioTrack& track, jack_nframes_t start, jack_nframes_t len,  bool overwrite, vector<Source*>& srcs,
3437                           InterThreadInfo& itt)
3438 {
3439         int ret = -1;
3440         Playlist* playlist;
3441         FileSource* fsource;
3442         uint32_t x;
3443         char buf[PATH_MAX+1];
3444         string dir;
3445         uint32_t nchans;
3446         jack_nframes_t position;
3447         jack_nframes_t this_chunk;
3448         jack_nframes_t to_do;
3449         vector<Sample*> buffers;
3450         char *  workbuf = 0;
3451         const jack_nframes_t chunk_size = (256 * 1024)/4;
3452
3453         atomic_set (&processing_prohibited, 1);
3454         
3455         /* call tree *MUST* hold route_lock */
3456         
3457         if ((playlist = track.disk_stream().playlist()) == 0) {
3458                 goto out;
3459         }
3460
3461         /* external redirects will be a problem */
3462
3463         if (track.has_external_redirects()) {
3464                 goto out;
3465         }
3466
3467         nchans = track.disk_stream().n_channels();
3468         
3469         dir = discover_best_sound_dir ();
3470
3471         for (uint32_t chan_n=0; chan_n < nchans; ++chan_n) {
3472
3473                 for (x = 0; x < 99999; ++x) {
3474                         snprintf (buf, sizeof(buf), "%s/%s-%d-bounce-%" PRIu32 ".wav", dir.c_str(), playlist->name().c_str(), chan_n, x+1);
3475                         if (access (buf, F_OK) != 0) {
3476                                 break;
3477                         }
3478                 }
3479                 
3480                 if (x == 99999) {
3481                         error << string_compose (_("too many bounced versions of playlist \"%1\""), playlist->name()) << endmsg;
3482                         goto out;
3483                 }
3484                 
3485                 try {
3486                         fsource = new FileSource (buf, frame_rate());
3487                 }
3488                 
3489                 catch (failed_constructor& err) {
3490                         error << string_compose (_("cannot create new audio file \"%1\" for %2"), buf, track.name()) << endmsg;
3491                         goto out;
3492                 }
3493
3494                 srcs.push_back(fsource);
3495         }
3496
3497         /* XXX need to flush all redirects */
3498         
3499         position = start;
3500         to_do = len;
3501
3502         /* create a set of reasonably-sized buffers */
3503
3504         for (vector<Sample*>::iterator i = _passthru_buffers.begin(); i != _passthru_buffers.end(); ++i) {
3505                 Sample* b;
3506 #ifdef NO_POSIX_MEMALIGN
3507                 b =  (Sample *) malloc(chunk_size * sizeof(Sample));
3508 #else
3509                 posix_memalign((void **)&b,16,chunk_size * 4);
3510 #endif                  
3511                 buffers.push_back (b);
3512         }
3513
3514         workbuf = new char[chunk_size * 4];
3515         
3516         while (to_do && !itt.cancel) {
3517                 
3518                 this_chunk = min (to_do, chunk_size);
3519                 
3520                 if (track.export_stuff (buffers, workbuf, nchans, start, this_chunk)) {
3521                         goto out;
3522                 }
3523
3524                 uint32_t n = 0;
3525                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src, ++n) {
3526                         if ((*src)->write (buffers[n], this_chunk, workbuf) != this_chunk) {
3527                                 goto out;
3528                         }
3529                 }
3530                 
3531                 start += this_chunk;
3532                 to_do -= this_chunk;
3533                 
3534                 itt.progress = (float) (1.0 - ((double) to_do / len));
3535
3536         }
3537
3538         if (!itt.cancel) {
3539                 
3540                 time_t now;
3541                 struct tm* xnow;
3542                 time (&now);
3543                 xnow = localtime (&now);
3544                 
3545                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3546                         dynamic_cast<FileSource*>((*src))->update_header (position, *xnow, now);
3547                 }
3548                 
3549                 /* build peakfile for new source */
3550                 
3551                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3552                         dynamic_cast<FileSource*>(*src)->build_peaks ();
3553                 }
3554                 
3555                 ret = 0;
3556         }
3557                 
3558   out:
3559         if (ret) {
3560                 for (vector<Source*>::iterator src=srcs.begin(); src != srcs.end(); ++src) {
3561                         dynamic_cast<FileSource*>(*src)->mark_for_remove ();
3562                         delete *src;
3563                 }
3564         }
3565
3566         for (vector<Sample*>::iterator i = buffers.begin(); i != buffers.end(); ++i) {
3567                 free(*i);
3568         }
3569
3570         if (workbuf) {
3571                 delete [] workbuf;
3572         }
3573         
3574         atomic_set (&processing_prohibited, 0);
3575
3576         itt.done = true;
3577
3578         return ret;
3579 }
3580
3581 vector<Sample*>&
3582 Session::get_silent_buffers (uint32_t howmany)
3583 {
3584         for (uint32_t i = 0; i < howmany; ++i) {
3585                 memset (_silent_buffers[i], 0, sizeof (Sample) * current_block_size);
3586         }
3587         return _silent_buffers;
3588 }
3589
3590 uint32_t 
3591 Session::ntracks () const
3592 {
3593         uint32_t n = 0;
3594         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3595
3596         for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
3597                 if (dynamic_cast<AudioTrack*> (*i)) {
3598                         ++n;
3599                 }
3600         }
3601
3602         return n;
3603 }
3604
3605 uint32_t 
3606 Session::nbusses () const
3607 {
3608         uint32_t n = 0;
3609         RWLockMonitor lm (route_lock, false, __LINE__, __FILE__);
3610
3611         for (RouteList::const_iterator i = routes.begin(); i != routes.end(); ++i) {
3612                 if (dynamic_cast<AudioTrack*> (*i) == 0) {
3613                         ++n;
3614                 }
3615         }
3616
3617         return n;
3618 }
3619
3620 void
3621 Session::set_layer_model (LayerModel lm)
3622 {
3623         if (lm != layer_model) {
3624                 layer_model = lm;
3625                 set_dirty ();
3626                 ControlChanged (LayeringModel);
3627         }
3628 }
3629
3630 void
3631 Session::set_xfade_model (CrossfadeModel xm)
3632 {
3633         if (xm != xfade_model) {
3634                 xfade_model = xm;
3635                 set_dirty ();
3636                 ControlChanged (CrossfadingModel);
3637         }
3638 }
3639