soundpool

A Flutter Sound Pool for playing short media files.

Sound Pool caches audio tracks in memory. This can be useful in following scenarios:

  • lower latency between play signal and actual playing of the sound (audio does not need to be read from disc/web),
  • the same sound may be used multiple times.

Inspired by Android SoundPool API.

 

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:soundpool/soundpool.dart';

class Sound extends StatefulWidget {
  final Widget child;

  const Sound({Key key, this.child}) : super(key: key);

  @override
  SoundState createState() => SoundState();

  static SoundState of(BuildContext context) {
    final state = context.ancestorStateOfType(const TypeMatcher<SoundState>());
    assert(state != null, 'can not find Sound widget');
    return state;
  }
}

const _SOUNDS = [
  'clean.mp3',
  'drop.mp3',
  'explosion.mp3',
  'move.mp3',
  'rotate.mp3',
  'start.mp3'
];

class SoundState extends State<Sound> {
  Soundpool _pool;

  Map<String, int> _soundIds;

  bool mute = false;

  void _play(String name) {
    final soundId = _soundIds[name];
    if (soundId != null && !mute) {
      _pool.play(soundId);
    }
  }

  @override
  void initState() {
    super.initState();
    _pool = Soundpool(streamType: StreamType.music, maxStreams: 4);
    _soundIds = Map();
    for (var value in _SOUNDS) {
      scheduleMicrotask(() async {
        final data = await rootBundle.load('assets/audios/$value');
        _soundIds[value] = await _pool.load(data);
      });
    }
  }

  @override
  void dispose() {
    super.dispose();
    _pool.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }

  void start() {
    _play('start.mp3');
  }

  void clear() {
    _play('clean.mp3');
  }

  void fall() {
    _play('drop.mp3');
  }

  void rotate() {
    _play('rotate.mp3');
  }

  void move() {
    _play('move.mp3');
  }
}

  

 

 

 


class PlaySound {
final _SOUNDS = [
'clean.mp3',
'drop.mp3',
'explosion.mp3',
'move.mp3',
'rotate.mp3',
'start.mp3'
];

Map soundIds = Map();

play(String name){
soundpool.play(soundIds[name]);
}

Soundpool soundpool = Soundpool(streamType: StreamType.music, maxStreams: 4);

PlaySound(){
scheduleMicrotask(()async{
for(var value in _SOUNDS){
var data = await rootBundle.load('assets/audios/$value');
soundIds[value] = await soundpool.load(data);
}
});
}
}
posted @ 2019-05-13 20:17  CrossPython  阅读(367)  评论(0编辑  收藏  举报