more DEBUG::Destruction messages
[ardour.git] / libs / ardour / ardour / disk_writer.h
index 3eed3c6d994fe7822b99fd25097b2efcbfeca44a..f85eb26f11db8cc385ab1a6b6462fc887f8c33e9 100644 (file)
 #include <list>
 #include <vector>
 
+#include "pbd/i18n.h"
+
 #include "ardour/disk_io.h"
+#include "ardour/midi_buffer.h"
 
 namespace ARDOUR
 {
 
 class AudioFileSource;
 class SMFSource;
+class MidiSource;
 
 class LIBARDOUR_API DiskWriter : public DiskIOProcessor
 {
   public:
        DiskWriter (Session&, std::string const & name, DiskIOProcessor::Flag f = DiskIOProcessor::Flag (0));
+       ~DiskWriter ();
+
+       bool set_name (std::string const & str);
+       std::string display_name() const { return std::string (_("writer")); }
 
        virtual bool set_write_source_name (const std::string& str);
 
@@ -46,12 +54,11 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
 
        void run (BufferSet& /*bufs*/, framepos_t /*start_frame*/, framepos_t /*end_frame*/, double speed, pframes_t /*nframes*/, bool /*result_required*/);
        void non_realtime_locate (framepos_t);
+       void realtime_handle_transport_stopped ();
 
        virtual XMLNode& state (bool full);
        int set_state (const XMLNode&, int version);
 
-       virtual int use_new_write_source (uint32_t n=0) = 0;
-
        std::string write_source_name () const {
                if (_write_source_name.empty()) {
                        return name();
@@ -71,7 +78,9 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
 
        boost::shared_ptr<SMFSource> midi_write_source () { return _midi_write_source; }
 
-       virtual std::string steal_write_source_name () { return std::string(); }
+       virtual std::string steal_write_source_name ();
+       int use_new_write_source (DataType, uint32_t n = 0);
+       void reset_write_sources (bool, bool force = false);
 
        AlignStyle  alignment_style() const { return _alignment_style; }
        AlignChoice alignment_choice() const { return _alignment_choice; }
@@ -83,12 +92,14 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
        void set_input_latency (framecnt_t);
        framecnt_t input_latency () const { return _input_latency; }
 
+       bool configure_io (ChanCount in, ChanCount out);
+
        std::list<boost::shared_ptr<Source> >& last_capture_sources () { return _last_capture_sources; }
 
        bool         record_enabled() const { return g_atomic_int_get (const_cast<gint*>(&_record_enabled)); }
        bool         record_safe () const { return g_atomic_int_get (const_cast<gint*>(&_record_safe)); }
-       virtual void set_record_enabled (bool yn) = 0;
-       virtual void set_record_safe (bool yn) = 0;
+       virtual void set_record_enabled (bool yn);
+       virtual void set_record_safe (bool yn);
 
        bool destructive() const { return _flags & Destructive; }
        int set_destructive (bool yn);
@@ -109,16 +120,33 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
        framecnt_t   capture_offset() const { return _capture_offset; }
        virtual void set_capture_offset ();
 
+       int seek (framepos_t frame, bool complete_refill);
+
        static PBD::Signal0<void> Overrun;
 
+       void set_note_mode (NoteMode m);
+
+       /** Emitted when some MIDI data has been received for recording.
+        *  Parameter is the source that it is destined for.
+        *  A caller can get a copy of the data with get_gui_feed_buffer ()
+        */
+       PBD::Signal1<void, boost::weak_ptr<MidiSource> > DataRecorded;
+
        PBD::Signal0<void> RecordEnableChanged;
        PBD::Signal0<void> RecordSafeChanged;
 
+       void check_record_status (framepos_t transport_frame, bool can_record);
+
+       void transport_looped (framepos_t transport_frame);
+       void transport_stopped_wallclock (struct tm&, time_t, bool abort);
+
+       void adjust_buffering ();
+
   protected:
-       virtual int do_flush (RunContext context, bool force = false) = 0;
+       friend class Track;
+       int do_flush (RunContext context, bool force = false);
 
        void get_input_sources ();
-       void check_record_status (framepos_t transport_frame, bool can_record);
        void prepare_record_status (framepos_t /*capture_start_frame*/);
        void set_align_style_from_io();
        void setup_destructive_playlist ();
@@ -138,9 +166,6 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
                framecnt_t& rec_nframes, framecnt_t& rec_offset
                );
 
-       static framecnt_t disk_read_chunk_frames;
-       static framecnt_t disk_write_chunk_frames;
-
        struct CaptureInfo {
                framepos_t start;
                framecnt_t frames;
@@ -168,7 +193,7 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
 
        std::list<boost::shared_ptr<Source> > _last_capture_sources;
        std::vector<boost::shared_ptr<AudioFileSource> > capturing_sources;
-       
+
        static framecnt_t _chunk_frames;
 
        NoteMode                     _note_mode;
@@ -176,6 +201,12 @@ class LIBARDOUR_API DiskWriter : public DiskIOProcessor
        volatile gint                _num_captured_loops;
        framepos_t                   _accumulated_capture_offset;
 
+       /** A buffer that we use to put newly-arrived MIDI data in for
+           the GUI to read (so that it can update itself).
+       */
+       MidiBuffer                   _gui_feed_buffer;
+       mutable Glib::Threads::Mutex _gui_feed_buffer_mutex;
+
        void finish_capture (boost::shared_ptr<ChannelList> c);
 };