flutter_oboe 0.0.1
flutter_oboe: ^0.0.1 copied to clipboard
Google Oboe audio engine plugins for flutter
example/lib/main.dart
import 'dart:io';
import 'dart:math';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'dart:async';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:flutter/services.dart';
import 'package:flutter_oboe/flutter_oboe.dart';
import 'package:flutter_oboe/flutter_oboe_test.dart';
import 'package:external_path/external_path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:just_audio/just_audio.dart';
import 'package:permission_handler/permission_handler.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String _platformVersion = 'Unknown';
final stream = OboeTestStream();
final flutterOboe = FlutterOboe();
final noise = Float32List(512);
late Timer timer;
bool bFileExist = false;
final _player = AudioPlayer();
Future<String> _getPath() async {
Directory appDocDir = await getApplicationDocumentsDirectory();
return appDocDir.path;
// return await ExternalPath.getExternalStoragePublicDirectory(ExternalPath.DIRECTORY_DOWNLOADS);
}
// static Future<String> _findLocalPath({bool bVisibleToUser = true}) async {
// final directory = Platform.isAndroid ? bVisibleToUser ? await getExternalStorageDirectory() : await getApplicationDocumentsDirectory() : await getApplicationDocumentsDirectory();
// return directory.path;
// }
@override
void initState() {
super.initState();
initPlatformState();
// if (!kIsWeb) {
// var status = await Permission.microphone.request();
// if (status != PermissionStatus.granted) {
// print('Microphone permission is needed');
// }
// }
//Oboe Test
for(var i=0; i< noise.length; i++){
noise[i] = sin(8 * pi * i / noise.length);
}
}
@override
void dispose(){
stream.dispose();
super.dispose();
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
String platformVersion;
// Platform messages may fail, so we use a try/catch PlatformException.
// We also handle the message potentially returning null.
try {
platformVersion =
await FlutterOboeTest.platformVersion ?? 'Unknown platform version';
} on PlatformException {
platformVersion = 'Failed to get platform version.';
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
_platformVersion = platformVersion;
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: const Text('Oboe Plugin'),
),
body: SizedBox(
width: double.infinity,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('Running on: $_platformVersion').paddingOnly(bottom: 5),
Text('1 + 2 = ${stream.performNativeAdd(1,2)}').paddingOnly(bottom: 5),
Text('Sample rate : ${stream.getSampleRate()}').paddingOnly(bottom: 5),
ElevatedButton(onPressed: startStream, child: const Text('Start audio stream')).paddingOnly(top: 50),
ElevatedButton(onPressed: stopStream, child: const Text('Stop audio stream')).paddingOnly(bottom: 5),
ElevatedButton(onPressed: startRecording, child: const Text('Start recording')).paddingOnly(top: 50),
ElevatedButton(onPressed: stopRecording, child: const Text('Stop recording')).paddingOnly(bottom: 5),
ElevatedButton(onPressed: saveRecording, child: const Text('Save recording')).paddingOnly(bottom: 5),
ElevatedButton(onPressed: checkFile, child: const Text('Check saved audio file')).paddingOnly(bottom: 5),
FutureBuilder(
future: _getPath(),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (snapshot.hasData) {
return Text('Full Data path : ' + snapshot.data);
} else {
return Text("Loading");
}
},
),
Text(bFileExist ? 'File exist' : 'File not found').paddingOnly(bottom: 5),
if(bFileExist)
ElevatedButton(onPressed: playAudio, child: const Text('Play recorded audio')).paddingOnly(bottom: 5),
],
),
),
),
);
}
//Testing
void startStream(){
stream.start();
var interval = (512000 / stream.getSampleRate()).floor() + 1;
timer = Timer.periodic(Duration(milliseconds: interval), (_){
stream.write(noise);
});
}
void stopStream(){
timer?.cancel();
stream.stop();
}
//Audio Recorder
void startRecording(){
//'/data/user/0/com.joydash.flutter_oboe_example/app_flutter/test.wav'
flutterOboe.startRecording();
}
void stopRecording(){
flutterOboe.stopRecording();
flutterOboe.writeToFile('/data/user/0/com.joydash.flutter_oboe_example/app_flutter/test1.wav');
}
void saveRecording(){
flutterOboe.writeToFile('/data/user/0/com.joydash.flutter_oboe_example/app_flutter/test1.wav');
}
void checkFile() async{
bFileExist = await File('/data/user/0/com.joydash.flutter_oboe_example/app_flutter/test1.wav').exists();
setState((){
if(bFileExist)
{
playAudio();
}
});
}
void playAudio() async{
flutterOboe.playFromFile('/data/user/0/com.joydash.flutter_oboe_example/app_flutter/test1.wav');
// await _player.setFilePath('/data/user/0/com.joydash.flutter_oboe_example/app_flutter/test1.wav');
// await _player.play();
}
void stopAudio() async{
flutterOboe.stopPlayingFromFile();
}
}