summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-06-14 22:16:31 +0200
committerRobin Gareus <robin@gareus.org>2015-06-14 22:26:06 +0200
commitacd95215a485ad17693e8eeb3a5797f1a6dfbecd (patch)
tree50dba634fe38f168d612f5b8c93fe815eb1f556e
parent94c146c7801dcab403eee721805a5825f40c61bd (diff)
allow to scan for half-duplex ALSA devices
-rw-r--r--libs/ardouralsautil/ardouralsautil/devicelist.h7
-rw-r--r--libs/ardouralsautil/devicelist.cc8
2 files changed, 11 insertions, 4 deletions
diff --git a/libs/ardouralsautil/ardouralsautil/devicelist.h b/libs/ardouralsautil/ardouralsautil/devicelist.h
index 2f8c2c4e90..b68a44c3ae 100644
--- a/libs/ardouralsautil/ardouralsautil/devicelist.h
+++ b/libs/ardouralsautil/ardouralsautil/devicelist.h
@@ -23,8 +23,13 @@
#include <string>
#include <map>
namespace ARDOUR {
+ enum AlsaDuplex {
+ HalfDuplexIn = 1,
+ HalfDuplexOut = 2,
+ FullDuplex = 3,
+ };
- void get_alsa_audio_device_names (std::map<std::string, std::string>& devices);
+ void get_alsa_audio_device_names (std::map<std::string, std::string>& devices, AlsaDuplex duplex = FullDuplex);
void get_alsa_rawmidi_device_names (std::map<std::string, std::string>& devices);
void get_alsa_sequencer_names (std::map<std::string, std::string>& devices);
int card_to_num(const char* device_name);
diff --git a/libs/ardouralsautil/devicelist.cc b/libs/ardouralsautil/devicelist.cc
index b20df100db..3fdb1401af 100644
--- a/libs/ardouralsautil/devicelist.cc
+++ b/libs/ardouralsautil/devicelist.cc
@@ -24,7 +24,7 @@
using namespace std;
void
-ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices)
+ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices, AlsaDuplex duplex)
{
snd_ctl_t *handle;
snd_ctl_card_info_t *info;
@@ -35,6 +35,8 @@ ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices
int cardnum = -1;
int device = -1;
+ assert (duplex > 0);
+
while (snd_card_next (&cardnum) >= 0 && cardnum >= 0) {
devname = "hw:";
@@ -63,7 +65,7 @@ ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices
snd_pcm_info_set_subdevice (pcminfo, 0);
snd_pcm_info_set_stream (pcminfo, SND_PCM_STREAM_CAPTURE);
- if (snd_ctl_pcm_info (handle, pcminfo) < 0) {
+ if (snd_ctl_pcm_info (handle, pcminfo) < 0 && (duplex & HalfDuplexIn)) {
continue;
}
@@ -71,7 +73,7 @@ ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices
snd_pcm_info_set_subdevice (pcminfo, 0);
snd_pcm_info_set_stream (pcminfo, SND_PCM_STREAM_PLAYBACK);
- if (snd_ctl_pcm_info (handle, pcminfo) < 0) {
+ if (snd_ctl_pcm_info (handle, pcminfo) < 0 && (duplex & HalfDuplexOut)) {
continue;
}
devname += ',';