X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fmidi_diskstream.h;h=91fb891f17705c651101fbba62294c2154328138;hb=0622a0cc3068a06d328119e90b7d9c5f5a84df32;hp=23ae7addb0e9a06f900f504aeb2e7c1a28ad7847;hpb=5558b3cf06b98060438d1e68c8d5d2f4a9c2f8f6;p=ardour.git diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h index 23ae7addb0..91fb891f17 100644 --- a/libs/ardour/ardour/midi_diskstream.h +++ b/libs/ardour/ardour/midi_diskstream.h @@ -52,7 +52,7 @@ class SMFSource; class Send; class Session; -class MidiDiskstream : public Diskstream +class LIBARDOUR_API MidiDiskstream : public Diskstream { public: MidiDiskstream (Session &, const string& name, Diskstream::Flag f = Recordable); @@ -63,6 +63,7 @@ class MidiDiskstream : public Diskstream float capture_buffer_load() const; void get_playback (MidiBuffer& dst, framecnt_t); + void flush_playback (framepos_t, framepos_t); void set_record_enabled (bool yn); @@ -75,12 +76,13 @@ class MidiDiskstream : public Diskstream int use_copy_playlist (); bool set_name (std::string const &); + bool set_write_source_name (const std::string& str); /* stateful */ XMLNode& get_state(void); int set_state(const XMLNode&, int version); - void ensure_jack_monitors_input (bool); + void ensure_input_monitoring (bool); boost::shared_ptr write_source () { return _write_source; } @@ -88,29 +90,6 @@ class MidiDiskstream : public Diskstream void set_note_mode (NoteMode m); - uint16_t get_channel_mask() { - uint16_t playback_mask = _playback_buf->get_channel_mask(); -#ifndef NDEBUG - uint16_t capture_mask = _capture_buf->get_channel_mask(); - assert(playback_mask == capture_mask); -#endif - return playback_mask; - } - - void set_channel_mode(ChannelMode mode, uint16_t mask) { - _playback_buf->set_channel_mode(mode, mask); - _capture_buf->set_channel_mode(mode, mask); - } - - ChannelMode get_channel_mode() { - ChannelMode playback_mode = _playback_buf->get_channel_mode(); -#ifndef NDEBUG - ChannelMode capture_mode = _capture_buf->get_channel_mode(); - assert(playback_mode == capture_mode); -#endif - return playback_mode; - } - /** 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 () @@ -133,20 +112,20 @@ class MidiDiskstream : public Diskstream void set_block_size (pframes_t); int internal_playback_seek (framecnt_t distance); int can_internal_playback_seek (framecnt_t distance); - std::list > steal_write_sources(); + std::string steal_write_source_name(); void reset_write_sources (bool, bool force = false); void non_realtime_input_change (); void non_realtime_locate (framepos_t location); static void set_readahead_frames (framecnt_t frames_ahead) { midi_readahead = frames_ahead; } - protected: - int seek (framepos_t which_sample, bool complete_refill = false); - protected: friend class MidiTrack; + friend class Auditioner; + int seek (framepos_t which_sample, bool complete_refill = false); - int process (framepos_t transport_frame, pframes_t nframes, framecnt_t &); + int process (BufferSet&, framepos_t transport_frame, pframes_t nframes, framecnt_t &, bool need_diskstream); + frameoffset_t calculate_playback_distance (pframes_t nframes); bool commit (framecnt_t nframes); static framecnt_t midi_readahead; @@ -183,22 +162,25 @@ class MidiDiskstream : public Diskstream void adjust_playback_buffering () {} void adjust_capture_buffering () {} - void engage_record_enable (); - void disengage_record_enable (); - + bool prep_record_enable (); + bool prep_record_disable (); + MidiRingBuffer* _playback_buf; MidiRingBuffer* _capture_buf; boost::weak_ptr _source_port; boost::shared_ptr _write_source; NoteMode _note_mode; - volatile gint _frames_written_to_ringbuffer; - volatile gint _frames_read_from_ringbuffer; + gint _frames_written_to_ringbuffer; + gint _frames_read_from_ringbuffer; + volatile gint _frames_pending_write; + 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::Mutex _gui_feed_buffer_mutex; + mutable Glib::Threads::Mutex _gui_feed_buffer_mutex; }; }; /* namespace ARDOUR */