Skip to main content

ampos_flutter_sound 0.0.8+4 copy "ampos_flutter_sound: ^0.0.8+4" to clipboard
ampos_flutter_sound: ^0.0.8+4 copied to clipboard

Flutter plugin that relates to sound like audio and recorder.

example/lib/main.dart

import 'dart:async';
import 'dart:io';

import 'package:ampos_flutter_sound/ampos_flutter_sound.dart';
import 'package:flutter/material.dart';
import 'package:intl/date_symbol_data_local.dart';
import 'package:intl/intl.dart' show DateFormat;

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  bool _isRecording = false;
  bool _isPlaying = false;
  bool _isReallyPlaying = false;

  StreamSubscription _recorderSubscription;
  StreamSubscription _dbPeakSubscription;
  StreamSubscription _playerSubscription;
  AmposFlutterSound flutterSound;

  String _recorderTxt = '00:00:00';
  String _playerTxt = '00:00:00';
  double _dbLevel;

  double sliderCurrentPosition = 0.0;
  double maxDuration = 1.0;

  String path = '';

  @override
  void initState() {
    super.initState();
    flutterSound = AmposFlutterSound(passiveRetrieveStatus: Platform.isAndroid);
    flutterSound.setSubscriptionDuration(0.01);
    flutterSound.setDbPeakLevelUpdate(0.8);
    flutterSound.setDbLevelEnabled(true);
    initializeDateFormatting();
  }

  Future<void> startRecorder() async {
    try {
      path = await flutterSound.startRecorder();
      print('startRecorder: $path');

      _recorderSubscription = flutterSound.onRecorderStateChanged.listen((e) {
        final DateTime date = DateTime.fromMillisecondsSinceEpoch(e.currentPosition.toInt(), isUtc: true);
        final String txt = DateFormat('mm:ss:SS', 'en_GB').format(date);

        setState(() {
          _recorderTxt = txt.substring(0, 8);
        });
      });
      _dbPeakSubscription = flutterSound.onRecorderDbPeakChanged.listen((value) {
        print('got update -> $value');
        setState(() {
          _dbLevel = value;
        });
      });

      setState(() {
        _isRecording = true;
        _isReallyPlaying = true;
      });
    } catch (err) {
      print('startRecorder error: $err');
    }
  }

  Future<void> stopRecorder() async {
    try {
      final String result = await flutterSound.stopRecorder();
      print('stopRecorder: $result');

      if (_recorderSubscription != null) {
        _recorderSubscription.cancel();
        _recorderSubscription = null;
      }
      if (_dbPeakSubscription != null) {
        _dbPeakSubscription.cancel();
        _dbPeakSubscription = null;
      }

      setState(() {
        _isRecording = false;
        _isReallyPlaying = false;
      });
    } catch (err) {
      print('stopRecorder error: $err');
    }
  }

  Future<void> startPlayer() async {
    final String path = await flutterSound.startPlayer(this.path);
    await flutterSound.setVolume(1.0);
    print('startPlayer: $path');

    try {
      _playerSubscription = flutterSound.onPlayerStateChanged.listen((e) {
        if (e != null) {
          sliderCurrentPosition = e.currentPosition;
          maxDuration = e.duration;

          final DateTime date = DateTime.fromMillisecondsSinceEpoch(e.currentPosition.toInt(), isUtc: true);
          final String txt = DateFormat('mm:ss:SS', 'en_GB').format(date);
          setState(() {
            _isPlaying = true;
            _isReallyPlaying = true;
            _playerTxt = txt.substring(0, 8);
          });
        }
      });
    } catch (err) {
      print('error: $err');
    }
  }

  Future<void> stopPlayer() async {
    try {
      final String result = await flutterSound.stopPlayer();
      print('stopPlayer: $result');
      if (_playerSubscription != null) {
        _playerSubscription.cancel();
        _playerSubscription = null;
      }

      setState(() {
        _isPlaying = false;
      });
    } catch (err) {
      print('error: $err');
    }
  }

  Future<void> pausePlayer() async {
    final String result = await flutterSound.pausePlayer();
    setState(() {
      _isPlaying = false;
    });
    print('pausePlayer: $result');
  }

  Future<void> resumePlayer() async {
    final String result = await flutterSound.resumePlayer();
    setState(() {
      _isPlaying = true;
    });
    print('resumePlayer: $result');
  }

  Future<void> seekToPlayer(int milliSecs) async {
    final String result = await flutterSound.seekToPlayer(milliSecs);
    print('seekToPlayer: $result');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Flutter Sound'),
        ),
        body: ListView(
          children: <Widget>[
            Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Container(
                  margin: EdgeInsets.only(top: 24.0, bottom: 16.0),
                  child: Text(
                    _recorderTxt,
                    style: TextStyle(
                      fontSize: 48.0,
                      color: Colors.black,
                    ),
                  ),
                ),
                _isRecording
                    ? LinearProgressIndicator(
                        value: 100.0 / 160.0 * (_dbLevel ?? 1) / 100,
                        valueColor: AlwaysStoppedAnimation<Color>(Colors.green),
                        backgroundColor: Colors.red,
                      )
                    : Container()
              ],
            ),
            Row(
              children: <Widget>[
                Container(
                  width: 56.0,
                  height: 56.0,
                  child: ClipOval(
                    child: FlatButton(
                      onPressed: () {
                        if (!_isRecording) {
                          return startRecorder();
                        }
                        return stopRecorder();
                      },
                      padding: EdgeInsets.all(8.0),
                      child: Image(
                        image: _isRecording ? AssetImage('res/icons/ic_stop.png') : AssetImage('res/icons/ic_mic.png'),
                      ),
                    ),
                  ),
                ),
              ],
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
            ),
            Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                Container(
                  margin: EdgeInsets.only(top: 60.0, bottom: 16.0),
                  child: Text(
                    _playerTxt,
                    style: TextStyle(
                      fontSize: 48.0,
                      color: Colors.black,
                    ),
                  ),
                ),
              ],
            ),
            Row(
              children: <Widget>[
                Container(
                  width: 56.0,
                  height: 56.0,
                  child: ClipOval(
                    child: FlatButton(
                      onPressed: () {
                        if (_isReallyPlaying) {
                          resumePlayer();
                        } else {
                          startPlayer();
                        }
                      },
                      padding: EdgeInsets.all(8.0),
                      child: Image(
                        image: AssetImage('res/icons/ic_play.png'),
                      ),
                    ),
                  ),
                ),
                Container(
                  width: 56.0,
                  height: 56.0,
                  child: ClipOval(
                    child: FlatButton(
                      onPressed: () {
                        pausePlayer();
                      },
                      padding: EdgeInsets.all(8.0),
                      child: Image(
                        width: 36.0,
                        height: 36.0,
                        image: AssetImage('res/icons/ic_pause.png'),
                      ),
                    ),
                  ),
                ),
                Container(
                  width: 56.0,
                  height: 56.0,
                  child: ClipOval(
                    child: FlatButton(
                      onPressed: () {
                        stopPlayer();
                      },
                      padding: EdgeInsets.all(8.0),
                      child: Image(
                        width: 28.0,
                        height: 28.0,
                        image: AssetImage('res/icons/ic_stop.png'),
                      ),
                    ),
                  ),
                ),
              ],
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
            ),
            Container(
                height: 56.0,
                child: Slider(
                    value: sliderCurrentPosition,
                    min: 0.0,
                    max: maxDuration,
                    onChanged: (double value) async {
                      await flutterSound.seekToPlayer(value.toInt());
                    },
                    divisions: maxDuration.toInt()))
          ],
        ),
      ),
    );
  }
}
2
likes
40
points
17
downloads

Publisher

unverified uploader

Weekly Downloads

Flutter plugin that relates to sound like audio and recorder.

Homepage

License

MIT (license)

Dependencies

flutter

More

Packages that depend on ampos_flutter_sound

Packages that implement ampos_flutter_sound