/
Yakodan
/
Music-System
Обзор
Документация
Войти
/
Yakodan
/
Music-System
Код
Запросы
0
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/Sound.java
144 строки
4 KB
Yakodan
Домашняя работа №2
17 окт 2023, 18:19
17 окт 2023, 18:19
2f6d301
Код
Авторство
О чём код?
/* Найденный в интернете вспомогательный класс :) */ import java.io.File; import java.io.IOException; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.FloatControl; import javax.sound.sampled.LineEvent; import javax.sound.sampled.LineListener; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; public class Sound implements AutoCloseable { private boolean released = false; private AudioInputStream stream = null; private Clip clip = null; private FloatControl volumeControl = null; private boolean playing = false; public Sound(File f) { try { stream = AudioSystem.getAudioInputStream(f); clip = AudioSystem.getClip(); clip.open(stream); clip.addLineListener(new Listener()); volumeControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN); released = true; } catch (IOException | UnsupportedAudioFileException | LineUnavailableException exc) { exc.printStackTrace(); released = false; close(); } } // true если звук успешно загружен, false если произошла ошибка public boolean isReleased() { return released; } // проигрывается ли звук в данный момент public boolean isPlaying() { return playing; } // Запуск /* breakOld определяет поведение, если звук уже играется Если breakOld==true, о звук будет прерван и запущен заново Иначе ничего не произойдёт */ public void play(boolean breakOld) { if (released) { if (breakOld) { clip.stop(); clip.setFramePosition(0); clip.start(); playing = true; } else if (!isPlaying()) { clip.setFramePosition(0); clip.start(); playing = true; } } } // То же самое, что и play(true) public void play() { play(true); } // Останавливает воспроизведение public void stop() { if (playing) { clip.stop(); } } public void close() { if (clip != null) clip.close(); if (stream != null) try { stream.close(); } catch (IOException exc) { exc.printStackTrace(); } } // Установка громкости /* x долже быть в пределах от 0 до 1 (от самого тихого к самому громкому) */ public void setVolume(float x) { if (x<0) x = 0; if (x>1) x = 1; float min = volumeControl.getMinimum(); float max = volumeControl.getMaximum(); volumeControl.setValue((max-min)*x+min); } // Возвращает текущую громкость (число от 0 до 1) public float getVolume() { float v = volumeControl.getValue(); float min = volumeControl.getMinimum(); float max = volumeControl.getMaximum(); return (v-min)/(max-min); } // Дожидается окончания проигрывания звука public void join() { if (!released) return; synchronized(clip) { try { while (playing) clip.wait(); } catch (InterruptedException exc) {} } } // Статический метод, для удобства public static Sound playSound(String path) { File f = new File(path); Sound snd = new Sound(f); snd.play(); return snd; } private class Listener implements LineListener { public void update(LineEvent ev) { if (ev.getType() == LineEvent.Type.STOP) { playing = false; synchronized(clip) { clip.notify(); } } } } }