From: terminator356 <ter...@us...> - 2009-03-28 01:48:47
|
Update of /cvsroot/lmuse/muse/muse In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv6180/muse Modified Files: Tag: REL07 audio.cpp conf.cpp icons.cpp icons.h mididev.cpp mididev.h midiport.cpp midiport.h midiseq.cpp song.cpp sync.cpp sync.h xml.cpp Log Message: See ChangeLog Index: xml.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/Attic/xml.cpp,v retrieving revision 1.17.2.3 retrieving revision 1.17.2.4 diff -C2 -d -r1.17.2.3 -r1.17.2.4 *** xml.cpp 2 Feb 2009 21:38:00 -0000 1.17.2.3 --- xml.cpp 28 Mar 2009 01:46:10 -0000 1.17.2.4 *************** *** 138,141 **** --- 138,147 ---- else if (strcmp(entity, "amp") == 0) c = '&'; + else if (strcmp(entity, "lt") == 0) + c = '<'; + else if (strcmp(entity, "gt") == 0) + c = '>'; + else if (strcmp(entity, "apos") == 0) + c = '\\'; else entity[k] = c; *************** *** 354,357 **** --- 360,369 ---- if (strcmp(name, "lt") == 0) c = '<'; + else if (strcmp(name, "gt") == 0) + c = '>'; + else if (strcmp(name, "apos") == 0) + c = '\\'; + else if (strcmp(name, "quot") == 0) + c = '"'; else if (strcmp(name, "amp") == 0) c = '&'; *************** *** 582,585 **** --- 594,600 ---- case '&': fprintf(f, "&"); break; case '<': fprintf(f, "<"); break; + case '>': fprintf(f, ">"); break; + case '\\': fprintf(f, "'"); break; + case '"': fprintf(f, """); break; default: fputc(*val, f); break; } Index: mididev.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/Attic/mididev.h,v retrieving revision 1.3.2.2 retrieving revision 1.3.2.3 diff -C2 -d -r1.3.2.2 -r1.3.2.3 *** mididev.h 9 Mar 2009 02:05:17 -0000 1.3.2.2 --- mididev.h 28 Mar 2009 01:46:09 -0000 1.3.2.3 *************** *** 14,17 **** --- 14,18 ---- #include "mpevent.h" + //#include "sync.h" //--------------------------------------------------------- *************** *** 26,29 **** --- 27,32 ---- MREventList _recordEvents2; bool _recBufFlipped; + // Holds sync settings and detection monitors. + //MidiSyncInfo _syncInfo; protected: *************** *** 53,56 **** --- 56,60 ---- void setOpenFlags(int val) { _openFlags = val; } void setrwFlags(int val) { _rwFlags = val; } + //MidiSyncInfo& syncInfo() { return _syncInfo; } virtual bool isSynti() const { return false; } *************** *** 80,83 **** --- 84,89 ---- //--------------------------------------------------------- + typedef std::list<MidiDevice*>::iterator iMidiDevice; + class MidiDeviceList : public std::list<MidiDevice*> { public: *************** *** 85,92 **** void remove(MidiDevice* dev); MidiDevice* find(const QString& name); }; - typedef MidiDeviceList::iterator iMidiDevice; - extern MidiDeviceList midiDevices; extern void initMidiDevices(); --- 91,97 ---- void remove(MidiDevice* dev); MidiDevice* find(const QString& name); + iMidiDevice find(const MidiDevice* dev); }; extern MidiDeviceList midiDevices; extern void initMidiDevices(); Index: conf.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/conf.cpp,v retrieving revision 1.33.2.10 retrieving revision 1.33.2.11 diff -C2 -d -r1.33.2.10 -r1.33.2.11 *** conf.cpp 9 Mar 2009 02:05:17 -0000 1.33.2.10 --- conf.cpp 28 Mar 2009 01:46:09 -0000 1.33.2.11 *************** *** 217,220 **** --- 217,221 ---- int openFlags = 1; bool thruFlag = false; + MidiSyncInfo tmpSi; for (;;) { *************** *** 234,237 **** --- 235,240 ---- else if (tag == "openFlags") openFlags = xml.parseInt(); + else if (tag == "midiSyncInfo") + tmpSi.read(xml); else if (tag == "instrument") { instrument = xml.parse1(); *************** *** 255,259 **** case Xml::TagEnd: if (tag == "midiport") { ! if (idx > MIDI_PORTS) { fprintf(stderr, "bad midi port %d (>%d)\n", idx, MIDI_PORTS); --- 258,263 ---- case Xml::TagEnd: if (tag == "midiport") { ! //if (idx > MIDI_PORTS) { ! if (idx < 0 || idx >= MIDI_PORTS) { fprintf(stderr, "bad midi port %d (>%d)\n", idx, MIDI_PORTS); *************** *** 262,265 **** --- 266,270 ---- MidiDevice* dev = midiDevices.find(device); MidiPort* mp = &midiPorts[idx]; + mp->syncInfo().copyParams(tmpSi); if (dev) { dev->setOpenFlags(openFlags); *************** *** 274,277 **** --- 279,359 ---- } + /* + //--------------------------------------------------------- + // readConfigMidiSyncInfo + //--------------------------------------------------------- + + static void readConfigMidiSyncInfo(Xml& xml) + { + QString device; + int idOut = 127; + int idIn = 127; + bool sendMC = false; + bool sendMMC = false; + bool sendMTC = false; + bool recMC = false; + bool recMMC = false; + bool recMTC = false; + + for (;;) { + Xml::Token token = xml.parse(); + if (token == Xml::Error || token == Xml::End) + break; + QString tag = xml.s1(); + switch (token) { + case Xml::TagStart: + if (tag == "device") + device = xml.parse1(); + else if (tag == "idOut") + idOut = (xml.parseInt()); + else if (tag == "idIn") + idIn = xml.parseInt(); + else if (tag == "sendMC") + sendMC = xml.parseInt(); + else if (tag == "sendMMC") + sendMMC = xml.parseInt(); + else if (tag == "sendMTC") + sendMTC = xml.parseInt(); + else if (tag == "recMC") + recMC = xml.parseInt(); + else if (tag == "recMMC") + recMMC = xml.parseInt(); + else if (tag == "recMTC") + recMTC = xml.parseInt(); + else + xml.unknown("midiSyncInfo"); + break; + case Xml::Attribut: + break; + case Xml::TagEnd: + if(tag == "midiSyncInfo") + { + MidiDevice* dev = midiDevices.find(device); + if(dev) + { + MidiSyncInfo& si = dev->syncInfo(); + si.setIdIn(idIn); + si.setIdOut(idOut); + + si.setMCIn(recMC); + si.setMMCIn(recMMC); + si.setMTCIn(recMTC); + + si.setMCOut(sendMC); + si.setMMCOut(sendMMC); + si.setMTCOut(sendMTC); + } + else + fprintf(stderr, "Read configuration: Sync device: %s not found\n", device.latin1()); + + return; + } + default: + break; + } + } + } + */ + //--------------------------------------------------------- // loadConfigMetronom *************** *** 537,547 **** config.transportHandleColor = readColor(xml); else if (tag == "txDeviceId") ! txDeviceId = xml.parseInt(); else if (tag == "rxDeviceId") ! rxDeviceId = xml.parseInt(); else if (tag == "txSyncPort") ! txSyncPort= xml.parseInt(); else if (tag == "rxSyncPort") ! rxSyncPort= xml.parseInt(); else if (tag == "mtctype") mtcType= xml.parseInt(); --- 619,633 ---- config.transportHandleColor = readColor(xml); else if (tag == "txDeviceId") ! //txDeviceId = xml.parseInt(); ! xml.parseInt(); else if (tag == "rxDeviceId") ! //rxDeviceId = xml.parseInt(); ! xml.parseInt(); else if (tag == "txSyncPort") ! //txSyncPort= xml.parseInt(); ! xml.parseInt(); else if (tag == "rxSyncPort") ! //rxSyncPort= xml.parseInt(); ! xml.parseInt(); else if (tag == "mtctype") mtcType= xml.parseInt(); *************** *** 550,569 **** else if (tag == "syncgentype") { // for compatibility ! int syncGenType= xml.parseInt(); ! genMTCSync = syncGenType == 1; ! genMCSync = syncGenType == 2; } else if (tag == "genMTCSync") ! genMTCSync = xml.parseInt(); else if (tag == "genMCSync") ! genMCSync = xml.parseInt(); else if (tag == "genMMC") ! genMMC = xml.parseInt(); else if (tag == "acceptMTC") ! acceptMTC = xml.parseInt(); else if (tag == "acceptMMC") ! acceptMMC = xml.parseInt(); else if (tag == "acceptMC") ! acceptMC = xml.parseInt(); else if (tag == "mtcoffset") { QString qs(xml.parse1()); --- 636,662 ---- else if (tag == "syncgentype") { // for compatibility ! //int syncGenType= xml.parseInt(); ! //genMTCSync = syncGenType == 1; ! //genMCSync = syncGenType == 2; ! xml.parseInt(); } else if (tag == "genMTCSync") ! //genMTCSync = xml.parseInt(); ! xml.parseInt(); else if (tag == "genMCSync") ! //genMCSync = xml.parseInt(); ! xml.parseInt(); else if (tag == "genMMC") ! //genMMC = xml.parseInt(); ! xml.parseInt(); else if (tag == "acceptMTC") ! //acceptMTC = xml.parseInt(); ! xml.parseInt(); else if (tag == "acceptMMC") ! //acceptMMC = xml.parseInt(); ! xml.parseInt(); else if (tag == "acceptMC") ! //acceptMC = xml.parseInt(); ! xml.parseInt(); else if (tag == "mtcoffset") { QString qs(xml.parse1()); *************** *** 573,576 **** --- 666,671 ---- mtcOffset = MTC(h, m, s, f, sf); } + //else if (tag == "midiSyncInfo") + // readConfigMidiSyncInfo(xml); else if (tag == "arranger") { if (muse && muse->arranger) *************** *** 796,799 **** --- 891,895 ---- xml.intTag(level, "record", dev->rwFlags() & 0x2 ? 1 : 0); } + mport->syncInfo().write(level, xml); // write out registered controller for all channels MidiCtrlValListList* vll = mport->controller(); *************** *** 866,871 **** xml.intTag(level, "midiFilterCtrl3", midiFilterCtrl3); xml.intTag(level, "midiFilterCtrl4", midiFilterCtrl4); ! xml.intTag(level, "txDeviceId", txDeviceId); ! xml.intTag(level, "rxDeviceId", rxDeviceId); xml.strTag(level, "theme", config.style); xml.strTag(level, "externalWavEditor", config.externalWavEditor); --- 962,969 ---- xml.intTag(level, "midiFilterCtrl3", midiFilterCtrl3); xml.intTag(level, "midiFilterCtrl4", midiFilterCtrl4); ! // Removed by Tim. p3.3.6 ! ! //xml.intTag(level, "txDeviceId", txDeviceId); ! //xml.intTag(level, "rxDeviceId", rxDeviceId); xml.strTag(level, "theme", config.style); xml.strTag(level, "externalWavEditor", config.externalWavEditor); *************** *** 896,901 **** xml.colorTag(level, "synthTrackBg", config.synthTrackBg); ! xml.intTag(level, "txSyncPort", txSyncPort); ! xml.intTag(level, "rxSyncPort", rxSyncPort); xml.intTag(level, "mtctype", mtcType); xml.nput(level, "<mtcoffset>%02d:%02d:%02d:%02d:%02d</mtcoffset>\n", --- 994,1031 ---- xml.colorTag(level, "synthTrackBg", config.synthTrackBg); ! // Changed by Tim. p3.3.6 ! ! //xml.intTag(level, "txSyncPort", txSyncPort); ! /* ! // To keep old muse versions happy... ! bool mcsync = mmc = mtc = false; ! for(int sp = 0; sp < MIDI_PORTS; ++sp) ! { ! MidiSyncTxPort* txPort = &midiSyncTxPorts[sp]; ! if(txPort->doMCSync() || txPort->doMMC() || txPort->doMTC()) ! { ! if(txPort->doMCSync()) ! mcsync = true; ! if(txPort->doMMC()) ! mmc = true; ! if(txPort->doMTC()) ! mtc = true; ! xml.intTag(level, "txSyncPort", sp); ! break; ! } ! } ! */ ! ! // Added by Tim. p3.3.6 ! ! //xml.tag(level++, "midiSyncInfo"); ! //for(iMidiDevice id = midiDevices.begin(); id != midiDevices.end(); ++id) ! //{ ! // MidiDevice* md = *id; ! // (*id)->syncInfo().write(level, xml, md); ! //} ! //xml.etag(level, "midiSyncInfo"); ! ! //xml.intTag(level, "rxSyncPort", rxSyncPort); xml.intTag(level, "mtctype", mtcType); xml.nput(level, "<mtcoffset>%02d:%02d:%02d:%02d:%02d</mtcoffset>\n", *************** *** 903,912 **** mtcOffset.f(), mtcOffset.sf()); extSyncFlag.save(level, xml); ! xml.intTag(level, "genMTCSync", genMTCSync); ! xml.intTag(level, "genMCSync", genMCSync); ! xml.intTag(level, "genMMC", genMMC); ! xml.intTag(level, "acceptMTC", acceptMTC); ! xml.intTag(level, "acceptMMC", acceptMMC); ! xml.intTag(level, "acceptMC", acceptMC); xml.qrectTag(level, "geometryMain", config.geometryMain); --- 1033,1043 ---- mtcOffset.f(), mtcOffset.sf()); extSyncFlag.save(level, xml); ! ! // xml.intTag(level, "genMTCSync", genMTCSync); ! // xml.intTag(level, "genMCSync", genMCSync); ! // xml.intTag(level, "genMMC", genMMC); ! // xml.intTag(level, "acceptMTC", acceptMTC); ! // xml.intTag(level, "acceptMMC", acceptMMC); ! // xml.intTag(level, "acceptMC", acceptMC); xml.qrectTag(level, "geometryMain", config.geometryMain); *************** *** 959,967 **** xml.intTag(level, "midiFilterCtrl3", midiFilterCtrl3); xml.intTag(level, "midiFilterCtrl4", midiFilterCtrl4); ! xml.intTag(level, "txDeviceId", txDeviceId); ! xml.intTag(level, "rxDeviceId", rxDeviceId); ! xml.intTag(level, "txSyncPort", txSyncPort); ! xml.intTag(level, "rxSyncPort", rxSyncPort); xml.intTag(level, "mtctype", mtcType); xml.nput(level, "<mtcoffset>%02d:%02d:%02d:%02d:%02d</mtcoffset>\n", --- 1090,1132 ---- xml.intTag(level, "midiFilterCtrl3", midiFilterCtrl3); xml.intTag(level, "midiFilterCtrl4", midiFilterCtrl4); ! // Removed by Tim. p3.3.6 ! ! //xml.intTag(level, "txDeviceId", txDeviceId); ! //xml.intTag(level, "rxDeviceId", rxDeviceId); ! // Changed by Tim. p3.3.6 ! ! //xml.intTag(level, "txSyncPort", txSyncPort); ! /* ! // To keep old muse versions happy... ! bool mcsync = mmc = mtc = false; ! for(int sp = 0; sp < MIDI_PORTS; ++sp) ! { ! MidiSyncTxPort* txPort = &midiSyncTxPorts[sp]; ! if(txPort->doMCSync() || txPort->doMMC() || txPort->doMTC()) ! { ! if(txPort->doMCSync()) ! mcsync = true; ! if(txPort->doMMC()) ! mmc = true; ! if(txPort->doMTC()) ! mtc = true; ! xml.intTag(level, "txSyncPort", sp); ! break; ! } ! } ! */ ! ! // Added by Tim. p3.3.6 ! ! //xml.tag(level++, "midiSyncInfo"); ! //for(iMidiDevice id = midiDevices.begin(); id != midiDevices.end(); ++id) ! //{ ! // MidiDevice* md = *id; ! // md->syncInfo().write(level, xml, md); ! //} ! //xml.etag(level, "midiSyncInfo"); ! ! //xml.intTag(level, "rxSyncPort", rxSyncPort); xml.intTag(level, "mtctype", mtcType); xml.nput(level, "<mtcoffset>%02d:%02d:%02d:%02d:%02d</mtcoffset>\n", *************** *** 969,978 **** mtcOffset.f(), mtcOffset.sf()); extSyncFlag.save(level, xml); ! xml.intTag(level, "genMTCSync", genMTCSync); ! xml.intTag(level, "genMCSync", genMCSync); ! xml.intTag(level, "genMMC", genMMC); ! xml.intTag(level, "acceptMTC", acceptMTC); ! xml.intTag(level, "acceptMMC", acceptMMC); ! xml.intTag(level, "acceptMC", acceptMC); xml.intTag(level, "bigtimeVisible", menuView->isItemChecked(bt_id)); --- 1134,1144 ---- mtcOffset.f(), mtcOffset.sf()); extSyncFlag.save(level, xml); ! ! // xml.intTag(level, "genMTCSync", genMTCSync); ! // xml.intTag(level, "genMCSync", genMCSync); ! // xml.intTag(level, "genMMC", genMMC); ! // xml.intTag(level, "acceptMTC", acceptMTC); ! // xml.intTag(level, "acceptMMC", acceptMMC); ! // xml.intTag(level, "acceptMC", acceptMC); xml.intTag(level, "bigtimeVisible", menuView->isItemChecked(bt_id)); *************** *** 1009,1014 **** { if (!midiSyncConfig) ! midiSyncConfig = new MidiSyncConfig(this); ! if (midiSyncConfig->isVisible()) { midiSyncConfig->raise(); --- 1175,1181 ---- { if (!midiSyncConfig) ! //midiSyncConfig = new MidiSyncConfig(this); ! midiSyncConfig = new MidiSyncConfig(0, (char*) "midiSyncConfig"); ! if (midiSyncConfig->isVisible()) { midiSyncConfig->raise(); Index: midiseq.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/midiseq.cpp,v retrieving revision 1.30.2.17 retrieving revision 1.30.2.18 diff -C2 -d -r1.30.2.17 -r1.30.2.18 *** midiseq.cpp 13 Mar 2009 02:29:50 -0000 1.30.2.17 --- midiseq.cpp 28 Mar 2009 01:46:09 -0000 1.30.2.18 *************** *** 358,363 **** if (port == -1) continue; ! if ((dev->rwFlags()&0x2) || (extSyncFlag.value() ! && (rxSyncPort == port || rxSyncPort == -1))) { addPollFd(dev->selectRfd(), POLLIN, ::midiRead, this, dev); } --- 358,365 ---- if (port == -1) continue; ! if ((dev->rwFlags() & 0x2) || (extSyncFlag.value() ! //&& (rxSyncPort == port || rxSyncPort == -1))) { ! //&& (dev->syncInfo().MCIn()))) { ! && (midiPorts[port].syncInfo().MCIn()))) { addPollFd(dev->selectRfd(), POLLIN, ::midiRead, this, dev); } *************** *** 425,431 **** void MidiSeq::processMidiClock() { ! if (genMCSync) { ! midiPorts[txSyncPort].sendClock(); ! } /* if (state == START_PLAY) { // start play on sync --- 427,434 ---- void MidiSeq::processMidiClock() { ! // if (genMCSync) { ! // midiPorts[txSyncPort].sendClock(); ! // } ! /* if (state == START_PLAY) { // start play on sync *************** *** 451,455 **** } */ ! midiClock += config.division/24; } --- 454,458 ---- } */ ! // midiClock += config.division/24; } *************** *** 505,512 **** --- 508,528 ---- unsigned curFrame = audio->curFrame(); + // Keep the sync detectors running... + // No, done in Song::beat(), (at the much slower heartbeat rate). + // + //for(int port = 0; port < MIDI_PORTS; ++port) + //{ + // Must keep them running even if there's no device... + //if(midiPorts[port].device()) + // midiPorts[port].syncInfo().setCurFrame(curFrame); + //} + //for(iMidiDevice imd = midiDevices.begin(); imd != midiDevices.end(); ++imd) + // (*imd)->syncInfo().setCurFrame(curFrame); + if (!extSyncFlag.value()) { //int curTick = tempomap.frame2tick(curFrame); // Copied from Tempomap. int curTick = lrint((double(curFrame)/double(sampleRate)) * tempomap.globalTempo() * config.division * 10000.0 / double(tempomap.tempo(song->cpos()))); + //int curTick = lrint((double(curFrame)/double(sampleRate)) * tempomap.globalTempo() * 240000.0 / double(tempomap.tempo(song->cpos()))); /* if ( midiClock > curTick + 100) // reinitialize *************** *** 524,535 **** int div = config.division/24; if(curTick >= midiClock + div) { //processMidiClock(); int perr = (curTick - midiClock) / div; ! if(genMCSync) ! { ! midiPorts[txSyncPort].sendClock(); ! if(perr > 1) printf("Dropped %d midi out clock(s). curTick:%d midiClock:%d div:%d\n", perr, curTick, midiClock, div); ! } // Keeping in mind how (receiving end) Phase Locked Loops (usually) operate... --- 540,608 ---- int div = config.division/24; if(curTick >= midiClock + div) { + //if(curTick >= midiClock) { //processMidiClock(); int perr = (curTick - midiClock) / div; ! //int perr = curTick - midiClock; ! ! bool used = false; ! ! //if(genMCSync) ! //{ ! //midiPorts[txSyncPort].sendClock(); ! for(int port = 0; port < MIDI_PORTS; ++port) ! { ! MidiPort* mp = &midiPorts[port]; ! ! // No device? Clock out not turned on? ! //MidiDevice* dev = mp->device(); ! //if(!dev || !mp->syncInfo().MCOut()) ! if(!mp->device() || !mp->syncInfo().MCOut()) ! continue; ! ! // Shall we check open flags? ! //if(!(dev->rwFlags() & 0x1) || !(dev->openFlags() & 1)) ! //if(!(dev->openFlags() & 1)) ! // continue; ! ! used = true; ! ! mp->sendClock(); ! } ! ! /* ! for(iMidiDevice imd = midiDevices.begin(); imd != midiDevices.end(); ++imd) ! { ! MidiDevice* dev = *imd; ! ! if(!dev->syncInfo().MCOut()) ! continue; ! ! // Shall we check open flags? ! //if(!(dev->rwFlags() & 0x1) || !(dev->openFlags() & 1)) ! //if(!(dev->openFlags() & 1)) ! // continue; ! ! int port = dev->midiPort(); ! // Without this -1 check, interesting sync things can be done by the user without ever ! // assigning any devices to ports ! ! //if(port < 0 || port > MIDI_PORTS) ! if(port < -1 || port > MIDI_PORTS) ! continue; ! ! if(port == -1) ! // Send straight to the device... Copied from MidiPort. ! { ! MidiPlayEvent event(0, 0, 0, ME_CLOCK, 0, 0); ! dev->putEvent(event); ! } ! else ! // Go through the port... ! midiPorts[port].sendClock(); ! } ! */ ! ! if(debugMsg && used && perr > 1) printf("Dropped %d midi out clock(s). curTick:%d midiClock:%d div:%d\n", perr, curTick, midiClock, div); ! //} // Keeping in mind how (receiving end) Phase Locked Loops (usually) operate... *************** *** 545,563 **** // // Tested: With midi thread set to high priority, very few clock dropouts ocurred (P4 1.6Ghz). ! // But target device tick drifts out of phase with muse tick slowly over time, say 20 bars or so, ! // I believe because of the frequent major shifts (below). // May need more tweaking, possibly use round with/instead of lrint (above), and/or // do not use equalization periods - set midiClock to fractions of div. // - // Another issue: Sync pulses occasionally have a major shift to the left (and seem to affect - // the next several pulses). - // This couldn't be caused by us sending the sync message here, at that time (look at this block's conditional). - // This might be caused by the queue, further down the pipeline, but I thought our queue is in 'direct' mode? - // Found some info about a experimental special sync queue by Takashi at alsa (2000). - // www . alsa-project . org / ~tiwai / alsa-sync . html - // Maybe using that would solve stability issues. // // Using equalization periods... midiClock += (perr * div); // // No equalization periods... TODO: --- 618,631 ---- // // Tested: With midi thread set to high priority, very few clock dropouts ocurred (P4 1.6Ghz). ! // But target device tick drifts out of phase with muse tick slowly over time, say 20 bars or so. // May need more tweaking, possibly use round with/instead of lrint (above), and/or // do not use equalization periods - set midiClock to fractions of div. + // Tested: With RTC resolution at 1024, stability was actually better than with 8192! + // It stayed in sync more than 64 bars... // // // Using equalization periods... midiClock += (perr * div); + //midiClock += perr; // // No equalization periods... TODO: Index: midiport.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/midiport.cpp,v retrieving revision 1.21.2.8 retrieving revision 1.21.2.9 diff -C2 -d -r1.21.2.8 -r1.21.2.9 *** midiport.cpp 9 Mar 2009 02:05:17 -0000 1.21.2.8 --- midiport.cpp 28 Mar 2009 01:46:09 -0000 1.21.2.9 *************** *** 31,34 **** --- 31,35 ---- MidiPort* port = &midiPorts[i]; port->setInstrument(genericMidiInstrument); + port->syncInfo().setPort(i); } } *************** *** 44,48 **** _instrument = 0; _controller = new MidiCtrlValListList(); ! // // create minimum set of managed controllers --- 45,49 ---- _instrument = 0; _controller = new MidiCtrlValListList(); ! // // create minimum set of managed controllers *************** *** 161,167 **** if(mc->initVal() != CTRL_VAL_UNKNOWN) { // Note the addition of bias! _device->putEvent(MidiPlayEvent(0, portno(), chan, ! ME_CONTROLLER, mc->num(), mc->initVal() + mc->bias())); } } --- 162,174 ---- if(mc->initVal() != CTRL_VAL_UNKNOWN) { + int ctl = mc->num(); // Note the addition of bias! _device->putEvent(MidiPlayEvent(0, portno(), chan, ! ME_CONTROLLER, ctl, mc->initVal() + mc->bias())); ! ! // Set it once so the 'last HW value' is set, and control knobs are positioned at the value... ! setHwCtrlState(chan, ctl, mc->initVal() + mc->bias()); ! // Set it again so that control labels show 'off'... ! setHwCtrlState(chan, ctl, CTRL_VAL_UNKNOWN); } } *************** *** 178,181 **** --- 185,193 ---- _device->putEvent(MidiPlayEvent(0, portno(), channel, ME_CONTROLLER, cntrl, val)); + + // Set it once so the 'last HW value' is set, and control knobs are positioned at the value... + setHwCtrlState(channel, cntrl, val); + // Set it again so that control labels show 'off'... + //setHwCtrlState(channel, cntrl, CTRL_VAL_UNKNOWN); } } Index: song.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/song.cpp,v retrieving revision 1.59.2.28 retrieving revision 1.59.2.29 diff -C2 -d -r1.59.2.28 -r1.59.2.29 *** song.cpp 9 Mar 2009 02:05:17 -0000 1.59.2.28 --- song.cpp 28 Mar 2009 01:46:09 -0000 1.59.2.29 *************** *** 1228,1231 **** --- 1228,1239 ---- void Song::beat() { + // Keep the sync detectors running... + for(int port = 0; port < MIDI_PORTS; ++port) + { + // Must keep them running even if there's no device... + //if(midiPorts[port].device()) + midiPorts[port].syncInfo().setTime(); + } + int tick = audio->tickPos(); if (audio->isPlaying()) Index: sync.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/sync.h,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.2.1 diff -C2 -d -r1.1.1.1 -r1.1.1.1.2.1 *** sync.h 27 Oct 2003 18:51:56 -0000 1.1.1.1 --- sync.h 28 Mar 2009 01:46:10 -0000 1.1.1.1.2.1 *************** *** 12,32 **** #include "mtc.h" #include "value.h" extern bool debugSync; ! extern int rxSyncPort; ! extern int txSyncPort; ! extern int rxDeviceId; ! extern int txDeviceId; extern int mtcType; extern MTC mtcOffset; extern BValue extSyncFlag; ! extern bool genMTCSync; // output MTC Sync ! extern bool genMCSync; // output MidiClock Sync ! extern bool genMMC; // output Midi Machine Control ! extern bool acceptMTC; ! extern bool acceptMC; ! extern bool acceptMMC; #endif --- 12,104 ---- #include "mtc.h" #include "value.h" + //#include "globaldefs.h" + + class Xml; + //class MidiDevice; + + //class MidiSyncPort + class MidiSyncInfo + { + private: + int _port; + + int _idOut; + int _idIn; + + bool _sendMC; + bool _sendMMC; + bool _sendMTC; + bool _recMC; + bool _recMMC; + bool _recMTC; + + double _lastClkTime; + double _lastTickTime; + bool _clockTrig; + bool _tickTrig; + bool _clockDetect; + bool _tickDetect; + + public: + MidiSyncInfo(); + MidiSyncInfo& operator= (const MidiSyncInfo &sp); + MidiSyncInfo& copyParams(const MidiSyncInfo &sp); + + int port() const { return _port; } + void setPort(const int p) { _port = p; } + + int idOut() const { return _idOut; } + int idIn() const { return _idIn; } + void setIdOut(const int v) { _idOut = v; } + void setIdIn(const int v) { _idIn = v; } + + bool MCOut() const { return _sendMC; } + bool MMCOut() const { return _sendMMC; } + bool MTCOut() const { return _sendMTC; } + + bool MCIn() const { return _recMC; } + bool MMCIn() const { return _recMMC; } + bool MTCIn() const { return _recMTC; } + + void setMCOut(const bool v) { _sendMC = v; } + void setMMCOut(const bool v) { _sendMMC = v; } + void setMTCOut(const bool v) { _sendMTC = v; } + + void setMCIn(const bool v); + void setMMCIn(const bool v) { _recMMC = v; } + void setMTCIn(const bool v) { _recMTC = v; } + + void setTime(); + + bool MCSyncDetect() const { return _clockDetect; } + void trigMCSyncDetect(); + + bool tickDetect() const { return _tickDetect; } + void trigTickDetect(); + + void read(Xml& xml); + //void write(int level, Xml& xml, MidiDevice* md); + void write(int level, Xml& xml); + }; + + //extern MidiSync midiSyncPorts[MIDI_PORTS]; extern bool debugSync; ! //extern int rxSyncPort; ! //extern int txSyncPort; ! //extern int rxDeviceId; ! //extern int txDeviceId; extern int mtcType; extern MTC mtcOffset; extern BValue extSyncFlag; ! //extern bool genMTCSync; // output MTC Sync ! //extern bool genMCSync; // output MidiClock Sync ! //extern bool genMMC; // output Midi Machine Control ! //extern bool acceptMTC; ! //extern bool acceptMC; ! //extern bool acceptMMC; ! extern int curMidiSyncInPort; #endif Index: sync.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/sync.cpp,v retrieving revision 1.6.2.9 retrieving revision 1.6.2.10 diff -C2 -d -r1.6.2.9 -r1.6.2.10 *** sync.cpp 27 Jan 2007 14:30:23 -0000 1.6.2.9 --- sync.cpp 28 Mar 2009 01:46:10 -0000 1.6.2.10 *************** *** 18,26 **** #include "audiodev.h" #include "gconfig.h" ! int rxSyncPort = -1; // receive from all ports ! int txSyncPort = 1; ! int rxDeviceId = 0x7f; // any device ! int txDeviceId = 0x7f; // any device bool debugSync = false; --- 18,29 ---- #include "audiodev.h" #include "gconfig.h" + #include "xml.h" ! //int rxSyncPort = -1; // receive from all ports ! //int txSyncPort = 1; ! //int rxDeviceId = 0x7f; // any device ! //int txDeviceId = 0x7f; // any device ! //MidiSyncPort midiSyncPorts[MIDI_PORTS]; ! int curMidiSyncInPort = -1; bool debugSync = false; *************** *** 28,37 **** MTC mtcOffset; BValue extSyncFlag(0, "extSync"); // false - MASTER, true - SLAVE ! bool genMTCSync = false; // output MTC Sync ! bool genMCSync = false; // output MidiClock Sync ! bool genMMC = false; // output Midi Machine Control ! bool acceptMTC = false; ! bool acceptMC = true; ! bool acceptMMC = true; static MTC mtcCurTime; --- 31,40 ---- MTC mtcOffset; BValue extSyncFlag(0, "extSync"); // false - MASTER, true - SLAVE ! //bool genMTCSync = false; // output MTC Sync ! //bool genMCSync = false; // output MidiClock Sync ! //bool genMMC = false; // output Midi Machine Control ! //bool acceptMTC = false; ! //bool acceptMC = true; ! //bool acceptMMC = true; static MTC mtcCurTime; *************** *** 41,46 **** static bool mtcSync; // receive complete mtc frame? ! static bool mcStart = false; ! static int mcStartTick; //--------------------------------------------------------- --- 44,266 ---- static bool mtcSync; // receive complete mtc frame? ! // Not used yet. ! // static bool mcStart = false; ! // static int mcStartTick; ! ! //--------------------------------------------------------- ! // MidiSyncInfo ! //--------------------------------------------------------- ! ! MidiSyncInfo::MidiSyncInfo() ! { ! _port = -1; ! _idOut = 127; ! _idIn = 127; ! _sendMC = false; ! _sendMMC = false; ! _sendMTC = false; ! _recMC = false; ! _recMMC = false; ! _recMTC = false; ! ! _lastClkTime = 0.0; ! _lastTickTime = 0.0; ! _clockTrig = false; ! _tickTrig = false; ! _clockDetect = false; ! _tickDetect = false; ! } ! ! //--------------------------------------------------------- ! // operator = ! //--------------------------------------------------------- ! ! MidiSyncInfo& MidiSyncInfo::operator=(const MidiSyncInfo &sp) ! { ! //_port = sp._port; ! ! copyParams(sp); ! ! _lastClkTime = sp._lastClkTime; ! _lastTickTime = sp._lastTickTime; ! _clockTrig = sp._clockTrig; ! _tickTrig = sp._tickTrig; ! _clockDetect = sp._clockDetect; ! _tickDetect = sp._tickDetect; ! return *this; ! } ! ! //--------------------------------------------------------- ! // copyParams ! //--------------------------------------------------------- ! ! MidiSyncInfo& MidiSyncInfo::copyParams(const MidiSyncInfo &sp) ! { ! //_port = sp._port; ! ! _idOut = sp._idOut; ! _idIn = sp._idIn; ! _sendMC = sp._sendMC; ! _sendMMC = sp._sendMMC; ! _sendMTC = sp._sendMTC; ! setMCIn(sp._recMC); ! _recMMC = sp._recMMC; ! _recMTC = sp._recMTC; ! return *this; ! } ! ! //--------------------------------------------------------- ! // setTime ! //--------------------------------------------------------- ! ! void MidiSyncInfo::setTime() ! { ! // Note: CurTime() makes a system call to gettimeofday(), ! // which apparently can be slow in some cases. So I avoid calling this function ! // too frequently by calling it (at the heartbeat rate) in Song::beat(). T356 ! double t = curTime(); ! ! if(_clockTrig) ! { ! _clockTrig = false; ! _lastClkTime = t; ! } ! else ! if(_clockDetect && (t - _lastClkTime >= 1.0)) // Set detect indicator timeout to about 1 second. ! { ! _clockDetect = false; ! if(curMidiSyncInPort == _port) ! curMidiSyncInPort = -1; ! } ! ! if(_tickTrig) ! { ! _tickTrig = false; ! _lastTickTime = t; ! } ! else ! if(_tickDetect && (t - _lastTickTime) >= 1.0) // Set detect indicator timeout to about 1 second. ! _tickDetect = false; ! } ! ! //--------------------------------------------------------- ! // setMCIn ! //--------------------------------------------------------- ! ! void MidiSyncInfo::setMCIn(const bool v) ! { ! _recMC = v; ! // If sync receive was turned off, clear the current midi sync in port number so another port can grab it. ! if(!_recMC && _port != -1 && curMidiSyncInPort == _port) ! curMidiSyncInPort = -1; ! } ! ! //--------------------------------------------------------- ! // trigMCSyncDetect ! //--------------------------------------------------------- ! ! void MidiSyncInfo::trigMCSyncDetect() ! { ! _clockDetect = true; ! _clockTrig = true; ! // Set the current midi sync in port number if it's not taken... ! if(_recMC && curMidiSyncInPort == -1) ! curMidiSyncInPort = _port; ! } ! ! //--------------------------------------------------------- ! // trigTickDetect ! //--------------------------------------------------------- ! ! void MidiSyncInfo::trigTickDetect() ! { ! _tickDetect = true; ! _tickTrig = true; ! } ! ! //--------------------------------------------------------- ! // read ! //--------------------------------------------------------- ! ! void MidiSyncInfo::read(Xml& xml) ! { ! for (;;) { ! Xml::Token token(xml.parse()); ! const QString& tag(xml.s1()); ! switch (token) { ! case Xml::Error: ! case Xml::End: ! return; ! case Xml::TagStart: ! if (tag == "idOut") ! _idOut = xml.parseInt(); ! else if (tag == "idIn") ! _idIn = xml.parseInt(); ! else if (tag == "sendMC") ! _sendMC = xml.parseInt(); ! else if (tag == "sendMMC") ! _sendMMC = xml.parseInt(); ! else if (tag == "sendMTC") ! _sendMTC = xml.parseInt(); ! else if (tag == "recMC") ! _recMC = xml.parseInt(); ! else if (tag == "recMMC") ! _recMMC = xml.parseInt(); ! else if (tag == "recMTC") ! _recMTC = xml.parseInt(); ! else ! xml.unknown("midiSyncInfo"); ! break; ! case Xml::TagEnd: ! if (tag == "midiSyncInfo") ! return; ! default: ! break; ! } ! } ! } ! ! //--------------------------------------------------------- ! // write ! //--------------------------------------------------------- ! ! //void MidiSyncInfo::write(int level, Xml& xml, MidiDevice* md) ! void MidiSyncInfo::write(int level, Xml& xml) ! { ! //if(!md) ! // return; ! ! // All defaults? Nothing to write. ! if(_idOut == 127 && _idIn == 127 && !_sendMC && !_sendMMC && !_sendMTC && !_recMC && !_recMMC && !_recMTC) ! return; ! ! xml.tag(level++, "midiSyncInfo"); ! //xml.intTag(level, "idx", idx); ! //xml.intTag(level++, "midiSyncPort", idx); ! //xml.tag(level++, "midiSyncInfo idx=\"%d\"", idx); ! ! //xml.strTag(level, "device", md->name()); ! ! if(_idOut != 127) ! xml.intTag(level, "idOut", _idOut); ! if(_idIn != 127) ! xml.intTag(level, "idIn", _idIn); ! ! if(_sendMC) ! xml.intTag(level, "sendMC", true); ! if(_sendMMC) ! xml.intTag(level, "sendMMC", true); ! if(_sendMTC) ! xml.intTag(level, "sendMTC", true); ! ! if(_recMC) ! xml.intTag(level, "recMC", true); ! if(_recMMC) ! xml.intTag(level, "recMMC", true); ! if(_recMTC) ! xml.intTag(level, "recMTC", true); ! ! xml.etag(level, "midiSyncInfo"); ! } //--------------------------------------------------------- *************** *** 54,58 **** printf("mmcInput: n:%d %02x %02x %02x %02x\n", n, p[2], p[3], p[4], p[5]); ! if (!(extSyncFlag.value() && acceptMMC)) return; --- 274,279 ---- printf("mmcInput: n:%d %02x %02x %02x %02x\n", n, p[2], p[3], p[4], p[5]); ! //if (!(extSyncFlag.value() && acceptMMC)) ! if(!extSyncFlag.value()) return; *************** *** 260,266 **** if (midiInputTrace) printf("set song position port:%d %d\n", port, midiBeat); ! if (!extSyncFlag.value()) return; Pos pos((config.division * midiBeat) / 4, true); if (!checkAudioDevice()) return; --- 481,499 ---- if (midiInputTrace) printf("set song position port:%d %d\n", port, midiBeat); ! ! midiPorts[port].syncInfo().trigMCSyncDetect(); ! ! //if (!extSyncFlag.value()) ! // External sync not on? Clock in not turned on? ! if(!extSyncFlag.value() || !midiPorts[port].syncInfo().MCIn()) return; + Pos pos((config.division * midiBeat) / 4, true); + + // Re-transmit song position to other devices if clock out turned on. + for(int p = 0; p < MIDI_PORTS; ++p) + if(p != port && midiPorts[p].syncInfo().MCOut()) + midiPorts[p].sendSongpos(midiBeat); + if (!checkAudioDevice()) return; *************** *** 315,320 **** } - - //--------------------------------------------------------- // realtimeSystemInput --- 548,551 ---- *************** *** 327,341 **** printf("realtimeSystemInput port:%d 0x%x\n", port+1, c); ! if (midiInputTrace && (rxSyncPort != port) && rxSyncPort != -1) { ! if (debugSync) ! printf("rxSyncPort configured as %d; received sync from port %d\n", ! rxSyncPort, port); ! return; ! } ! if (!extSyncFlag.value()) ! return; switch(c) { case 0xf8: // midi clock (24 ticks / quarter note) { double mclock0 = curTime(); // Difference in time last 2 rounds: --- 558,596 ---- printf("realtimeSystemInput port:%d 0x%x\n", port+1, c); ! //if (midiInputTrace && (rxSyncPort != port) && rxSyncPort != -1) { ! // if (debugSync) ! // printf("rxSyncPort configured as %d; received sync from port %d\n", ! // rxSyncPort, port); ! // return; ! // } ! ! MidiPort* mp = &midiPorts[port]; ! ! // Trigger on any tick, clock, or realtime command. ! if(c == 0xf9) ! mp->syncInfo().trigTickDetect(); ! else ! mp->syncInfo().trigMCSyncDetect(); ! ! // External sync not on? Clock in not turned on? ! if(!extSyncFlag.value() || !mp->syncInfo().MCIn()) ! return; ! switch(c) { case 0xf8: // midi clock (24 ticks / quarter note) { + // Not for the current in port? Forget it. + if(port != curMidiSyncInPort) + break; + + // Re-transmit clock to other devices if clock out turned on. + // Must be careful not to allow more than one clock input at a time. + // Would re-transmit mixture of multiple clocks - confusing receivers. + // Solution: Added curMidiSyncInPort. + // Maybe in MidiSeq::processTimerTick(), call sendClock for the other devices, instead of here. + for(int p = 0; p < MIDI_PORTS; ++p) + if(p != port && midiPorts[p].syncInfo().MCOut()) + midiPorts[p].sendClock(); + double mclock0 = curTime(); // Difference in time last 2 rounds: *************** *** 425,429 **** // if (mclock1 == 0.0) { ! midiPorts[port].device()->discardInput(); if (debugSync) printf("Discarding input from port %d\n", port); --- 680,684 ---- // if (mclock1 == 0.0) { ! mp->device()->discardInput(); if (debugSync) printf("Discarding input from port %d\n", port); *************** *** 448,458 **** break; case 0xf9: // midi tick (every 10 msec) ! if (mcStart) { ! song->setPos(0, mcStartTick); ! mcStart = false; ! return; ! } break; case 0xfa: // start if (debugSync) printf(" start\n"); --- 703,719 ---- break; case 0xf9: // midi tick (every 10 msec) ! // FIXME: Unfinished? mcStartTick is uninitialized and Song::setPos doesn't set it either. Dangerous to allow this. ! //if (mcStart) { ! // song->setPos(0, mcStartTick); ! // mcStart = false; ! // return; ! // } break; case 0xfa: // start + // Re-transmit start to other devices if clock out turned on. + for(int p = 0; p < MIDI_PORTS; ++p) + if(p != port && midiPorts[p].syncInfo().MCOut()) + midiPorts[p].sendStart(); + if (debugSync) printf(" start\n"); *************** *** 476,479 **** --- 737,745 ---- break; case 0xfb: // continue + // Re-transmit continue to other devices if clock out turned on. + for(int p = 0; p < MIDI_PORTS; ++p) + if(p != port && midiPorts[p].syncInfo().MCOut()) + midiPorts[p].sendContinue(); + if (debugSync) printf(" continue\n"); *************** *** 487,490 **** --- 753,761 ---- break; case 0xfc: // stop + // Re-transmit stop to other devices if clock out turned on. + for(int p = 0; p < MIDI_PORTS; ++p) + if(p != port && midiPorts[p].syncInfo().MCOut()) + midiPorts[p].sendStop(); + if (debugSync) printf(" stop\n"); Index: midiport.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/midiport.h,v retrieving revision 1.9.2.3 retrieving revision 1.9.2.4 diff -C2 -d -r1.9.2.3 -r1.9.2.4 *** midiport.h 9 Mar 2009 02:05:17 -0000 1.9.2.3 --- midiport.h 28 Mar 2009 01:46:09 -0000 1.9.2.4 *************** *** 11,14 **** --- 11,15 ---- #include "globaldefs.h" + #include "sync.h" class MidiDevice; *************** *** 19,22 **** --- 20,24 ---- class MidiCtrlValList; class Part; + //class MidiSyncInfo; //--------------------------------------------------------- *************** *** 30,33 **** --- 32,37 ---- MidiInstrument* _instrument; AutomationType _automationType[MIDI_CHANNELS]; + // Holds sync settings and detection monitors. + MidiSyncInfo _syncInfo; void clearDevice(); *************** *** 92,95 **** --- 96,100 ---- _automationType[channel] = t; } + MidiSyncInfo& syncInfo() { return _syncInfo; } }; Index: icons.h =================================================================== RCS file: /cvsroot/lmuse/muse/muse/icons.h,v retrieving revision 1.11.2.2 retrieving revision 1.11.2.3 diff -C2 -d -r1.11.2.2 -r1.11.2.3 *** icons.h 4 Jan 2007 00:35:16 -0000 1.11.2.2 --- icons.h 28 Mar 2009 01:46:09 -0000 1.11.2.3 *************** *** 105,108 **** --- 105,109 ---- extern QPixmap* exitIcon; extern QPixmap* exit1Icon; + extern QPixmap* record1_Icon; extern QPixmap* record_on_Icon; extern QPixmap* record_off_Icon; Index: icons.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/icons.cpp,v retrieving revision 1.13.2.2 retrieving revision 1.13.2.3 diff -C2 -d -r1.13.2.2 -r1.13.2.3 *** icons.cpp 4 Jan 2007 00:35:16 -0000 1.13.2.2 --- icons.cpp 28 Mar 2009 01:46:09 -0000 1.13.2.3 *************** *** 47,50 **** --- 47,51 ---- #include "xpm/play.xpm" + #include "xpm/record1.xpm" #include "xpm/record.xpm" #include "xpm/record_on.xpm" *************** *** 229,232 **** --- 230,234 ---- QPixmap* playIcon; + QPixmap* record1_Icon; QPixmap* record_on_Icon; QPixmap* record_off_Icon; *************** *** 397,402 **** playIcon = new QPixmap(play_xpm); ! record_on_Icon= new QPixmap(record_on_xpm); ! record_off_Icon= new QPixmap(record_off_xpm); recordIcon = new QPixmap(record_xpm); stopIcon = new QPixmap(stop_xpm); --- 399,405 ---- playIcon = new QPixmap(play_xpm); ! record1_Icon = new QPixmap(record1_xpm); ! record_on_Icon = new QPixmap(record_on_xpm); ! record_off_Icon = new QPixmap(record_off_xpm); recordIcon = new QPixmap(record_xpm); stopIcon = new QPixmap(stop_xpm); Index: mididev.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/Attic/mididev.cpp,v retrieving revision 1.10.2.3 retrieving revision 1.10.2.4 diff -C2 -d -r1.10.2.3 -r1.10.2.4 *** mididev.cpp 9 Mar 2009 02:05:17 -0000 1.10.2.3 --- mididev.cpp 28 Mar 2009 01:46:09 -0000 1.10.2.4 *************** *** 23,27 **** #include "audio.h" #include "midiseq.h" ! #include "sync.h" #include "midiitransform.h" --- 23,27 ---- #include "audio.h" #include "midiseq.h" ! //#include "sync.h" #include "midiitransform.h" *************** *** 227,230 **** --- 227,238 ---- } + iMidiDevice MidiDeviceList::find(const MidiDevice* dev) + { + for (iMidiDevice i = begin(); i != end(); ++i) + if (*i == dev) + return i; + return end(); + } + //--------------------------------------------------------- // add Index: audio.cpp =================================================================== RCS file: /cvsroot/lmuse/muse/muse/audio.cpp,v retrieving revision 1.59.2.20 retrieving revision 1.59.2.21 diff -C2 -d -r1.59.2.20 -r1.59.2.21 *** audio.cpp 2 Feb 2009 21:37:59 -0000 1.59.2.20 --- audio.cpp 28 Mar 2009 01:46:09 -0000 1.59.2.21 *************** *** 624,640 **** midiSeq->msgSeek(); // handle stuck notes and set // controller for new position ! if (genMCSync) { ! MidiPort* syncPort = &midiPorts[txSyncPort]; ! int beat = (curTickPos * 4) / config.division; ! bool isPlaying=false; ! if (state == PLAY) ! isPlaying = true; ! syncPort->sendStop(); ! syncPort->sendSongpos(beat); ! if (isPlaying) ! syncPort->sendContinue(); ! } loopPassed = true; // for record loop mode if (state != LOOP2 && !freewheel()) --- 624,729 ---- midiSeq->msgSeek(); // handle stuck notes and set // controller for new position ! //if(genMCSync) ! //{ ! for(int port = 0; port < MIDI_PORTS; ++port) ! { ! MidiPort* mp = &midiPorts[port]; ! MidiDevice* dev = mp->device(); ! if(!dev || !mp->syncInfo().MCOut()) ! continue; ! // Added by T356: Shall we check for device write open flag to see if it's ok to send?... ! // This means obey what the user has chosen for read/write in the midi port config dialog, ! // which already takes into account whether the device is writable or not. ! //if(!(dev->rwFlags() & 0x1) || !(dev->openFlags() & 1)) ! //if(!(dev->openFlags() & 1)) ! // continue; ! ! //int port = dev->midiPort(); ! ! // By checking for no port here (-1), (and out of bounds), it means ! // the device must be assigned to a port for these MMC commands to be sent. ! // Without this check, interesting sync things can be done by the user without ever ! // assigning any devices to ports ! ! //if(port < 0 || port > MIDI_PORTS) ! //if(port < -1 || port > MIDI_PORTS) ! // continue; ! ! int beat = (curTickPos * 4) / config.division; ! bool isPlaying=false; ! if(state == PLAY) ! isPlaying = true; ! ! mp->sendStop(); ! mp->sendSongpos(beat); ! if(isPlaying) ! mp->sendContinue(); ! } ! //} ! ! /* ! if(genMCSync) ! { ! for(iMidiDevice imd = midiDevices.begin(); imd != midiDevices.end(); ++imd) ! { ! MidiDevice* dev = (*imd); ! if(!dev->syncInfo().MCOut()) ! continue; ! ! // Added by T356: Shall we check for device write open flag to see if it's ok to send?... ! // This means obey what the user has chosen for read/write in the midi port config dialog, ! // which already takes into account whether the device is writable or not. ! //if(!(dev->rwFlags() & 0x1) || !(dev->openFlags() & 1)) ! //if(!(dev->openFlags() & 1)) ! // continue; ! ! int port = dev->midiPort(); ! ! // By checking for no port here (-1), (and out of bounds), it means ! // the device must be assigned to a port for these MMC commands to be sent. ! // Without this check, interesting sync things can be done by the user without ever ! // assigning any devices to ports ! ! //if(port < 0 || port > MIDI_PORTS) ! if(port < -1 || port > MIDI_PORTS) ! continue; ! ! int beat = (curTickPos * 4) / config.division; ! ! bool isPlaying=false; ! if(state == PLAY) ! isPlaying = true; ! ! ... [truncated message content] |