| // 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_services/media/media.mojom.dart'; |
| import 'package:sky/mojo/net/fetch.dart'; |
| import 'package:sky/mojo/shell.dart' as shell; |
| import 'package:sky/rendering.dart'; |
| import 'package:sky/theme/colors.dart' as colors; |
| import 'package:sky/widgets.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()); |
| } |