X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fmidi%2B%2B2%2Fmidi%2B%2B%2Fmmc.h;h=caf1605c290ee522b9c614b96b494be3514c47e6;hb=00caabf73583fa029601b7d4e9ccdb9b2da7925c;hp=687d0e14d89d06c2c10f64428da4c7ecbd76f6f5;hpb=aae367b63c9b619db1e40f27dc334c6987219481;p=ardour.git diff --git a/libs/midi++2/midi++/mmc.h b/libs/midi++2/midi++/mmc.h index 687d0e14d8..caf1605c29 100644 --- a/libs/midi++2/midi++/mmc.h +++ b/libs/midi++2/midi++/mmc.h @@ -1,5 +1,5 @@ /* - Copyright (C) 2000 Paul Barton-Davis + Copyright (C) 2000 Paul Barton-Davis 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 @@ -20,20 +20,30 @@ #ifndef __midipp_mmc_h_h__ #define __midipp_mmc_h_h__ +#include "timecode/time.h" + #include "pbd/signals.h" +#include "pbd/ringbuffer.h" + +#include "midi++/libmidi_visibility.h" #include "midi++/types.h" +#include "midi++/parser.h" + +namespace ARDOUR { + class PortEngine; +} namespace MIDI { class Port; class Parser; +class MachineControlCommand; -class MachineControl +/** Class to handle incoming and outgoing MIDI machine control messages */ +class LIBMIDIPP_API MachineControl { public: typedef PBD::Signal1 MMCSignal; - typedef byte CommandSignature[60]; - typedef byte ResponseSignature[60]; enum Command { cmdStop = 0x1, @@ -50,10 +60,10 @@ class MachineControl cmdChase = 0xB, cmdCommandErrorReset = 0xC, cmdMmcReset = 0xD, - + cmdIllegalMackieJogStart = 0x20, cmdIllegalMackieJogStop = 0x21, - + cmdWrite = 0x40, cmdMaskedWrite = 0x41, cmdRead = 0x42, @@ -83,25 +93,28 @@ class MachineControl cmdWait = 0x7C, cmdResume = 0x7F }; - - MachineControl (Port &port, - float MMCVersion, - CommandSignature &cs, - ResponseSignature &rs); - - Port &port() { return _port; } - + + MachineControl (); + + void set_ports (MIDI::Port* input, MIDI::Port* output); + + Port* input_port() { return _input_port; } + Port* output_port() { return _output_port; } + void set_receive_device_id (byte id); void set_send_device_id (byte id); byte receive_device_id () const { return _receive_device_id; } byte send_device_id () const { return _send_device_id; } + void enable_send (bool); + bool send_enabled () const { return _enable_send; } + void send (MachineControlCommand const &, timestamp_t when); static bool is_mmc (byte *sysex_buf, size_t len); /* Signals to connect to if you want to run "callbacks" when certain MMC commands are received. */ - + MMCSignal Stop; MMCSignal Play; MMCSignal DeferredPlay; @@ -139,26 +152,30 @@ class MachineControl MMCSignal Wait; MMCSignal Resume; + PBD::Signal0 SPPStart; + PBD::Signal0 SPPContinue; + PBD::Signal0 SPPStop; + /* The second argument is the shuttle speed, the third is true if the direction is "forwards", false for "reverse" */ - + PBD::Signal3 Shuttle; /* The second argument specifies the desired track record enabled status. */ - PBD::Signal3 + PBD::Signal3 TrackRecordStatusChange; - + /* The second argument specifies the desired track record enabled status. */ - PBD::Signal3 + PBD::Signal3 TrackMuteChange; - + /* The second argument points to a byte array containing the locate target value in MMC Standard Time Code format (5 bytes, roughly: hrs/mins/secs/frames/subframes) @@ -167,23 +184,18 @@ class MachineControl PBD::Signal2 Locate; /* The second argument is the number of steps to jump */ - + PBD::Signal2 Step; - - protected: #define MMC_NTRACKS 48 - /* MMC Information fields (think "registers") */ - - CommandSignature commandSignature; - ResponseSignature responseSignature; + /* note: these are not currently in use */ byte updateRate; byte responseError; byte commandError; byte commandErrorLevel; - + byte motionControlTally; byte velocityTally; byte stopMode; @@ -253,17 +265,40 @@ class MachineControl private: byte _receive_device_id; byte _send_device_id; - MIDI::Port &_port; + Port* _input_port; + Port* _output_port; + bool _enable_send; ///< true if MMC sending is enabled void process_mmc_message (Parser &p, byte *, size_t len); - PBD::ScopedConnection mmc_connection; + PBD::ScopedConnectionList port_connections; ///< connections to our parser for incoming data int do_masked_write (byte *, size_t len); int do_locate (byte *, size_t len); int do_step (byte *, size_t len); int do_shuttle (byte *, size_t len); - + void write_track_status (byte *, size_t len, byte reg); + void spp_start (); + void spp_continue (); + void spp_stop (); +}; + +/** Class to describe a MIDI machine control command to be sent. + * In an ideal world we might use a class hierarchy for this, but objects of this type + * have to be allocated off the stack for RT safety. + */ +class LIBMIDIPP_API MachineControlCommand +{ +public: + MachineControlCommand () : _command (MachineControl::Command (0)) {} + MachineControlCommand (MachineControl::Command); + MachineControlCommand (Timecode::Time); + + MIDI::byte* fill_buffer (MachineControl *mmc, MIDI::byte *) const; + +private: + MachineControl::Command _command; + Timecode::Time _time; }; } // namespace MIDI