X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fmidi%2B%2B2%2Fmmc.cc;h=d722a816eef104932a99669b875aed6bfd09de0b;hb=fb8bc4e8c97b4977b9698ba92b9ff7a8b9c54a5c;hp=69bdabf1e52f68fbaaf3482364919ca37152f459;hpb=4885f29be158999626eb6dfa5507fe2258d388b0;p=ardour.git diff --git a/libs/midi++2/mmc.cc b/libs/midi++2/mmc.cc index 69bdabf1e5..d722a816ee 100644 --- a/libs/midi++2/mmc.cc +++ b/libs/midi++2/mmc.cc @@ -21,17 +21,30 @@ #include #include -#include "control_protocol/timecode.h" +#include "timecode/time.h" +#include "timecode/bbt_time.h" + #include "pbd/error.h" + #include "midi++/mmc.h" #include "midi++/port.h" #include "midi++/parser.h" -#include "midi++/manager.h" + +#ifndef __INT_MAX__ // 'ssize_t' won't be defined yet +typedef long ssize_t; +#endif using namespace std; using namespace MIDI; using namespace PBD; +/** + * As libtimecode is linked statically to libmidi++ this + * is necessary to pull in all the symbols from libtimecode + * so they are exported for other users of libtimecode. + */ +double tmp = Timecode::BBT_Time::ticks_per_beat; + static std::map mmc_cmd_map; static void build_mmc_cmd_map () { @@ -194,37 +207,42 @@ static void build_mmc_cmd_map () mmc_cmd_map.insert (newpair); } - -MachineControl::MachineControl (jack_client_t* jack) +MachineControl::MachineControl () { build_mmc_cmd_map (); - _receive_device_id = 0; + _receive_device_id = 0x7f; _send_device_id = 0x7f; +} + +void +MachineControl::set_ports (MIDI::Port* ip, MIDI::Port* op) +{ + port_connections.drop_connections (); - _input_port = Manager::instance()->add_port (new Port ("MMC in", Port::IsInput, jack)); - _output_port = Manager::instance()->add_port (new Port ("MMC out", Port::IsOutput, jack)); + _input_port = ip; + _output_port = op; _input_port->parser()->mmc.connect_same_thread (port_connections, boost::bind (&MachineControl::process_mmc_message, this, _1, _2, _3)); - _input_port->parser()->start.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_start, this, _1, _2)); - _input_port->parser()->contineu.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_continue, this, _1, _2)); - _input_port->parser()->stop.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_stop, this, _1, _2)); + _input_port->parser()->start.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_start, this)); + _input_port->parser()->contineu.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_continue, this)); + _input_port->parser()->stop.connect_same_thread (port_connections, boost::bind (&MachineControl::spp_stop, this)); } void -MachineControl::set_receive_device_id (byte id) +MachineControl::set_receive_device_id (MIDI::byte id) { _receive_device_id = id & 0x7f; } void -MachineControl::set_send_device_id (byte id) +MachineControl::set_send_device_id (MIDI::byte id) { _send_device_id = id & 0x7f; } bool -MachineControl::is_mmc (byte *sysex_buf, size_t len) +MachineControl::is_mmc (MIDI::byte *sysex_buf, size_t len) { if (len < 4 || len > 48) { return false; @@ -243,7 +261,7 @@ MachineControl::is_mmc (byte *sysex_buf, size_t len) } void -MachineControl::process_mmc_message (Parser &, byte *msg, size_t len) +MachineControl::process_mmc_message (Parser &, MIDI::byte *msg, size_t len) { size_t skiplen; byte *mmc_msg; @@ -266,7 +284,7 @@ MachineControl::process_mmc_message (Parser &, byte *msg, size_t len) cerr << endl; #endif - if (msg[1] != 0x7f && msg[1] != _receive_device_id) { + if (_receive_device_id != 0x7f && msg[1] != 0x7f && msg[1] != _receive_device_id) { return; } @@ -450,7 +468,7 @@ MachineControl::process_mmc_message (Parser &, byte *msg, size_t len) } int -MachineControl::do_masked_write (byte *msg, size_t len) +MachineControl::do_masked_write (MIDI::byte *msg, size_t len) { /* return the number of bytes "consumed" */ @@ -476,7 +494,7 @@ MachineControl::do_masked_write (byte *msg, size_t len) } void -MachineControl::write_track_status (byte *msg, size_t /*len*/, byte reg) +MachineControl::write_track_status (MIDI::byte *msg, size_t /*len*/, MIDI::byte reg) { size_t n; ssize_t base_track; @@ -565,7 +583,7 @@ MachineControl::write_track_status (byte *msg, size_t /*len*/, byte reg) } int -MachineControl::do_locate (byte *msg, size_t /*msglen*/) +MachineControl::do_locate (MIDI::byte *msg, size_t /*msglen*/) { if (msg[2] == 0) { warning << "MIDI::MMC: locate [I/F] command not supported" @@ -580,7 +598,7 @@ MachineControl::do_locate (byte *msg, size_t /*msglen*/) } int -MachineControl::do_step (byte *msg, size_t /*msglen*/) +MachineControl::do_step (MIDI::byte *msg, size_t /*msglen*/) { int steps = msg[2] & 0x3f; @@ -593,7 +611,7 @@ MachineControl::do_step (byte *msg, size_t /*msglen*/) } int -MachineControl::do_shuttle (byte *msg, size_t /*msglen*/) +MachineControl::do_shuttle (MIDI::byte *msg, size_t /*msglen*/) { size_t forward; byte sh = msg[2]; @@ -633,7 +651,7 @@ MachineControl::enable_send (bool yn) * @param c command. */ void -MachineControl::send (MachineControlCommand const & c) +MachineControl::send (MachineControlCommand const & c, timestamp_t when) { if (_output_port == 0 || !_enable_send) { // cerr << "Not delivering MMC " << _mmc->port() << " - " << session_send_mmc << endl; @@ -643,27 +661,27 @@ MachineControl::send (MachineControlCommand const & c) MIDI::byte buffer[32]; MIDI::byte* b = c.fill_buffer (this, buffer); - if (_output_port->midimsg (buffer, b - buffer, 0)) { + if (_output_port->midimsg (buffer, b - buffer, when)) { error << "MMC: cannot send command" << endmsg; } } void -MachineControl::spp_start (Parser& parser, nframes_t timestamp) +MachineControl::spp_start () { - SPPStart (parser, timestamp); /* EMIT SIGNAL */ + SPPStart (); /* EMIT SIGNAL */ } void -MachineControl::spp_continue (Parser& parser, nframes_t timestamp) +MachineControl::spp_continue () { - SPPContinue (parser, timestamp); /* EMIT SIGNAL */ + SPPContinue (); /* EMIT SIGNAL */ } void -MachineControl::spp_stop (Parser& parser, nframes_t timestamp) +MachineControl::spp_stop () { - SPPStop (parser, timestamp); /* EMIT SIGNAL */ + SPPStop (); /* EMIT SIGNAL */ } MachineControlCommand::MachineControlCommand (MachineControl::Command c) @@ -692,7 +710,7 @@ MachineControlCommand::fill_buffer (MachineControl* mmc, MIDI::byte* b) const if (_command == MachineControl::cmdLocate) { *b++ = 0x6; // byte count *b++ = 0x1; // "TARGET" subcommand - *b++ = _time.hours; + *b++ = _time.hours % 24; *b++ = _time.minutes; *b++ = _time.seconds; *b++ = _time.frames;