public JavaSound(File file) {
    this.file = file;

    try {
      clip = AudioSystem.getClip();
    } catch (LineUnavailableException e) {
      ForPlay.log().warn("Unable to create clip for " + file);
      // give up
      return;
    } catch (IllegalArgumentException e) {
      /*
       * OpenJDK on Linux may throw java.lang.IllegalArgumentException: No line matching interface
       * Clip supporting format PCM_SIGNED unknown sample rate, 16 bit, stereo, 4 bytes/frame,
       * big-endian is supported.
       */
      ForPlay.log().info("Failed to load sound " + file + " due to " + e.toString());
      // give up
      return;
    }

    clip.addLineListener(
        new LineListener() {
          @Override
          public void update(LineEvent event) {
            Type type = event.getType();
            if (LineEvent.Type.STOP == type) {
              // ForPlay.log().info("STOP EVENT");
              try {
                clip.close();
              } finally {
                playing = false;
              }
            }
          }
        });
  }
  @Override
  public boolean play() {
    // ForPlay.log().info("play()");
    if (playing) {
      // we have not yet received LineEvent.Type.STOP
      return false;
    }
    if (clip == null) {
      // no audio clip to play
      return false;
    }
    if (clip.isActive()) {
      // already playing
      return false;
    }

    try {
      inputStream = new FileInputStream(file);
    } catch (FileNotFoundException e) {
      ForPlay.log().warn("Sound file not found " + file);
      // give up
      return false;
    }

    AudioInputStream ais;
    try {
      // ForPlay.log().info("calling AudioSystem.getAudioInputStream()");
      ais = AudioSystem.getAudioInputStream(inputStream);
    } catch (UnsupportedAudioFileException e) {
      ForPlay.log()
          .warn(
              "Failed to play sound "
                  + file
                  + " due to failure to get audio stream caused by "
                  + e.toString(),
              e);
      return false;
    } catch (IOException e) {
      ForPlay.log()
          .warn(
              "Failed to play sound "
                  + file
                  + " due to failure to get audio stream caused by "
                  + e.toString(),
              e);
      return false;
    }
    try {
      // ForPlay.log().info("calling clip.open()");
      clip.open(ais);
    } catch (IOException e) {
      ForPlay.log()
          .warn(
              "Failed to play sound "
                  + file
                  + " due to failure to open clip caused by "
                  + e.toString(),
              e);
      return false;
    } catch (LineUnavailableException e) {
      ForPlay.log()
          .info(
              "Not playing sound "
                  + file
                  + " due to failure to open clip caused by "
                  + e.toString());
    } catch (IllegalArgumentException e) {
      ForPlay.log()
          .info(
              "Not playing sound "
                  + file
                  + " due to failure to open clip caused by "
                  + e.toString());
      return false;
    } catch (IllegalStateException e) {
      // Line may already be open
      // TODO(fredsa): figure out why this happens
      ForPlay.log()
          .info(
              "Not playing sound "
                  + file
                  + " due to failure to open clip caused by "
                  + e.toString());
      return false;
    }
    if (looping) {
      clip.loop(Clip.LOOP_CONTINUOUSLY);
    }
    // ForPlay.log().info("calling clip.start()");
    clip.start();
    playing = true;
    return true;
  }