/*
* Copyright 2009 Fred Sauer
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.allen_sauer.gwt.voices.client;
import static com.allen_sauer.gwt.voices.client.Sound.LoadState.LOAD_STATE_SUPPORTED_AND_READY;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.allen_sauer.gwt.voices.client.ui.VoicesMovie;
import java.util.ArrayList;
/**
* <a href= 'http://www.adobe.com/products/flashplayer/'>Adobe Flash Player</a> based
* sound.
*/
public class FlashSound extends AbstractSound {
// CHECKSTYLE_JAVADOC_OFF
private static ArrayList<FlashSound> soundList = new ArrayList<FlashSound>();
@SuppressWarnings("unused")
private static void playbackCompleted(final int index) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
soundList.get(index).playbackCompleted();
}
});
}
@SuppressWarnings("unused")
private static void soundLoaded(final int index) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
soundList.get(index).soundLoaded();
}
});
}
private int balance = SoundController.DEFAULT_BALANCE;
private boolean looping = SoundController.DEFAULT_LOOPING;
private final int soundNumber;
private boolean soundRegistered = false;
private final VoicesMovie voicesMovie;
private int volume = SoundController.DEFAULT_VOLUME;
public FlashSound(String mimeType, String url, boolean streaming, boolean crossOrigin,
VoicesMovie voicesMovie) {
super(mimeType, url, streaming, crossOrigin);
this.voicesMovie = voicesMovie;
soundNumber = soundList.size();
soundList.add(this);
if (streaming) {
setLoadState(LOAD_STATE_SUPPORTED_AND_READY);
} else {
registerSound();
}
}
@Override
public int getBalance() {
return balance;
}
@Override
public boolean getLooping() {
return looping;
}
public int getSoundNumber() {
return soundNumber;
}
@Override
public SoundType getSoundType() {
return SoundType.FLASH;
}
@Override
public int getVolume() {
return volume;
}
@Override
public boolean play() {
registerSound();
if (getLoadState() == LOAD_STATE_SUPPORTED_AND_READY) {
// true indicates the sound was played
return voicesMovie.playSound(soundNumber);
}
// sound was not played, return false
return false;
}
@Override
public void setBalance(int balance) {
assert balance >= -100;
assert balance <= 100;
this.balance = balance;
if (getLoadState() == LOAD_STATE_SUPPORTED_AND_READY) {
voicesMovie.setBalance(soundNumber, balance);
}
}
@Override
public void setLooping(boolean looping) {
this.looping = looping;
if (getLoadState() == LOAD_STATE_SUPPORTED_AND_READY) {
voicesMovie.setLooping(soundNumber, looping);
}
}
@Override
public void setVolume(int volume) {
assert volume >= 0;
assert volume <= 100;
this.volume = volume;
if (getLoadState() == LOAD_STATE_SUPPORTED_AND_READY) {
voicesMovie.setVolume(soundNumber, volume);
}
}
@Override
public void stop() {
if (getLoadState() == LOAD_STATE_SUPPORTED_AND_READY) {
voicesMovie.stopSound(soundNumber);
}
}
protected void playbackCompleted() {
soundHandlerCollection.fireOnPlaybackComplete(this);
}
protected void soundLoaded() {
setLoadState(LOAD_STATE_SUPPORTED_AND_READY);
if (volume != SoundController.DEFAULT_VOLUME) {
voicesMovie.setVolume(soundNumber, volume);
}
if (balance != SoundController.DEFAULT_BALANCE) {
voicesMovie.setBalance(soundNumber, balance);
}
if (looping != SoundController.DEFAULT_LOOPING) {
voicesMovie.setLooping(soundNumber, looping);
}
}
private void registerSound() {
if (!soundRegistered) {
voicesMovie.registerSound(this);
soundRegistered = true;
}
}
}