blob: 6be942db13073d8702e1eb28ce024411fc570850 [file] [log] [blame]
part of flutter_sprites;
/// An audio asset loaded by the SoundEffectPlayer.
class SoundEffect {
SoundEffect(this._soundId);
int _soundId;
}
/// A sound being played by the SoundEffectPlayer.
class SoundEffectStream {
SoundEffectStream(SoundEffectPlayer player, int streamId, {
double leftVolume,
double rightVolume,
double pitch
}) {
_player = player;
_streamId = streamId;
_paused = false;
_leftVolume = leftVolume;
_rightVolume = rightVolume;
_pitch = pitch;
}
SoundEffectPlayer _player;
int _streamId;
SoundPoolProxy get _soundPool => _player._soundPool;
void stop() {
_soundPool.ptr.stop(_streamId);
}
bool get paused => _paused;
bool _paused;
void set paused(bool value) {
_paused = value;
if (_paused) {
_soundPool.ptr.pause(_streamId);
} else {
_soundPool.ptr.resume(_streamId);
}
}
double get leftVolume => _leftVolume;
double _leftVolume;
void set leftVolume(double value) {
_leftVolume = value;
_soundPool.ptr.setVolume(_streamId, <double>[_leftVolume, _rightVolume]);
}
double get rightVolume => _rightVolume;
double _rightVolume;
void set rightVolume(double value) {
_rightVolume = value;
_soundPool.ptr.setVolume(_streamId, <double>[_leftVolume, _rightVolume]);
}
double get pitch => _pitch;
double _pitch;
void set pitch(double value) {
_pitch = value;
_soundPool.ptr.setRate(_streamId, _pitch);
}
}
class SoundEffectPlayer {
SoundEffectPlayer(int maxStreams) {
MediaServiceProxy mediaService = new MediaServiceProxy.unbound();
shell.connectToService("mojo:media_service", mediaService);
_soundPool = new SoundPoolProxy.unbound();
mediaService.ptr.createSoundPool(_soundPool, maxStreams);
}
SoundPoolProxy _soundPool;
bool _paused;
int _nextStreamId = 0;
Future<SoundEffect> load(MojoDataPipeConsumer data) async {
SoundPoolLoadResponseParams result = await _soundPool.ptr.load(data);
if (result.success)
return new SoundEffect(result.soundId);
throw new Exception('Unable to load sound');
}
Future<SoundEffectStream> play(SoundEffect sound, {
double leftVolume: 1.0,
double rightVolume: 1.0,
bool loop: false,
double pitch: 1.0
}) async {
int streamId = _nextStreamId++;
SoundPoolPlayResponseParams result = await _soundPool.ptr.play(
sound._soundId, streamId, <double>[leftVolume, rightVolume], loop, pitch
);
if (result.success) {
return new SoundEffectStream(this, streamId,
leftVolume: leftVolume,
rightVolume: rightVolume,
pitch: pitch
);
}
throw new Exception('Unable to play sound');
}
bool get paused => _paused;
void set paused(bool value) {
_paused = value;
if (_paused) {
_soundPool.ptr.pauseAll();
} else {
_soundPool.ptr.resumeAll();
}
}
}
typedef void SoundTrackCallback(SoundTrack soundTrack);
typedef void SoundTrackBufferingCallback(SoundTrack soundTrack, int index);
class SoundTrack {
MediaPlayerProxy _player;
SoundTrackCallback onSoundComplete;
SoundTrackCallback onSeekComplete;
SoundTrackBufferingCallback onBufferingUpdate;
bool loop;
double time;
double volume;
}
SoundTrackPlayer _sharedSoundTrackPlayer;
class SoundTrackPlayer {
Set<SoundTrack> _soundTracks = new HashSet<SoundTrack>();
static SoundTrackPlayer sharedInstance() {
return _sharedSoundTrackPlayer ??= new SoundTrackPlayer();
}
SoundTrackPlayer() {
_mediaService = new MediaServiceProxy.unbound();
shell.connectToService("mojo:media_service", _mediaService);
}
MediaServiceProxy _mediaService;
Future<SoundTrack> load(Future<MojoDataPipeConsumer> pipe) async {
// Create media player
SoundTrack soundTrack = new SoundTrack();
soundTrack._player = new MediaPlayerProxy.unbound();
_mediaService.ptr.createPlayer(soundTrack._player);
await soundTrack._player.ptr.prepare(await pipe);
return soundTrack;
}
void unload(SoundTrack soundTrack) {
stop(soundTrack);
_soundTracks.remove(soundTrack);
}
void play(SoundTrack soundTrack, {
bool loop: false,
double volume: 1.0,
double startTime: 0.0
}) {
soundTrack._player.ptr.setLooping(loop);
soundTrack._player.ptr.setVolume(volume);
soundTrack._player.ptr.seekTo((startTime * 1000.0).toInt());
soundTrack._player.ptr.start();
_soundTracks.add(soundTrack);
}
void stop(SoundTrack track) {
track._player.ptr.pause();
}
void pauseAll() {
for (SoundTrack soundTrack in _soundTracks)
soundTrack._player.ptr.pause();
}
void resumeAll() {
for (SoundTrack soundTrack in _soundTracks)
soundTrack._player.ptr.start();
}
}