diff options
-rw-r--r-- | muse/ChangeLog | 3 | ||||
-rw-r--r-- | muse/muse/audio.cpp | 2 | ||||
-rw-r--r-- | muse/muse/marker/markerview.cpp | 4 | ||||
-rw-r--r-- | muse/muse/midi.cpp | 2 | ||||
-rw-r--r-- | muse/muse/midiseq.cpp | 23 | ||||
-rw-r--r-- | muse/muse/midiseq.h | 2 |
6 files changed, 16 insertions, 20 deletions
diff --git a/muse/ChangeLog b/muse/ChangeLog index 3d928e0a..6289b3b3 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,3 +1,6 @@ +1.10 (ws) + - changed locking of audio and midi sequencer thread (in my setup this + results in xrun free operation at 2.9 msec latency (kernel 2.6.18-rt5) 26.9 (ng) DeicsOnze 0.4.5 - add four level of quality 24.9 (ng) DeicsOnze 0.4.3 diff --git a/muse/muse/audio.cpp b/muse/muse/audio.cpp index 32bf208d..d46786d7 100644 --- a/muse/muse/audio.cpp +++ b/muse/muse/audio.cpp @@ -471,7 +471,7 @@ printf("invalidate prefetch buffer\n"); } } - midiSeq->msgProcess(frames); + processMidi(frames); GroupList* gl = song->groups(); AuxList* al = song->auxs(); diff --git a/muse/muse/marker/markerview.cpp b/muse/muse/marker/markerview.cpp index 398b15c6..ae1f871a 100644 --- a/muse/muse/marker/markerview.cpp +++ b/muse/muse/marker/markerview.cpp @@ -389,8 +389,8 @@ void MarkerView::markerChanged(int val) for (int k = 0; k < n; ++k) { MarkerItem* item = (MarkerItem*)(table->topLevelItem(k)); if (item->marker() == &i->second) { - ((QTreeWidgetItem*)item)->setSelected(true); -// table->setCurrentItem(item); +// ((QTreeWidgetItem*)item)->setSelected(true); + table->setCurrentItem(item); return; } } diff --git a/muse/muse/midi.cpp b/muse/muse/midi.cpp index 5cd6d8a9..4b037fe2 100644 --- a/muse/muse/midi.cpp +++ b/muse/muse/midi.cpp @@ -637,6 +637,7 @@ void Audio::initDevices() void Audio::processMidi(unsigned frames) { + midiBusy = true; MidiOutPortList* ol = song->midiOutPorts(); for (iMidiOutPort id = ol->begin(); id != ol->end(); ++id) { (*id)->process(_curTickPos, _nextTickPos, _pos, frames); @@ -659,6 +660,7 @@ void Audio::processMidi(unsigned frames) } port->afterProcess(); } + midiBusy = false; } //--------------------------------------------------------- diff --git a/muse/muse/midiseq.cpp b/muse/muse/midiseq.cpp index bf774698..53d71c68 100644 --- a/muse/muse/midiseq.cpp +++ b/muse/muse/midiseq.cpp @@ -44,6 +44,8 @@ MidiSeq* midiSeq; static const unsigned char mmcStopMsg[] = { 0x7f, 0x7f, 0x06, 0x01 }; static const unsigned char mmcDeferredPlayMsg[] = { 0x7f, 0x7f, 0x06, 0x03 }; +volatile bool midiBusy; + //--------------------------------------------------------- // readMsg //--------------------------------------------------------- @@ -60,12 +62,8 @@ static void readMsg(void* p, void*) void MidiSeq::processMsg(const ThreadMsg* m) { - AudioMsg* msg = (AudioMsg*)m; switch (msg->id) { - case MS_PROCESS: - audio->processMidi(msg->time); - break; case SEQM_SEEK: processSeek(); break; @@ -513,6 +511,11 @@ void MidiSeq::processTimerTick() if (idle) return; + if (midiBusy) { + // we hit audio: midiSeq->msgProcess + // miss this timer tick + return; + } unsigned curFrame = audio->curFrame(); /* if (!extSyncFlag.value()) { @@ -551,18 +554,6 @@ void MidiSeq::msgMsg(int id) Thread::sendMsg(&msg); } -//--------------------------------------------------------- -// msgProcess -//--------------------------------------------------------- - -void MidiSeq::msgProcess(unsigned frames) - { - AudioMsg msg; - msg.id = MS_PROCESS; - msg.time = frames; - Thread::sendMsg(&msg); - } - void MidiSeq::msgSeek() { msgMsg(SEQM_SEEK); } void MidiSeq::msgStop() { msgMsg(MS_STOP); } void MidiSeq::msgStart() { msgMsg(MS_START); } diff --git a/muse/muse/midiseq.h b/muse/muse/midiseq.h index 346aa8b4..98739749 100644 --- a/muse/muse/midiseq.h +++ b/muse/muse/midiseq.h @@ -84,7 +84,6 @@ class MidiSeq : public Thread { void mmcInput(int id, int cmd, const AL::Pos&); void msgMsg(int id); - void msgProcess(unsigned frames); void msgSeek(); void msgStart(); void msgStop(); @@ -94,5 +93,6 @@ class MidiSeq : public Thread { }; extern MidiSeq* midiSeq; +extern volatile bool midiBusy; #endif |