package de.fau.cs.mad.fly.sound;
import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.audio.Sound;
import com.badlogic.gdx.audio.Music;
public interface Playable extends Disposable {
public Playback play();
public void resume();
public void stop();
public void pause();
public boolean isSoundEffect();
public boolean isMusic();
public AudioManager manager();
}
class SoundPlayable implements Playable {
final Sound target;
final float defaultVolume;
final boolean defaultLooping;
private final AudioManager manager;
public SoundPlayable(Sound target, float defaultVolume, boolean defaultLooping, AudioManager manager) {
this.target = target;
this.defaultVolume = defaultVolume;
this.defaultLooping = defaultLooping;
this.manager = manager;
}
@Override
public AudioManager manager() {
return manager;
}
@Override
public Playback play() {
return new SoundPlayback(this);
}
@Override
public boolean isSoundEffect() {
return true;
}
@Override
public boolean isMusic() {
return false;
}
@Override
public void resume() {
target.resume();
}
@Override
public void stop() {
target.stop();
}
@Override
public void pause() {
target.pause();
}
@Override
public void dispose() {
target.dispose();
}
}
class MusicPlayable implements Playable, Playback {
private final Music target;
private final float defaultVolume;
private final AudioManager manager;
public MusicPlayable(Music target, float defaultVolume, boolean defaultLooping, AudioManager manager) {
this.target = target;
this.manager = manager;
this.defaultVolume = defaultVolume;
setLooping(defaultLooping);
}
@Override
public AudioManager manager() {
return manager;
}
public boolean isMusic() {
return true;
}
@Override
public boolean isSoundEffect() {
return false;
}
@Override
public Playable source() {
return this;
}
@Override
public Playback play() {
if(!target.isPlaying()) {
setVolume(1.0f);
target.play();
}
return this;
}
@Override
public void pause() {
target.pause();
}
@Override
public void resume() {
play();
}
@Override
public void stop() {
target.stop();
}
@Override
public void setVolume(float volume) {
target.setVolume(volume * defaultVolume * manager.volume);
}
@Override
public void setLooping(boolean looping) {
target.setLooping(looping);
}
@Override
public void setPan(float pan, float volume) {
target.setPan(pan, volume);
}
@Override
public void dispose() {
target.dispose();
}
}