diff options
Diffstat (limited to 'src/libs/engine')
-rw-r--r-- | src/libs/engine/AlsaMidiDriver.cpp | 33 | ||||
-rw-r--r-- | src/libs/engine/AlsaMidiDriver.h | 10 | ||||
-rw-r--r-- | src/libs/engine/JackMidiDriver.cpp | 3 | ||||
-rw-r--r-- | src/libs/engine/Makefile.am | 2 |
4 files changed, 23 insertions, 25 deletions
diff --git a/src/libs/engine/AlsaMidiDriver.cpp b/src/libs/engine/AlsaMidiDriver.cpp index bbec1ab1..a1638077 100644 --- a/src/libs/engine/AlsaMidiDriver.cpp +++ b/src/libs/engine/AlsaMidiDriver.cpp @@ -35,7 +35,7 @@ namespace Ingen { //// AlsaMidiPort //// -AlsaMidiPort::AlsaMidiPort(AlsaMidiDriver* driver, DuplexPort<MidiBuffer>* patch_port) +AlsaMidiPort::AlsaMidiPort(AlsaMidiDriver* driver, DuplexPort* patch_port) : DriverPort(patch_port->is_input()), Raul::ListNode<AlsaMidiPort*>(this), _driver(driver), @@ -125,16 +125,20 @@ AlsaMidiPort::prepare_block(const SampleCount block_start, const SampleCount blo { assert(block_end >= block_start); - snd_seq_event_t* ev = NULL; - MidiMessage* message = NULL; - size_t nu_events = 0; - size_t event_size = 0; // decoded length of Alsa event in bytes - int timestamp = 0; + const SampleCount nframes = block_end - block_start; + snd_seq_event_t* ev = NULL; + size_t num_events = 0; + size_t event_size = 0; // decoded length of Alsa event in bytes + int timestamp = 0; + MidiBuffer* patch_buf = dynamic_cast<MidiBuffer*>(_patch_port->buffer(0)); + assert(patch_buf); + + patch_buf->prepare_write(nframes); + while (!_events.empty() && _events.front().time.tick < block_end) { - assert(nu_events < _patch_port->buffer_size()); + assert(num_events < _patch_port->buffer_size()); ev = &_events.front(); - message = &_patch_port->buffer(0)->data()[nu_events]; timestamp = ev->time.tick - block_start; if (timestamp < 0) { @@ -149,20 +153,17 @@ AlsaMidiPort::prepare_block(const SampleCount block_start, const SampleCount blo // FIXME: is this realtime safe? if ((event_size = snd_midi_event_decode(_driver->event_coder(), - _midi_pool[nu_events], MAX_MIDI_EVENT_SIZE, ev)) > 0) { - message->size = event_size; - message->time = timestamp; - message->buffer = _midi_pool[nu_events]; - ++nu_events; + _midi_pool[num_events], MAX_MIDI_EVENT_SIZE, ev)) > 0) { + + patch_buf->put_event(timestamp, event_size, _midi_pool[num_events]); + ++num_events; + } else { cerr << "[AlsaMidiPort] Unable to decode MIDI event" << endl; } _events.pop(); } - - _patch_port->buffer(0)->filled_size(nu_events); - //_patch_port->tied_port()->buffer(0)->filled_size(nu_events); } diff --git a/src/libs/engine/AlsaMidiDriver.h b/src/libs/engine/AlsaMidiDriver.h index 6c6debee..88daf94a 100644 --- a/src/libs/engine/AlsaMidiDriver.h +++ b/src/libs/engine/AlsaMidiDriver.h @@ -43,7 +43,7 @@ static const int MAX_MIDI_EVENT_SIZE = 3; class AlsaMidiPort : public DriverPort, public Raul::ListNode<AlsaMidiPort*> { public: - AlsaMidiPort(AlsaMidiDriver* driver, DuplexPort<MidiBuffer>* port); + AlsaMidiPort(AlsaMidiDriver* driver, DuplexPort* port); virtual ~AlsaMidiPort(); void event(snd_seq_event_t* const ev); @@ -52,12 +52,12 @@ public: void set_name(const std::string& name); - int port_id() const { return _port_id; } - DuplexPort<MidiBuffer>* patch_port() const { return _patch_port; } + int port_id() const { return _port_id; } + DuplexPort* patch_port() const { return _patch_port; } private: AlsaMidiDriver* _driver; - DuplexPort<MidiBuffer>* _patch_port; + DuplexPort* _patch_port; int _port_id; unsigned char** _midi_pool; ///< Pool of raw MIDI events for MidiMessage::buffer Raul::SRSWQueue<snd_seq_event_t> _events; @@ -86,7 +86,7 @@ public: AudioDriver* audio_driver() { return _audio_driver; } - DriverPort* create_port(DuplexPort<MidiBuffer>* patch_port) + DriverPort* create_port(DuplexPort* patch_port) { return new AlsaMidiPort(this, patch_port); } void add_port(DriverPort* port); diff --git a/src/libs/engine/JackMidiDriver.cpp b/src/libs/engine/JackMidiDriver.cpp index 7170753f..0ec2170b 100644 --- a/src/libs/engine/JackMidiDriver.cpp +++ b/src/libs/engine/JackMidiDriver.cpp @@ -92,9 +92,6 @@ JackMidiPort::prepare_block(const SampleCount block_start, const SampleCount blo } //cerr << "Jack MIDI got " << event_count << " events." << endl; - - //_patch_port->buffer(0)->filled_size(event_count); - //_patch_port->tied_port()->buffer(0)->filled_size(event_count); } diff --git a/src/libs/engine/Makefile.am b/src/libs/engine/Makefile.am index 49308afa..98737957 100644 --- a/src/libs/engine/Makefile.am +++ b/src/libs/engine/Makefile.am @@ -42,6 +42,7 @@ libingen_la_SOURCES = \ AudioBuffer.cpp \ MidiBuffer.h \ MidiBuffer.cpp \ + BufferFactory.h \ BufferFactory.cpp \ Port.h \ Port.cpp \ @@ -51,7 +52,6 @@ libingen_la_SOURCES = \ OutputPort.cpp \ DuplexPort.h \ DuplexPort.cpp \ - MidiMessage.h \ MidiNoteNode.h \ MidiNoteNode.cpp \ MidiTriggerNode.h \ |