Video-Frame (not sample)
[ardour.git] / libs / ardouralsautil / devicelist.cc
index b20df100dbd49aa37d08a9f60828805e8082b647..c2d83aab85784c51d511e7c8675b83659dbefd7c 100644 (file)
  */
 
 #include <alsa/asoundlib.h>
-#include "pbd/convert.h"
+#include <glib.h>
+
+#include "pbd/string_convert.h"
 #include "ardouralsautil/devicelist.h"
 
 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;
@@ -34,11 +36,19 @@ ARDOUR::get_alsa_audio_device_names (std::map<std::string, std::string>& devices
        string devname;
        int cardnum = -1;
        int device = -1;
+       const char* fixed_name;
+
+       if ((fixed_name = g_getenv ("ARDOUR_ALSA_DEVICE"))) {
+               devices.insert (make_pair<string,string> (fixed_name, fixed_name));
+               return;
+       }
+
+       assert (duplex > 0);
 
        while (snd_card_next (&cardnum) >= 0 && cardnum >= 0) {
 
                devname = "hw:";
-               devname += PBD::to_string (cardnum, std::dec);
+               devname += PBD::to_string (cardnum);
 
                if (snd_ctl_open (&handle, devname.c_str(), 0) >= 0 && snd_ctl_card_info (handle, info) >= 0) {
 
@@ -63,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_CAPTURE);
 
-                               if (snd_ctl_pcm_info (handle, pcminfo) < 0) {
+                               if (snd_ctl_pcm_info (handle, pcminfo) < 0 && (duplex & HalfDuplexIn)) {
                                        continue;
                                }
 
@@ -71,11 +81,11 @@ 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 += ',';
-                               devname += PBD::to_string (device, std::dec);
+                               devname += PBD::to_string (device);
                                devices.insert (std::make_pair (card_name, devname));
                        }
 
@@ -93,7 +103,7 @@ ARDOUR::get_alsa_rawmidi_device_names (std::map<std::string, std::string>& devic
        while (snd_card_next (&cardnum) >= 0 && cardnum >= 0) {
                snd_ctl_t *handle;
                std::string devname = "hw:";
-               devname += PBD::to_string (cardnum, std::dec);
+               devname += PBD::to_string (cardnum);
                if (snd_ctl_open (&handle, devname.c_str (), 0) >= 0 && snd_ctl_card_info (handle, cinfo) >= 0) {
                        int device = -1;
                        while (snd_ctl_rawmidi_next_device (handle, &device) >= 0 && device >= 0) {
@@ -137,7 +147,7 @@ ARDOUR::get_alsa_rawmidi_device_names (std::map<std::string, std::string>& devic
                                                devname = "hw:";
                                                devname += snd_ctl_card_info_get_id (cinfo);
                                                devname += ",";
-                                               devname += PBD::to_string (device, std::dec);
+                                               devname += PBD::to_string (device);
 
                                                std::string card_name;
                                                card_name = snd_rawmidi_info_get_name (info);
@@ -152,9 +162,9 @@ ARDOUR::get_alsa_rawmidi_device_names (std::map<std::string, std::string>& devic
                                                devname = "hw:";
                                                devname += snd_ctl_card_info_get_id (cinfo);
                                                devname += ",";
-                                               devname += PBD::to_string (device, std::dec);
+                                               devname += PBD::to_string (device);
                                                devname += ",";
-                                               devname += PBD::to_string (sub, std::dec);
+                                               devname += PBD::to_string (sub);
 
                                                std::string card_name = sub_name;
                                                card_name += " (";
@@ -213,9 +223,9 @@ ARDOUR::get_alsa_sequencer_names (std::map<std::string, std::string>& devices)
                        card_name += ")";
 
                        std::string devname;
-                       devname = PBD::to_string(snd_seq_port_info_get_client (pinfo), std::dec);
+                       devname = PBD::to_string(snd_seq_port_info_get_client (pinfo));
                        devname += ":";
-                       devname += PBD::to_string(snd_seq_port_info_get_port (pinfo), std::dec);
+                       devname += PBD::to_string(snd_seq_port_info_get_port (pinfo));
                        devices.insert (std::make_pair (card_name, devname));
                }
        }