NOOP, remove trailing tabs/whitespace.
[ardour.git] / libs / midi++2 / mmc.cc
index 1b9481c9bf8127e1a89580ff4ebc6f78cc707c9f..d9ad0778654d6be853f0f85f6fc0b3a3b5a186d7 100644 (file)
@@ -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
@@ -22,6 +22,7 @@
 #include <map>
 
 #include "timecode/time.h"
+#include "timecode/bbt_time.h"
 
 #include "pbd/error.h"
 
@@ -37,6 +38,13 @@ 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<int,string> mmc_cmd_map;
 static void build_mmc_cmd_map ()
 {
@@ -248,7 +256,7 @@ MachineControl::is_mmc (MIDI::byte *sysex_buf, size_t len)
            sysex_buf[3] != 0x7) { /* MMC Response */
                return false;
        }
-       
+
        return true;
 }
 
@@ -276,7 +284,7 @@ MachineControl::process_mmc_message (Parser &, MIDI::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;
        }
 
@@ -299,7 +307,7 @@ MachineControl::process_mmc_message (Parser &, MIDI::byte *msg, size_t len)
                }
 
 #if 0
-               cerr << "+++ MMC type " 
+               cerr << "+++ MMC type "
                     << hex
                     << ((int) *mmc_msg)
                     << dec
@@ -439,7 +447,7 @@ MachineControl::process_mmc_message (Parser &, MIDI::byte *msg, size_t len)
                        break;
                }
 
-               /* increase skiplen to cover the command byte and 
+               /* increase skiplen to cover the command byte and
                   count byte (if it existed).
                */
 
@@ -457,7 +465,7 @@ MachineControl::process_mmc_message (Parser &, MIDI::byte *msg, size_t len)
                len -= skiplen;
 
        } while (len > 1); /* skip terminating EOX byte */
-}              
+}
 
 int
 MachineControl::do_masked_write (MIDI::byte *msg, size_t len)
@@ -465,7 +473,7 @@ MachineControl::do_masked_write (MIDI::byte *msg, size_t len)
        /* return the number of bytes "consumed" */
 
        int retval = msg[1] + 2; /* bytes following + 2 */
-       
+
        switch (msg[2]) {
        case 0x4f:  /* Track Record Ready Status */
                write_track_status (&msg[3], len - 3, msg[2]);
@@ -500,15 +508,15 @@ MachineControl::write_track_status (MIDI::byte *msg, size_t /*len*/, MIDI::byte
           bit 4: aux track b
 
           the format of the message (its an MMC Masked Write) is:
-          
+
           0x41      Command Code
           <count>   byte count of following data
           <name>    byte value of the field being written
-          <byte #>  byte number of target byte in the 
+          <byte #>  byte number of target byte in the
           bitmap being written to
           <mask>    ones in the mask indicate which bits will be changed
           <data>    new data for the byte being written
-          
+
           by the time this code is executing, msg[0] is the
           byte number of the target byte. if its zero, we
           are writing to a special byte in the standard
@@ -516,20 +524,20 @@ MachineControl::write_track_status (MIDI::byte *msg, size_t /*len*/, MIDI::byte
           special. hence the bits for tracks 1 + 2 are bits
           5 and 6 of the first byte of the track
           bitmap. so:
-          
-          change track 1:  msg[0] = 0;       << first byte of track bitmap 
+
+          change track 1:  msg[0] = 0;       << first byte of track bitmap
                            msg[1] = 0100000; << binary: bit 5 set
-       
+
           change track 2:  msg[0] = 0;       << first byte of track bitmap
                            msg[1] = 1000000; << binary: bit 6 set
-       
+
           change track 3:  msg[0] = 1;       << second byte of track bitmap
                            msg[1] = 0000001; << binary: bit 0 set
-       
+
           the (msg[0] * 8) - 6 computation is an attempt to
           extract the value of the first track: ie. the one
           that would be indicated by bit 0 being set.
-               
+
            so, if msg[0] = 0, msg[1] = 0100000 (binary),
           what happens is that base_track = -5, but by the
           time we check the correct bit, n = 5, and so the
@@ -557,19 +565,19 @@ MachineControl::write_track_status (MIDI::byte *msg, size_t /*len*/, MIDI::byte
                        */
 
                        bool val = (msg[2] & (1<<n));
-                       
+
                        switch (reg) {
                        case 0x4f:
                                trackRecordStatus[base_track+n] = val;
                                TrackRecordStatusChange (*this, base_track+n, val);
                                break;
-                               
+
                        case 0x62:
                                trackMute[base_track+n] = val;
                                TrackMuteChange (*this, base_track+n, val);
                                break;
                        }
-               } 
+               }
 
        }
 }
@@ -619,13 +627,13 @@ MachineControl::do_shuttle (MIDI::byte *msg, size_t /*msglen*/)
        } else {
                forward = true;
        }
-       
+
        left_shift = (sh & 0x38);
 
        integral = ((sh & 0x7) << left_shift) | (sm >> (7 - left_shift));
        fractional = ((sm << left_shift) << 7) | sl;
 
-       shuttle_speed = integral + 
+       shuttle_speed = integral +
                ((float)fractional / (1 << (14 - left_shift)));
 
        Shuttle (*this, shuttle_speed, forward);
@@ -643,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;
@@ -653,7 +661,7 @@ 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;
        }
 }
@@ -689,7 +697,7 @@ MachineControlCommand::MachineControlCommand (Timecode::Time t)
 
 }
 
-MIDI::byte * 
+MIDI::byte *
 MachineControlCommand::fill_buffer (MachineControl* mmc, MIDI::byte* b) const
 {
        *b++ = 0xf0; // SysEx
@@ -702,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;