diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index 4b8fb82a7a..82a3399f6f 100644 --- a/libs/backends/alsa/alsa_audiobackend.cc +++ b/libs/backends/alsa/alsa_audiobackend.cc @@ -1008,6 +1008,7 @@ AlsaAudioBackend::register_system_midi_ports() LatencyRange lr; lr.min = lr.max = _samples_per_period + (_measure_latency ? 0 : nfo->systemic_output_latency); set_latency_range (p, false, lr); + static_cast(p)->set_n_periods(2); _system_midi_out.push_back(static_cast(p)); _rmidi_out.push_back (mout); } @@ -1428,7 +1429,7 @@ AlsaAudioBackend::main_process_thread () i = 0; for (std::vector::const_iterator it = _system_midi_in.begin (); it != _system_midi_in.end (); ++it, ++i) { assert (_rmidi_in.size() > i); - AlsaMidiIn *rm = static_cast(_rmidi_in.at(i)); + AlsaMidiIn *rm = _rmidi_in.at(i); void *bptr = (*it)->get_buffer(0); pframes_t time; uint8_t data[64]; // match MaxAlsaEventSize in alsa_rawmidi.cc @@ -1461,7 +1462,7 @@ AlsaAudioBackend::main_process_thread () for (std::vector::const_iterator it = _system_midi_out.begin (); it != _system_midi_out.end (); ++it, ++i) { assert (_rmidi_out.size() > i); const AlsaMidiBuffer src = static_cast(*it)->const_buffer(); - AlsaMidiOut *rm = static_cast(_rmidi_out.at(i)); + AlsaMidiOut *rm = _rmidi_out.at(i); rm->sync_time (clock1); for (AlsaMidiBuffer::const_iterator mit = src.begin (); mit != src.end (); ++mit) { rm->send_event ((*mit)->timestamp(), (*mit)->data(), (*mit)->size()); @@ -1764,6 +1765,7 @@ void* AlsaAudioPort::get_buffer (pframes_t n_samples) AlsaMidiPort::AlsaMidiPort (AlsaAudioBackend &b, const std::string& name, PortFlags flags) : AlsaPort (b, name, flags) + , _n_periods (1) , _bufperiod (0) { _buffer[0].clear (); diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h index 91d133f303..f8f7ea3ea3 100644 --- a/libs/backends/alsa/alsa_audiobackend.h +++ b/libs/backends/alsa/alsa_audiobackend.h @@ -144,10 +144,12 @@ class AlsaMidiPort : public AlsaPort { void* get_buffer (pframes_t nframes); const AlsaMidiBuffer const_buffer () const { return _buffer[_bufperiod]; } - void next_period() { get_buffer(0); _bufperiod = (_bufperiod + 1) % 2; } + void next_period() { if (_n_periods > 1) { get_buffer(0); _bufperiod = (_bufperiod + 1) % _n_periods; } } + void set_n_periods(int n) { if (n > 0 && n < 3) { _n_periods = n; } } private: AlsaMidiBuffer _buffer[2]; + int _n_periods; int _bufperiod; }; // class AlsaMidiPort