ae4a64802fbdaa926aa841c292bf7ca5c437ff61
[ardour.git] / libs / ardour / ardour / session.h
1 /*
2     Copyright (C) 2000 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 #ifndef __ardour_session_h__
22 #define __ardour_session_h__
23
24
25 #include <string>
26 #include <list>
27 #include <map>
28 #include <vector>
29 #include <set>
30 #include <stack>
31
32 #include <boost/weak_ptr.hpp>
33 #include <boost/dynamic_bitset.hpp>
34
35 #include <stdint.h>
36
37 #include <sndfile.h>
38
39 #include <glibmm/thread.h>
40
41 #include <pbd/error.h>
42 #include <pbd/undo.h>
43 #include <pbd/pool.h>
44 #include <pbd/rcu.h>
45 #include <pbd/statefuldestructible.h>
46
47 #include <midi++/types.h>
48 #include <midi++/mmc.h>
49
50 #include <pbd/stateful.h> 
51 #include <pbd/destructible.h> 
52
53 #include <ardour/ardour.h>
54 #include <ardour/configuration.h>
55 #include <ardour/location.h>
56 #include <ardour/gain.h>
57 #include <ardour/io.h>
58
59 class XMLTree;
60 class XMLNode;
61 class AEffect;
62
63 namespace MIDI {
64         class Port;
65 }
66
67 namespace PBD {
68         class Controllable;
69 }
70
71 namespace ARDOUR {
72
73 class Port;
74 class AudioEngine;
75 class Slave;
76 class Diskstream;       
77 class AudioDiskstream;  
78 class Route;
79 class AuxInput;
80 class Source;
81 class AudioSource;
82 class AudioFileSource;
83 class Auditioner;
84 class Insert;
85 class Send;
86 class Redirect;
87 class PortInsert;
88 class PluginInsert;
89 class Connection;
90 class TempoMap;
91 class AudioTrack;
92 class NamedSelection;
93 class AudioRegion;
94 class Region;
95 class Playlist;
96 class VSTPlugin;
97 class ControlProtocolInfo;
98
99 struct AudioExportSpecification;
100 struct RouteGroup;
101
102 using std::vector;
103 using std::string;
104 using std::map;
105 using std::set;
106
107 class Session : public PBD::StatefulDestructible
108
109 {
110   private:
111         typedef std::pair<boost::weak_ptr<Route>,bool> RouteBooleanState;
112         typedef vector<RouteBooleanState> GlobalRouteBooleanState;
113         typedef std::pair<boost::weak_ptr<Route>,MeterPoint> RouteMeterState;
114         typedef vector<RouteMeterState> GlobalRouteMeterState;
115
116   public:
117         enum RecordState {
118                 Disabled = 0,
119                 Enabled = 1,
120                 Recording = 2
121         };
122
123         struct Event {
124             enum Type {
125                     SetTransportSpeed,
126                     SetDiskstreamSpeed,
127                     Locate,
128                     LocateRoll,
129                     SetLoop,
130                     PunchIn,
131                     PunchOut,
132                     RangeStop,
133                     RangeLocate,
134                     Overwrite,
135                     SetSlaveSource,
136                     Audition,
137                     InputConfigurationChange,
138                     SetAudioRange,
139                     SetPlayRange,
140                     
141                     /* only one of each of these events
142                        can be queued at any one time
143                     */
144
145                     StopOnce,
146                     AutoLoop
147             };
148
149             enum Action {
150                     Add,
151                     Remove,
152                     Replace,
153                     Clear
154             };
155
156             Type           type;
157             Action         action;
158             nframes_t action_frame;
159             nframes_t target_frame;
160             float          speed;
161
162             union {
163                         void*                ptr;
164                         bool                 yes_or_no;
165                         SlaveSource slave;
166             };
167
168             boost::shared_ptr<Region>   region;
169
170             list<AudioRange>     audio_range;
171             list<MusicRange>     music_range;
172
173             Event(Type t, Action a, nframes_t when, nframes_t where, float spd, bool yn = false)
174                     : type (t), 
175                       action (a),
176                       action_frame (when),
177                       target_frame (where),
178                       speed (spd),
179                       yes_or_no (yn) {}
180
181             void set_ptr (void* p) { 
182                     ptr = p;
183             }
184
185             bool before (const Event& other) const {
186                     return action_frame < other.action_frame;
187             }
188
189             bool after (const Event& other) const {
190                     return action_frame > other.action_frame;
191             }
192
193             static bool compare (const Event *e1, const Event *e2) {
194                     return e1->before (*e2);
195             }
196
197             void *operator new (size_t ignored) {
198                     return pool.alloc ();
199             }
200
201             void operator delete(void *ptr, size_t size) {
202                     pool.release (ptr);
203             }
204
205             static const nframes_t Immediate = 0;
206
207          private:
208             static MultiAllocSingleReleasePool pool;
209         };
210
211         /* creating from an XML file */
212
213         Session (AudioEngine&,
214                  string fullpath,
215                  string snapshot_name,
216                  string* mix_template = 0);
217
218         /* creating a new Session */
219
220         Session (AudioEngine&,
221                  string fullpath,
222                  string snapshot_name,
223                  AutoConnectOption input_auto_connect,
224                  AutoConnectOption output_auto_connect,
225                  uint32_t control_out_channels,
226                  uint32_t master_out_channels,
227                  uint32_t n_physical_in,
228                  uint32_t n_physical_out,
229                  nframes_t initial_length);
230         
231         virtual ~Session ();
232
233
234         static int find_session (string str, string& path, string& snapshot, bool& isnew);
235         
236         string path() const { return _path; }
237         string name() const { return _name; }
238         string snap_name() const { return _current_snapshot_name; }
239         string raid_path () const;
240
241         void set_snap_name ();
242
243         void set_dirty ();
244         void set_clean ();
245         bool dirty() const { return _state_of_the_state & Dirty; }
246         void set_deletion_in_progress ();
247         bool deletion_in_progress() const { return _state_of_the_state & Deletion; }
248         sigc::signal<void> DirtyChanged;
249
250         std::string sound_dir (bool with_path = true) const;
251         std::string peak_dir () const;
252         std::string dead_sound_dir () const;
253         std::string automation_dir () const;
254
255         string peak_path_from_audio_path (string) const;
256
257         static string suffixed_search_path (std::string suffix, bool data);
258         static string control_protocol_path ();
259         static string template_path ();
260         static string template_dir ();
261         static void get_template_list (list<string>&);
262         
263         static string change_audio_path_by_name (string oldpath, string oldname, string newname, bool destructive);
264         string audio_path_from_name (string, uint32_t nchans, uint32_t chan, bool destructive);
265
266         void process (nframes_t nframes);
267
268         vector<Sample*>& get_passthru_buffers() { return _passthru_buffers; }
269         vector<Sample*>& get_silent_buffers (uint32_t howmany);
270         vector<Sample*>& get_send_buffers () { return _send_buffers; }
271
272         void add_diskstream (boost::shared_ptr<Diskstream>);
273         boost::shared_ptr<Diskstream> diskstream_by_id (const PBD::ID& id);
274         boost::shared_ptr<Diskstream> diskstream_by_name (string name);
275
276         bool have_captured() const { return _have_captured; }
277
278         void refill_all_diskstream_buffers ();
279         uint32_t diskstream_buffer_size() const { return dstream_buffer_size; }
280         
281         uint32_t get_next_diskstream_id() const { return n_diskstreams(); }
282         uint32_t n_diskstreams() const;
283         
284         typedef std::list<boost::shared_ptr<Diskstream> > DiskstreamList;
285         typedef std::list<boost::shared_ptr<Route> >      RouteList; 
286
287         boost::shared_ptr<RouteList> get_routes() const {
288                 return routes.reader ();
289         }
290
291         uint32_t nroutes() const { return routes.reader()->size(); }
292         uint32_t ntracks () const;
293         uint32_t nbusses () const;
294
295         struct RoutePublicOrderSorter {
296             bool operator() (boost::shared_ptr<Route>, boost::shared_ptr<Route> b);
297         };
298         
299         template<class T> void foreach_route (T *obj, void (T::*func)(Route&));
300         template<class T> void foreach_route (T *obj, void (T::*func)(boost::shared_ptr<Route>));
301         template<class T, class A> void foreach_route (T *obj, void (T::*func)(Route&, A), A arg);
302
303         boost::shared_ptr<Route> route_by_name (string);
304         boost::shared_ptr<Route> route_by_id (PBD::ID);
305         boost::shared_ptr<Route> route_by_remote_id (uint32_t id);
306
307         bool route_name_unique (string) const;
308
309         bool get_record_enabled() const { 
310                 return (record_status () >= Enabled);
311         }
312
313         RecordState record_status() const {
314                 return (RecordState) g_atomic_int_get (&_record_status);
315         }
316
317         bool actively_recording () {
318                 return record_status() == Recording;
319         }
320
321         bool record_enabling_legal () const;
322         void maybe_enable_record ();
323         void disable_record (bool rt_context, bool force = false);
324         void step_back_from_record ();
325         
326         /* Proxy signal for region hidden changes */
327
328         sigc::signal<void,boost::shared_ptr<Region> > RegionHiddenChange;
329
330         /* Emitted when all i/o connections are complete */
331         
332         sigc::signal<void> IOConnectionsComplete;
333         
334         /* Record status signals */
335
336         sigc::signal<void> RecordStateChanged;
337
338         /* Transport mechanism signals */
339
340         sigc::signal<void> TransportStateChange; /* generic */
341         sigc::signal<void,nframes_t> PositionChanged; /* sent after any non-sequential motion */
342         sigc::signal<void> DurationChanged;
343         sigc::signal<void> HaltOnXrun;
344
345         sigc::signal<void,RouteList&> RouteAdded;
346
347         void request_roll ();
348         void request_bounded_roll (nframes_t start, nframes_t end);
349         void request_stop (bool abort = false);
350         void request_locate (nframes_t frame, bool with_roll = false);
351
352         void request_play_loop (bool yn);
353         bool get_play_loop () const { return play_loop; }
354
355         nframes_t  last_transport_start() const { return _last_roll_location; }
356         void goto_end ()   { request_locate (end_location->start(), false);}
357         void goto_start () { request_locate (start_location->start(), false); }
358         void set_session_start (nframes_t start) { start_location->set_start(start); }
359         void set_session_end (nframes_t end) { end_location->set_start(end); _end_location_is_free = false; }
360         void use_rf_shuttle_speed ();
361         void request_transport_speed (float speed);
362         void request_overwrite_buffer (Diskstream*);
363         void request_diskstream_speed (Diskstream&, float speed);
364         void request_input_change_handling ();
365
366         bool locate_pending() const { return static_cast<bool>(post_transport_work&PostTransportLocate); }
367         bool transport_locked () const;
368
369         int wipe ();
370
371         int remove_region_from_region_list (boost::shared_ptr<Region>);
372
373         nframes_t get_maximum_extent () const;
374         nframes_t current_end_frame() const { return end_location->start(); }
375         nframes_t current_start_frame() const { return start_location->start(); }
376         nframes_t frame_rate() const   { return _current_frame_rate; }
377         nframes_t frames_per_hour() const { return _frames_per_hour; }
378
379         double frames_per_smpte_frame() const { return _frames_per_smpte_frame; }
380         nframes_t smpte_frames_per_hour() const { return _smpte_frames_per_hour; }
381
382         float smpte_frames_per_second() const;
383         bool smpte_drop_frames() const;
384
385         /* Locations */
386
387         Locations *locations() { return &_locations; }
388
389         sigc::signal<void,Location*>    auto_loop_location_changed;
390         sigc::signal<void,Location*>    auto_punch_location_changed;
391         sigc::signal<void>              locations_modified;
392
393         void set_auto_punch_location (Location *);
394         void set_auto_loop_location (Location *);
395         int location_name(string& result, string base = string(""));
396
397         void reset_input_monitor_state ();
398
399         void add_event (nframes_t action_frame, Event::Type type, nframes_t target_frame = 0);
400         void remove_event (nframes_t frame, Event::Type type);
401         void clear_events (Event::Type type);
402
403         nframes_t get_block_size() const { return current_block_size; }
404         nframes_t worst_output_latency () const { return _worst_output_latency; }
405         nframes_t worst_input_latency () const { return _worst_input_latency; }
406         nframes_t worst_track_latency () const { return _worst_track_latency; }
407
408         int save_state (string snapshot_name, bool pending = false);
409         int restore_state (string snapshot_name);
410         int save_template (string template_name);
411         int save_history (string snapshot_name = "");
412         int restore_history (string snapshot_name);
413
414         static int rename_template (string old_name, string new_name);
415
416         static int delete_template (string name);
417         
418         sigc::signal<void,string> StateSaved;
419         sigc::signal<void> StateReady;
420
421         vector<string*>* possible_states() const;
422         static vector<string*>* possible_states(string path);
423
424         XMLNode& get_state();
425         int      set_state(const XMLNode& node); // not idempotent
426         XMLNode& get_template();
427         
428         void add_instant_xml (XMLNode&, const std::string& dir);
429
430         enum StateOfTheState {
431                 Clean = 0x0,
432                 Dirty = 0x1,
433                 CannotSave = 0x2,
434                 Deletion = 0x4,
435                 InitialConnecting = 0x8,
436                 Loading = 0x10,
437                 InCleanup = 0x20
438         };
439
440         StateOfTheState state_of_the_state() const { return _state_of_the_state; }
441
442         RouteGroup* add_edit_group (string);
443         RouteGroup* add_mix_group (string);
444
445         void remove_edit_group (RouteGroup&);
446         void remove_mix_group (RouteGroup&);
447
448         RouteGroup *mix_group_by_name (string);
449         RouteGroup *edit_group_by_name (string);
450
451         sigc::signal<void,RouteGroup*> edit_group_added;
452         sigc::signal<void,RouteGroup*> mix_group_added;
453         sigc::signal<void> edit_group_removed;
454         sigc::signal<void> mix_group_removed;
455
456         void foreach_edit_group (sigc::slot<void,RouteGroup*> sl) {
457                 for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); i++) {
458                         sl (*i);
459                 }
460         }
461
462         void foreach_mix_group (sigc::slot<void,RouteGroup*> sl) {
463                 for (list<RouteGroup *>::iterator i = mix_groups.begin(); i != mix_groups.end(); i++) {
464                         sl (*i);
465                 }
466         }
467
468         /* fundamental operations. duh. */
469
470         std::list<boost::shared_ptr<AudioTrack> > new_audio_track (int input_channels, int output_channels, TrackMode mode = Normal, uint32_t how_many = 1);
471         RouteList new_audio_route (int input_channels, int output_channels, uint32_t how_many);
472
473         void   remove_route (boost::shared_ptr<Route>);
474
475         void   resort_routes ();
476         void   resort_routes_using (boost::shared_ptr<RouteList>);
477
478         AudioEngine &engine() { return _engine; };
479
480         int32_t  max_level;
481         int32_t  min_level;
482
483         /* Time */
484
485         nframes_t transport_frame () const {return _transport_frame; }
486         nframes_t audible_frame () const;
487
488         enum PullupFormat {
489                 pullup_Plus4Plus1,
490                 pullup_Plus4,
491                 pullup_Plus4Minus1,
492                 pullup_Plus1,
493                 pullup_None,
494                 pullup_Minus1,
495                 pullup_Minus4Plus1,
496                 pullup_Minus4,
497                 pullup_Minus4Minus1
498         };
499
500         int  set_smpte_format (SmpteFormat);
501         void sync_time_vars();
502
503         void bbt_time (nframes_t when, BBT_Time&);
504         void smpte_to_sample( SMPTE::Time& smpte, nframes_t& sample, bool use_offset, bool use_subframes ) const;
505         void sample_to_smpte( nframes_t sample, SMPTE::Time& smpte, bool use_offset, bool use_subframes ) const;
506         void smpte_time (SMPTE::Time &);
507         void smpte_time (nframes_t when, SMPTE::Time&);
508         void smpte_time_subframes (nframes_t when, SMPTE::Time&);
509
510         void smpte_duration (nframes_t, SMPTE::Time&) const;
511         void smpte_duration_string (char *, nframes_t) const;
512
513         void           set_smpte_offset (nframes_t);
514         nframes_t smpte_offset () const { return _smpte_offset; }
515         void           set_smpte_offset_negative (bool);
516         bool           smpte_offset_negative () const { return _smpte_offset_negative; }
517
518         nframes_t convert_to_frames_at (nframes_t position, AnyTime&);
519
520         static sigc::signal<void> StartTimeChanged;
521         static sigc::signal<void> EndTimeChanged;
522         static sigc::signal<void> SMPTEOffsetChanged;
523
524         void        request_slave_source (SlaveSource);
525         bool        synced_to_jack() const { return Config->get_slave_source() == JACK; }
526
527         float       transport_speed() const { return _transport_speed; }
528         bool        transport_stopped() const { return _transport_speed == 0.0f; }
529         bool        transport_rolling() const { return _transport_speed != 0.0f; }
530
531         int jack_slave_sync (nframes_t);
532
533         TempoMap& tempo_map() { return *_tempo_map; }
534         
535         /* region info  */
536
537         sigc::signal<void,boost::weak_ptr<AudioRegion> > AudioRegionAdded;
538         sigc::signal<void,boost::weak_ptr<AudioRegion> > AudioRegionRemoved;
539
540         int region_name (string& result, string base = string(""), bool newlevel = false) const;
541         string new_region_name (string);
542         string path_from_region_name (string name, string identifier);
543
544         boost::shared_ptr<AudioRegion> find_whole_file_parent (boost::shared_ptr<AudioRegion const>);
545         void find_equivalent_playlist_regions (boost::shared_ptr<Region>, std::vector<boost::shared_ptr<Region> >& result);
546
547         boost::shared_ptr<AudioRegion> XMLRegionFactory (const XMLNode&, bool full);
548
549         template<class T> void foreach_audio_region (T *obj, void (T::*func)(boost::shared_ptr<AudioRegion>));
550
551         /* source management */
552
553         struct import_status : public InterThreadInfo {
554             string doing_what;
555             
556             /* control info */
557             bool multichan;
558             bool sample_convert;
559             volatile bool freeze;
560             std::vector<Glib::ustring> paths;
561             
562             /* result */
563             std::vector<boost::shared_ptr<AudioRegion> > new_regions;
564             
565         };
566
567         int import_audiofile (import_status&);
568         bool sample_rate_convert (import_status&, string infile, string& outfile);
569         string build_tmp_convert_name (string file);
570
571         SlaveSource post_export_slave;
572         nframes_t post_export_position;
573
574         int start_audio_export (ARDOUR::AudioExportSpecification&);
575         int stop_audio_export (ARDOUR::AudioExportSpecification&);
576         
577         void add_source (boost::shared_ptr<Source>);
578         void remove_source (boost::weak_ptr<Source>);
579
580         struct cleanup_report {
581             vector<string> paths;
582             int32_t space;
583         };
584
585         int  cleanup_sources (cleanup_report&);
586         int  cleanup_trash_sources (cleanup_report&);
587
588         int destroy_region (boost::shared_ptr<Region>);
589         int destroy_regions (std::list<boost::shared_ptr<Region> >);
590
591         int remove_last_capture ();
592
593         /* handlers should return -1 for "stop cleanup", 0 for
594            "yes, delete this playlist" and 1 for "no, don't delete
595            this playlist.
596         */
597         
598         sigc::signal<int,boost::shared_ptr<ARDOUR::Playlist> > AskAboutPlaylistDeletion;
599
600         /* handlers should return !0 for use pending state, 0 for
601            ignore it.
602         */
603
604         static sigc::signal<int> AskAboutPendingState;
605         
606         boost::shared_ptr<AudioFileSource> create_audio_source_for_session (ARDOUR::AudioDiskstream&, uint32_t which_channel, bool destructive);
607
608         boost::shared_ptr<Source> source_by_id (const PBD::ID&);
609
610         /* playlist management */
611
612         boost::shared_ptr<Playlist> playlist_by_name (string name);
613         void add_playlist (boost::shared_ptr<Playlist>);
614         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistAdded;
615         sigc::signal<void,boost::shared_ptr<Playlist> > PlaylistRemoved;
616
617         uint32_t n_playlists() const;
618
619         template<class T> void foreach_playlist (T *obj, void (T::*func)(boost::shared_ptr<Playlist>));
620         void get_playlists (std::vector<boost::shared_ptr<Playlist> >&);
621
622         /* named selections */
623
624         NamedSelection* named_selection_by_name (string name);
625         void add_named_selection (NamedSelection *);
626         void remove_named_selection (NamedSelection *);
627
628         template<class T> void foreach_named_selection (T& obj, void (T::*func)(NamedSelection&));
629         sigc::signal<void> NamedSelectionAdded;
630         sigc::signal<void> NamedSelectionRemoved;
631
632         /* Curves and AutomationLists (TODO when they go away) */
633         void add_curve(Curve*);
634         void add_automation_list(AutomationList*);
635
636         /* fade curves */
637
638         float get_default_fade_length () const { return default_fade_msecs; }
639         float get_default_fade_steepness () const { return default_fade_steepness; }
640         void set_default_fade (float steepness, float msecs);
641
642         /* auditioning */
643
644         boost::shared_ptr<Auditioner> the_auditioner() { return auditioner; }
645         void audition_playlist ();
646         void audition_region (boost::shared_ptr<Region>);
647         void cancel_audition ();
648         bool is_auditioning () const;
649         
650         sigc::signal<void,bool> AuditionActive;
651
652         /* flattening stuff */
653
654         int write_one_audio_track (AudioTrack&, nframes_t start, nframes_t cnt, bool overwrite, vector<boost::shared_ptr<AudioSource> >&,
655                                    InterThreadInfo& wot);
656         int freeze (InterThreadInfo&);
657
658         /* session-wide solo/mute/rec-enable */
659         
660         bool soloing() const { return currently_soloing; }
661
662         void set_all_solo (bool);
663         void set_all_mute (bool);
664
665         sigc::signal<void,bool> SoloActive;
666         
667         void record_disenable_all ();
668         void record_enable_all ();
669
670         /* control/master out */
671
672         boost::shared_ptr<IO> control_out() const { return _control_out; }
673         boost::shared_ptr<IO> master_out() const { return _master_out; }
674
675         /* insert/send management */
676         
677         uint32_t n_port_inserts() const { return _port_inserts.size(); }
678         uint32_t n_plugin_inserts() const { return _plugin_inserts.size(); }
679         uint32_t n_sends() const { return _sends.size(); }
680
681         uint32_t next_send_id();
682         uint32_t next_insert_id();
683         void mark_send_id (uint32_t);
684         void mark_insert_id (uint32_t);
685
686         /* s/w "RAID" management */
687         
688         nframes_t available_capture_duration();
689
690         /* I/O Connections */
691
692         template<class T> void foreach_connection (T *obj, void (T::*func)(Connection *));
693         void add_connection (Connection *);
694         void remove_connection (Connection *);
695         Connection *connection_by_name (string) const;
696
697         sigc::signal<void,Connection *> ConnectionAdded;
698         sigc::signal<void,Connection *> ConnectionRemoved;
699
700         /* MIDI */
701
702         int set_mtc_port (string port_tag);
703         int set_mmc_port (string port_tag);
704         int set_midi_port (string port_tag);
705         MIDI::Port *mtc_port() const { return _mtc_port; }
706         MIDI::Port *mmc_port() const { return _mmc_port; }
707         MIDI::Port *midi_port() const { return _midi_port; }
708
709         sigc::signal<void> MTC_PortChanged;
710         sigc::signal<void> MMC_PortChanged;
711         sigc::signal<void> MIDI_PortChanged;
712
713         void set_trace_midi_input (bool, MIDI::Port* port = 0);
714         void set_trace_midi_output (bool, MIDI::Port* port = 0);
715
716         bool get_trace_midi_input(MIDI::Port *port = 0);
717         bool get_trace_midi_output(MIDI::Port *port = 0);
718         
719         void send_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
720
721         void deliver_midi (MIDI::Port*, MIDI::byte*, int32_t size);
722
723         /* Scrubbing */
724
725         void start_scrub (nframes_t where);
726         void stop_scrub ();
727         void set_scrub_speed (float);
728         nframes_t scrub_buffer_size() const;
729         sigc::signal<void> ScrubReady;
730
731         /* History (for editors, mixers, UIs etc.) */
732
733         void undo (uint32_t n) {
734                 _history.undo (n);
735         }
736
737         void redo (uint32_t n) {
738                 _history.redo (n);
739         }
740
741         UndoHistory& history() { return _history; }
742         
743         uint32_t undo_depth() const { return _history.undo_depth(); }
744         uint32_t redo_depth() const { return _history.redo_depth(); }
745         string next_undo() const { return _history.next_undo(); }
746         string next_redo() const { return _history.next_redo(); }
747
748         void begin_reversible_command (string cmd_name);
749         void commit_reversible_command (Command* cmd = 0);
750
751         void add_command (Command *const cmd) {
752                 current_trans->add_command (cmd);
753         }
754
755         std::map<PBD::ID, PBD::StatefulThingWithGoingAway*> registry;
756
757         // these commands are implemented in libs/ardour/session_command.cc
758         Command* memento_command_factory(XMLNode* n);
759         void register_with_memento_command_factory(PBD::ID, PBD::StatefulThingWithGoingAway*);
760
761         Command* global_state_command_factory (const XMLNode& n);
762
763         class GlobalRouteStateCommand : public Command
764         {
765           public:
766                 GlobalRouteStateCommand (Session&, void*);
767                 GlobalRouteStateCommand (Session&, const XMLNode& node);
768                 int set_state (const XMLNode&);
769                 XMLNode& get_state ();
770
771           protected:
772                 GlobalRouteBooleanState before, after;
773                 Session& sess;
774                 void* src;
775                 
776         };
777
778         class GlobalSoloStateCommand : public GlobalRouteStateCommand
779         {
780           public:
781                 GlobalSoloStateCommand (Session &, void *src);
782                 GlobalSoloStateCommand (Session&, const XMLNode&);
783                 void operator()(); //redo
784                 void undo();
785                 XMLNode &get_state();
786                 void mark();
787         };
788
789         class GlobalMuteStateCommand : public GlobalRouteStateCommand
790         {
791           public:
792                 GlobalMuteStateCommand(Session &, void *src);
793                 GlobalMuteStateCommand (Session&, const XMLNode&);
794                 void operator()(); // redo
795                 void undo();
796                 XMLNode &get_state();
797                 void mark();
798         };
799
800         class GlobalRecordEnableStateCommand : public GlobalRouteStateCommand
801         {
802           public:
803                 GlobalRecordEnableStateCommand(Session &, void *src);
804                 GlobalRecordEnableStateCommand (Session&, const XMLNode&);
805                 void operator()(); // redo
806                 void undo();
807                 XMLNode &get_state();
808                 void mark();
809         };
810
811         class GlobalMeteringStateCommand : public Command
812         {
813           public:
814                 GlobalMeteringStateCommand(Session &, void *src);
815                 GlobalMeteringStateCommand (Session&, const XMLNode&);
816                 void operator()();
817                 void undo();
818                 XMLNode &get_state();
819                 int set_state (const XMLNode&);
820                 void mark();
821
822           protected:
823                 Session& sess;
824                 void* src;
825                 GlobalRouteMeterState before;
826                 GlobalRouteMeterState after;
827         };
828
829         /* clicking */
830
831         boost::shared_ptr<IO>  click_io() { return _click_io; }
832                 
833         /* tempo FX */
834
835         struct TimeStretchRequest {
836             boost::shared_ptr<ARDOUR::AudioRegion> region;
837             float                fraction; /* session: read ; GUI: write */
838             float                progress; /* session: write ; GUI: read */
839             bool                 running;  /* read/write */
840             bool                 quick_seek; /* GUI: write */
841             bool                 antialias;  /* GUI: write */
842
843             TimeStretchRequest () {} 
844         };
845
846         boost::shared_ptr<AudioRegion> tempoize_region (TimeStretchRequest&);
847
848         /* disk, buffer loads */
849
850         uint32_t playback_load ();
851         uint32_t capture_load ();
852         uint32_t playback_load_min ();
853         uint32_t capture_load_min ();
854
855         void reset_playback_load_min ();
856         void reset_capture_load_min ();
857         
858         float read_data_rate () const;
859         float write_data_rate () const;
860
861         /* ranges */
862
863         void set_audio_range (list<AudioRange>&);
864         void set_music_range (list<MusicRange>&);
865
866         void request_play_range (bool yn);
867         bool get_play_range () const { return _play_range; }
868
869         /* favorite dirs */
870         typedef vector<string> FavoriteDirs;
871
872         static int read_favorite_dirs (FavoriteDirs&);
873
874         static int write_favorite_dirs (FavoriteDirs&);
875         
876         /* file suffixes */
877
878         static const char* template_suffix() { return _template_suffix; }
879         static const char* statefile_suffix() { return _statefile_suffix; }
880         static const char* pending_suffix() { return _pending_suffix; }
881
882         /* buffers for gain and pan */
883
884         gain_t* gain_automation_buffer () const { return _gain_automation_buffer; }
885         pan_t** pan_automation_buffer() const { return _pan_automation_buffer; }
886
887         /* buffers for conversion */
888         enum RunContext {
889                 ButlerContext = 0,
890                 TransportContext,
891                 ExportContext
892         };
893         
894         /* VST support */
895
896         static long vst_callback (AEffect* effect,
897                                   long opcode,
898                                   long index,
899                                   long value,
900                                   void* ptr,
901                                   float opt);
902
903         typedef float (*compute_peak_t)                         (Sample *, nframes_t, float);
904         typedef void  (*apply_gain_to_buffer_t)         (Sample *, nframes_t, float);
905         typedef void  (*mix_buffers_with_gain_t)        (Sample *, Sample *, nframes_t, float);
906         typedef void  (*mix_buffers_no_gain_t)          (Sample *, Sample *, nframes_t);
907
908         static compute_peak_t                   compute_peak;
909         static apply_gain_to_buffer_t   apply_gain_to_buffer;
910         static mix_buffers_with_gain_t  mix_buffers_with_gain;
911         static mix_buffers_no_gain_t    mix_buffers_no_gain;
912
913         static sigc::signal<void> SendFeedback;
914
915         /* Controllables */
916
917         PBD::Controllable* controllable_by_id (const PBD::ID&);
918
919         void add_controllable (PBD::Controllable*);
920         void remove_controllable (PBD::Controllable*);
921
922   protected:
923         friend class AudioEngine;
924         void set_block_size (nframes_t nframes);
925         void set_frame_rate (nframes_t nframes);
926
927   protected:
928         friend class Diskstream;
929         void stop_butler ();
930         void wait_till_butler_finished();
931
932   protected:
933         friend class Route;
934         void schedule_curve_reallocation ();
935         void update_latency_compensation (bool, bool);
936         
937   private:
938         int  create (bool& new_session, string* mix_template, nframes_t initial_length);
939         void destroy ();
940
941         nframes_t compute_initial_length ();
942
943         static const char* _template_suffix;
944         static const char* _statefile_suffix;
945         static const char* _pending_suffix;
946
947         enum SubState {
948                 PendingDeclickIn   = 0x1,
949                 PendingDeclickOut  = 0x2,
950                 StopPendingCapture = 0x4,
951                 AutoReturning      = 0x10,
952                 PendingLocate      = 0x20,
953                 PendingSetLoop     = 0x40
954         };
955
956         /* stuff used in process() should be close together to
957            maximise cache hits
958         */
959
960         typedef void (Session::*process_function_type)(nframes_t);
961
962         AudioEngine            &_engine;
963         mutable gint            processing_prohibited;
964         process_function_type    process_function;
965         process_function_type    last_process_function;
966         bool                     waiting_for_sync_offset;
967         nframes_t          _base_frame_rate;
968         nframes_t          _current_frame_rate;  //this includes video pullup offset
969         int                      transport_sub_state;
970         mutable gint           _record_status;
971         nframes_t          _transport_frame;
972         Location*                end_location;
973         Location*                start_location;
974         Slave                  *_slave;
975         volatile float          _transport_speed;
976         volatile float          _desired_transport_speed;
977         float                   _last_transport_speed;
978         nframes_t          _last_slave_transport_frame;
979         nframes_t           maximum_output_latency;
980         nframes_t           last_stop_frame;
981         vector<Sample *>        _passthru_buffers;
982         vector<Sample *>        _silent_buffers;
983         vector<Sample *>        _send_buffers;
984         nframes_t           current_block_size;
985         nframes_t          _worst_output_latency;
986         nframes_t          _worst_input_latency;
987         nframes_t          _worst_track_latency;
988         bool                    _have_captured;
989         float                   _meter_hold;
990         float                   _meter_falloff;
991         bool                    _end_location_is_free;
992
993         void set_worst_io_latencies ();
994         void set_worst_io_latencies_x (IOChange asifwecare, void *ignored) {
995                 set_worst_io_latencies ();
996         }
997
998         void update_latency_compensation_proxy (void* ignored);
999
1000         void ensure_passthru_buffers (uint32_t howmany);
1001         
1002         void process_scrub          (nframes_t);
1003         void process_without_events (nframes_t);
1004         void process_with_events    (nframes_t);
1005         void process_audition       (nframes_t);
1006         int  process_export         (nframes_t, ARDOUR::AudioExportSpecification*);
1007         
1008         /* slave tracking */
1009
1010         static const int delta_accumulator_size = 25;
1011         int delta_accumulator_cnt;
1012         long delta_accumulator[delta_accumulator_size];
1013         long average_slave_delta;
1014         int  average_dir;
1015         bool have_first_delta_accumulator;
1016         
1017         enum SlaveState {
1018                 Stopped,
1019                 Waiting,
1020                 Running
1021         };
1022         
1023         SlaveState slave_state;
1024         nframes_t slave_wait_end;
1025
1026         void reset_slave_state ();
1027         bool follow_slave (nframes_t, nframes_t);
1028         void set_slave_source (SlaveSource);
1029
1030         bool _exporting;
1031         int prepare_to_export (ARDOUR::AudioExportSpecification&);
1032
1033         void prepare_diskstreams ();
1034         void commit_diskstreams (nframes_t, bool& session_requires_butler);
1035         int  process_routes (nframes_t, nframes_t);
1036         int  silent_process_routes (nframes_t, nframes_t);
1037
1038         bool get_rec_monitors_input () {
1039                 if (actively_recording()) {
1040                         return true;
1041                 } else {
1042                         if (Config->get_auto_input()) {
1043                                 return false;
1044                         } else {
1045                                 return true;
1046                         }
1047                 }
1048         }
1049
1050         int get_transport_declick_required () {
1051
1052                 if (transport_sub_state & PendingDeclickIn) {
1053                         transport_sub_state &= ~PendingDeclickIn;
1054                         return 1;
1055                 } else if (transport_sub_state & PendingDeclickOut) {
1056                         return -1;
1057                 } else {
1058                         return 0;
1059                 }
1060         }
1061
1062         bool maybe_stop (nframes_t limit) {
1063                 if ((_transport_speed > 0.0f && _transport_frame >= limit) || (_transport_speed < 0.0f && _transport_frame == 0)) {
1064                         stop_transport ();
1065                         return true;
1066                 }
1067                 return false;
1068         }
1069
1070         bool maybe_sync_start (nframes_t&, nframes_t&);
1071
1072         void check_declick_out ();
1073
1074         MIDI::MachineControl*    mmc;
1075         MIDI::Port*             _mmc_port;
1076         MIDI::Port*             _mtc_port;
1077         MIDI::Port*             _midi_port;
1078         string                  _path;
1079         string                  _name;
1080         bool                     session_send_mmc;
1081         bool                     session_send_mtc;
1082         bool                     session_midi_feedback;
1083         bool                     play_loop;
1084         bool                     loop_changing;
1085         nframes_t           last_loopend;
1086
1087         RingBuffer<Event*> pending_events;
1088
1089         void hookup_io ();
1090         void when_engine_running ();
1091         void graph_reordered ();
1092
1093         string _current_snapshot_name;
1094
1095         XMLTree* state_tree;
1096         bool     state_was_pending;
1097         StateOfTheState _state_of_the_state;
1098
1099         void     auto_save();
1100         int      load_options (const XMLNode&);
1101         XMLNode& get_options () const;
1102         int      load_state (string snapshot_name);
1103         bool     save_config_options_predicate (ConfigVariableBase::Owner owner) const;
1104
1105         nframes_t   _last_roll_location;
1106         nframes_t   _last_record_location;
1107         bool              pending_locate_roll;
1108         nframes_t    pending_locate_frame;
1109
1110         bool              pending_locate_flush;
1111         bool              pending_abort;
1112         bool              pending_auto_loop;
1113         
1114         Sample*           butler_mixdown_buffer;
1115         float*            butler_gain_buffer;
1116         pthread_t         butler_thread;
1117         Glib::Mutex       butler_request_lock;
1118         Glib::Cond        butler_paused;
1119         bool              butler_should_run;
1120         mutable gint      butler_should_do_transport_work;
1121         int               butler_request_pipe[2];
1122
1123         inline bool transport_work_requested() const { return g_atomic_int_get(&butler_should_do_transport_work); }
1124         
1125         struct ButlerRequest {
1126             enum Type {
1127                     Wake,
1128                     Run,
1129                     Pause,
1130                     Quit
1131             };
1132         };
1133
1134         enum PostTransportWork {
1135                 PostTransportStop               = 0x1,
1136                 PostTransportDisableRecord      = 0x2,
1137                 PostTransportPosition           = 0x8,
1138                 PostTransportDidRecord          = 0x20,
1139                 PostTransportDuration           = 0x40,
1140                 PostTransportLocate             = 0x80,
1141                 PostTransportRoll               = 0x200,
1142                 PostTransportAbort              = 0x800,
1143                 PostTransportOverWrite          = 0x1000,
1144                 PostTransportSpeed              = 0x2000,
1145                 PostTransportAudition           = 0x4000,
1146                 PostTransportScrub              = 0x8000,
1147                 PostTransportReverse            = 0x10000,
1148                 PostTransportInputChange        = 0x20000,
1149                 PostTransportCurveRealloc       = 0x40000
1150         };
1151         
1152         static const PostTransportWork ProcessCannotProceedMask = 
1153                 PostTransportWork (PostTransportInputChange|
1154                                    PostTransportSpeed|
1155                                    PostTransportReverse|
1156                                    PostTransportCurveRealloc|
1157                                    PostTransportScrub|
1158                                    PostTransportAudition|
1159                                    PostTransportLocate|
1160                                    PostTransportStop);
1161         
1162         PostTransportWork post_transport_work;
1163
1164         void             summon_butler ();
1165         void             schedule_butler_transport_work ();
1166         int              start_butler_thread ();
1167         void             terminate_butler_thread ();
1168         static void    *_butler_thread_work (void *arg);
1169         void*            butler_thread_work ();
1170
1171         uint32_t    cumulative_rf_motion;
1172         uint32_t    rf_scale;
1173
1174         void set_rf_speed (float speed);
1175         void reset_rf_scale (nframes_t frames_moved);
1176
1177         Locations        _locations;
1178         void              locations_changed ();
1179         void              locations_added (Location*);
1180         void              handle_locations_changed (Locations::LocationList&);
1181
1182         sigc::connection auto_punch_start_changed_connection;
1183         sigc::connection auto_punch_end_changed_connection;
1184         sigc::connection auto_punch_changed_connection;
1185         void             auto_punch_start_changed (Location *);
1186         void             auto_punch_end_changed (Location *);
1187         void             auto_punch_changed (Location *);
1188
1189         sigc::connection auto_loop_start_changed_connection;
1190         sigc::connection auto_loop_end_changed_connection;
1191         sigc::connection auto_loop_changed_connection;
1192         void             auto_loop_changed (Location *);
1193
1194         typedef list<Event *> Events;
1195         Events           events;
1196         Events           immediate_events;
1197         Events::iterator next_event;
1198
1199         /* there can only ever be one of each of these */
1200
1201         Event *auto_loop_event;
1202         Event *punch_out_event;
1203         Event *punch_in_event;
1204
1205         /* events */
1206
1207         void dump_events () const;
1208         void queue_event (Event *ev);
1209         void merge_event (Event*);
1210         void replace_event (Event::Type, nframes_t action_frame, nframes_t target = 0);
1211         bool _replace_event (Event*);
1212         bool _remove_event (Event *);
1213         void _clear_event_type (Event::Type);
1214
1215         void first_stage_init (string path, string snapshot_name);
1216         int  second_stage_init (bool new_tracks);
1217         void find_current_end ();
1218         void remove_empty_sounds ();
1219
1220         void setup_midi_control ();
1221         int  midi_read (MIDI::Port *);
1222
1223         void enable_record ();
1224         
1225         void increment_transport_position (uint32_t val) {
1226                 if (max_frames - val < _transport_frame) {
1227                         _transport_frame = max_frames;
1228                 } else {
1229                         _transport_frame += val;
1230                 }
1231         }
1232
1233         void decrement_transport_position (uint32_t val) {
1234                 if (val < _transport_frame) {
1235                         _transport_frame -= val;
1236                 } else {
1237                         _transport_frame = 0;
1238                 }
1239         }
1240
1241         void post_transport_motion ();
1242         static void *session_loader_thread (void *arg);
1243
1244         void *do_work();
1245
1246         void set_next_event ();
1247         void process_event (Event *);
1248
1249         /* MIDI Machine Control */
1250
1251         void deliver_mmc (MIDI::MachineControl::Command, nframes_t);
1252         void deliver_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t, MIDI::EventTwoBytes);
1253         void deliver_data (MIDI::Port* port, MIDI::byte*, int32_t size);
1254
1255         void spp_start (MIDI::Parser&);
1256         void spp_continue (MIDI::Parser&);
1257         void spp_stop (MIDI::Parser&);
1258
1259         void mmc_deferred_play (MIDI::MachineControl &);
1260         void mmc_stop (MIDI::MachineControl &);
1261         void mmc_step (MIDI::MachineControl &, int);
1262         void mmc_pause (MIDI::MachineControl &);
1263         void mmc_record_pause (MIDI::MachineControl &);
1264         void mmc_record_strobe (MIDI::MachineControl &);
1265         void mmc_record_exit (MIDI::MachineControl &);
1266         void mmc_track_record_status (MIDI::MachineControl &, 
1267                                       uint32_t track, bool enabled);
1268         void mmc_fast_forward (MIDI::MachineControl &);
1269         void mmc_rewind (MIDI::MachineControl &);
1270         void mmc_locate (MIDI::MachineControl &, const MIDI::byte *);
1271         void mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw);
1272         void mmc_record_enable (MIDI::MachineControl &mmc, size_t track, bool enabled);
1273
1274         struct timeval last_mmc_step;
1275         double step_speed;
1276
1277         typedef sigc::slot<bool> MidiTimeoutCallback;
1278         typedef list<MidiTimeoutCallback> MidiTimeoutList;
1279
1280         MidiTimeoutList midi_timeouts;
1281         bool mmc_step_timeout ();
1282
1283         MIDI::byte mmc_buffer[32];
1284         MIDI::byte mtc_msg[16];
1285         MIDI::byte mtc_smpte_bits;   /* encoding of SMTPE type for MTC */
1286         MIDI::byte midi_msg[16];
1287         nframes_t  outbound_mtc_smpte_frame;
1288         SMPTE::Time transmitting_smpte_time;
1289         int next_quarter_frame_to_send;
1290         
1291         double _frames_per_smpte_frame; /* has to be floating point because of drop frame */
1292         nframes_t _frames_per_hour;
1293         nframes_t _smpte_frames_per_hour;
1294         nframes_t _smpte_offset;
1295         bool _smpte_offset_negative;
1296
1297         /* cache the most-recently requested time conversions.
1298            this helps when we have multiple clocks showing the
1299            same time (e.g. the transport frame)
1300         */
1301
1302         bool       last_smpte_valid;
1303         nframes_t  last_smpte_when;
1304         SMPTE::Time last_smpte;
1305
1306         int send_full_time_code ();
1307         int send_midi_time_code ();
1308
1309         void send_full_time_code_in_another_thread ();
1310         void send_midi_time_code_in_another_thread ();
1311         void send_time_code_in_another_thread (bool full);
1312         void send_mmc_in_another_thread (MIDI::MachineControl::Command, nframes_t frame = 0);
1313
1314         nframes_t adjust_apparent_position (nframes_t frames);
1315         
1316         void reset_record_status ();
1317         
1318         int no_roll (nframes_t nframes, nframes_t offset);
1319         
1320         bool non_realtime_work_pending() const { return static_cast<bool>(post_transport_work); }
1321         bool process_can_proceed() const { return !(post_transport_work & ProcessCannotProceedMask); }
1322
1323         struct MIDIRequest {
1324             
1325             enum Type {
1326                     SendFullMTC,
1327                     SendMTC,
1328                     SendMMC,
1329                     PortChange,
1330                     SendMessage,
1331                     Deliver,
1332                     Quit
1333             };
1334             
1335             Type type;
1336             MIDI::MachineControl::Command mmc_cmd;
1337             nframes_t locate_frame;
1338
1339             // for SendMessage type
1340
1341             MIDI::Port * port;
1342             MIDI::channel_t chan;
1343             union {
1344                 MIDI::EventTwoBytes data;
1345                 MIDI::byte* buf;
1346             };
1347
1348             union { 
1349                 MIDI::eventType ev;
1350                 int32_t size;
1351             };
1352
1353             MIDIRequest () {}
1354             
1355             void *operator new(size_t ignored) {
1356                     return pool.alloc ();
1357             };
1358
1359             void operator delete(void *ptr, size_t size) {
1360                     pool.release (ptr);
1361             }
1362
1363           private:
1364             static MultiAllocSingleReleasePool pool;
1365         };
1366
1367         Glib::Mutex       midi_lock;
1368         pthread_t       midi_thread;
1369         int             midi_request_pipe[2];
1370         mutable  gint   butler_active;
1371         RingBuffer<MIDIRequest*> midi_requests;
1372
1373         int           start_midi_thread ();
1374         void          terminate_midi_thread ();
1375         void          poke_midi_thread ();
1376         static void *_midi_thread_work (void *arg);
1377         void          midi_thread_work ();
1378         void          change_midi_ports ();
1379         int           use_config_midi_ports ();
1380
1381         bool waiting_to_start;
1382
1383         void set_play_loop (bool yn);
1384         void overwrite_some_buffers (Diskstream*);
1385         void flush_all_redirects ();
1386         void locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1387         void start_locate (nframes_t, bool with_roll, bool with_flush, bool with_loop=false);
1388         void force_locate (nframes_t frame, bool with_roll = false);
1389         void set_diskstream_speed (Diskstream*, float speed);
1390         void set_transport_speed (float speed, bool abort = false);
1391         void stop_transport (bool abort = false);
1392         void start_transport ();
1393         void actually_start_transport ();
1394         void realtime_stop (bool abort);
1395         void non_realtime_start_scrub ();
1396         void non_realtime_set_speed ();
1397         void non_realtime_stop (bool abort, int entry_request_count, bool& finished);
1398         void non_realtime_overwrite (int entry_request_count, bool& finished);
1399         void butler_transport_work ();
1400         void post_transport ();
1401         void engine_halted ();
1402         void xrun_recovery ();
1403
1404         TempoMap    *_tempo_map;
1405         void          tempo_map_changed (Change);
1406
1407         /* edit/mix groups */
1408
1409         int load_route_groups (const XMLNode&, bool is_edit);
1410         int load_edit_groups (const XMLNode&);
1411         int load_mix_groups (const XMLNode&);
1412
1413
1414         list<RouteGroup *> edit_groups;
1415         list<RouteGroup *> mix_groups;
1416
1417         /* disk-streams */
1418
1419         SerializedRCUManager<DiskstreamList>  diskstreams; 
1420
1421         uint32_t dstream_buffer_size;
1422         int  load_diskstreams (const XMLNode&);
1423
1424         /* routes stuff */
1425
1426         SerializedRCUManager<RouteList>  routes;
1427
1428         void   add_routes (RouteList&, bool save = true);
1429         uint32_t destructive_index;
1430
1431         int load_routes (const XMLNode&);
1432         boost::shared_ptr<Route> XMLRouteFactory (const XMLNode&);
1433
1434         /* mixer stuff */
1435
1436         bool       solo_update_disabled;
1437         bool       currently_soloing;
1438         
1439         void route_mute_changed (void *src);
1440         void route_solo_changed (void *src, boost::weak_ptr<Route>);
1441         void catch_up_on_solo ();
1442         void update_route_solo_state ();
1443         void modify_solo_mute (bool, bool);
1444         void strip_portname_for_solo (string& portname);
1445
1446         /* REGION MANAGEMENT */
1447
1448         mutable Glib::Mutex region_lock;
1449         typedef map<PBD::ID,boost::shared_ptr<AudioRegion> > AudioRegionList;
1450         AudioRegionList audio_regions;
1451         
1452         void add_region (boost::shared_ptr<Region>);
1453         void region_changed (Change, boost::weak_ptr<Region>);
1454         void remove_region (boost::weak_ptr<Region>);
1455
1456         int load_regions (const XMLNode& node);
1457
1458         /* SOURCES */
1459         
1460         mutable Glib::Mutex audio_source_lock;
1461         typedef std::map<PBD::ID,boost::shared_ptr<AudioSource> > AudioSourceList;
1462
1463         AudioSourceList audio_sources;
1464
1465         int load_sources (const XMLNode& node);
1466         XMLNode& get_sources_as_xml ();
1467
1468         boost::shared_ptr<Source> XMLSourceFactory (const XMLNode&);
1469
1470         /* PLAYLISTS */
1471         
1472         mutable Glib::Mutex playlist_lock;
1473         typedef set<boost::shared_ptr<Playlist> > PlaylistList;
1474         PlaylistList playlists;
1475         PlaylistList unused_playlists;
1476
1477         int load_playlists (const XMLNode&);
1478         int load_unused_playlists (const XMLNode&);
1479         void remove_playlist (boost::weak_ptr<Playlist>);
1480         void track_playlist (bool, boost::weak_ptr<Playlist>);
1481
1482         boost::shared_ptr<Playlist> playlist_factory (string name);
1483         boost::shared_ptr<Playlist> XMLPlaylistFactory (const XMLNode&);
1484
1485         void playlist_length_changed ();
1486         void diskstream_playlist_changed (boost::shared_ptr<Diskstream>);
1487
1488         /* NAMED SELECTIONS */
1489
1490         mutable Glib::Mutex named_selection_lock;
1491         typedef set<NamedSelection *> NamedSelectionList;
1492         NamedSelectionList named_selections;
1493
1494         int load_named_selections (const XMLNode&);
1495
1496         NamedSelection *named_selection_factory (string name);
1497         NamedSelection *XMLNamedSelectionFactory (const XMLNode&);
1498
1499         /* CURVES and AUTOMATION LISTS */
1500         std::map<PBD::ID, Curve*> curves;
1501         std::map<PBD::ID, AutomationList*> automation_lists;
1502
1503         /* DEFAULT FADE CURVES */
1504
1505         float default_fade_steepness;
1506         float default_fade_msecs;
1507
1508         /* AUDITIONING */
1509
1510         boost::shared_ptr<Auditioner> auditioner;
1511         void set_audition (boost::shared_ptr<Region>);
1512         void non_realtime_set_audition ();
1513         boost::shared_ptr<Region> pending_audition_region;
1514
1515         /* EXPORT */
1516
1517         /* FLATTEN */
1518
1519         int flatten_one_track (AudioTrack&, nframes_t start, nframes_t cnt);
1520
1521         /* INSERT AND SEND MANAGEMENT */
1522         
1523         list<PortInsert *>   _port_inserts;
1524         list<PluginInsert *> _plugin_inserts;
1525         list<Send *>         _sends;
1526         boost::dynamic_bitset<uint32_t>  send_bitset;
1527         boost::dynamic_bitset<uint32_t>  insert_bitset;
1528         uint32_t          send_cnt;
1529         uint32_t          insert_cnt;
1530
1531
1532         void add_redirect (Redirect *);
1533         void remove_redirect (Redirect *);
1534
1535         /* S/W RAID */
1536
1537         struct space_and_path {
1538             uint32_t blocks; /* 4kB blocks */
1539             string path;
1540             
1541             space_and_path() { 
1542                     blocks = 0;
1543             }
1544         };
1545
1546         struct space_and_path_ascending_cmp {
1547             bool operator() (space_and_path a, space_and_path b) {
1548                     return a.blocks > b.blocks;
1549             }
1550         };
1551         
1552         void setup_raid_path (string path);
1553
1554         vector<space_and_path> session_dirs;
1555         vector<space_and_path>::iterator last_rr_session_dir;
1556         uint32_t _total_free_4k_blocks;
1557         Glib::Mutex space_lock;
1558
1559         static const char* old_sound_dir_name;
1560         static const char* sound_dir_name;
1561         static const char* dead_sound_dir_name;
1562         static const char* interchange_dir_name;
1563         static const char* peak_dir_name;
1564
1565         string discover_best_sound_dir (bool destructive = false);
1566         int ensure_sound_dir (string, string&);
1567         void refresh_disk_space ();
1568
1569         mutable gint _playback_load;
1570         mutable gint _capture_load;
1571         mutable gint _playback_load_min;
1572         mutable gint _capture_load_min;
1573
1574         /* I/O Connections */
1575
1576         typedef list<Connection *> ConnectionList;
1577         mutable Glib::Mutex connection_lock;
1578         ConnectionList _connections;
1579         int load_connections (const XMLNode&);
1580
1581         void reverse_diskstream_buffers ();
1582
1583         UndoHistory _history;
1584         UndoTransaction* current_trans;
1585
1586         GlobalRouteBooleanState get_global_route_boolean (bool (Route::*method)(void) const);
1587         GlobalRouteMeterState get_global_route_metering ();
1588
1589         void set_global_route_boolean (GlobalRouteBooleanState s, void (Route::*method)(bool, void*), void *arg);
1590         void set_global_route_metering (GlobalRouteMeterState s, void *arg);
1591
1592         void set_global_mute (GlobalRouteBooleanState s, void *src);
1593         void set_global_solo (GlobalRouteBooleanState s, void *src);
1594         void set_global_record_enable (GlobalRouteBooleanState s, void *src);
1595
1596         void jack_timebase_callback (jack_transport_state_t, nframes_t, jack_position_t*, int);
1597         int  jack_sync_callback (jack_transport_state_t, jack_position_t*);
1598         void record_enable_change_all (bool yn);
1599
1600         XMLNode& state(bool);
1601
1602         /* click track */
1603
1604         struct Click {
1605             nframes_t start;
1606             nframes_t duration;
1607             nframes_t offset;
1608             const Sample *data;
1609
1610             Click (nframes_t s, nframes_t d, const Sample *b) 
1611                     : start (s), duration (d), data (b) { offset = 0; }
1612             
1613             void *operator new(size_t ignored) {
1614                     return pool.alloc ();
1615             };
1616
1617             void operator delete(void *ptr, size_t size) {
1618                     pool.release (ptr);
1619             }
1620
1621           private:
1622             static Pool pool;
1623         };
1624  
1625         typedef list<Click*> Clicks;
1626
1627         Clicks          clicks;
1628         bool           _clicking;
1629         boost::shared_ptr<IO> _click_io;
1630         Sample*         click_data;
1631         Sample*         click_emphasis_data;
1632         nframes_t  click_length;
1633         nframes_t  click_emphasis_length;
1634         mutable Glib::RWLock click_lock;
1635
1636         static const Sample         default_click[];
1637         static const nframes_t default_click_length;
1638         static const Sample         default_click_emphasis[];
1639         static const nframes_t default_click_emphasis_length;
1640
1641         Click *get_click();
1642         void   setup_click_sounds (int which);
1643         void   clear_clicks ();
1644         void   click (nframes_t start, nframes_t nframes, nframes_t offset);
1645
1646         vector<Route*> master_outs;
1647         
1648         /* range playback */
1649
1650         list<AudioRange> current_audio_range;
1651         bool _play_range;
1652         void set_play_range (bool yn);
1653         void setup_auto_play ();
1654
1655         /* main outs */
1656         uint32_t main_outs;
1657         
1658         boost::shared_ptr<IO> _master_out;
1659         boost::shared_ptr<IO> _control_out;
1660
1661         gain_t* _gain_automation_buffer;
1662         pan_t** _pan_automation_buffer;
1663         void allocate_pan_automation_buffers (nframes_t nframes, uint32_t howmany, bool force);
1664         uint32_t _npan_buffers;
1665
1666         /* VST support */
1667
1668         long _vst_callback (VSTPlugin*,
1669                             long opcode,
1670                             long index,
1671                             long value,
1672                             void* ptr,
1673                             float opt);
1674
1675         /* number of hardware audio ports we're using,
1676            based on max (requested,available)
1677         */
1678
1679         uint32_t n_physical_outputs;
1680         uint32_t n_physical_inputs;
1681
1682         void remove_pending_capture_state ();
1683
1684         int find_all_sources (std::string path, std::set<std::string>& result);
1685         int find_all_sources_across_snapshots (std::set<std::string>& result, bool exclude_this_snapshot);
1686
1687         LayerModel layer_model;
1688         CrossfadeModel xfade_model;
1689
1690         typedef std::set<PBD::Controllable*> Controllables;
1691         Glib::Mutex controllables_lock;
1692         Controllables controllables;
1693
1694         void reset_native_file_format();
1695         bool first_file_data_format_reset;
1696         bool first_file_header_format_reset;
1697
1698         void config_changed (const char*);
1699
1700         void add_control_protocol (const ControlProtocolInfo* const, XMLNode*);
1701         XMLNode& get_control_protocol_state ();
1702         
1703 };
1704
1705 } // namespace ARDOUR
1706
1707 #endif /* __ardour_session_h__ */