From fb51bdb892fcb7ffe74a01becda566fd6bc9a431 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 23 Jun 2014 11:56:58 +0200 Subject: [PATCH] statically allocate midi-options fixes possible segfault when the data in the vector goes out of scope due to RVO. --- libs/backends/alsa/alsa_audiobackend.cc | 12 +++++++----- libs/backends/alsa/alsa_audiobackend.h | 1 + libs/backends/dummy/dummy_audiobackend.cc | 13 ++++++++----- libs/backends/dummy/dummy_audiobackend.h | 2 ++ 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/libs/backends/alsa/alsa_audiobackend.cc b/libs/backends/alsa/alsa_audiobackend.cc index 82a3399f6f..a61d3a1869 100644 --- a/libs/backends/alsa/alsa_audiobackend.cc +++ b/libs/backends/alsa/alsa_audiobackend.cc @@ -38,6 +38,7 @@ using namespace ARDOUR; static std::string s_instance_name; size_t AlsaAudioBackend::_max_buffer_size = 8192; +std::vector AlsaAudioBackend::_midi_options; AlsaAudioBackend::AlsaAudioBackend (AudioEngine& e, AudioBackendInfo& info) : AudioBackend (e, info) @@ -403,11 +404,12 @@ AlsaAudioBackend::midi_device_info(std::string const name) const { std::vector AlsaAudioBackend::enumerate_midi_options () const { - std::vector m; - m.push_back (_("None")); - m.push_back (_("ALSA raw devices")); - m.push_back (_("ALSA sequencer")); - return m; + if (_midi_options.empty()) { + _midi_options.push_back (_("None")); + _midi_options.push_back (_("ALSA raw devices")); + _midi_options.push_back (_("ALSA sequencer")); + } + return _midi_options; } std::vector diff --git a/libs/backends/alsa/alsa_audiobackend.h b/libs/backends/alsa/alsa_audiobackend.h index f8f7ea3ea3..089420e78e 100644 --- a/libs/backends/alsa/alsa_audiobackend.h +++ b/libs/backends/alsa/alsa_audiobackend.h @@ -302,6 +302,7 @@ class AlsaAudioBackend : public AudioBackend { bool _freewheeling; bool _measure_latency; + static std::vector _midi_options; std::string _audio_device; std::string _midi_driver_option; diff --git a/libs/backends/dummy/dummy_audiobackend.cc b/libs/backends/dummy/dummy_audiobackend.cc index cd09a64c65..dc53010443 100644 --- a/libs/backends/dummy/dummy_audiobackend.cc +++ b/libs/backends/dummy/dummy_audiobackend.cc @@ -32,6 +32,7 @@ using namespace ARDOUR; static std::string s_instance_name; size_t DummyAudioBackend::_max_buffer_size = 8192; +std::vector DummyAudioBackend::_midi_options; DummyAudioBackend::DummyAudioBackend (AudioEngine& e, AudioBackendInfo& info) : AudioBackend (e, info) @@ -249,15 +250,17 @@ DummyAudioBackend::systemic_output_latency () const return _systemic_output_latency; } + /* MIDI */ std::vector DummyAudioBackend::enumerate_midi_options () const { - std::vector m; - m.push_back (_("1 in, 1 out")); - m.push_back (_("2 in, 2 out")); - m.push_back (_("8 in, 8 out")); - return m; + if (_midi_options.empty()) { + _midi_options.push_back (_("1 in, 1 out")); + _midi_options.push_back (_("2 in, 2 out")); + _midi_options.push_back (_("8 in, 8 out")); + } + return _midi_options; } int diff --git a/libs/backends/dummy/dummy_audiobackend.h b/libs/backends/dummy/dummy_audiobackend.h index d4732f5eeb..638bb9f312 100644 --- a/libs/backends/dummy/dummy_audiobackend.h +++ b/libs/backends/dummy/dummy_audiobackend.h @@ -292,6 +292,8 @@ class DummyAudioBackend : public AudioBackend { private: std::string _instance_name; + static std::vector _midi_options; + bool _running; bool _freewheeling;