private static Line getLine(String propName, Line.Info info) throws LineUnavailableException {

    List<?> mixerProviders = ProviderService.getProviders(mixerProviderPath);

    if (propName != null) {
      String propVal = System.getProperty(propName);
      if (propVal != null) {
        Mixer m = getMixer(propVal, info, mixerProviders);
        if (m != null) {
          Line l = m.getLine(info);
          if (l != null) {
            return l;
          }
        }
      }

      Properties soundProperties = ProviderService.getSoundProperties();
      propVal = soundProperties.getProperty(propName);
      if (propVal != null) {
        Mixer m = getMixer(propVal, info, mixerProviders);
        if (m != null) {
          Line l = m.getLine(info);
          if (l != null) {
            return l;
          }
        }
      }
    }

    for (Iterator providers = ProviderService.getProviders(mixerProviderPath).iterator();
        providers.hasNext(); ) {
      try {
        MixerProvider pr = (MixerProvider) (providers.next());
        Mixer.Info[] mixinfos = pr.getMixerInfo();
        for (Mixer.Info mixinfo : mixinfos) {
          try {
            Mixer mix = pr.getMixer(mixinfo);
            return mix.getLine(info);
          } catch (IllegalArgumentException e) {
            // continue
          }
        }
      } catch (ClassCastException e) {
      }
    }
    // sound.11=Could not get line
    throw new IllegalArgumentException(Messages.getString("sound.11")); // $NON-NLS-1$
  }
  private static Mixer getMixer(String propVal, Line.Info info, List<?> mixerProviders) {

    int index = propVal.indexOf("#"); // $NON-NLS-1$
    String className;
    String mixName;
    if (index == -1) {
      className = propVal.trim();
      mixName = ""; // $NON-NLS-1$
    } else {
      className = propVal.substring(0, index).trim();
      if (index == propVal.length()) {
        mixName = ""; // $NON-NLS-1$
      } else {
        mixName = propVal.substring(index + 1).trim();
      }
    }
    Mixer.Info[] minfos = null;
    if (!className.equals("")) { // $NON-NLS-1$
      for (Iterator providers = mixerProviders.iterator(); providers.hasNext(); ) {
        try {
          MixerProvider pr = (MixerProvider) (providers.next());
          if (className.equals(pr.getClass().getName())) {
            minfos = pr.getMixerInfo();
            break;
          }
        } catch (ClassCastException e) {
        }
      }
    }
    if (minfos == null) {
      minfos = getMixerInfo();
    }

    if (!mixName.equals("")) { // $NON-NLS-1$
      for (Mixer.Info minfo : minfos) {
        if (mixName.equals(minfo.getName())) {
          return getMixer(minfo);
        }
      }
    }
    if (minfos.length > 0) {
      return getMixer(minfos[0]);
    }
    return null;
  }
  public static boolean isLineSupported(Line.Info info) {

    for (Iterator providers = ProviderService.getProviders(mixerProviderPath).iterator();
        providers.hasNext(); ) {
      try {
        MixerProvider pr = (MixerProvider) providers.next();
        Mixer.Info[] mixinfos = pr.getMixerInfo();
        for (Mixer.Info mixinfo : mixinfos) {
          Mixer mix = pr.getMixer(mixinfo);
          if (mix.isLineSupported(info)) {
            return true;
          }
        }
      } catch (ClassCastException e) {
      }
    }
    return false;
  }
 public static Line.Info[] getTargetLineInfo(Line.Info info) {
   List<Line.Info> result = new ArrayList<Line.Info>();
   for (Iterator providers = ProviderService.getProviders(mixerProviderPath).iterator();
       providers.hasNext(); ) {
     try {
       MixerProvider pr = (MixerProvider) providers.next();
       Mixer.Info[] mixinfos = pr.getMixerInfo();
       for (Mixer.Info mixinfo : mixinfos) {
         Mixer mix = pr.getMixer(mixinfo);
         Line.Info[] linfos = mix.getTargetLineInfo(info);
         for (Line.Info linfo : linfos) {
           result.add(linfo);
         }
       }
     } catch (ClassCastException e) {
     }
   }
   Line.Info[] temp = new Line.Info[result.size()];
   return result.toArray(temp);
 }