Set default input/output device based on selected host api rather than global default
authorTim Mayberry <mojofunk@gmail.com>
Wed, 1 Apr 2015 12:56:45 +0000 (22:56 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Thu, 30 Jul 2015 23:59:54 +0000 (09:59 +1000)
libs/backends/portaudio/portaudio_backend.cc
libs/backends/portaudio/portaudio_backend.h
libs/backends/portaudio/portaudio_io.cc
libs/backends/portaudio/portaudio_io.h

index 3e24ff28f0b0f5d72b7c1e338b7d0a16461a2b13..1e3722ddcda34528ae49e42be47f3dd9b84b2db1 100644 (file)
@@ -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);
index 432598263dfecc45c6ef2f80d23ed5335e0eaa23..1f802c7a5f2f671357bd3abd5800340a99733884 100644 (file)
@@ -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;
 
index 64f424d8587242391219d94090165c5f56806039..164ac91cd823ee64082cd71d786204b18bfee248 100644 (file)
@@ -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;
index bbc3f9a4d00ac5a0303b9ccaaf579d07945bdcdd..9871850ec4876598f4b7603804f92afce1d87b36 100644 (file)
@@ -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