summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-04-01 22:56:45 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-07-31 09:59:54 +1000
commit4e370feeb17a2e68e35e4ff6b0a67eaf940a9b91 (patch)
tree106aafa3ab764432f1811bd93ea231b0fcab09ae
parente2001ac4f30441ddc22c74df200c8a27e638d476 (diff)
Set default input/output device based on selected host api rather than global default
-rw-r--r--libs/backends/portaudio/portaudio_backend.cc4
-rw-r--r--libs/backends/portaudio/portaudio_backend.h1
-rw-r--r--libs/backends/portaudio/portaudio_io.cc53
-rw-r--r--libs/backends/portaudio/portaudio_io.h9
4 files changed, 45 insertions, 22 deletions
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc
index 3e24ff28f0..1e3722ddcd 100644
--- a/libs/backends/portaudio/portaudio_backend.cc
+++ b/libs/backends/portaudio/portaudio_backend.cc
@@ -112,14 +112,14 @@ PortAudioBackend::enumerate_drivers () const
int
PortAudioBackend::set_driver (const std::string& name)
{
- _target_driver = name;
+ _pcmio->set_host_api (name);
return 0;
}
std::vector<AudioBackend::DeviceStatus>
PortAudioBackend::enumerate_devices () const
{
- _pcmio->discover(_target_driver);
+ _pcmio->discover();
_audio_device_status.clear();
std::map<int, std::string> devices;
_pcmio->device_list(devices);
diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h
index 432598263d..1f802c7a5f 100644
--- a/libs/backends/portaudio/portaudio_backend.h
+++ b/libs/backends/portaudio/portaudio_backend.h
@@ -317,7 +317,6 @@ class PortAudioBackend : public AudioBackend {
static std::vector<AudioBackend::DeviceStatus> _audio_device_status;
static std::vector<AudioBackend::DeviceStatus> _midi_device_status;
- std::string _target_driver;
mutable std::string _audio_device;
std::string _midi_driver_option;
diff --git a/libs/backends/portaudio/portaudio_io.cc b/libs/backends/portaudio/portaudio_io.cc
index 64f424d858..164ac91cd8 100644
--- a/libs/backends/portaudio/portaudio_io.cc
+++ b/libs/backends/portaudio/portaudio_io.cc
@@ -70,7 +70,7 @@ PortAudioIO::available_sample_rates(int device_id, std::vector<float>& sampleRat
// TODO use separate int device_input, int device_output ?!
if (device_id == -1) {
- device_id = Pa_GetDefaultInputDevice();
+ device_id = get_default_input_device ();
}
#ifndef NDEBUG
printf("PortAudio: Querying Samplerates for device %d\n", device_id);
@@ -166,6 +166,16 @@ PortAudioIO::host_api_list (std::vector<std::string>& api_list)
}
}
+void
+PortAudioIO::set_host_api (const std::string& host_api_name)
+{
+ _host_api_index = get_host_api_index_from_name (host_api_name);
+
+ if (_host_api_index < 0) {
+ fprintf(stderr, "Error setting host API\n");
+ }
+}
+
PaHostApiIndex
PortAudioIO::get_host_api_index_from_name (const std::string& name)
{
@@ -184,8 +194,24 @@ PortAudioIO::get_host_api_index_from_name (const std::string& name)
return -1;
}
+PaDeviceIndex
+PortAudioIO::get_default_input_device ()
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ if (info == NULL) return -1;
+ return info->defaultInputDevice;
+}
+
+PaDeviceIndex
+PortAudioIO::get_default_output_device ()
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ if (info == NULL) return -1;
+ return info->defaultOutputDevice;
+}
+
void
-PortAudioIO::discover(const std::string& host_api)
+PortAudioIO::discover()
{
if (!initialize_pa()) return;
@@ -194,19 +220,12 @@ PortAudioIO::discover(const std::string& host_api)
}
_devices.clear();
- PaHostApiIndex host_api_index = get_host_api_index_from_name (host_api);
-
- if (host_api_index < 0) return;
-
- const PaHostApiInfo* info = Pa_GetHostApiInfo (host_api_index);
-
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
if (info == NULL) return;
- PaDeviceIndex default_input = info->defaultInputDevice;
- PaDeviceIndex default_output = info->defaultOutputDevice;
{
- const PaDeviceInfo* nfo_i = Pa_GetDeviceInfo(default_input);
- const PaDeviceInfo* nfo_o = Pa_GetDeviceInfo(default_output);
+ const PaDeviceInfo* nfo_i = Pa_GetDeviceInfo(get_default_input_device());
+ const PaDeviceInfo* nfo_o = Pa_GetDeviceInfo(get_default_output_device());
if (nfo_i && nfo_o) {
_devices.insert (std::pair<int, paDevice*> (-1,
new paDevice("Default",
@@ -225,10 +244,10 @@ PortAudioIO::discover(const std::string& host_api)
const PaDeviceInfo* nfo = Pa_GetDeviceInfo(i);
if (!nfo) continue;
- if (nfo->hostApi != host_api_index) continue;
+ if (nfo->hostApi != _host_api_index) continue;
#ifndef NDEBUG
- printf(" (%d) '%s' in: %d (lat: %.1f .. %.1f) out: %d (lat: %.1f .. %.1f) sr:%.2f\n",
- i, nfo->name,
+ printf(" (%d) '%s' '%s' in: %d (lat: %.1f .. %.1f) out: %d (lat: %.1f .. %.1f) sr:%.2f\n",
+ i, info->name, nfo->name,
nfo->maxInputChannels,
nfo->defaultLowInputLatency * 1e3,
nfo->defaultHighInputLatency * 1e3,
@@ -312,10 +331,10 @@ PortAudioIO::pcm_setup (
}
if (device_input == -1) {
- device_input = Pa_GetDefaultInputDevice();
+ device_input = get_default_input_device ();
}
if (device_output == -1) {
- device_output = Pa_GetDefaultOutputDevice();
+ device_output = get_default_output_device ();
}
_capture_channels = 0;
diff --git a/libs/backends/portaudio/portaudio_io.h b/libs/backends/portaudio/portaudio_io.h
index bbc3f9a4d0..9871850ec4 100644
--- a/libs/backends/portaudio/portaudio_io.h
+++ b/libs/backends/portaudio/portaudio_io.h
@@ -40,9 +40,13 @@ public:
bool initialize_pa ();
void host_api_list (std::vector<std::string>&);
+ void set_host_api (const std::string& host_api_name);
PaHostApiIndex get_host_api_index_from_name (const std::string& name);
- void discover(const std::string& host_api);
+ PaDeviceIndex get_default_input_device ();
+ PaDeviceIndex get_default_output_device ();
+
+ void discover();
void device_list (std::map<int, std::string> &devices) const;
int available_sample_rates (int device_id, std::vector<float>& sampleRates);
@@ -102,7 +106,8 @@ private:
std::map<int, paDevice *> _devices;
- std::string _host_api;
+ PaHostApiIndex _host_api_index;
+
};
} // namespace