3 Copyright (C) 1999-2002 Paul Davis
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
29 #include <midi++/mmc.h>
30 #include <midi++/port.h>
31 #include <midi++/manager.h>
32 #include <pbd/error.h>
33 #include <glibmm/thread.h>
34 #include <pbd/pthread_utils.h>
36 #include <ardour/configuration.h>
37 #include <ardour/audioengine.h>
38 #include <ardour/session.h>
39 #include <ardour/audio_track.h>
40 #include <ardour/audio_diskstream.h>
41 #include <ardour/slave.h>
42 #include <ardour/cycles.h>
43 #include <ardour/smpte.h>
48 using namespace ARDOUR;
52 MachineControl::CommandSignature MMC_CommandSignature;
53 MachineControl::ResponseSignature MMC_ResponseSignature;
55 MultiAllocSingleReleasePool Session::MIDIRequest::pool ("midi", sizeof (Session::MIDIRequest), 1024);
58 Session::use_config_midi_ports ()
62 if (default_mmc_port) {
63 set_mmc_port (default_mmc_port->name());
68 if (default_mtc_port) {
69 set_mtc_port (default_mtc_port->name());
74 if (default_midi_port) {
75 set_midi_port (default_midi_port->name());
84 /***********************************************************************
86 **********************************************************************/
89 Session::set_mtc_port (string port_tag)
93 if (port_tag.length() == 0) {
95 if (_slave && ((ms = dynamic_cast<MTC_Slave*> (_slave)) != 0)) {
96 error << _("Ardour is slaved to MTC - port cannot be reset") << endmsg;
100 if (_mtc_port == 0) {
110 if ((port = MIDI::Manager::instance()->port (port_tag)) == 0) {
111 error << string_compose (_("unknown port %1 requested for MTC"), port_tag) << endl;
117 if (_slave && ((ms = dynamic_cast<MTC_Slave*> (_slave)) != 0)) {
121 Config->set_mtc_port_name (port_tag);
124 MTC_PortChanged(); /* EMIT SIGNAL */
125 change_midi_ports ();
131 Session::set_mmc_receive_device_id (uint32_t device_id)
134 mmc->set_receive_device_id (device_id);
139 Session::set_mmc_send_device_id (uint32_t device_id)
142 mmc->set_send_device_id (device_id);
147 Session::set_mmc_port (string port_tag)
149 MIDI::byte old_recv_device_id = 0;
150 MIDI::byte old_send_device_id = 0;
151 bool reset_id = false;
153 if (port_tag.length() == 0) {
154 if (_mmc_port == 0) {
163 if ((port = MIDI::Manager::instance()->port (port_tag)) == 0) {
170 old_recv_device_id = mmc->receive_device_id();
171 old_recv_device_id = mmc->send_device_id();
176 mmc = new MIDI::MachineControl (*_mmc_port, 1.0,
177 MMC_CommandSignature,
178 MMC_ResponseSignature);
181 mmc->set_receive_device_id (old_recv_device_id);
182 mmc->set_send_device_id (old_send_device_id);
186 (mem_fun (*this, &Session::mmc_deferred_play));
187 mmc->DeferredPlay.connect
188 (mem_fun (*this, &Session::mmc_deferred_play));
190 (mem_fun (*this, &Session::mmc_stop));
191 mmc->FastForward.connect
192 (mem_fun (*this, &Session::mmc_fast_forward));
194 (mem_fun (*this, &Session::mmc_rewind));
196 (mem_fun (*this, &Session::mmc_pause));
197 mmc->RecordPause.connect
198 (mem_fun (*this, &Session::mmc_record_pause));
199 mmc->RecordStrobe.connect
200 (mem_fun (*this, &Session::mmc_record_strobe));
201 mmc->RecordExit.connect
202 (mem_fun (*this, &Session::mmc_record_exit));
204 (mem_fun (*this, &Session::mmc_locate));
206 (mem_fun (*this, &Session::mmc_step));
208 (mem_fun (*this, &Session::mmc_shuttle));
209 mmc->TrackRecordStatusChange.connect
210 (mem_fun (*this, &Session::mmc_record_enable));
213 /* also handle MIDI SPP because its so common */
215 _mmc_port->input()->start.connect (mem_fun (*this, &Session::spp_start));
216 _mmc_port->input()->contineu.connect (mem_fun (*this, &Session::spp_continue));
217 _mmc_port->input()->stop.connect (mem_fun (*this, &Session::spp_stop));
219 Config->set_mmc_port_name (port_tag);
222 MMC_PortChanged(); /* EMIT SIGNAL */
223 change_midi_ports ();
229 Session::set_midi_port (string port_tag)
232 if (port_tag.length() == 0) {
233 if (_midi_port == 0) {
242 if ((port = MIDI::Manager::instance()->port (port_tag)) == 0) {
248 /* XXX need something to forward this to control protocols ? or just
252 Config->set_midi_port_name (port_tag);
256 MIDI_PortChanged(); /* EMIT SIGNAL */
257 change_midi_ports ();
263 Session::set_trace_midi_input (bool yn, MIDI::Port* port)
266 MIDI::Parser* input_parser;
269 if ((input_parser = port->input()) != 0) {
270 input_parser->trace (yn, &cout, "input: ");
275 if ((input_parser = _mmc_port->input()) != 0) {
276 input_parser->trace (yn, &cout, "input: ");
280 if (_mtc_port && _mtc_port != _mmc_port) {
281 if ((input_parser = _mtc_port->input()) != 0) {
282 input_parser->trace (yn, &cout, "input: ");
286 if (_midi_port && _midi_port != _mmc_port && _midi_port != _mtc_port ) {
287 if ((input_parser = _midi_port->input()) != 0) {
288 input_parser->trace (yn, &cout, "input: ");
294 Config->set_trace_midi_input (yn);
298 Session::set_trace_midi_output (bool yn, MIDI::Port* port)
301 MIDI::Parser* output_parser;
304 if ((output_parser = port->output()) != 0) {
305 output_parser->trace (yn, &cout, "output: ");
309 if ((output_parser = _mmc_port->output()) != 0) {
310 output_parser->trace (yn, &cout, "output: ");
314 if (_mtc_port && _mtc_port != _mmc_port) {
315 if ((output_parser = _mtc_port->output()) != 0) {
316 output_parser->trace (yn, &cout, "output: ");
320 if (_midi_port && _midi_port != _mmc_port && _midi_port != _mtc_port ) {
321 if ((output_parser = _midi_port->output()) != 0) {
322 output_parser->trace (yn, &cout, "output: ");
329 Config->set_trace_midi_output (yn);
333 Session::get_trace_midi_input(MIDI::Port *port)
336 MIDI::Parser* input_parser;
338 if ((input_parser = port->input()) != 0) {
339 return input_parser->tracing();
344 if ((input_parser = _mmc_port->input()) != 0) {
345 return input_parser->tracing();
350 if ((input_parser = _mtc_port->input()) != 0) {
351 return input_parser->tracing();
356 if ((input_parser = _midi_port->input()) != 0) {
357 return input_parser->tracing();
367 Session::get_trace_midi_output(MIDI::Port *port)
370 MIDI::Parser* output_parser;
372 if ((output_parser = port->output()) != 0) {
373 return output_parser->tracing();
378 if ((output_parser = _mmc_port->output()) != 0) {
379 return output_parser->tracing();
384 if ((output_parser = _mtc_port->output()) != 0) {
385 return output_parser->tracing();
390 if ((output_parser = _midi_port->output()) != 0) {
391 return output_parser->tracing();
402 Session::setup_midi_control ()
404 outbound_mtc_smpte_frame = 0;
405 next_quarter_frame_to_send = 0;
407 /* setup the MMC buffer */
409 mmc_buffer[0] = 0xf0; // SysEx
410 mmc_buffer[1] = 0x7f; // Real Time SysEx ID for MMC
411 mmc_buffer[2] = (mmc ? mmc->send_device_id() : 0x7f);
412 mmc_buffer[3] = 0x6; // MCC
414 /* Set up the qtr frame message */
428 Session::midi_read (MIDI::Port* port)
432 /* reading from the MIDI port activates the Parser
433 that in turn generates signals that we care
434 about. the port is already set to NONBLOCK so that
435 can read freely here.
440 // cerr << "+++ READ ON " << port->name() << endl;
442 int nread = port->read (buf, sizeof (buf));
444 // cerr << "-- READ (" << nread << " ON " << port->name() << endl;
447 if ((size_t) nread < sizeof (buf)) {
452 } else if (nread == 0) {
454 } else if (errno == EAGAIN) {
457 fatal << string_compose(_("Error reading from MIDI port %1"), port->name()) << endmsg;
467 Session::spp_start (Parser& ignored)
469 if (Config->get_mmc_control() && (Config->get_slave_source() != MTC)) {
470 request_transport_speed (1.0);
475 Session::spp_continue (Parser& ignored)
481 Session::spp_stop (Parser& ignored)
483 if (Config->get_mmc_control()) {
489 Session::mmc_deferred_play (MIDI::MachineControl &mmc)
491 if (Config->get_mmc_control() && (Config->get_slave_source() != MTC)) {
492 request_transport_speed (1.0);
497 Session::mmc_record_pause (MIDI::MachineControl &mmc)
499 if (Config->get_mmc_control()) {
500 maybe_enable_record();
505 Session::mmc_record_strobe (MIDI::MachineControl &mmc)
507 if (!Config->get_mmc_control())
510 /* record strobe does an implicit "Play" command */
512 if (_transport_speed != 1.0) {
514 /* start_transport() will move from Enabled->Recording, so we
515 don't need to do anything here except enable recording.
516 its not the same as maybe_enable_record() though, because
517 that *can* switch to Recording, which we do not want.
520 save_state ("", true);
521 g_atomic_int_set (&_record_status, Enabled);
522 RecordStateChanged (); /* EMIT SIGNAL */
524 request_transport_speed (1.0);
533 Session::mmc_record_exit (MIDI::MachineControl &mmc)
535 if (Config->get_mmc_control()) {
536 disable_record (false);
541 Session::mmc_stop (MIDI::MachineControl &mmc)
543 if (Config->get_mmc_control()) {
549 Session::mmc_pause (MIDI::MachineControl &mmc)
551 if (Config->get_mmc_control()) {
553 /* We support RECORD_PAUSE, so the spec says that
554 we must interpret PAUSE like RECORD_PAUSE if
558 if (actively_recording()) {
559 maybe_enable_record ();
566 static bool step_queued = false;
569 Session::mmc_step (MIDI::MachineControl &mmc, int steps)
571 if (!Config->get_mmc_control()) {
576 struct timeval diff = { 0, 0 };
578 gettimeofday (&now, 0);
580 timersub (&now, &last_mmc_step, &diff);
582 gettimeofday (&now, 0);
583 timersub (&now, &last_mmc_step, &diff);
585 if (last_mmc_step.tv_sec != 0 && (diff.tv_usec + (diff.tv_sec * 1000000)) < _engine.usecs_per_cycle()) {
589 double diff_secs = diff.tv_sec + (diff.tv_usec / 1000000.0);
590 double cur_speed = (((steps * 0.5) * smpte_frames_per_second()) / diff_secs) / smpte_frames_per_second();
592 if (_transport_speed == 0 || cur_speed * _transport_speed < 0) {
593 /* change direction */
594 step_speed = cur_speed;
596 step_speed = (0.6 * step_speed) + (0.4 * cur_speed);
602 cerr << "delta = " << diff_secs
603 << " ct = " << _transport_speed
604 << " steps = " << steps
605 << " new speed = " << cur_speed
606 << " speed = " << step_speed
610 request_transport_speed (step_speed);
614 midi_timeouts.push_back (mem_fun (*this, &Session::mmc_step_timeout));
620 Session::mmc_rewind (MIDI::MachineControl &mmc)
622 if (Config->get_mmc_control()) {
623 request_transport_speed(-8.0f);
628 Session::mmc_fast_forward (MIDI::MachineControl &mmc)
630 if (Config->get_mmc_control()) {
631 request_transport_speed(8.0f);
636 Session::mmc_locate (MIDI::MachineControl &mmc, const MIDI::byte* mmc_tc)
638 if (!Config->get_mmc_control()) {
642 nframes_t target_frame;
645 smpte.hours = mmc_tc[0] & 0xf;
646 smpte.minutes = mmc_tc[1];
647 smpte.seconds = mmc_tc[2];
648 smpte.frames = mmc_tc[3];
649 smpte.rate = smpte_frames_per_second();
650 smpte.drop = smpte_drop_frames();
652 // Also takes smpte offset into account:
653 smpte_to_sample( smpte, target_frame, true /* use_offset */, false /* use_subframes */ );
655 if (target_frame > max_frames) {
656 target_frame = max_frames;
659 /* Some (all?) MTC/MMC devices do not send a full MTC frame
660 at the end of a locate, instead sending only an MMC
661 locate command. This causes the current position
662 of an MTC slave to become out of date. Catch this.
665 MTC_Slave* mtcs = dynamic_cast<MTC_Slave*> (_slave);
668 // cerr << "Locate *with* MTC slave\n";
669 mtcs->handle_locate (mmc_tc);
671 // cerr << "Locate without MTC slave\n";
672 request_locate (target_frame, false);
677 Session::mmc_shuttle (MIDI::MachineControl &mmc, float speed, bool forw)
679 if (!Config->get_mmc_control()) {
683 if (Config->get_shuttle_speed_threshold() >= 0 && speed > Config->get_shuttle_speed_threshold()) {
684 speed *= Config->get_shuttle_speed_factor();
688 request_transport_speed (speed);
690 request_transport_speed (-speed);
695 Session::mmc_record_enable (MIDI::MachineControl &mmc, size_t trk, bool enabled)
697 if (Config->get_mmc_control()) {
699 RouteList::iterator i;
700 boost::shared_ptr<RouteList> r = routes.reader();
702 for (i = r->begin(); i != r->end(); ++i) {
705 if ((at = dynamic_cast<AudioTrack*>((*i).get())) != 0) {
706 if (trk == at->remote_control_id()) {
707 at->set_record_enable (enabled, &mmc);
717 Session::change_midi_ports ()
720 MIDIRequest* request = new MIDIRequest;
722 request->type = MIDIRequest::PortChange;
723 midi_requests.write (&request, 1);
728 /** Send MTC Full Frame message (complete SMPTE time) for the start of this cycle.
729 * This resets the MTC code, the next quarter frame message that is sent will be
730 * the first one with the beginning of this cycle as the new start point.
732 * Audio thread only, realtime safe. MIDI::Manager::cycle_start must
733 * have been called with the appropriate nframes parameter this cycle.
736 Session::send_full_time_code(nframes_t nframes)
738 /* This function could easily send at a given frame offset, but would
739 * that be useful? Does ardour do sub-block accurate locating? [DR] */
744 _send_smpte_update = false;
746 if (_mtc_port == 0 || !session_send_mtc) {
750 // Get smpte time for this transport frame
751 sample_to_smpte(_transport_frame, smpte, true /* use_offset */, false /* no subframes */);
753 transmitting_smpte_time = smpte;
754 outbound_mtc_smpte_frame = _transport_frame;
756 // I don't understand this bit yet.. [DR]
757 if (((mtc_smpte_bits >> 5) != MIDI::MTC_25_FPS) && (transmitting_smpte_time.frames % 2)) {
758 // start MTC quarter frame transmission on an even frame
759 SMPTE::increment( transmitting_smpte_time );
760 outbound_mtc_smpte_frame += (nframes_t) _frames_per_smpte_frame;
763 // Compensate for audio latency
764 outbound_mtc_smpte_frame += _worst_output_latency;
766 next_quarter_frame_to_send = 0;
768 // Sync slave to the same SMPTE time as we are on
776 msg[5] = mtc_smpte_bits | smpte.hours;
777 msg[6] = smpte.minutes;
778 msg[7] = smpte.seconds;
779 msg[8] = smpte.frames;
781 cerr << "MTC: Sending full time code at " << outbound_mtc_smpte_frame << endl;
783 // Send message at offset 0, sent time is for the start of this cycle
784 if (!_mtc_port->midimsg (msg, sizeof (msg), 0)) {
785 error << _("Session: could not send full MIDI time code") << endmsg;
793 /** Sends MTC (quarter-frame) messages for this cycle.
794 * Must be called exactly once per cycle from the audio thread. Realtime safe.
795 * This function assumes the state of full SMPTE is sane, eg. the slave is
796 * expecting quarter frame messages and has the right frame of reference (any
797 * full MTC SMPTE time messages that needed to be sent should have been sent
798 * earlier already this cycle by send_full_time_code)
801 Session::send_midi_time_code_for_cycle(nframes_t nframes)
803 assert (next_quarter_frame_to_send >= 0);
804 assert (next_quarter_frame_to_send <= 7);
806 if (next_quarter_frame_to_send < 0)
808 printf("Negative????\n");
811 if (_mtc_port == 0 || !session_send_mtc || transmitting_smpte_time.negative
812 /*|| (next_quarter_frame_to_send < 0)*/ ) {
813 //printf("(MTC) Not sending MTC\n");
817 /* Duration of one quarter frame */
818 nframes_t quarter_frame_duration = ((long) _frames_per_smpte_frame) >> 2;
820 //cerr << "(MTC) TR: " << _transport_frame << " - SF: " << outbound_mtc_smpte_frame
821 //<< " - NQ: " << next_quarter_frame_to_send << " - FD" << quarter_frame_duration << endl;
823 // FIXME: this should always be true
824 //assert((outbound_mtc_smpte_frame + (next_quarter_frame_to_send * quarter_frame_duration))
825 // > _transport_frame);
828 // Send quarter frames for this cycle
829 while (_transport_frame + nframes > (outbound_mtc_smpte_frame +
830 (next_quarter_frame_to_send * quarter_frame_duration))) {
832 //cerr << "(MTC) Next frame to send: " << next_quarter_frame_to_send << endl;
834 switch (next_quarter_frame_to_send) {
836 mtc_msg[1] = 0x00 | (transmitting_smpte_time.frames & 0xf);
839 mtc_msg[1] = 0x10 | ((transmitting_smpte_time.frames & 0xf0) >> 4);
842 mtc_msg[1] = 0x20 | (transmitting_smpte_time.seconds & 0xf);
845 mtc_msg[1] = 0x30 | ((transmitting_smpte_time.seconds & 0xf0) >> 4);
848 mtc_msg[1] = 0x40 | (transmitting_smpte_time.minutes & 0xf);
851 mtc_msg[1] = 0x50 | ((transmitting_smpte_time.minutes & 0xf0) >> 4);
854 mtc_msg[1] = 0x60 | ((mtc_smpte_bits|transmitting_smpte_time.hours) & 0xf);
857 mtc_msg[1] = 0x70 | (((mtc_smpte_bits|transmitting_smpte_time.hours) & 0xf0) >> 4);
861 const nframes_t msg_time = (outbound_mtc_smpte_frame
862 + (quarter_frame_duration * next_quarter_frame_to_send));
864 // This message must fall within this block or something is broken
865 assert(msg_time >= _transport_frame);
866 assert(msg_time < _transport_frame + nframes);
868 nframes_t out_stamp = msg_time - _transport_frame;
869 assert(out_stamp < nframes);
871 if (!_mtc_port->midimsg (mtc_msg, 2, out_stamp)) {
872 error << string_compose(_("Session: cannot send quarter-frame MTC message (%1)"), strerror (errno))
877 /*cerr << "(MTC) SMPTE: " << transmitting_smpte_time.hours
878 << ":" << transmitting_smpte_time.minutes
879 << ":" << transmitting_smpte_time.seconds
880 << ":" << transmitting_smpte_time.frames
881 << ", qfm = " << next_quarter_frame_to_send
882 << ", stamp = " << out_stamp
883 << ", delta = " << _transport_frame + out_stamp - last_time << endl;*/
885 // Increment quarter frame counter
886 next_quarter_frame_to_send++;
888 if (next_quarter_frame_to_send >= 8) {
889 // Wrap quarter frame counter
890 next_quarter_frame_to_send = 0;
891 // Increment smpte time twice
892 SMPTE::increment( transmitting_smpte_time );
893 SMPTE::increment( transmitting_smpte_time );
894 // Re-calculate timing of first quarter frame
895 //smpte_to_sample( transmitting_smpte_time, outbound_mtc_smpte_frame, true /* use_offset */, false );
896 outbound_mtc_smpte_frame += 8 * quarter_frame_duration;
897 // Compensate for audio latency
898 outbound_mtc_smpte_frame += _worst_output_latency;
905 /***********************************************************************
907 **********************************************************************/
910 Session::send_mmc_in_another_thread (MIDI::MachineControl::Command cmd, nframes_t target_frame)
912 MIDIRequest* request;
914 if (_mtc_port == 0 || !session_send_mmc) {
918 request = new MIDIRequest;
919 request->type = MIDIRequest::SendMMC;
920 request->mmc_cmd = cmd;
921 request->locate_frame = target_frame;
923 midi_requests.write (&request, 1);
928 /** Send an MMC command at the given absolute timestamp (@a where).
930 * This must be called in the process thread, and @a where must fall within
931 * this process cycle or horrible things will happen.
934 Session::deliver_mmc (MIDI::MachineControl::Command cmd, nframes_t where)
936 using namespace MIDI;
940 if (_mmc_port == 0 || !session_send_mmc) {
941 //cerr << "Not delivering MMC " << _mmc_port << " - " << send_mmc << endl;
945 mmc_buffer[nbytes++] = cmd;
947 //cerr << "delivering MMC, cmd = " << hex << (int) cmd << dec << endl;
950 case MachineControl::cmdLocate:
951 smpte_time_subframes (where, smpte);
953 mmc_buffer[nbytes++] = 0x6; // byte count
954 mmc_buffer[nbytes++] = 0x1; // "TARGET" subcommand
955 mmc_buffer[nbytes++] = smpte.hours;
956 mmc_buffer[nbytes++] = smpte.minutes;
957 mmc_buffer[nbytes++] = smpte.seconds;
958 mmc_buffer[nbytes++] = smpte.frames;
959 mmc_buffer[nbytes++] = smpte.subframes;
962 case MachineControl::cmdStop:
965 case MachineControl::cmdPlay:
966 /* always convert Play into Deferred Play */
968 mmc_buffer[4] = MachineControl::cmdDeferredPlay;
971 case MachineControl::cmdDeferredPlay:
974 case MachineControl::cmdRecordStrobe:
977 case MachineControl::cmdRecordExit:
980 case MachineControl::cmdRecordPause:
989 mmc_buffer[nbytes++] = 0xf7; // terminate SysEx/MMC message
991 assert(where >= _transport_frame);
993 // FIXME: timestamp correct? [DR]
994 if (!_mmc_port->midimsg (mmc_buffer, sizeof (mmc_buffer), where - _transport_frame)) {
995 error << string_compose(_("MMC: cannot send command %1%2%3"), &hex, cmd, &dec) << endmsg;
997 cerr << "Sending MMC\n";
1003 Session::mmc_step_timeout ()
1006 struct timeval diff;
1008 gettimeofday (&now, 0);
1010 timersub (&now, &last_mmc_step, &diff);
1011 diff_usecs = diff.tv_sec * 1000000 + diff.tv_usec;
1013 if (diff_usecs > 1000000.0 || fabs (_transport_speed) < 0.0000001) {
1014 /* too long or too slow, stop transport */
1015 request_transport_speed (0.0);
1016 step_queued = false;
1020 if (diff_usecs < 250000.0) {
1021 /* too short, just keep going */
1027 request_transport_speed (_transport_speed * 0.75);
1033 Session::send_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t ch, MIDI::EventTwoBytes data)
1035 // in another thread, really
1037 MIDIRequest* request = new MIDIRequest;
1039 request->type = MIDIRequest::SendMessage;
1040 request->port = port;
1043 request->data = data;
1045 midi_requests.write (&request, 1);
1046 poke_midi_thread ();
1051 Session::deliver_midi (MIDI::Port * port, MIDI::byte* buf, int32_t bufsize)
1053 // in another thread, really
1055 MIDIRequest* request = new MIDIRequest;
1057 request->type = MIDIRequest::Deliver;
1058 request->port = port;
1060 request->size = bufsize;
1062 midi_requests.write (&request, 1);
1063 poke_midi_thread ();
1069 This is aaalll gone.
1073 Session::deliver_midi_message (MIDI::Port * port, MIDI::eventType ev, MIDI::channel_t ch, MIDI::EventTwoBytes data)
1075 if (port == 0 || ev == MIDI::none) {
1079 midi_msg[0] = (ev & 0xF0) | (ch & 0xF);
1080 midi_msg[1] = data.controller_number;
1081 midi_msg[2] = data.value;
1083 port->write (midi_msg, 3);
1087 Session::deliver_data (MIDI::Port * port, MIDI::byte* buf, int32_t size)
1090 port->write (buf, size);
1093 /* this is part of the semantics of the Deliver request */
1100 /*---------------------------------------------------------------------------
1102 ---------------------------------------------------------------------------*/
1106 Session::start_midi_thread ()
1108 if (pipe (midi_request_pipe)) {
1109 error << string_compose(_("Cannot create transport request signal pipe (%1)"), strerror (errno)) << endmsg;
1113 if (fcntl (midi_request_pipe[0], F_SETFL, O_NONBLOCK)) {
1114 error << string_compose(_("UI: cannot set O_NONBLOCK on " "signal read pipe (%1)"), strerror (errno)) << endmsg;
1118 if (fcntl (midi_request_pipe[1], F_SETFL, O_NONBLOCK)) {
1119 error << string_compose(_("UI: cannot set O_NONBLOCK on " "signal write pipe (%1)"), strerror (errno)) << endmsg;
1123 if (pthread_create_and_store ("transport", &midi_thread, 0, _midi_thread_work, this)) {
1124 error << _("Session: could not create transport thread") << endmsg;
1128 // pthread_detach (midi_thread);
1134 Session::terminate_midi_thread ()
1137 MIDIRequest* request = new MIDIRequest;
1140 request->type = MIDIRequest::Quit;
1142 midi_requests.write (&request, 1);
1143 poke_midi_thread ();
1145 pthread_join (midi_thread, &status);
1150 Session::poke_midi_thread ()
1154 if (write (midi_request_pipe[1], &c, 1) != 1) {
1155 error << string_compose(_("cannot send signal to midi thread! (%1)"), strerror (errno)) << endmsg;
1160 Session::_midi_thread_work (void* arg)
1162 pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, 0);
1163 pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);
1165 ((Session *) arg)->midi_thread_work ();
1170 Session::midi_thread_work ()
1172 MIDIRequest* request;
1173 struct pollfd pfd[4];
1177 struct sched_param rtparam;
1180 vector<MIDI::Port*> ports;
1182 PBD::ThreadCreatedWithRequestSize (pthread_self(), X_("MIDI"), 2048);
1184 memset (&rtparam, 0, sizeof (rtparam));
1185 rtparam.sched_priority = 9; /* XXX should be relative to audio (JACK) thread */
1187 if ((x = pthread_setschedparam (pthread_self(), SCHED_FIFO, &rtparam)) != 0) {
1188 // do we care? not particularly.
1191 /* set up the port vector; 4 is the largest possible size for now */
1193 ports.push_back (0);
1194 ports.push_back (0);
1195 ports.push_back (0);
1196 ports.push_back (0);
1202 pfd[nfds].fd = midi_request_pipe[0];
1203 pfd[nfds].events = POLLIN|POLLHUP|POLLERR;
1206 /* if we are using MMC control, we obviously have to listen
1207 on the appropriate port.
1210 if (Config->get_mmc_control() && _mmc_port && _mmc_port->selectable() >= 0) {
1211 pfd[nfds].fd = _mmc_port->selectable();
1212 pfd[nfds].events = POLLIN|POLLHUP|POLLERR;
1213 ports[nfds] = _mmc_port;
1217 /* if MTC is being handled on a different port from MMC
1218 or we are not handling MMC at all, poll
1222 if (_mtc_port && (_mtc_port != _mmc_port || !Config->get_mmc_control()) && _mtc_port->selectable() >= 0) {
1223 pfd[nfds].fd = _mtc_port->selectable();
1224 pfd[nfds].events = POLLIN|POLLHUP|POLLERR;
1225 ports[nfds] = _mtc_port;
1229 if (_midi_port && (_midi_port != _mmc_port || !Config->get_mmc_control()) && (_midi_port != _mtc_port) && _midi_port->selectable() >= 0) {
1230 pfd[nfds].fd = _midi_port->selectable();
1231 pfd[nfds].events = POLLIN|POLLHUP|POLLERR;
1232 ports[nfds] = _midi_port;
1236 if (!midi_timeouts.empty()) {
1237 timeout = 100; /* 10msecs */
1239 timeout = -1; /* if there is no data, we don't care */
1243 // cerr << "MIDI poll on " << nfds << " for " << timeout << endl;
1244 if (poll (pfd, nfds, timeout) < 0) {
1245 if (errno == EINTR) {
1246 /* gdb at work, perhaps */
1250 error << string_compose(_("MIDI thread poll failed (%1)"), strerror (errno)) << endmsg;
1254 // cerr << "MIDI thread wakes at " << get_cycles () << endl;
1259 /* check the transport request pipe */
1261 if (pfd[0].revents & ~POLLIN) {
1262 error << _("Error on transport thread request pipe") << endmsg;
1266 if (pfd[0].revents & POLLIN) {
1270 // cerr << "MIDI request FIFO ready\n";
1273 /* empty the pipe of all current requests */
1276 size_t nread = read (midi_request_pipe[0], &foo, sizeof (foo));
1279 if ((size_t) nread < sizeof (foo)) {
1284 } else if (nread == 0) {
1286 } else if (errno == EAGAIN) {
1289 fatal << _("Error reading from transport request pipe") << endmsg;
1294 while (midi_requests.read (&request, 1) == 1) {
1296 switch (request->type) {
1298 case MIDIRequest::SendFullMTC:
1299 // cerr << "send full MTC\n";
1300 send_full_time_code ();
1301 // cerr << "... done\n";
1304 case MIDIRequest::SendMTC:
1305 // cerr << "send qtr MTC\n";
1306 send_midi_time_code ();
1307 // cerr << "... done\n";
1310 case MIDIRequest::SendMMC:
1311 // cerr << "send MMC\n";
1312 deliver_mmc (request->mmc_cmd, request->locate_frame);
1313 // cerr << "... done\n";
1316 case MIDIRequest::SendMessage:
1317 // cerr << "send Message\n";
1318 deliver_midi_message (request->port, request->ev, request->chan, request->data);
1319 // cerr << "... done\n";
1322 case MIDIRequest::Deliver:
1323 // cerr << "deliver\n";
1324 deliver_data (_midi_port, request->buf, request->size);
1325 // cerr << "... done\n";
1328 case MIDIRequest::PortChange:
1329 /* restart poll with new ports */
1330 // cerr << "rebind\n";
1334 case MIDIRequest::Quit:
1336 pthread_exit_pbd (0);
1354 /* now read the rest of the ports */
1356 for (int p = 1; p < nfds; ++p) {
1357 if ((pfd[p].revents & ~POLLIN)) {
1358 // error << string_compose(_("Transport: error polling MIDI port %1 (revents =%2%3%4"), p, &hex, pfd[p].revents, &dec) << endmsg;
1362 if (pfd[p].revents & POLLIN) {
1364 midi_read (ports[p]);
1368 /* timeout driven */
1370 if (fds_ready < 2 && timeout != -1) {
1372 for (MidiTimeoutList::iterator i = midi_timeouts.begin(); i != midi_timeouts.end(); ) {
1374 MidiTimeoutList::iterator tmp;
1379 midi_timeouts.erase (i);