summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2015-07-20 21:44:46 +1000
committerTim Mayberry <mojofunk@gmail.com>2015-07-31 09:59:54 +1000
commitcfbd9dd6d4d87cda4f3b3e55e7b44bdecf5b9e4b (patch)
tree0ac2a3c89343ad6d57fbd3b3cf593d4d17d583d7
parentacd17a9b5300a38c4d61ecc0af32974d3b5113f5 (diff)
Add functionality to show ASIO control panel
-rw-r--r--libs/backends/portaudio/portaudio_backend.cc12
-rw-r--r--libs/backends/portaudio/portaudio_backend.h4
-rw-r--r--libs/backends/portaudio/portaudio_io.cc47
-rw-r--r--libs/backends/portaudio/portaudio_io.h2
-rw-r--r--libs/backends/portaudio/wscript1
5 files changed, 62 insertions, 4 deletions
diff --git a/libs/backends/portaudio/portaudio_backend.cc b/libs/backends/portaudio/portaudio_backend.cc
index cfab0d172c..6501224316 100644
--- a/libs/backends/portaudio/portaudio_backend.cc
+++ b/libs/backends/portaudio/portaudio_backend.cc
@@ -376,6 +376,18 @@ PortAudioBackend::systemic_output_latency () const
return _systemic_audio_output_latency;
}
+std::string
+PortAudioBackend::control_app_name () const
+{
+ return _pcmio->control_app_name (name_to_id (_input_audio_device));
+}
+
+void
+PortAudioBackend::launch_control_app ()
+{
+ return _pcmio->launch_control_app (name_to_id(_input_audio_device));
+}
+
/* MIDI */
std::vector<std::string>
diff --git a/libs/backends/portaudio/portaudio_backend.h b/libs/backends/portaudio/portaudio_backend.h
index 22dd386904..b0cc68715f 100644
--- a/libs/backends/portaudio/portaudio_backend.h
+++ b/libs/backends/portaudio/portaudio_backend.h
@@ -212,8 +212,8 @@ class PortAudioBackend : public AudioBackend {
bool can_set_systemic_midi_latencies () const { return false; }
/* External control app */
- std::string control_app_name () const { return std::string (); }
- void launch_control_app () {}
+ std::string control_app_name () const;
+ void launch_control_app ();
/* MIDI */
std::vector<std::string> enumerate_midi_options () const;
diff --git a/libs/backends/portaudio/portaudio_io.cc b/libs/backends/portaudio/portaudio_io.cc
index 30a0a25eb4..f034df7603 100644
--- a/libs/backends/portaudio/portaudio_io.cc
+++ b/libs/backends/portaudio/portaudio_io.cc
@@ -24,6 +24,10 @@
#include <glibmm.h>
#include "portaudio_io.h"
+#ifdef WITH_ASIO
+#include "pa_asio.h"
+#endif
+
#include "pbd/compose.h"
#include "debug.h"
@@ -63,6 +67,43 @@ PortAudioIO::~PortAudioIO ()
free (_output_buffer); _output_buffer = NULL;
}
+std::string
+PortAudioIO::control_app_name (int device_id) const
+{
+ const PaHostApiInfo* info = Pa_GetHostApiInfo (_host_api_index);
+ std::string app_name;
+
+ if (info == NULL) {
+ DEBUG_AUDIO (string_compose ("Unable to determine Host API from index %1\n",
+ _host_api_index));
+ return app_name;
+ }
+
+ PaHostApiTypeId type_id = info->type;
+
+#ifdef WITH_ASIO
+ if (type_id == paASIO) {
+ // is this used for anything, or just acts as a boolean?
+ return "PortaudioASIO";
+ }
+#endif
+
+ return app_name;
+}
+
+void
+PortAudioIO::launch_control_app (int device_id)
+{
+#ifdef WITH_ASIO
+ PaError err = PaAsio_ShowControlPanel (device_id, NULL);
+
+ if (err != paNoError) {
+ // error << ?
+ DEBUG_AUDIO (string_compose (
+ "Unable to show control panel for device with index %1\n", device_id));
+ }
+#endif
+}
int
PortAudioIO::available_sample_rates(int device_id, std::vector<float>& sampleRates)
@@ -209,8 +250,10 @@ PortAudioIO::get_host_api_index_from_name (const std::string& name)
for (int i = 0; i < count; ++i) {
const PaHostApiInfo* info = Pa_GetHostApiInfo (i);
- if (info->name != NULL) { // possible?
- if (name == info->name) return i;
+ if (info != NULL && info->name != NULL) { // possible?
+ if (name == info->name) {
+ return i;
+ }
}
}
DEBUG_AUDIO (string_compose ("Unable to get host API from name: %1\n", name));
diff --git a/libs/backends/portaudio/portaudio_io.h b/libs/backends/portaudio/portaudio_io.h
index 25f198bd5a..991c542574 100644
--- a/libs/backends/portaudio/portaudio_io.h
+++ b/libs/backends/portaudio/portaudio_io.h
@@ -54,6 +54,8 @@ public:
int available_sample_rates (int device_id, std::vector<float>& sampleRates);
int available_buffer_sizes (int device_id, std::vector<uint32_t>& sampleRates);
+ std::string control_app_name (int device_id) const;
+ void launch_control_app (int device_id);
void pcm_stop (void);
int pcm_start (void);
diff --git a/libs/backends/portaudio/wscript b/libs/backends/portaudio/wscript
index 93421a0fe2..9c661d83b0 100644
--- a/libs/backends/portaudio/wscript
+++ b/libs/backends/portaudio/wscript
@@ -17,6 +17,7 @@ def options(opt):
def configure(conf):
autowaf.configure(conf)
autowaf.check_pkg(conf, 'portaudio-2.0', uselib_store='PORTAUDIO', atleast_version='19')
+ conf.check(header_name='pa_asio.h', define_name='WITH_ASIO', mandatory=False)
def build(bld):
obj = bld(features = 'cxx cxxshlib')