Relative snap
[ardour.git] / libs / ardour / ardour / midi_scene_changer.h
index 2cc0464becce0fa060b7b77c56d727055fe97640..6eff899b8e517a4c30f3b999894b6f256ed4a2db 100644 (file)
 #ifndef __libardour_midi_scene_changer_h__
 #define __libardour_midi_scene_changer_h__
 
+#include <glibmm/threads.h>
+
 #include "ardour/scene_changer.h"
 
 namespace ARDOUR
 {
 
+class MIDISceneChange;
+
 class MIDISceneChanger : public SceneChanger
 {
     public:
@@ -41,30 +45,39 @@ class MIDISceneChanger : public SceneChanger
        void set_recording (bool);
        void locate (framepos_t);
 
+       /** Signal emitted whenever any relevant MIDI input is detected.
+        */
+       PBD::Signal0<void> MIDIInputActivity;
+
+       /** Signal emitted whenever any relevant MIDI output is sent.
+        */
+       PBD::Signal0<void> MIDIOutputActivity;
+
     private:
        typedef std::multimap<framepos_t,boost::shared_ptr<MIDISceneChange> > Scenes;
 
        MIDI::Port* input_port;
        boost::shared_ptr<MidiPort> output_port;
+       Glib::Threads::RWLock scene_lock;
        Scenes scenes;
        bool _recording;
-       framepos_t last_bank_message_time;
+       bool have_seen_bank_changes;
        framepos_t last_program_message_time;
        unsigned short current_bank;
        int last_delivered_program;
        int last_delivered_bank;
 
-       void gather ();
+       void gather (const Locations::LocationList&);
        bool recording () const;
        void jump_to (int bank, int program);
-       void deliver (MidiBuffer&, framepos_t, boost::shared_ptr<MIDISceneChange>);
+       void rt_deliver (MidiBuffer&, framepos_t, boost::shared_ptr<MIDISceneChange>);
+       void non_rt_deliver (boost::shared_ptr<MIDISceneChange>);
 
-       void bank_change_input (MIDI::Parser&, unsigned short);
-       void program_change_input (MIDI::Parser&, MIDI::byte);
-       void locations_changed (Locations::Change);
+       void bank_change_input (MIDI::Parser&, unsigned short, int channel);
+       void program_change_input (MIDI::Parser&, MIDI::byte, int channel);
+       void locations_changed ();
 
-       PBD::ScopedConnection incoming_bank_change_connection;
-       PBD::ScopedConnection incoming_program_change_connection;
+       PBD::ScopedConnectionList incoming_connections;
 };
 
 } // namespace