using namespace ARDOUR;
PortAudioIO::PortAudioIO ()
- : _initialized (false)
- , _capture_channels (0)
+ : _capture_channels (0)
, _playback_channels (0)
, _stream (0)
, _input_buffer (0)
{
pcm_stop();
- if (_initialized) {
- Pa_Terminate();
- }
-
+ pa_deinitialize ();
clear_device_lists ();
free (_input_buffer); _input_buffer = NULL;
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) {
}
}
+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();
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();
PortAudioIO::discover()
{
DEBUG_AUDIO ("PortAudio: discover\n");
- if (!initialize_pa()) return;
+ if (!pa_initialize()) return;
clear_device_lists ();
add_none_devices ();
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;
}
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; }
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 ();
static void get_default_buffer_sizes(std::vector<uint32_t>&);
private: // Data
- bool _initialized;
-
uint32_t _capture_channels;
uint32_t _playback_channels;