+ for (std::map<std::string, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
+ struct AlsaMidiDeviceInfo * nfo = midi_device_info(i->first);
+ if (!nfo) continue;
+ if (!nfo->enabled) continue;
+
+ AlsaMidiOut *mout;
+ if (_midi_driver_option == _("ALSA raw devices")) {
+ mout = new AlsaRawMidiOut (i->second.c_str());
+ } else {
+ mout = new AlsaSeqMidiOut (i->second.c_str());
+ }
+
+ if (mout->state ()) {
+ PBD::warning << string_compose (
+ _("AlsaMidiOut: failed to open midi device '%1'."), i->second)
+ << endmsg;
+ delete mout;
+ } else {
+ mout->setup_timing(_samples_per_period, _samplerate);
+ mout->sync_time (g_get_monotonic_time());
+ if (mout->start ()) {
+ PBD::warning << string_compose (
+ _("AlsaMidiOut: failed to start midi device '%1'."), i->second)
+ << endmsg;
+ delete mout;
+ } else {
+ char tmp[64];
+ snprintf(tmp, sizeof(tmp), "system:midi_playback_%d", ++midi_ins);
+ PortHandle p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsInput | IsPhysical | IsTerminal));
+ if (!p) {
+ mout->stop();
+ delete mout;
+ }
+ LatencyRange lr;
+ lr.min = lr.max = (_measure_latency ? 0 : nfo->systemic_output_latency);
+ set_latency_range (p, false, lr);
+ static_cast<AlsaMidiPort*>(p)->set_n_periods(2);
+ _system_midi_out.push_back(static_cast<AlsaPort*>(p));
+ _rmidi_out.push_back (mout);
+ }
+ }
+
+ AlsaMidiIn *midin;
+ if (_midi_driver_option == _("ALSA raw devices")) {
+ midin = new AlsaRawMidiIn (i->second.c_str());
+ } else {
+ midin = new AlsaSeqMidiIn (i->second.c_str());
+ }
+
+ if (midin->state ()) {
+ PBD::warning << string_compose (
+ _("AlsaMidiIn: failed to open midi device '%1'."), i->second)
+ << endmsg;
+ delete midin;
+ } else {
+ midin->setup_timing(_samples_per_period, _samplerate);
+ midin->sync_time (g_get_monotonic_time());
+ if (midin->start ()) {
+ PBD::warning << string_compose (
+ _("AlsaMidiIn: failed to start midi device '%1'."), i->second)
+ << endmsg;
+ delete midin;
+ } else {
+ char tmp[64];
+ snprintf(tmp, sizeof(tmp), "system:midi_capture_%d", ++midi_outs);
+ PortHandle p = add_port(std::string(tmp), DataType::MIDI, static_cast<PortFlags>(IsOutput | IsPhysical | IsTerminal));
+ if (!p) {
+ midin->stop();
+ delete midin;
+ continue;
+ }
+ LatencyRange lr;
+ lr.min = lr.max = (_measure_latency ? 0 : nfo->systemic_input_latency);
+ set_latency_range (p, false, lr);
+ _system_midi_in.push_back(static_cast<AlsaPort*>(p));
+ _rmidi_in.push_back (midin);
+ }
+ }
+ }