package org.flixel.system.gdx.audio;
import org.flixel.system.gdx.utils.EventPool;
import com.badlogic.gdx.audio.Music;
import com.badlogic.gdx.audio.Music.OnCompletionListener;
import com.badlogic.gdx.utils.Pool;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.media.SoundChannel;
import flash.media.SoundTransform;
public class GdxMusicChannel extends EventDispatcher implements SoundChannel, OnCompletionListener
{
private SoundTransform _soundTransform;
private Music _music;
private static final Pool<GdxMusicChannel> _channels;
private static final EventPool _events;
static
{
_channels = new Pool<GdxMusicChannel>()
{
@Override
protected GdxMusicChannel newObject()
{
return new GdxMusicChannel();
}
};
_events = new EventPool(2);
}
public static GdxMusicChannel getNew()
{
return _channels.obtain();
}
private GdxMusicChannel()
{
}
void play(Music music, float startTime, int loops, SoundTransform sndTransform)
{
_music = music;
if(loops > 0)
_music.setLooping(true);
else
_music.setLooping(false);
setSoundTransform(sndTransform);
_music.setOnCompletionListener(this);
_music.play();
}
@Override
public float getLeftPeak()
{
return 0;
}
@Override
public float getRightPeak()
{
return 0;
}
@Override
public void setSoundTransform(SoundTransform soundTransform)
{
_soundTransform = soundTransform;
_music.setPan(soundTransform.pan, soundTransform.volume);
}
@Override
public SoundTransform getSoundTransform()
{
return _soundTransform;
}
@Override
public void stop()
{
_music.stop();
_channels.free(this);
}
@Override
public void pause()
{
_music.pause();
}
@Override
public void resume()
{
if(!_music.isPlaying())
_music.play();
}
@Override
public void onCompletion(Music music)
{
stop();
dispatchEvent(_events.obtain(Event.SOUND_COMPLETE));
}
}