summaryrefslogtreecommitdiff
path: root/libs/ardouralsautil
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-08-11 18:16:02 +0200
committerRobin Gareus <robin@gareus.org>2015-08-11 18:18:19 +0200
commit40661f7d1ff7ce75ef84d115241d841d9849b195 (patch)
treea8c33bc31b9ee29536e5a083bbee8289b47b0c6c /libs/ardouralsautil
parent52c25cab36b26755cf7e4fdaf4d55f383b5fa90a (diff)
add API to query ALSA supported parameters
Diffstat (limited to 'libs/ardouralsautil')
-rw-r--r--libs/ardouralsautil/ardouralsautil/deviceinfo.h34
-rw-r--r--libs/ardouralsautil/deviceparams.cc88
-rw-r--r--libs/ardouralsautil/wscript3
3 files changed, 124 insertions, 1 deletions
diff --git a/libs/ardouralsautil/ardouralsautil/deviceinfo.h b/libs/ardouralsautil/ardouralsautil/deviceinfo.h
new file mode 100644
index 0000000000..ab778314e8
--- /dev/null
+++ b/libs/ardouralsautil/ardouralsautil/deviceinfo.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2015 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2013 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __libardouralsautil_deviceinfo_h__
+#define __libardouralsautil_deviceinfo_h__
+
+namespace ARDOUR {
+
+ struct ALSADeviceInfo {
+ unsigned int max_channels;
+ unsigned int min_rate, max_rate;
+ unsigned long min_size, max_size;
+ bool valid;
+ };
+
+ int get_alsa_device_parameters (const char* device_name, const bool play, ALSADeviceInfo *nfo);
+}
+#endif
diff --git a/libs/ardouralsautil/deviceparams.cc b/libs/ardouralsautil/deviceparams.cc
new file mode 100644
index 0000000000..2e9f121a15
--- /dev/null
+++ b/libs/ardouralsautil/deviceparams.cc
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2015 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2013 Paul Davis
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <alsa/asoundlib.h>
+#include "pbd/convert.h"
+#include "ardouralsautil/deviceinfo.h"
+
+using namespace std;
+
+int
+ARDOUR::get_alsa_device_parameters (const char* device_name, const bool play, ALSADeviceInfo *nfo)
+{
+ snd_pcm_t *pcm;
+ snd_pcm_hw_params_t *hw_params;
+ std::string errmsg;
+ int err;
+
+ nfo->valid = false;
+
+ err = snd_pcm_open (&pcm, device_name,
+ play ? SND_PCM_STREAM_PLAYBACK : SND_PCM_STREAM_CAPTURE,
+ SND_PCM_NONBLOCK);
+
+ if (err < 0) {
+ fprintf (stderr, "ALSA: Cannot open device '%s': %s\n", device_name, snd_strerror (err));
+ return 1;
+ }
+
+ snd_pcm_hw_params_alloca (&hw_params);
+ err = snd_pcm_hw_params_any (pcm, hw_params);
+ if (err < 0) {
+ errmsg = "Cannot get hardware parameters";
+ goto error_out;
+ }
+
+ err = snd_pcm_hw_params_get_channels_max (hw_params, &nfo->max_channels);
+ if (err < 0) {
+ errmsg = "Cannot get maximum channels count";
+ goto error_out;
+ }
+
+ err = snd_pcm_hw_params_get_rate_min (hw_params, &nfo->min_rate, NULL);
+ if (err < 0) {
+ errmsg = "Cannot get minimum rate";
+ goto error_out;
+ }
+ err = snd_pcm_hw_params_get_rate_max (hw_params, &nfo->max_rate, NULL);
+ if (err < 0) {
+ errmsg = "Cannot get maximum rate";
+ goto error_out;
+ }
+
+ err = snd_pcm_hw_params_get_buffer_size_min (hw_params, &nfo->min_size);
+ if (err < 0) {
+ errmsg = "Cannot get minimum buffer size";
+ goto error_out;
+ }
+ err = snd_pcm_hw_params_get_buffer_size_max (hw_params, &nfo->max_size);
+ if (err < 0) {
+ errmsg = "Cannot get maximum buffer size";
+ goto error_out;
+ }
+ snd_pcm_close (pcm);
+ nfo->valid = true;
+ return 0;
+
+error_out:
+ fprintf (stderr, "ALSA: %s: %s\n", errmsg.c_str(), snd_strerror (err));
+ snd_pcm_close (pcm);
+ return 1;
+
+}
diff --git a/libs/ardouralsautil/wscript b/libs/ardouralsautil/wscript
index 7f70e2e749..60be05240d 100644
--- a/libs/ardouralsautil/wscript
+++ b/libs/ardouralsautil/wscript
@@ -26,7 +26,8 @@ def build(bld):
if bld.is_defined('HAVE_ALSA'):
obj = bld(features = 'cxx cxxshlib')
obj.source = [
- 'devicelist.cc'
+ 'devicelist.cc',
+ 'deviceparams.cc'
]
obj.export_includes = ['.']
obj.includes = ['.']