private void extractLibraryInfo() {
   libraries = new LinkedHashMap<String, LibraryInfo>();
   List<Device> devices = new ArrayList<Device>();
   List<Device> inputDevices = new ArrayList<Device>();
   for (AudioServerProvider lib : Lookup.SYSTEM.getAll(AudioServerProvider.class)) {
     LOG.log(Level.FINE, "Audio Library : {0}", lib.getLibraryName());
     devices.clear();
     inputDevices.clear();
     for (Device device : lib.findAll(Device.class)) {
       if (device.getMaxOutputChannels() > 0) {
         LOG.log(Level.FINE, "-- Found device : {0}", device.getName());
         devices.add(device);
       } else if (device.getMaxInputChannels() > 0) {
         LOG.log(Level.FINE, "-- Found input device : {0}", device.getName());
         inputDevices.add(device);
       }
     }
     libraries.put(
         lib.getLibraryName(),
         new LibraryInfo(
             lib,
             devices.toArray(new Device[devices.size()]),
             inputDevices.toArray(new Device[inputDevices.size()])));
   }
 }
  private Device findDevice(LibraryInfo info, boolean usingDefault, boolean input) {
    String name = null;

    if (usingDefault) {
      name = input ? AudioSettings.getInputDeviceName() : AudioSettings.getDeviceName();
    } else {
      if (input) {
        name = inputDeviceName == null ? null : inputDeviceName.value;
      } else {
        name = deviceName == null ? null : deviceName.value;
      }
    }

    if (name == null || name.trim().isEmpty()) {
      return null;
    }

    Device[] devices = input ? info.inputDevices : info.devices;
    for (Device device : devices) {
      if (device.getName().equals(name)) {
        return device;
      }
    }
    for (Device device : devices) {
      if (device.getName().contains(name)) {
        return device;
      }
    }
    return null;
  }
 private void validateDevices() {
   if (deviceName == null || inputDeviceName == null) {
     return;
   }
   LibraryInfo info = libraries.get(audioLib.value);
   if (info == null) {
     return;
   }
   Device primary = findDevice(info, false, false);
   if (primary != null && primary.getMaxInputChannels() > 0) {
     inputDeviceName.value = "";
   }
 }
  private AudioServer createServer(BusClient bus) throws Exception {
    float srate = sampleRate.value;
    int buffersize = getBuffersize();

    boolean usingDefault = false;
    LibraryInfo info = libraries.get(audioLib.value);
    if (info == null) {
      info = libraries.get(AudioSettings.getLibrary());
      if (info == null) {
        throw new IllegalStateException("Audio library not found");
      }
      usingDefault = true;
    }
    LOG.log(
        Level.FINE,
        "Found audio library {0}\n{1}",
        new Object[] {info.provider.getLibraryName(), info.provider.getLibraryDescription()});

    Device device = findDevice(info, usingDefault, false);
    if (device != null) {
      LOG.log(Level.FINE, "Found device : {0}", device.getName());
    }
    Device inputDevice = null;
    if (device != null && device.getMaxInputChannels() == 0 && bus.getSourceCount() > 0) {
      inputDevice = findDevice(info, usingDefault, true);
      if (inputDevice != null) {
        LOG.log(Level.FINE, "Found input device : {0}", inputDevice.getName());
      }
    }

    ClientID clientID = new ClientID("PraxisLIVE-" + getAddress().getRootID());

    AudioConfiguration ctxt =
        new AudioConfiguration(
            srate,
            bus.getSourceCount(),
            bus.getSinkCount(),
            buffersize,
            createCheckedExts(device, inputDevice, clientID));
    return info.provider.createServer(ctxt, bus);
  }