Make import GUI report if you are importing a file of a name that
[ardour.git] / libs / ardour / session_midi.cc
index fe08b4012721e0c9f7c699e1d0d84362ae50e10a..5b1b9060d45bb96d567512dbac4345af31409211 100644 (file)
@@ -16,7 +16,6 @@
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-  $Id$
 */
 
 #include <string>
@@ -126,9 +125,31 @@ Session::set_mtc_port (string port_tag)
        return 0;
 }
 
+void
+Session::set_mmc_receive_device_id (uint32_t device_id)
+{
+       if (mmc) {
+               mmc->set_receive_device_id (device_id);
+       }
+}
+
+void
+Session::set_mmc_send_device_id (uint32_t device_id)
+{
+       if (mmc) {
+               mmc->set_send_device_id (device_id);
+               /* reset MMC buffer */
+               mmc_buffer[2] = mmc->send_device_id();
+       }
+}
+
 int
 Session::set_mmc_port (string port_tag)
 {
+       MIDI::byte old_recv_device_id = 0;
+       MIDI::byte old_send_device_id = 0;
+       bool reset_id = false;
+
        if (port_tag.length() == 0) {
                if (_mmc_port == 0) {
                        return 0;
@@ -146,6 +167,9 @@ Session::set_mmc_port (string port_tag)
        _mmc_port = port;
 
        if (mmc) {
+               old_recv_device_id = mmc->receive_device_id();
+               old_recv_device_id = mmc->send_device_id();
+               reset_id = true;
                delete mmc;
        }
 
@@ -153,6 +177,10 @@ Session::set_mmc_port (string port_tag)
                                        MMC_CommandSignature,
                                        MMC_ResponseSignature);
 
+       if (reset_id) {
+               set_mmc_receive_device_id (old_recv_device_id);
+               set_mmc_send_device_id (old_send_device_id);
+       }
 
        mmc->Play.connect 
                (mem_fun (*this, &Session::mmc_deferred_play));
@@ -181,6 +209,7 @@ Session::set_mmc_port (string port_tag)
        mmc->TrackRecordStatusChange.connect
                (mem_fun (*this, &Session::mmc_record_enable));
 
+
        /* also handle MIDI SPP because its so common */
 
        _mmc_port->input()->start.connect (mem_fun (*this, &Session::spp_start));
@@ -369,7 +398,7 @@ Session::setup_midi_control ()
        
        mmc_buffer[0] = 0xf0; // SysEx
        mmc_buffer[1] = 0x7f; // Real Time SysEx ID for MMC
-       mmc_buffer[2] = 0x7f; // "broadcast" device ID
+       mmc_buffer[2] = (mmc ? mmc->send_device_id() : 0x7f);
        mmc_buffer[3] = 0x6;  // MCC
 
        /* Set up the qtr frame message */
@@ -382,24 +411,6 @@ Session::setup_midi_control ()
        mtc_msg[10] = 0xf1;
        mtc_msg[12] = 0xf1;
        mtc_msg[14] = 0xf1;
-
-       if (_mmc_port != 0) {
-
-               Config->set_send_mmc (session_send_mmc);
-
-       } else {
-
-               mmc = 0;
-               session_send_mmc = false;
-       }
-
-       if (_mtc_port != 0) {
-
-               Config->set_send_mtc (session_send_mtc);
-
-       } else {
-               session_send_mtc = false;
-       }
 }
 
 int
@@ -543,7 +554,6 @@ Session::mmc_pause (MIDI::MachineControl &mmc)
 static bool step_queued = false;
 
 void
-
 Session::mmc_step (MIDI::MachineControl &mmc, int steps)
 {
        if (!Config->get_mmc_control()) {
@@ -565,7 +575,7 @@ Session::mmc_step (MIDI::MachineControl &mmc, int steps)
        }
        
        double diff_secs = diff.tv_sec + (diff.tv_usec / 1000000.0);
-       double cur_speed = (((steps * 0.5) * Config->get_smpte_frames_per_second()) / diff_secs) / Config->get_smpte_frames_per_second();
+       double cur_speed = (((steps * 0.5) * smpte_frames_per_second()) / diff_secs) / smpte_frames_per_second();
        
        if (_transport_speed == 0 || cur_speed * _transport_speed < 0) {
                /* change direction */
@@ -624,6 +634,8 @@ Session::mmc_locate (MIDI::MachineControl &mmc, const MIDI::byte* mmc_tc)
        smpte.minutes = mmc_tc[1];
        smpte.seconds = mmc_tc[2];
        smpte.frames = mmc_tc[3];
+       smpte.rate = smpte_frames_per_second();
+       smpte.drop = smpte_drop_frames();
   
        // Also takes smpte offset into account:
        smpte_to_sample( smpte, target_frame, true /* use_offset */, false /* use_subframes */ );
@@ -1097,15 +1109,17 @@ Session::start_midi_thread ()
 void
 Session::terminate_midi_thread ()
 {
-       MIDIRequest* request = new MIDIRequest;
-       void* status;
-
-       request->type = MIDIRequest::Quit;
-
-       midi_requests.write (&request, 1);
-       poke_midi_thread ();
-
-       pthread_join (midi_thread, &status);
+       if (midi_thread) {
+               MIDIRequest* request = new MIDIRequest;
+               void* status;
+               
+               request->type = MIDIRequest::Quit;
+               
+               midi_requests.write (&request, 1);
+               poke_midi_thread ();
+               
+               pthread_join (midi_thread, &status);
+       }
 }
 
 void