statically allocate midi-options
authorRobin Gareus <robin@gareus.org>
Mon, 23 Jun 2014 09:56:58 +0000 (11:56 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 23 Jun 2014 09:56:58 +0000 (11:56 +0200)
fixes possible segfault when the data in the vector
goes out of scope due to RVO.

libs/backends/alsa/alsa_audiobackend.cc
libs/backends/alsa/alsa_audiobackend.h
libs/backends/dummy/dummy_audiobackend.cc
libs/backends/dummy/dummy_audiobackend.h

index 82a3399f6f78ba6055f609e0ea908d10c6321674..a61d3a186922a1c6ce34ab041e288038937b74b6 100644 (file)
@@ -38,6 +38,7 @@ using namespace ARDOUR;
 
 static std::string s_instance_name;
 size_t AlsaAudioBackend::_max_buffer_size = 8192;
+std::vector<std::string> 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<std::string>
 AlsaAudioBackend::enumerate_midi_options () const
 {
-       std::vector<std::string> 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<AudioBackend::DeviceStatus>
index f8f7ea3ea34f32332d0d3eedab3fb9720f34da02..089420e78efce896604854d56f475f1e47aa3652 100644 (file)
@@ -302,6 +302,7 @@ class AlsaAudioBackend : public AudioBackend {
                bool  _freewheeling;
                bool  _measure_latency;
 
+               static std::vector<std::string> _midi_options;
                std::string _audio_device;
                std::string _midi_driver_option;
 
index cd09a64c6590f22c71f57bb35807fe5cedad4e79..dc53010443d134de0430c43cdf0fd80fe6571198 100644 (file)
@@ -32,6 +32,7 @@ using namespace ARDOUR;
 
 static std::string s_instance_name;
 size_t DummyAudioBackend::_max_buffer_size = 8192;
+std::vector<std::string> 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<std::string>
 DummyAudioBackend::enumerate_midi_options () const
 {
-       std::vector<std::string> 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
index d4732f5eeb22fa52e92c292c4056eb08c896ccd4..638bb9f312bf4cdfdc3d1b1690b5c8c0cda20a6a 100644 (file)
@@ -292,6 +292,8 @@ class DummyAudioBackend : public AudioBackend {
 
        private:
                std::string _instance_name;
+               static std::vector<std::string> _midi_options;
+
                bool  _running;
                bool  _freewheeling;