Change the functions related to initializing the Portaudio library
authorTim Mayberry <mojofunk@gmail.com>
Mon, 24 Aug 2015 02:57:34 +0000 (12:57 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Wed, 2 Sep 2015 02:07:15 +0000 (12:07 +1000)
libs/backends/portaudio/portaudio_io.cc
libs/backends/portaudio/portaudio_io.h

index 5ca99d16771a7a17e68b99af25a00f42398e9931..f0a6450c285c4fe11f3b4626d2c4f6560137982a 100644 (file)
@@ -42,8 +42,7 @@ using namespace PBD;
 using namespace ARDOUR;
 
 PortAudioIO::PortAudioIO ()
-       : _initialized (false)
-       , _capture_channels (0)
+       : _capture_channels (0)
        , _playback_channels (0)
        , _stream (0)
        , _input_buffer (0)
@@ -59,10 +58,7 @@ PortAudioIO::~PortAudioIO ()
 {
        pcm_stop();
 
-       if (_initialized) {
-               Pa_Terminate();
-       }
-
+       pa_deinitialize ();
        clear_device_lists ();
 
        free (_input_buffer); _input_buffer = NULL;
@@ -113,7 +109,7 @@ PortAudioIO::get_default_sample_rates (std::vector<float>& rates)
 int
 PortAudioIO::available_sample_rates(int device_id, std::vector<float>& sampleRates)
 {
-       if (!initialize_pa()) return -1;
+       if (!pa_initialize()) return -1;
 
 #ifdef WITH_ASIO
        if (get_current_host_api_type() == paASIO) {
@@ -307,28 +303,44 @@ PortAudioIO::output_device_list(std::map<int, std::string> &devices) const
        }
 }
 
+bool&
+PortAudioIO::pa_initialized()
+{
+       static bool s_initialized = false;
+       return s_initialized;
+}
+
 bool
-PortAudioIO::initialize_pa ()
+PortAudioIO::pa_initialize()
 {
-       PaError err = paNoError;
+       if (pa_initialized()) return true;
 
-       if (!_initialized) {
-               err = Pa_Initialize();
-               if (err != paNoError) {
-                       return false;
-               }
-               _initialized = true;
-               _host_api_index = Pa_GetDefaultHostApi ();
-               _host_api_name = get_host_api_name_from_index (_host_api_index);
+       PaError err = Pa_Initialize();
+       if (err != paNoError) {
+               return false;
        }
+       pa_initialized() = true;
 
        return true;
 }
 
+bool
+PortAudioIO::pa_deinitialize()
+{
+       if (!pa_initialized()) return true;
+
+       PaError err = Pa_Terminate();
+       if (err != paNoError) {
+               return false;
+       }
+       pa_initialized() = false;
+       return true;
+}
+
 void
 PortAudioIO::host_api_list (std::vector<std::string>& api_list)
 {
-       if (!initialize_pa()) return;
+       if (!pa_initialize()) return;
 
        PaHostApiIndex count = Pa_GetHostApiCount();
 
@@ -382,7 +394,7 @@ PortAudioIO::set_host_api (const std::string& host_api_name)
 PaHostApiIndex
 PortAudioIO::get_host_api_index_from_name (const std::string& name)
 {
-       if (!initialize_pa()) return -1;
+       if (!pa_initialize()) return -1;
 
        PaHostApiIndex count = Pa_GetHostApiCount();
 
@@ -519,7 +531,7 @@ void
 PortAudioIO::discover()
 {
        DEBUG_AUDIO ("PortAudio: discover\n");
-       if (!initialize_pa()) return;
+       if (!pa_initialize()) return;
 
        clear_device_lists ();
        add_none_devices ();
@@ -682,7 +694,7 @@ PortAudioIO::pcm_setup (
                int device_input, int device_output,
                double sample_rate, uint32_t samples_per_period)
 {
-       if (!initialize_pa()) {
+       if (!pa_initialize()) {
                DEBUG_AUDIO ("PortAudio Initialization Failed\n");
                return InitializationError;
        }
index 6daa13d5eaaf577301e0fa7d9374aec333a7f9fe..71200b6e15c4292647a9f91226e4ebd393e9b5c0 100644 (file)
@@ -54,8 +54,6 @@ public:
                DeviceDefault = -1
        };
 
-       bool     initialize_pa ();
-
        void host_api_list (std::vector<std::string>&);
        bool set_host_api (const std::string& host_api_name);
        std::string get_host_api () const { return _host_api_name; }
@@ -110,6 +108,10 @@ public:
 
 private: // Methods
 
+       static bool pa_initialize();
+       static bool pa_deinitialize();
+       static bool& pa_initialized();
+
        void clear_device_lists ();
        void add_none_devices ();
        void add_default_devices ();
@@ -130,8 +132,6 @@ private: // Methods
        static void get_default_buffer_sizes(std::vector<uint32_t>&);
 
 private: // Data
-       bool _initialized;
-
        uint32_t _capture_channels;
        uint32_t _playback_channels;