DefaultAudioLineProvider.java

package org.hammer.audio;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Mixer;
import javax.sound.sampled.TargetDataLine;

/**
 * Default implementation of AudioLineProvider that uses AudioSystem to acquire lines.
 *
 * <p>This is the production implementation used by AudioCaptureServiceImpl's public constructor.
 *
 * @author refactoring
 */
class DefaultAudioLineProvider implements AudioLineProvider {

  private final Mixer.Info mixerInfo;

  DefaultAudioLineProvider() {
    this(null);
  }

  DefaultAudioLineProvider(Mixer.Info mixerInfo) {
    this.mixerInfo = mixerInfo;
  }

  @Override
  public TargetDataLine acquireLine(AudioFormat format) {
    DataLine.Info info = new DataLine.Info(TargetDataLine.class, format);

    if (mixerInfo != null) {
      return acquireLineFromMixer(format, info);
    }

    if (!AudioSystem.isLineSupported(info)) {
      throw new IllegalStateException("TargetDataLine not supported for format: " + format);
    }

    try {
      TargetDataLine line = (TargetDataLine) AudioSystem.getLine(info);
      line.open(format);
      return line;
    } catch (LineUnavailableException ex) {
      throw new IllegalStateException("Unable to open TargetDataLine", ex);
    }
  }

  @SuppressWarnings("PMD.CloseResource")
  private TargetDataLine acquireLineFromMixer(AudioFormat format, DataLine.Info info) {
    Mixer mixer = AudioSystem.getMixer(mixerInfo);
    if (!mixer.isLineSupported(info)) {
      throw new IllegalStateException(
          "TargetDataLine not supported by " + mixerInfo.getName() + " for format: " + format);
    }

    try {
      TargetDataLine line = (TargetDataLine) mixer.getLine(info);
      line.open(format);
      return line;
    } catch (LineUnavailableException ex) {
      throw new IllegalStateException(
          "Unable to open TargetDataLine on " + mixerInfo.getName(), ex);
    }
  }
}