diff --git a/src/java/com/threerings/media/sound/SoundEnabledObserver.java b/src/java/com/threerings/media/sound/SoundEnabledObserver.java new file mode 100644 index 00000000..5031ea6c --- /dev/null +++ b/src/java/com/threerings/media/sound/SoundEnabledObserver.java @@ -0,0 +1,14 @@ +package com.threerings.media.sound; + +import com.threerings.media.sound.SoundPlayer.SoundType; + +/** + * Exposes a {@link SoundType} being enabled or disabled in {@link SoundPlayer}. + */ +public interface SoundEnabledObserver +{ + /** + * Called when the given type is either enabled or disabled. + */ + void enabledChanged(SoundType type, boolean enabled); +} diff --git a/src/java/com/threerings/media/sound/SoundPlayer.java b/src/java/com/threerings/media/sound/SoundPlayer.java index 854bad28..05ce44c7 100644 --- a/src/java/com/threerings/media/sound/SoundPlayer.java +++ b/src/java/com/threerings/media/sound/SoundPlayer.java @@ -5,7 +5,9 @@ import java.util.Set; import com.google.common.collect.Sets; import com.samskivert.util.Interval; +import com.samskivert.util.ObserverList; import com.samskivert.util.RunQueue; +import com.samskivert.util.ObserverList.ObserverOp; /** * Loads, plays and loops sounds. @@ -131,13 +133,32 @@ public abstract class SoundPlayer /** * Turns on or off the specified sound type. */ - public void setEnabled (SoundType type, boolean enabled) + public void setEnabled (final SoundType type, final boolean enabled) { + boolean changed; if (enabled) { - _disabledTypes.remove(type); + changed = _disabledTypes.remove(type); } else { - _disabledTypes.add(type); + changed = _disabledTypes.add(type); } + if (changed) { + _enabledObservers.apply(new ObserverOp() { + public boolean apply (SoundEnabledObserver observer) { + observer.enabledChanged(type, enabled); + return true; + } + }); + } + } + + public void addSoundEnabledObserver (SoundEnabledObserver listener) + { + _enabledObservers.add(listener); + } + + public void removeSoundEnabledObserver (SoundEnabledObserver listener) + { + _enabledObservers.remove(listener); } /** @@ -273,4 +294,6 @@ public abstract class SoundPlayer /** A set of soundTypes for which sound is enabled. */ protected Set _disabledTypes = Sets.newHashSet(); + protected ObserverList _enabledObservers = ObserverList.newFastUnsafe(); + }