ampos_flutter_sound 0.0.1 ampos_flutter_sound: ^0.0.1 copied to clipboard
Flutter plugin that relates to sound like audio and recorder.
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:ampos_flutter_sound/flutter_sound.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;
FlutterSound 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 = FlutterSound();
flutterSound.setSubscriptionDuration(0.01);
flutterSound.setDbPeakLevelUpdate(0.8);
flutterSound.setDbLevelEnabled(true);
initializeDateFormatting();
}
Future<void> startRecorder() async {
try {
path = await flutterSound.startRecorder(null);
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()))
],
),
),
);
}
}