summaryrefslogtreecommitdiff
path: root/muse2/muse/driver/jackmidi.cpp
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2012-07-01 16:42:16 +0000
committerFlorian Jung <flo@windfisch.org>2012-07-01 16:42:16 +0000
commit9c4664d162c537ba4dd4fd8220971c0fb727103a (patch)
tree37a28b7cd4e4d8984ad4934a4884cd7b4da0505c /muse2/muse/driver/jackmidi.cpp
parente87fedf1be804f7ec774071d844b1f163be30b96 (diff)
final merge
Diffstat (limited to 'muse2/muse/driver/jackmidi.cpp')
-rw-r--r--muse2/muse/driver/jackmidi.cpp38
1 files changed, 27 insertions, 11 deletions
diff --git a/muse2/muse/driver/jackmidi.cpp b/muse2/muse/driver/jackmidi.cpp
index 706fa269..e3e67dfb 100644
--- a/muse2/muse/driver/jackmidi.cpp
+++ b/muse2/muse/driver/jackmidi.cpp
@@ -30,6 +30,7 @@
//#include <jack/midiport.h>
#include "jackmidi.h"
+#include "jackaudio.h"
#include "song.h"
#include "globals.h"
#include "midi.h"
@@ -50,10 +51,6 @@
// Turn on debug messages.
//#define JACK_MIDI_DEBUG
-namespace MusEGlobal {
-extern unsigned int volatile lastExtMidiSyncTick;
-}
-
namespace MusECore {
//---------------------------------------------------------
@@ -422,7 +419,7 @@ void MidiJackDevice::recordEvent(MidiRecordEvent& event)
// Split the events up into channel fifos. Special 'channel' number 17 for sysex events.
unsigned int ch = (typ == ME_SYSEX)? MIDI_CHANNELS : event.channel();
- if(_recordFifo[ch].put(MidiPlayEvent(event)))
+ if(_recordFifo[ch].put(event))
printf("MidiJackDevice::recordEvent: fifo channel %d overflow\n", ch);
}
@@ -446,10 +443,18 @@ void MidiJackDevice::eventReceived(jack_midi_event_t* ev)
// catch process play
//
- //int frameOffset = MusEGlobal::audio->getFrameOffset();
- unsigned pos = MusEGlobal::audio->pos().frame();
-
- event.setTime(MusEGlobal::extSyncFlag.value() ? MusEGlobal::lastExtMidiSyncTick : (pos + ev->time)); // p3.3.25
+ // These Jack events arrived in the previous period, and it may not have been at the audio position before this one (after a seek).
+ // This is how our ALSA driver works, events there are timestamped asynchronous of any process, referenced to the CURRENT audio
+ // position, so that by the time of the NEXT process, THOSE events have also occured in the previous period.
+ // So, technically this is correct. What MATTERS is how we adjust the times for storage, and/or simultaneous playback in THIS period,
+ // and TEST: we'll need to make sure any non-contiguous previous period is handled correctly by process - will it work OK as is?
+ // If ALSA works OK than this should too...
+#ifdef _AUDIO_USE_TRUE_FRAME_
+ event.setTime(MusEGlobal::audio->previousPos().frame() + ev->time);
+#else
+ event.setTime(MusEGlobal::audio->pos().frame() + ev->time);
+#endif
+ event.setTick(MusEGlobal::lastExtMidiSyncTick);
event.setChannel(*(ev->buffer) & 0xf);
int type = *(ev->buffer) & 0xf0;
@@ -509,9 +514,20 @@ void MidiJackDevice::eventReceived(jack_midi_event_t* ev)
case ME_START:
case ME_CONTINUE:
case ME_STOP:
- if(_port != -1)
- MusEGlobal::midiSeq->realtimeSystemInput(_port, type);
+ {
+ if(MusEGlobal::audioDevice && MusEGlobal::audioDevice->deviceType() == JACK_MIDI && _port != -1)
+ {
+ MusECore::JackAudioDevice* jad = static_cast<MusECore::JackAudioDevice*>(MusEGlobal::audioDevice);
+ jack_client_t* jc = jad->jackClient();
+ if(jc)
+ {
+ jack_nframes_t abs_ft = jack_last_frame_time(jc) + ev->time;
+ double abs_ev_t = double(jack_frames_to_time(jc, abs_ft)) / 1000000.0;
+ MusEGlobal::midiSeq->realtimeSystemInput(_port, type, abs_ev_t);
+ }
+ }
return;
+ }
//case ME_SYSEX_END:
//break;
// return;