diff options
Diffstat (limited to 'libs/ardouralsautil')
-rw-r--r-- | libs/ardouralsautil/ardouralsautil/deviceinfo.h | 34 | ||||
-rw-r--r-- | libs/ardouralsautil/deviceparams.cc | 88 | ||||
-rw-r--r-- | libs/ardouralsautil/wscript | 3 |
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 = ['.'] |