summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-08-24 12:57:34 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-09-02 12:07:15 +1000
commit1cb36108bbb97e2c7494b48c93964b1a47bf16b4 (patch)
tree1cb102565304f0bd2ec53fafed8d87f67c3d15bb
parent3b71674eeea6f00ff127ee0c679c28682aa85a1f (diff)
Change the functions related to initializing the Portaudio library
-rw-r--r--libs/backends/portaudio/portaudio_io.cc54
-rw-r--r--libs/backends/portaudio/portaudio_io.h8
2 files changed, 37 insertions, 25 deletions
diff --git a/libs/backends/portaudio/portaudio_io.cc b/libs/backends/portaudio/portaudio_io.cc
index 5ca99d1677..f0a6450c28 100644
--- a/libs/backends/portaudio/portaudio_io.cc
+++ b/libs/backends/portaudio/portaudio_io.cc
@@ -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;
}
diff --git a/libs/backends/portaudio/portaudio_io.h b/libs/backends/portaudio/portaudio_io.h
index 6daa13d5ea..71200b6e15 100644
--- a/libs/backends/portaudio/portaudio_io.h
+++ b/libs/backends/portaudio/portaudio_io.h
@@ -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;