X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fmidi_track.h;h=018b5c4f601e33c17ccf49606726a79f8b861908;hb=7dffe671da3489206f06d57c96595d5eaabb9ec4;hp=c273395a74be2b135a800beb72fd98f038769934;hpb=8713667ec1a6cc9ba56c07f763e5a422cc47fbef;p=ardour.git diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index c273395a74..018b5c4f60 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -1,6 +1,6 @@ /* Copyright (C) 2006 Paul Davis - Written by Dave Robillard + Author: David Robillard This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,6 +22,7 @@ #include "ardour/track.h" #include "ardour/midi_ring_buffer.h" +#include "ardour/midi_state_tracker.h" namespace ARDOUR { @@ -30,36 +31,40 @@ class Session; class MidiDiskstream; class MidiPlaylist; class RouteGroup; +class SMFSource; class MidiTrack : public Track { public: MidiTrack (Session&, string name, Route::Flag f = Route::Flag (0), TrackMode m = Normal); - MidiTrack (Session&, const XMLNode&, int); ~MidiTrack (); - int roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, - int declick, bool can_record, bool rec_monitors_input); + int init (); - void handle_transport_stopped (bool abort, bool did_locate, bool flush_processors); + int roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, int declick, bool& need_butler); - boost::shared_ptr midi_diskstream() const; + void realtime_handle_transport_stopped (); + void realtime_locate (); - int use_diskstream (string name); - int use_diskstream (const PBD::ID& id); + boost::shared_ptr create_diskstream (); + void set_diskstream (boost::shared_ptr); + void set_record_enabled (bool yn, void *src); - void set_latency_delay (nframes_t); + DataType data_type () const { + return DataType::MIDI; + } - int export_stuff (BufferSet& bufs, nframes_t nframes, sframes_t end_frame); + int export_stuff (BufferSet& bufs, framecnt_t nframes, framepos_t end_frame); - void freeze (InterThreadInfo&); + void freeze_me (InterThreadInfo&); void unfreeze (); boost::shared_ptr bounce (InterThreadInfo&); - boost::shared_ptr bounce_range ( - nframes_t start, nframes_t end, InterThreadInfo&, bool enable_processing); + boost::shared_ptr bounce_range ( + framepos_t start, framepos_t end, InterThreadInfo&, bool enable_processing + ); - int set_state(const XMLNode&, int version); + int set_state (const XMLNode&, int version); void midi_panic(void); bool write_immediate_event(size_t size, const uint8_t* buf); @@ -67,12 +72,12 @@ public: /** A control that will send "immediate" events to a MIDI track when twiddled */ struct MidiControl : public AutomationControl { MidiControl(MidiTrack* route, const Evoral::Parameter& param, - boost::shared_ptr al = boost::shared_ptr()) + boost::shared_ptr al = boost::shared_ptr()) : AutomationControl (route->session(), param, al) , _route (route) {} - void set_value (float val); + void set_value (double val); MidiTrack* _route; }; @@ -82,39 +87,64 @@ public: bool step_editing() const { return _step_editing; } void set_step_editing (bool yn); - MidiRingBuffer& step_edit_ring_buffer() { return _step_edit_ring_buffer; } + MidiRingBuffer& step_edit_ring_buffer() { return _step_edit_ring_buffer; } - uint8_t default_channel() const { return _default_channel; } - void set_default_channel (uint8_t chn); + PBD::Signal1 StepEditStatusChange; bool midi_thru() const { return _midi_thru; } void set_midi_thru (bool yn); + boost::shared_ptr write_source (uint32_t n = 0); + void set_channel_mode (ChannelMode, uint16_t); + ChannelMode get_channel_mode (); + uint16_t get_channel_mask (); + boost::shared_ptr midi_playlist (); + + bool bounceable () const { + return false; + } + + PBD::Signal1 > DataRecorded; + boost::shared_ptr get_gui_feed_buffer () const; + + void set_input_active (bool); + bool input_active () const; + PBD::Signal0 InputActiveChanged; + protected: XMLNode& state (bool full); + + bool should_monitor () const; + bool send_silence () const; + + void act_on_mute (); + + private: + + virtual boost::shared_ptr diskstream_factory (XMLNode const &); - int _set_state (const XMLNode&, int, bool call_base); + boost::shared_ptr midi_diskstream () const; -private: - void write_out_of_band_data ( - BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes); + void write_out_of_band_data (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, framecnt_t nframes); - int set_diskstream (boost::shared_ptr ds); - void use_new_diskstream (); void set_state_part_two (); void set_state_part_three (); - MidiRingBuffer _immediate_events; - MidiRingBuffer _step_edit_ring_buffer; + MidiRingBuffer _immediate_events; + MidiRingBuffer _step_edit_ring_buffer; NoteMode _note_mode; bool _step_editing; - uint8_t _default_channel; bool _midi_thru; + bool _input_active; + + int no_roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame, bool state_changing); + void push_midi_input_to_step_edit_ringbuffer (framecnt_t nframes); + void diskstream_data_recorded (boost::weak_ptr); + PBD::ScopedConnection _diskstream_data_recorded_connection; - int no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame, - bool state_changing, bool can_record, bool rec_monitors_input); - void push_midi_input_to_step_edit_ringbuffer (nframes_t nframes); + void track_input_active (IOChange, void*); + void map_input_active (bool); }; } /* namespace ARDOUR*/