blob: 6625d12bca9e5e9771ad8cc30e8e4f586ee13450 [file] [log] [blame]
// 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.
import 'package:mojo/mojo/url_response.mojom.dart';
import 'package:sky/mojo/net/fetch.dart';
import 'package:sky/mojo/shell.dart' as shell;
import 'package:sky/rendering/box.dart';
import 'package:sky/rendering/flex.dart';
import 'package:sky/theme/colors.dart' as colors;
import 'package:sky/widgets/basic.dart';
import 'package:sky_services/media/media.mojom.dart';
// All of these sounds are marked as public domain at soundbible.
const String chimes = "http://soundbible.com/grab.php?id=2030&type=wav";
const String chainsaw = "http://soundbible.com/grab.php?id=1391&type=wav";
const String stag = "http://soundbible.com/grab.php?id=2073&type=wav";
const String frogs = "http://soundbible.com/grab.php?id=2033&type=wav";
const String rattle = "http://soundbible.com/grab.php?id=2037&type=wav";
const String iLoveYou = "http://soundbible.com/grab.php?id=2045&type=wav";
class Key {
Key(this.color, this.soundUrl);
final Color color;
final String soundUrl;
MediaPlayerProxy player;
EventDisposition down() {
if (player == null)
return EventDisposition.ignored;
player.ptr.seekTo(0);
player.ptr.start();
return EventDisposition.processed;
}
EventDisposition up() {
if (player == null)
return EventDisposition.ignored;
player.ptr.pause();
return EventDisposition.processed;
}
}
class PianoApp extends App {
final List<Key> keys = [
new Key(colors.Red[500], chimes),
new Key(colors.Orange[500], chainsaw),
new Key(colors.Yellow[500], stag),
new Key(colors.Green[500], frogs),
new Key(colors.Blue[500], rattle),
new Key(colors.Purple[500], iLoveYou),
];
PianoApp() {
loadSounds();
}
loadSounds() async {
MediaServiceProxy mediaService = new MediaServiceProxy.unbound();
shell.requestService(null, mediaService);
for (Key key in keys) {
MediaPlayerProxy player = new MediaPlayerProxy.unbound();
mediaService.ptr.createPlayer(player);
UrlResponse response = await fetchUrl(key.soundUrl);
await player.ptr.prepare(response.body);
key.player = player;
}
mediaService.close();
// Are we leaking all the player connections?
}
Widget build() {
List<Widget> children = [];
for (Key key in keys) {
children.add(
new Listener(
child: new Flexible(
child: new Container(
decoration: new BoxDecoration(backgroundColor: key.color)
)
),
onPointerCancel: (_) => key.up(),
onPointerDown: (_) => key.down(),
onPointerUp: (_) => key.up()
)
);
}
return new Flex(
children,
direction: FlexDirection.vertical
);
}
}
void main() {
runApp(new PianoApp());
}