don't let enumerated device list strings go out of scope.
authorRobin Gareus <robin@gareus.org>
Mon, 23 Jun 2014 10:16:35 +0000 (12:16 +0200)
committerRobin Gareus <robin@gareus.org>
Mon, 23 Jun 2014 10:16:35 +0000 (12:16 +0200)
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 a61d3a186922a1c6ce34ab041e288038937b74b6..a411916c6828b45ebcdc108fec1ef58412557651 100644 (file)
@@ -39,6 +39,8 @@ using namespace ARDOUR;
 static std::string s_instance_name;
 size_t AlsaAudioBackend::_max_buffer_size = 8192;
 std::vector<std::string> AlsaAudioBackend::_midi_options;
+std::vector<AudioBackend::DeviceStatus> AlsaAudioBackend::_audio_device_status;
+std::vector<AudioBackend::DeviceStatus> AlsaAudioBackend::_midi_device_status;
 
 AlsaAudioBackend::AlsaAudioBackend (AudioEngine& e, AudioBackendInfo& info)
        : AudioBackend (e, info)
@@ -87,13 +89,13 @@ AlsaAudioBackend::is_realtime () const
 std::vector<AudioBackend::DeviceStatus>
 AlsaAudioBackend::enumerate_devices () const
 {
-       std::vector<AudioBackend::DeviceStatus> s;
+       _audio_device_status.clear();
        std::map<std::string, std::string> devices;
        get_alsa_audio_device_names(devices);
        for (std::map<std::string, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
-               s.push_back (DeviceStatus (i->first, true));
+               _audio_device_status.push_back (DeviceStatus (i->first, true));
        }
-       return s;
+       return _audio_device_status;
 }
 
 void
@@ -415,7 +417,7 @@ AlsaAudioBackend::enumerate_midi_options () const
 std::vector<AudioBackend::DeviceStatus>
 AlsaAudioBackend::enumerate_midi_devices () const
 {
-       std::vector<AudioBackend::DeviceStatus> s;
+       _midi_device_status.clear();
        std::map<std::string, std::string> devices;
 
        if (_midi_driver_option == _("ALSA raw devices")) {
@@ -423,14 +425,12 @@ AlsaAudioBackend::enumerate_midi_devices () const
        }
        else if (_midi_driver_option == _("ALSA sequencer")) {
                get_alsa_sequencer_names (devices);
-       } else {
-               return s;
        }
 
        for (std::map<std::string, std::string>::const_iterator i = devices.begin (); i != devices.end(); ++i) {
-               s.push_back (DeviceStatus (i->first, true));
+               _midi_device_status.push_back (DeviceStatus (i->first, true));
        }
-       return s;
+       return _midi_device_status;
 }
 
 int
index 089420e78efce896604854d56f475f1e47aa3652..6f54ba2f1cddaa4bf43d1be22322e1d1e25c9ac4 100644 (file)
@@ -303,6 +303,9 @@ class AlsaAudioBackend : public AudioBackend {
                bool  _measure_latency;
 
                static std::vector<std::string> _midi_options;
+               static std::vector<AudioBackend::DeviceStatus> _audio_device_status;
+               static std::vector<AudioBackend::DeviceStatus> _midi_device_status;
+
                std::string _audio_device;
                std::string _midi_driver_option;
 
index dc53010443d134de0430c43cdf0fd80fe6571198..3a969aa479bc2cbf12512dc3453464b987267da3 100644 (file)
@@ -33,6 +33,7 @@ using namespace ARDOUR;
 static std::string s_instance_name;
 size_t DummyAudioBackend::_max_buffer_size = 8192;
 std::vector<std::string> DummyAudioBackend::_midi_options;
+std::vector<AudioBackend::DeviceStatus> DummyAudioBackend::_device_status;
 
 DummyAudioBackend::DummyAudioBackend (AudioEngine& e, AudioBackendInfo& info)
        : AudioBackend (e, info)
@@ -76,9 +77,10 @@ DummyAudioBackend::is_realtime () const
 std::vector<AudioBackend::DeviceStatus>
 DummyAudioBackend::enumerate_devices () const
 {
-       std::vector<AudioBackend::DeviceStatus> s;
-       s.push_back (DeviceStatus (_("Dummy"), true));
-       return s;
+       if (_device_status.empty()) {
+               _device_status.push_back (DeviceStatus (_("Dummy"), true));
+       }
+       return _device_status;
 }
 
 std::vector<float>
index 638bb9f312bf4cdfdc3d1b1690b5c8c0cda20a6a..70aec34ecd91110dfa37a8b645712275ef39d53f 100644 (file)
@@ -293,6 +293,7 @@ class DummyAudioBackend : public AudioBackend {
        private:
                std::string _instance_name;
                static std::vector<std::string> _midi_options;
+               static std::vector<AudioBackend::DeviceStatus> _device_status;
 
                bool  _running;
                bool  _freewheeling;