• category: swing folder: Sound title: Wavファイルの演奏 tags: [AudioSystem, Sound] author: aterai pubdate: 2004-08-16T00:28:04+09:00 description: AudioSystemを使って、AudioInputStream、Clip(Line)などを作成取得し、wavファイルを演奏します。 image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTTj2hYTjI/AAAAAAAAAko/8dQ-XleMZBc/s800/Sound.png

概要

AudioSystemを使って、AudioInputStreamClip(Line)などを作成取得し、wavファイルを演奏します。

サンプルコード

URL url = getClass().getResource("notice1.wav");
try (AudioInputStream sound = AudioSystem.getAudioInputStream(url);
     Clip clip = (Clip) AudioSystem.getLine(new DataLine.Info(Clip.class, sound.getFormat()))) {
  SecondaryLoop loop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
  clip.addLineListener(e -> {
    LineEvent.Type t = e.getType();
    if (Objects.equals(t, LineEvent.Type.STOP) || Objects.equals(t, LineEvent.Type.CLOSE)) {
      loop.exit();
    }
  });
  clip.open(sound);
  clip.start();
  loop.enter();
} catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
  ex.printStackTrace();
  Toolkit.getDefaultToolkit().beep();
}
View in GitHub: Java, Kotlin

解説

AudioSystemを使用すれば、WAVEAUAIFFSND形式のサウンドファイルが演奏可能です。

  • AudioInputStreamClipAutoCloseableで自動的に開放するためtry-with-resourcesブロックで作成
  • 演奏開始後にSecondaryLoopで現在のスレッドをブロックし新しいセカンダリイベントループで演奏継続
  • 演奏終了イベントをLineListenerで受け取るとセカンダリイベントループを終了して現在のスレッドに戻りclose()が自動的に実行される

参考リンク

コメント