diff options
author | Florian Jung <flo@windfisch.org> | 2012-03-15 18:21:23 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2012-03-15 18:21:23 +0000 |
commit | 27b7bf6815cda7abb67026c37b3e44daee1803cb (patch) | |
tree | 0b9d1c0bc84ac7ff8032e707f2b5fb4e0aaabb5c /muse2/muse/midiseq.cpp | |
parent | 2d6f113a10eb485694e20a78500f650776d701e3 (diff) |
merged with trunk
Diffstat (limited to 'muse2/muse/midiseq.cpp')
-rw-r--r-- | muse2/muse/midiseq.cpp | 201 |
1 files changed, 60 insertions, 141 deletions
diff --git a/muse2/muse/midiseq.cpp b/muse2/muse/midiseq.cpp index 1e46db11..94335d99 100644 --- a/muse2/muse/midiseq.cpp +++ b/muse2/muse/midiseq.cpp @@ -31,6 +31,7 @@ #include <poll.h> #include <math.h> +#include "app.h" #include "globals.h" #include "midi.h" #include "midiseq.h" @@ -44,7 +45,6 @@ #include "synth.h" #include "song.h" #include "gconfig.h" -#include <lo/lo_osc_types.h> namespace MusEGlobal { MusECore::MidiSeq* midiSeq; @@ -57,7 +57,6 @@ int MidiSeq::ticker = 0; void initMidiSequencer() { - //MusEGlobal::midiSeq = new MidiSeq(MusEGlobal::realTimeScheduling ? MusEGlobal::realTimePriority : 0, "Midi"); MusEGlobal::midiSeq = new MidiSeq("Midi"); } @@ -80,19 +79,18 @@ void MidiSeq::processMsg(const ThreadMsg* m) { MusECore::AudioMsg* msg = (MusECore::AudioMsg*)m; switch(msg->id) { - // This does not appear to be used anymore. Was sent in Audio::process1, + // This does not appear to be used anymore. Was sent in Audio::process1, DELETETHIS 5 ?? // now Audio::processMidi is called directly. p4.0.15 Tim. //case MusECore::MS_PROCESS: // audio->processMidi(); // break; - // Removed p4.0.34 - //case MusECore::SEQM_SEEK: - // processSeek(); - // break; - //case MusECore::MS_STOP: - // processStop(); - // break; + case MusECore::SEQM_SEEK: + processSeek(); + break; + case MusECore::MS_STOP: + processStop(); + break; case MusECore::MS_SET_RTC: MusEGlobal::doSetuid(); @@ -102,8 +100,9 @@ void MidiSeq::processMsg(const ThreadMsg* m) case MusECore::MS_UPDATE_POLL_FD: updatePollFd(); break; - // Moved into Song::processMsg p4.0.34 - /* + + + // Moved into Song::processMsg p4.0.34 ... case MusECore::SEQM_ADD_TRACK: MusEGlobal::song->insertTrack2(msg->track, msg->ival); updatePollFd(); @@ -112,10 +111,10 @@ void MidiSeq::processMsg(const ThreadMsg* m) MusEGlobal::song->cmdRemoveTrack(msg->track); updatePollFd(); break; - case MusECore::SEQM_CHANGE_TRACK: - MusEGlobal::song->changeTrack((Track*)(msg->p1), (Track*)(msg->p2)); - updatePollFd(); - break; + //case MusECore::SEQM_CHANGE_TRACK: DELETETHIS 4 + // MusEGlobal::song->changeTrack((Track*)(msg->p1), (Track*)(msg->p2)); + // updatePollFd(); + // break; case MusECore::SEQM_ADD_PART: MusEGlobal::song->cmdAddPart((Part*)msg->p1); break; @@ -123,10 +122,10 @@ void MidiSeq::processMsg(const ThreadMsg* m) MusEGlobal::song->cmdRemovePart((Part*)msg->p1); break; case MusECore::SEQM_CHANGE_PART: - //MusEGlobal::song->cmdChangePart((Part*)msg->p1, (Part*)msg->p2); MusEGlobal::song->cmdChangePart((Part*)msg->p1, (Part*)msg->p2, msg->a, msg->b); break; - */ + + case MusECore::SEQM_SET_TRACK_OUT_CHAN: { MidiTrack* track = (MidiTrack*)(msg->p1); @@ -158,29 +157,26 @@ void MidiSeq::processMsg(const ThreadMsg* m) } } -#if 0 -// Removed p4.0.34 +#if 1 // DELETETHIS the #if and #endif? //--------------------------------------------------------- // processStop //--------------------------------------------------------- void MidiSeq::processStop() { - // p3.3.28 - // TODO Try to move this into Audio::stopRolling(). p4.0.22 // Done p4.0.34 - //playStateExt = false; // not playing + // TODO Try to move this into Audio::stopRolling(). + playStateExt = false; // not playing // // clear Alsa midi device notes and stop stuck notes - // Jack midi devices are handled in Audio::stopRolling() // for(iMidiDevice id = MusEGlobal::midiDevices.begin(); id != MusEGlobal::midiDevices.end(); ++id) { - //MidiDevice* md = *id; + //MidiDevice* md = *id; DELETETHIS 3 // Only ALSA devices are handled by this thread. - if((*id)->deviceType() == MidiDevice::ALSA_MIDI) // p4.0.22 - (*id)->handleStop(); // p4.0.22 - /* + //if((*id)->deviceType() == MidiDevice::ALSA_MIDI) + (*id)->handleStop(); + /* DELETETHIS 14 if (md->midiPort() == -1) continue; MPEventList* pel = md->playEvents(); @@ -199,18 +195,17 @@ void MidiSeq::processStop() } #endif -#if 0 -// Removed p4.0.34 +#if 1 //DELETETHIS #if and #endif //--------------------------------------------------------- // processSeek //--------------------------------------------------------- void MidiSeq::processSeek() { - //int pos = MusEGlobal::audio->tickPos(); - // TODO Try to move this into MusEGlobal::audio::seek(). p4.0.22 Done p4.0.34 - //if (pos == 0 && !MusEGlobal::song->record()) - // MusEGlobal::audio->initDevices(); + int pos = MusEGlobal::audio->tickPos(); + // TODO Try to move this into MusEGlobal::audio::seek(). + if (pos == 0 && !MusEGlobal::song->record()) + MusEGlobal::audio->initDevices(); //--------------------------------------------------- // set all controller @@ -218,11 +213,11 @@ void MidiSeq::processSeek() for (iMidiDevice i = MusEGlobal::midiDevices.begin(); i != MusEGlobal::midiDevices.end(); ++i) { - //MidiDevice* md = *i; + //MidiDevice* md = *i; DELETETHIS 3 // Only ALSA devices are handled by this thread. - if((*i)->deviceType() == MidiDevice::ALSA_MIDI) // p4.0.22 - (*i)->handleSeek(); // p4.0.22 - /* + //if((*i)->deviceType() == MidiDevice::ALSA_MIDI) + (*i)->handleSeek(); + /* DELETETHIS 47 int port = md->midiPort(); if (port == -1) continue; @@ -278,13 +273,9 @@ void MidiSeq::processSeek() // MidiSeq //--------------------------------------------------------- -//MidiSeq::MidiSeq(int priority, const char* name) -// : Thread(priority, name) MidiSeq::MidiSeq(const char* name) : Thread(name) { - // Changed by Tim. p3.3.17 - //prio = priority; prio = 0; idle = false; @@ -352,7 +343,7 @@ signed int MidiSeq::selectTimer() void MidiSeq::threadStart(void*) { - // Removed by Tim. p3.3.17 + // Removed by Tim. p3.3.17 DELETETHIS 13 /* struct sched_param rt_param; memset(&rt_param, 0, sizeof(rt_param)); @@ -397,6 +388,7 @@ static void midiRead(void*, void* d) dev->processInput(); } +// DELETETHIS 12 //--------------------------------------------------------- // synthIRead //--------------------------------------------------------- @@ -446,24 +438,13 @@ void MidiSeq::updatePollFd() for (iMidiDevice imd = MusEGlobal::midiDevices.begin(); imd != MusEGlobal::midiDevices.end(); ++imd) { MidiDevice* dev = *imd; int port = dev->midiPort(); - //const QString name = dev->name(); if (port == -1) continue; if ((dev->rwFlags() & 0x2) || (MusEGlobal::extSyncFlag.value() - //&& (rxSyncPort == port || rxSyncPort == -1))) { - //&& (dev->syncInfo().MCIn()))) { - && (MusEGlobal::midiPorts[port].syncInfo().MCIn()))) { - if(dev->selectRfd() < 0){ - //fprintf(stderr, "WARNING: read-file-descriptor for {%s} is negative\n", name.toLatin1()); - } + && (MusEGlobal::midiPorts[port].syncInfo().MCIn()))) addPollFd(dev->selectRfd(), POLLIN, MusECore::midiRead, this, dev); - } - if (dev->bytesToWrite()){ - if(dev->selectWfd() < 0){ - //fprintf(stderr, "WARNING: write-file-descriptor for {%s} is negative\n", name.toLatin1()); - } + if (dev->bytesToWrite()) addPollFd(dev->selectWfd(), POLLOUT, MusECore::midiWrite, this, dev); - } } // special handling for alsa midi: // (one fd for all devices) @@ -480,23 +461,19 @@ void MidiSeq::updatePollFd() void MidiSeq::threadStop() { timer->stopTimer(); - //timer.stopTimer(); } //--------------------------------------------------------- // setRtcTicks -// return true on success +// returns actual tick frequency //--------------------------------------------------------- -bool MidiSeq::setRtcTicks() +int MidiSeq::setRtcTicks() { + int gotTicks = timer->setTimerFreq(MusEGlobal::config.rtcTicks); - //timer.setTimerFreq(MusEGlobal::config.rtcTicks); - //timer.startTimer(); - timer->setTimerFreq(MusEGlobal::config.rtcTicks); timer->startTimer(); - realRtcTicks = MusEGlobal::config.rtcTicks; - return true; + return gotTicks; } //--------------------------------------------------------- @@ -504,24 +481,20 @@ bool MidiSeq::setRtcTicks() // return true on error //--------------------------------------------------------- -//bool MidiSeq::start() void MidiSeq::start(int priority) { - // Changed by Tim. p3.3.17 - prio = priority; - //timerFd = -1; - MusEGlobal::doSetuid(); - //timerFd = selectTimer(); - //timerFd = timer.initTimer(); - //printf("timerFd=%d\n",timerFd); - setRtcTicks(); + int gotTicks = setRtcTicks(); MusEGlobal::undoSetuid(); - //Thread::start(); Thread::start(priority); - //return false; + + if (gotTicks < 500) { + QMessageBox::warning( MusEGlobal::muse, QString("Bad timing"), QString("Timing source has a frequency below 500hz!\n" \ + "This could lead to audible timing problems.\n" \ + "Please see console output for any further error messages\n ")); + } } //--------------------------------------------------------- @@ -530,6 +503,7 @@ void MidiSeq::start(int priority) void MidiSeq::processMidiClock() { + // DELETETHIS 30, maybe remove entire function? // if (genMCSync) { // MusEGlobal::midiPorts[txSyncPort].sendClock(); // } @@ -584,10 +558,6 @@ void MidiSeq::midiTick(void* p, void*) void MidiSeq::processTimerTick() { - // Disabled by Tim. p3.3.22 -// extern int watchMidi; -// ++watchMidi; // make a simple watchdog happy - //--------------------------------------------------- // read elapsed rtc timer ticks //--------------------------------------------------- @@ -596,14 +566,12 @@ void MidiSeq::processTimerTick() unsigned long nn; if (timerFd != -1) { nn = timer->getTimerTicks(); - //nn = timer.getTimerTicks(); nn >>= 8; } - if (idle) { -// printf("IDLE\n"); + if (idle) return; - } + if (MusEGlobal::midiBusy) { // we hit MusEGlobal::audio: MusEGlobal::midiSeq->msgProcess (actually this has been MusEGlobal::audio->processMidi for some time now - Tim) // miss this timer tick @@ -612,70 +580,32 @@ void MidiSeq::processTimerTick() unsigned curFrame = MusEGlobal::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(MusEGlobal::midiPorts[port].device()) - // MusEGlobal::midiPorts[port].syncInfo().setCurFrame(curFrame); - //} - //for(iMidiDevice imd = MusEGlobal::midiDevices.begin(); imd != MusEGlobal::midiDevices.end(); ++imd) - // (*imd)->syncInfo().setCurFrame(curFrame); - if (!MusEGlobal::extSyncFlag.value()) { - //int curTick = MusEGlobal::tempomap.frame2tick(curFrame); - // Copied from Tempomap. - //int curTick = lrint((double(curFrame)/double(MusEGlobal::sampleRate)) * MusEGlobal::tempomap.globalTempo() * MusEGlobal::config.division * 10000.0 / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos()))); - //int curTick = lrint((double(curFrame)/double(MusEGlobal::sampleRate)) * MusEGlobal::tempomap.globalTempo() * 240000.0 / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos()))); int curTick = lrint((double(curFrame)/double(MusEGlobal::sampleRate)) * double(MusEGlobal::tempomap.globalTempo()) * double(MusEGlobal::config.division) * 10000.0 / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos()))); - //int curTick = int((double(curFrame)/double(MusEGlobal::sampleRate)) * double(MusEGlobal::tempomap.globalTempo()) * double(MusEGlobal::config.division * 10000.0) / double(MusEGlobal::tempomap.tempo(MusEGlobal::song->cpos()))); - -/* if ( midiClock > curTick + 100) // reinitialize - { - midiClock = curTick; - } - else if( curTick > midiClock + 100) // reinitialize - { - midiClock = curTick; - }*/ if(midiClock > curTick) midiClock = curTick; int div = MusEGlobal::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) - //{ - //MusEGlobal::midiPorts[txSyncPort].sendClock(); for(int port = 0; port < MIDI_PORTS; ++port) { MidiPort* mp = &MusEGlobal::midiPorts[port]; - // No device? Clock out not turned on? - //MidiDevice* dev = mp->device(); - //if(!dev || !mp->syncInfo().MCOut()) + // No device? Clock out not turned on? DELETETHIS 3 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(); } + // DELETETHIS 35 ?? /* for(iMidiDevice imd = MusEGlobal::midiDevices.begin(); imd != MusEGlobal::midiDevices.end(); ++imd) { @@ -710,7 +640,7 @@ void MidiSeq::processTimerTick() if(MusEGlobal::debugMsg && used && perr > 1) printf("Dropped %d midi out clock(s). curTick:%d midiClock:%d div:%d\n", perr, curTick, midiClock, div); - //} + //} DELETETHIS and maybe the below ??? // Increment as if we had caught the timer exactly on the mark, even if the timer // has passed beyond the mark, or even beyond 2 * div. @@ -732,25 +662,16 @@ void MidiSeq::processTimerTick() // // Using equalization periods... midiClock += (perr * div); - //midiClock += perr; + //midiClock += perr; DELETETHIS // - // No equalization periods... TODO: + // No equalization periods... TODO: or DELETETHIS? //midiClock += (perr * div); } } -// if (genMTCSync) { - // printf("Midi Time Code Sync generation not impl.\n"); -// } - - // p3.3.25 - //int tickpos = MusEGlobal::audio->tickPos(); - //bool extsync = MusEGlobal::extSyncFlag.value(); - // // play all events upto curFrame - // for (iMidiDevice id = MusEGlobal::midiDevices.begin(); id != MusEGlobal::midiDevices.end(); ++id) { - //MidiDevice* md = *id; + //MidiDevice* md = *id; DELETETHIS 10 // Is it a Jack midi device? They are iterated in Audio::processMidi. p3.3.36 //MidiJackDevice* mjd = dynamic_cast<MidiJackDevice*>(md); //if(mjd) @@ -762,7 +683,7 @@ void MidiSeq::processTimerTick() if((*id)->deviceType() == MidiDevice::ALSA_MIDI) (*id)->processMidi(); - // Moved into MidiAlsaDevice. p4.0.34 + // Moved into MidiAlsaDevice. p4.0.34 DELETETHIS 40 /* int port = md->midiPort(); MidiPort* mp = port != -1 ? &MusEGlobal::midiPorts[port] : 0; @@ -838,10 +759,8 @@ void MidiSeq::msgSetMidiDevice(MidiPort* port, MidiDevice* device) Thread::sendMsg(&msg); } -// This does not appear to be used anymore. Was called in Audio::process1, now Audio::processMidi is called directly. p4.0.15 Tim. -//void MidiSeq::msgProcess() { msgMsg(MusECore::MS_PROCESS); } -//void MidiSeq::msgSeek() { msgMsg(MusECore::SEQM_SEEK); } // Removed p4.0.34 -//void MidiSeq::msgStop() { msgMsg(MusECore::MS_STOP); } // +void MidiSeq::msgSeek() { msgMsg(MusECore::SEQM_SEEK); } +void MidiSeq::msgStop() { msgMsg(MusECore::MS_STOP); } void MidiSeq::msgSetRtc() { msgMsg(MusECore::MS_SET_RTC); } void MidiSeq::msgUpdatePollFd() { msgMsg(MusECore::MS_UPDATE_POLL_FD); } |