X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fmidi%2B%2B2%2Fmidi%2B%2B%2Fparser.h;h=44897f9d8e1a9046ef62eb8a9497c67e274ef16b;hb=46624ea3560584446ef923b993e93e966355a327;hp=36d19f3da90a566333d791e34685cc06c20ed2b4;hpb=79986643c0c904f6574bb5323e2233a43a9e622e;p=ardour.git diff --git a/libs/midi++2/midi++/parser.h b/libs/midi++2/midi++/parser.h index 36d19f3da9..44897f9d8e 100644 --- a/libs/midi++2/midi++/parser.h +++ b/libs/midi++2/midi++/parser.h @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #ifndef __midi_parse_h__ @@ -24,25 +23,35 @@ #include #include -#include +#include "pbd/signals.h" -#include +#include "midi++/types.h" namespace MIDI { class Port; class Parser; -typedef sigc::signal OneByteSignal; -typedef sigc::signal TwoByteSignal; -typedef sigc::signal PitchBendSignal; -typedef sigc::signal Signal; +typedef PBD::Signal1 ZeroByteSignal; +typedef PBD::Signal2 TimestampedSignal; +typedef PBD::Signal2 OneByteSignal; +typedef PBD::Signal2 TwoByteSignal; +typedef PBD::Signal2 PitchBendSignal; +typedef PBD::Signal3 Signal; -class Parser : public sigc::trackable { +class Parser { public: - Parser (Port &p); + Parser (); ~Parser (); + + /* sets the time that will be reported for any MTC or MIDI Clock + message the next time ::scanner() parses such a message. It should + therefore be set before every byte passed into ::scanner(). + */ + framecnt_t get_timestamp() const { return _timestamp; } + void set_timestamp (const framecnt_t timestamp) { _timestamp = timestamp; } + /* signals that anyone can connect to */ OneByteSignal bank_change; @@ -62,11 +71,11 @@ class Parser : public sigc::trackable { OneByteSignal channel_program_change[16]; PitchBendSignal channel_pitchbend[16]; TwoByteSignal channel_controller[16]; - sigc::signal channel_active_preparse[16]; - sigc::signal channel_active_postparse[16]; - - OneByteSignal mtc_quarter_frame; + ZeroByteSignal channel_active_preparse[16]; + ZeroByteSignal channel_active_postparse[16]; + OneByteSignal mtc_quarter_frame; /* see below for more useful signals */ + Signal mtc; Signal raw_preparse; Signal raw_postparse; Signal any; @@ -75,18 +84,16 @@ class Parser : public sigc::trackable { Signal position; Signal song; - Signal mtc; - sigc::signal mtc_qtr; + ZeroByteSignal all_notes_off; + ZeroByteSignal tune; + ZeroByteSignal active_sense; + ZeroByteSignal reset; + ZeroByteSignal eox; - sigc::signal all_notes_off; - sigc::signal tune; - sigc::signal timing; - sigc::signal start; - sigc::signal stop; - sigc::signal contineu; /* note spelling */ - sigc::signal active_sense; - sigc::signal reset; - sigc::signal eox; + TimestampedSignal timing; + TimestampedSignal start; + TimestampedSignal stop; + TimestampedSignal contineu; /* note spelling */ /* This should really be protected, but then derivatives of Port can't access it. @@ -98,13 +105,12 @@ class Parser : public sigc::trackable { const char *midi_event_type_name (MIDI::eventType); void trace (bool onoff, std::ostream *o, const std::string &prefix = ""); bool tracing() { return trace_stream != 0; } - Port &port() { return _port; } void set_offline (bool); bool offline() const { return _offline; } - sigc::signal OfflineStatusChanged; + PBD::Signal0 OfflineStatusChanged; - sigc::signal edit; + PBD::Signal2 edit; void set_mmc_forwarding (bool yn) { _mmc_forward = yn; @@ -112,20 +118,15 @@ class Parser : public sigc::trackable { /* MTC */ - enum MTC_Status { - MTC_Stopped = 0, - MTC_Forward, - MTC_Backward - }; - MTC_FPS mtc_fps() const { return _mtc_fps; } MTC_Status mtc_running() const { return _mtc_running; } const byte *mtc_current() const { return _mtc_time; } bool mtc_locked() const { return _mtc_locked; } - - sigc::signal mtc_status; - sigc::signal mtc_skipped; - sigc::signal mtc_time; + + PBD::Signal3 mtc_qtr; + PBD::Signal3 mtc_time; + PBD::Signal1 mtc_status; + PBD::Signal0 mtc_skipped; void set_mtc_forwarding (bool yn) { _mtc_forward = yn; @@ -134,13 +135,12 @@ class Parser : public sigc::trackable { void reset_mtc_state (); private: - Port &_port; /* tracing */ - + std::ostream *trace_stream; std::string trace_prefix; void trace_event (Parser &p, byte *msg, size_t len); - sigc::connection trace_connection; + PBD::ScopedConnection trace_connection; size_t message_counter[256]; @@ -162,13 +162,15 @@ class Parser : public sigc::trackable { bool _mmc_forward; bool _mtc_forward; int expected_mtc_quarter_frame_code; - byte _mtc_time[4]; - byte _qtr_mtc_time[4]; + byte _mtc_time[5]; + byte _qtr_mtc_time[5]; unsigned long consecutive_qtr_frame_cnt; MTC_FPS _mtc_fps; MTC_Status _mtc_running; bool _mtc_locked; byte last_qtr_frame; + + framecnt_t _timestamp; ParseState pre_variable_state; MIDI::eventType pre_variable_msgtype;