X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fmidi_diskstream.h;h=53c7a7e22cf92f0175612c4e49b0e778b914dbbe;hb=6698f5f686bef82b0c9568558c83a3b9b3344700;hp=7877bfaf1c4e3d24f9bd99009d91dff41aef28b6;hpb=79fc27de2ef9db51a8c7c69764b663a9921c5a40;p=ardour.git diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h index 7877bfaf1c..53c7a7e22c 100644 --- a/libs/ardour/ardour/midi_diskstream.h +++ b/libs/ardour/ardour/midi_diskstream.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -44,6 +45,8 @@ #include #include #include +#include + struct tm; namespace ARDOUR { @@ -60,28 +63,21 @@ class MidiDiskstream : public Diskstream public: MidiDiskstream (Session &, const string& name, Diskstream::Flag f = Recordable); MidiDiskstream (Session &, const XMLNode&); - - void set_io (ARDOUR::IO& io); - - MidiDiskstream& ref() { _refcnt++; return *this; } - //void unref() { if (_refcnt) _refcnt--; if (_refcnt == 0) delete this; } - //uint32_t refcnt() const { return _refcnt; } + ~MidiDiskstream(); float playback_buffer_load() const; float capture_buffer_load() const; - - //void set_align_style (AlignStyle); - //void set_persistent_align_style (AlignStyle); + + void get_playback(MidiBuffer& dst, nframes_t start, nframes_t end); void set_record_enabled (bool yn); - //void set_speed (double); - int use_playlist (Playlist *); + boost::shared_ptr midi_playlist () { return boost::dynamic_pointer_cast(_playlist); } + + int use_playlist (boost::shared_ptr); int use_new_playlist (); int use_copy_playlist (); - Playlist *playlist () { return _playlist; } - /* stateful */ XMLNode& get_state(void); @@ -89,7 +85,11 @@ class MidiDiskstream : public Diskstream void monitor_input (bool); - //void handle_input_change (IOChange, void *src); + boost::shared_ptr write_source () { return _write_source; } + + int set_destructive (bool yn); // doom! + + void set_note_mode (NoteMode m); protected: friend class Session; @@ -101,54 +101,35 @@ class MidiDiskstream : public Diskstream void set_pending_overwrite(bool); int overwrite_existing_buffers (); - void set_block_size (jack_nframes_t); - int internal_playback_seek (jack_nframes_t distance); - int can_internal_playback_seek (jack_nframes_t distance); + void set_block_size (nframes_t); + int internal_playback_seek (nframes_t distance); + int can_internal_playback_seek (nframes_t distance); int rename_write_sources (); void reset_write_sources (bool, bool force = false); void non_realtime_input_change (); - uint32_t read_data_count() const { return _read_data_count; } - uint32_t write_data_count() const { return _write_data_count; } - protected: - friend class Auditioner; - int seek (jack_nframes_t which_sample, bool complete_refill = false); + int seek (nframes_t which_sample, bool complete_refill = false); protected: friend class MidiTrack; - int process (jack_nframes_t transport_frame, jack_nframes_t nframes, jack_nframes_t offset, bool can_record, bool rec_monitors_input); - bool commit (jack_nframes_t nframes); + int process (nframes_t transport_frame, nframes_t nframes, nframes_t offset, bool can_record, bool rec_monitors_input); + bool commit (nframes_t nframes); private: - /* use unref() to destroy a diskstream */ - ~MidiDiskstream(); - - MidiPlaylist* _playlist; - - /*Tthe two central butler operations */ - int do_flush (Session::RunContext context, bool force = false) { return 0; } - int do_refill () { return 0; } + /* The two central butler operations */ + int do_flush (Session::RunContext context, bool force = false); + int do_refill (); - int do_refill_with_alloc() { return 0; } - - int read (RawMidi* buf, RawMidi* mixdown_buffer, char * workbuf, jack_nframes_t& start, jack_nframes_t cnt, bool reversed); + int do_refill_with_alloc(); - /* XXX fix this redundancy ... */ - - //void playlist_changed (Change); - //void playlist_modified (); - void playlist_deleted (Playlist*); + int read (nframes_t& start, nframes_t cnt, bool reversed); void finish_capture (bool rec_monitors_input); void transport_stopped (struct tm&, time_t, bool abort); - - struct CaptureInfo { - uint32_t start; - uint32_t frames; - }; + void transport_looped (nframes_t transport_frame); void init (Diskstream::Flag); @@ -158,19 +139,24 @@ class MidiDiskstream : public Diskstream void allocate_temporary_buffers (); - //bool realtime_set_speed (double, bool global_change); - void non_realtime_set_speed (); - int use_pending_capture_data (XMLNode& node); void get_input_sources (); - void check_record_status (jack_nframes_t transport_frame, jack_nframes_t nframes, bool can_record); + void check_record_status (nframes_t transport_frame, nframes_t nframes, bool can_record); void set_align_style_from_io(); - void setup_destructive_playlist (); - void use_destructive_playlist (); - std::list _last_capture_regions; - std::vector _capturing_sources; + void engage_record_enable (); + void disengage_record_enable (); + + /* FIXME: too much code duplication in this class because of lack of ChannelInfo */ + + MidiRingBuffer* _playback_buf; + MidiRingBuffer* _capture_buf; + MidiPort* _source_port; + boost::shared_ptr _write_source; + RingBufferNPT* _capture_transition_buf; + nframes_t _last_flush_frame; + NoteMode _note_mode; }; }; /* namespace ARDOUR */