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 #include namespace ARDOUR { + enum AlsaDuplex { + HalfDuplexIn = 1, + HalfDuplexOut = 2, + FullDuplex = 3, + }; - void get_alsa_audio_device_names (std::map& devices); + void get_alsa_audio_device_names (std::map& devices, AlsaDuplex duplex = FullDuplex); void get_alsa_rawmidi_device_names (std::map& devices); void get_alsa_sequencer_names (std::map& 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& devices) +ARDOUR::get_alsa_audio_device_names (std::map& 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& 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& 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& 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 += ',';