Hello,
this patch enables the possibility to start and stop transport remotely by 
simple MIDI /START/STOP messages. I included the configuration choice to MMC 
options because I think this belongs there.

BR

Eckhard
Index: rosegarden/gui/rosegardenconfigurationpage.h
===================================================================
--- rosegarden/gui/rosegardenconfigurationpage.h	(revision 7189)
+++ rosegarden/gui/rosegardenconfigurationpage.h	(working copy)
@@ -518,7 +518,6 @@
     QComboBox *m_mmcTransport;
     QComboBox *m_mtcTransport;
     QCheckBox *m_midiSyncAuto;
-
     int      m_sampleRate;
     QSlider* m_readAhead;
     QSlider* m_audioMix;
Index: rosegarden/gui/rosegardenconfigurationpage.cpp
===================================================================
--- rosegarden/gui/rosegardenconfigurationpage.cpp	(revision 7189)
+++ rosegarden/gui/rosegardenconfigurationpage.cpp	(working copy)
@@ -1477,9 +1477,10 @@
     m_mmcTransport->insertItem(i18n("Off"));
     m_mmcTransport->insertItem(i18n("MMC Master"));
     m_mmcTransport->insertItem(i18n("MMC Slave"));
+    m_mmcTransport->insertItem(i18n("Simple Start/Stop"));
 
     int mmcMode = m_cfg->readNumEntry("mmcmode", 0);
-    if (mmcMode < 0 || mmcMode > 2) mmcMode = 0;
+    if (mmcMode < 0 || mmcMode > 3) mmcMode = 0;
     m_mmcTransport->setCurrentItem(mmcMode);
 
     // MTC transport
Index: rosegarden/sound/AlsaDriver.cpp
===================================================================
--- rosegarden/sound/AlsaDriver.cpp	(revision 7189)
+++ rosegarden/sound/AlsaDriver.cpp	(working copy)
@@ -2253,7 +2253,7 @@
     RealTime eventTime(0, 0);
 
     snd_seq_event_t *event;
-
+    
     while (snd_seq_event_input(m_midiHandle, &event) > 0)
     {
         unsigned int channel = (unsigned int)event->data.note.channel;
@@ -2495,24 +2495,42 @@
                break;
 
             case SND_SEQ_EVENT_START:
+          	if(getMMCStatus() == TRANSPORT_SIMPLE_START_STOP) {
 #ifdef DEBUG_ALSA
-               std::cerr << "AlsaDriver::getMappedComposition - "
+			std::cerr << "AlsaDriver::getMappedComposition - "
                          << "START" << std::endl;
 #endif
+			ExternalTransport *transport = getExternalTransportControl();
+			if (transport) {
+			transport->transportChange(ExternalTransport::TransportPlay);
+			}
+		} 
                break;
 
             case SND_SEQ_EVENT_CONTINUE:
+            	if(getMMCStatus() == TRANSPORT_SIMPLE_START_STOP) {
 #ifdef DEBUG_ALSA
-               std::cerr << "AlsaDriver::getMappedComposition - "
+               		std::cerr << "AlsaDriver::getMappedComposition - "
                          << "CONTINUE" << std::endl;
 #endif
+			ExternalTransport *transport = getExternalTransportControl();
+			if (transport) {
+	    		transport->transportChange(ExternalTransport::TransportPlay);
+			}
+		}
                break;
 
             case SND_SEQ_EVENT_STOP:
+            	if(getMMCStatus() == TRANSPORT_SIMPLE_START_STOP) {
 #ifdef DEBUG_ALSA
-               std::cerr << "AlsaDriver::getMappedComposition - "
+               		std::cerr << "AlsaDriver::getMappedComposition - "
                          << "STOP" << std::endl;
 #endif
+			ExternalTransport *transport = getExternalTransportControl();
+			if (transport) {
+			transport->transportChange(ExternalTransport::TransportStop);
+			}
+		}
                break;
 
             case SND_SEQ_EVENT_SONGPOS:
@@ -2520,6 +2538,7 @@
                std::cerr << "AlsaDriver::getMappedComposition - "
                          << "SONG POSITION" << std::endl;
 #endif
+		
                break;
 
                // these cases are handled by checkForNewClients
@@ -3048,7 +3067,7 @@
     if (getMMCStatus() != TRANSPORT_SLAVE) return false;
 
     if (event->data.ext.len != 6) return false;
-
+    
     unsigned char *ptr = (unsigned char *)(event->data.ext.ptr);
     
     if (*ptr++ != MIDI_SYSTEM_EXCLUSIVE) return false;
@@ -3057,7 +3076,7 @@
     if (*ptr++ != MIDI_SYSEX_RT_COMMAND) return false;
 
     int instruction = *ptr++;
-
+	std::cerr << "MMC received ";
     if (*ptr != MIDI_END_OF_EXCLUSIVE) return false;
 
     if (instruction == MIDI_MMC_PLAY ||
@@ -3991,6 +4010,14 @@
 		    setMMCStatus(TRANSPORT_SLAVE);
                     break;
 
+                case 3:
+#ifdef DEBUG_ALSA
+                    std::cerr << "AlsaDriver::processEventsOut - "
+                              << "Rosegarden accepts simple START/STOP"
+                              << std::endl;
+#endif
+		    setMMCStatus(TRANSPORT_SIMPLE_START_STOP);
+                    break;
                 case 0:
                 default:
 #ifdef DEBUG_ALSA
Index: rosegarden/sound/SoundDriver.h
===================================================================
--- rosegarden/sound/SoundDriver.h	(revision 7189)
+++ rosegarden/sound/SoundDriver.h	(working copy)
@@ -76,7 +76,8 @@
 {
     TRANSPORT_OFF,
     TRANSPORT_MASTER,
-    TRANSPORT_SLAVE
+    TRANSPORT_SLAVE,
+    TRANSPORT_SIMPLE_START_STOP
 } TransportSyncStatus;
 
 

Attachment: pgps94BCA12nm.pgp
Description: PGP signature

Reply via email to