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