Commit b7af062a authored by Adam Barth's avatar Adam Barth Committed by GitHub

Remove sound.dart (#5995)

This code is now in its own standalone library. The library is in a private git
repository in the flutter organization because the code is unmaintained. If
you're interested in using and maintaining this code, please contact
flutter-dev@googlegroups.com for more information.

Fixes #1364
parent 8755e569
......@@ -6,7 +6,6 @@
library flutter_sprites;
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
import 'dart:math' as math;
import 'dart:typed_data';
......@@ -18,8 +17,6 @@ import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart';
import 'package:meta/meta.dart';
import 'package:mojo/core.dart';
import 'package:flutter_services/media.dart';
import 'package:vector_math/vector_math_64.dart';
part 'src/action.dart';
......@@ -35,7 +32,6 @@ part 'src/node.dart';
part 'src/node3d.dart';
part 'src/node_with_size.dart';
part 'src/particle_system.dart';
part 'src/sound.dart';
part 'src/sprite.dart';
part 'src/sprite_box.dart';
part 'src/sprite_widget.dart';
......
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of flutter_sprites;
/// An audio asset loaded by the SoundEffectPlayer.
class SoundEffect {
/// Creates a new sound effect with the given sound id. Normally,
/// SoundEffect objects are created through the [SoundEffectPlayer].
SoundEffect(this._soundId);
int _soundId;
}
/// A sound being played by the SoundEffectPlayer.
class SoundEffectStream {
/// Creates a new SoundEffectStream. Typically SoundEffectStream objects are
/// created by the SoundEffectPlayer.
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;
/// Stop the sound effect.
void stop() {
_soundPool.stop(_streamId);
}
/// True if the sound effect is paused.
bool get paused => _paused;
bool _paused;
set paused(bool value) {
_paused = value;
if (_paused) {
_soundPool.pause(_streamId);
} else {
_soundPool.resume(_streamId);
}
}
/// Left volume of the sound effect, valid values are 0.0 to 1.0.
double get leftVolume => _leftVolume;
double _leftVolume;
set leftVolume(double value) {
_leftVolume = value;
_soundPool.setVolume(_streamId, <double>[_leftVolume, _rightVolume]);
}
/// Right volume of the sound effect, valid values are 0.0 to 1.0.
double get rightVolume => _rightVolume;
double _rightVolume;
set rightVolume(double value) {
_rightVolume = value;
_soundPool.setVolume(_streamId, <double>[_leftVolume, _rightVolume]);
}
/// The pitch of the sound effect, a value of 1.0 plays back the sound effect
/// at normal speed. Cannot be negative.
double get pitch => _pitch;
double _pitch;
set pitch(double value) {
_pitch = value;
_soundPool.setRate(_streamId, _pitch);
}
}
/// The SoundEffectPlayer loads and plays sound effects.
class SoundEffectPlayer {
/// Creates a new SoundEffectPlayer with a max number of simultaneous
/// streams specified.
SoundEffectPlayer(int maxStreams) {
MediaServiceProxy mediaService = shell.connectToApplicationService(
'mojo:media_service', MediaService.connectToService
);
_soundPool = new SoundPoolProxy.unbound();
mediaService.createSoundPool(_soundPool, maxStreams);
}
SoundPoolProxy _soundPool;
bool _paused;
int _nextStreamId = 0;
/// Loads a sound effect.
Future<SoundEffect> load(MojoDataPipeConsumer data) {
Completer<SoundEffect> completer = new Completer<SoundEffect>();
_soundPool.load(data, (bool success, int soundId) {
if (success)
completer.complete(new SoundEffect(soundId));
else
completer.completeError(new Exception('Unable to load sound'));
});
return completer.future;
}
/// Plays a sound effect.
Future<SoundEffectStream> play(SoundEffect sound, {
double leftVolume: 1.0,
double rightVolume: 1.0,
bool loop: false,
double pitch: 1.0
}) {
Completer<SoundEffectStream> completer = new Completer<SoundEffectStream>();
int streamId = _nextStreamId++;
_soundPool.play(sound._soundId,
streamId,
<double>[leftVolume, rightVolume],
loop,
pitch,
(bool success) {
if (success) {
completer.complete(new SoundEffectStream(this, streamId,
leftVolume: leftVolume,
rightVolume: rightVolume,
pitch: pitch
));
} else {
completer.completeError(new Exception('Unable to play sound'));
}
});
return completer.future;
}
/// Set to true to pause a sound effect.
bool get paused => _paused;
set paused(bool value) {
_paused = value;
if (_paused) {
_soundPool.pauseAll();
} else {
_soundPool.resumeAll();
}
}
}
/// Signature for callbacks used by [SoundTrack].
typedef void SoundTrackCallback(SoundTrack soundTrack);
/// Signature for callbacks used by [SoundTrack].
typedef void SoundTrackBufferingCallback(SoundTrack soundTrack, int index);
/// A sound track is typically longer than a [SoundEffect]. Use sound tracks to
/// play back music or ambient sounds.
class SoundTrack {
MediaPlayerProxy _player;
/// Called when the sound has finished playing.
SoundTrackCallback onSoundComplete;
/// Called when a seek operation has finished.
SoundTrackCallback onSeekComplete;
/// Called when buffering is being performed.
SoundTrackBufferingCallback onBufferingUpdate;
/// If true, the sound track will automatically loop.
bool loop;
/// The current playback time in seconds.
double time;
/// The volume the sound track is currently played at, valid range is 0.0 to
/// 1.0.
double volume;
}
SoundTrackPlayer _sharedSoundTrackPlayer;
/// Loads and plays [SoundTrack]s.
class SoundTrackPlayer {
/// Creates a new [SoundTrackPlayer], typically you will want to use the
/// [sharedInstance] method to receive the player.
SoundTrackPlayer() {
_mediaService = shell.connectToApplicationService(
'mojo:media_service', MediaService.connectToService
);
}
MediaServiceProxy _mediaService;
Set<SoundTrack> _soundTracks = new HashSet<SoundTrack>();
/// Retrives a singleton object of the SoundTrackPlayer, use this method
/// in favor for the constructor.
static SoundTrackPlayer sharedInstance() {
return _sharedSoundTrackPlayer ??= new SoundTrackPlayer();
}
/// Loads a [SoundTrack].
Future<SoundTrack> load(Future<MojoDataPipeConsumer> pipe) async {
// Create media player
SoundTrack soundTrack = new SoundTrack();
soundTrack._player = new MediaPlayerProxy.unbound();
_mediaService.createPlayer(soundTrack._player);
Completer<SoundTrack> completer = new Completer<SoundTrack>();
soundTrack._player.prepare(await pipe, (bool ignored) {
completer.complete(soundTrack);
});
return await completer.future;
}
/// Unloads a [SoundTrack] from memory.
void unload(SoundTrack soundTrack) {
stop(soundTrack);
_soundTracks.remove(soundTrack);
}
/// Plays a [SoundTrack].
void play(SoundTrack soundTrack, {
bool loop: false,
double volume: 1.0,
double startTime: 0.0
}) {
soundTrack._player
..setLooping(loop)
..setVolume(volume)
..seekTo((startTime * 1000.0).toInt())
..start();
_soundTracks.add(soundTrack);
}
/// Stops a [SoundTrack]. You may also want to call the [unload] method to
/// remove if from memory if you are not planning to play it again.
void stop(SoundTrack track) {
track._player.pause();
}
/// Pauses all [SoundTrack]s that are currently playing.
void pauseAll() {
for (SoundTrack soundTrack in _soundTracks)
soundTrack._player.pause();
}
/// Resumes all [SoundTrack]s that have been loaded by this player.
void resumeAll() {
for (SoundTrack soundTrack in _soundTracks)
soundTrack._player.start();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment