From 9d95fae38aeb9f9876aafd1a889235c5e13851f5 Mon Sep 17 00:00:00 2001 From: "Pooja.Saini" Date: Thu, 4 Jul 2024 09:58:18 +0530 Subject: [PATCH] added the feature of start and stop recording --- .../android/app/src/main/AndroidManifest.xml | 5 + .../obs/obs_demo/ios/Runner/Info.plist | 2 + obs_flutter/obs/obs_demo/lib/main.dart | 2 - .../obs_demo/lib/screen/audio_recorder.dart | 115 +++++++++++ .../obs/obs_demo/lib/screen/bottomNavi.dart | 10 +- .../flutter/generated_plugin_registrant.cc | 4 + .../linux/flutter/generated_plugins.cmake | 1 + .../Flutter/GeneratedPluginRegistrant.swift | 2 + obs_flutter/obs/obs_demo/pubspec.lock | 181 ++++++++++++++++++ obs_flutter/obs/obs_demo/pubspec.yaml | 3 + .../flutter/generated_plugin_registrant.cc | 6 + .../windows/flutter/generated_plugins.cmake | 2 + 12 files changed, 327 insertions(+), 6 deletions(-) create mode 100644 obs_flutter/obs/obs_demo/lib/screen/audio_recorder.dart diff --git a/obs_flutter/obs/obs_demo/android/app/src/main/AndroidManifest.xml b/obs_flutter/obs/obs_demo/android/app/src/main/AndroidManifest.xml index ceb8ef8..116442b 100644 --- a/obs_flutter/obs/obs_demo/android/app/src/main/AndroidManifest.xml +++ b/obs_flutter/obs/obs_demo/android/app/src/main/AndroidManifest.xml @@ -1,4 +1,9 @@ + + + + + +NSMicrophoneUsageDescription +Some message to describe why you need this permission CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName diff --git a/obs_flutter/obs/obs_demo/lib/main.dart b/obs_flutter/obs/obs_demo/lib/main.dart index 8c5ac97..0b4f168 100644 --- a/obs_flutter/obs/obs_demo/lib/main.dart +++ b/obs_flutter/obs/obs_demo/lib/main.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; import 'package:obs_demo/CreateUserPage.dart'; -import 'package:obs_demo/screen/bottomNavi.dart'; -import 'package:obs_demo/screen/dashboard.dart'; void main() { runApp(const MyApp()); diff --git a/obs_flutter/obs/obs_demo/lib/screen/audio_recorder.dart b/obs_flutter/obs/obs_demo/lib/screen/audio_recorder.dart new file mode 100644 index 0000000..5ee9608 --- /dev/null +++ b/obs_flutter/obs/obs_demo/lib/screen/audio_recorder.dart @@ -0,0 +1,115 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:audioplayers/audioplayers.dart'; +import 'package:record/record.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:path_provider/path_provider.dart'; + +class AudioRecorder extends StatefulWidget { + @override + _AudioRecorderState createState() => _AudioRecorderState(); +} + +class _AudioRecorderState extends State { + late AudioPlayer audioPlayer; + String? _filePath; + bool _isRecording = false; + bool _hasRecording = false; + + @override + void initState() { + super.initState(); + audioPlayer = AudioPlayer(); + _requestPermissions(); + } + + Future _requestPermissions() async { + await Permission.microphone.request(); + await Permission.storage.request(); + } + + Future _startRecording() async { + if (await Record().hasPermission()) { + final directory = await getApplicationDocumentsDirectory(); + _filePath = '${directory.path}/audio_recording.wav'; + await Record().start( + path: _filePath, + encoder: AudioEncoder.AAC, + bitRate: 128000, + samplingRate: 44100, + ); + setState(() { + _isRecording = true; + _hasRecording = false; + }); + print('Recording started: $_filePath'); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Microphone permission is required')), + ); + } + } + + Future _stopRecording() async { + await Record().stop(); + setState(() { + _isRecording = false; + _hasRecording = true; + }); + print('Recording stopped: $_filePath'); + } + + Future _playRecording() async { + if (_filePath != null && File(_filePath!).existsSync()) { + await audioPlayer.play(DeviceFileSource(_filePath!)); + print('Playing recording: $_filePath'); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('No recording found or file does not exist')), + ); + } + } + + @override + void dispose() { + if (_isRecording) { + _stopRecording(); + } + audioPlayer.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Modern Audio Recorder'), + elevation: 0, + ), + body: Padding( + padding: const EdgeInsets.all(20.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(_isRecording ? 'Recording...' : 'Press the button to record'), + SizedBox(height: 20), + ElevatedButton( + onPressed: _isRecording ? _stopRecording : _startRecording, + child: Text(_isRecording ? 'Stop Recording' : 'Start Recording'), + ), + if (_filePath != null && !_isRecording && _hasRecording) ...[ + SizedBox(height: 20), + Text('Recording saved at:'), + Text(_filePath!), + SizedBox(height: 20), + ElevatedButton( + onPressed: _playRecording, + child: Text('Play Recording'), + ), + ], + ], + ), + ), + ); + } +} diff --git a/obs_flutter/obs/obs_demo/lib/screen/bottomNavi.dart b/obs_flutter/obs/obs_demo/lib/screen/bottomNavi.dart index 68d569f..7af965b 100644 --- a/obs_flutter/obs/obs_demo/lib/screen/bottomNavi.dart +++ b/obs_flutter/obs/obs_demo/lib/screen/bottomNavi.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:obs_demo/editortext.dart'; +import 'package:obs_demo/screen/audio_recorder.dart'; import 'package:obs_demo/screen/dashboard.dart'; import 'package:obs_demo/user_profile.dart'; @@ -64,6 +65,7 @@ class _BottomNavigationBarExampleState // 'Audio', // style: optionStyle, // ), + AudioRecorder(), Column( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -130,10 +132,10 @@ class _BottomNavigationBarExampleState icon: Icon(Icons.create), label: '', ), - // BottomNavigationBarItem( - // icon: Icon(Icons.audiotrack_outlined), - // label: 'Audio', - // ), + BottomNavigationBarItem( + icon: Icon(Icons.volume_up), + label: '', + ), BottomNavigationBarItem( icon: Icon(Icons.menu), label: '', diff --git a/obs_flutter/obs/obs_demo/linux/flutter/generated_plugin_registrant.cc b/obs_flutter/obs/obs_demo/linux/flutter/generated_plugin_registrant.cc index e71a16d..1830e5c 100644 --- a/obs_flutter/obs/obs_demo/linux/flutter/generated_plugin_registrant.cc +++ b/obs_flutter/obs/obs_demo/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) audioplayers_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "AudioplayersLinuxPlugin"); + audioplayers_linux_plugin_register_with_registrar(audioplayers_linux_registrar); } diff --git a/obs_flutter/obs/obs_demo/linux/flutter/generated_plugins.cmake b/obs_flutter/obs/obs_demo/linux/flutter/generated_plugins.cmake index 2e1de87..e9abb91 100644 --- a/obs_flutter/obs/obs_demo/linux/flutter/generated_plugins.cmake +++ b/obs_flutter/obs/obs_demo/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/obs_flutter/obs/obs_demo/macos/Flutter/GeneratedPluginRegistrant.swift b/obs_flutter/obs/obs_demo/macos/Flutter/GeneratedPluginRegistrant.swift index e777c67..a9f2f23 100644 --- a/obs_flutter/obs/obs_demo/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/obs_flutter/obs/obs_demo/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,8 +5,10 @@ import FlutterMacOS import Foundation +import audioplayers_darwin import path_provider_foundation func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioplayersDarwinPlugin.register(with: registry.registrar(forPlugin: "AudioplayersDarwinPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) } diff --git a/obs_flutter/obs/obs_demo/pubspec.lock b/obs_flutter/obs/obs_demo/pubspec.lock index ca691a4..074c7f3 100644 --- a/obs_flutter/obs/obs_demo/pubspec.lock +++ b/obs_flutter/obs/obs_demo/pubspec.lock @@ -9,6 +9,62 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + audioplayers: + dependency: "direct main" + description: + name: audioplayers + sha256: "752039d6aa752597c98ec212e9759519061759e402e7da59a511f39d43aa07d2" + url: "https://pub.dev" + source: hosted + version: "6.0.0" + audioplayers_android: + dependency: transitive + description: + name: audioplayers_android + sha256: de576b890befe27175c2f511ba8b742bec83765fa97c3ce4282bba46212f58e4 + url: "https://pub.dev" + source: hosted + version: "5.0.0" + audioplayers_darwin: + dependency: transitive + description: + name: audioplayers_darwin + sha256: e507887f3ff18d8e5a10a668d7bedc28206b12e10b98347797257c6ae1019c3b + url: "https://pub.dev" + source: hosted + version: "6.0.0" + audioplayers_linux: + dependency: transitive + description: + name: audioplayers_linux + sha256: "3d3d244c90436115417f170426ce768856d8fe4dfc5ed66a049d2890acfa82f9" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + audioplayers_platform_interface: + dependency: transitive + description: + name: audioplayers_platform_interface + sha256: "6834dd48dfb7bc6c2404998ebdd161f79cd3774a7e6779e1348d54a3bfdcfaa5" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + audioplayers_web: + dependency: transitive + description: + name: audioplayers_web + sha256: db8fc420dadf80da18e2286c18e746fb4c3b2c5adbf0c963299dde046828886d + url: "https://pub.dev" + source: hosted + version: "5.0.0" + audioplayers_windows: + dependency: transitive + description: + name: audioplayers_windows + sha256: "8605762dddba992138d476f6a0c3afd9df30ac5b96039929063eceed416795c2" + url: "https://pub.dev" + source: hosted + version: "4.0.0" boolean_selector: dependency: transitive description: @@ -41,6 +97,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" cupertino_icons: dependency: "direct main" description: @@ -65,6 +129,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -83,6 +163,11 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" http: dependency: "direct main" description: @@ -211,6 +296,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.2.1" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: bc56bfe9d3f44c3c612d8d393bd9b174eb796d706759f9b495ac254e4294baa5 + url: "https://pub.dev" + source: hosted + version: "10.4.5" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "59c6322171c29df93a22d150ad95f3aa19ed86542eaec409ab2691b8f35f9a47" + url: "https://pub.dev" + source: hosted + version: "10.3.6" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: "99e220bce3f8877c78e4ace901082fb29fa1b4ebde529ad0932d8d664b34f3f5" + url: "https://pub.dev" + source: hosted + version: "9.1.4" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "6760eb5ef34589224771010805bea6054ad28453906936f843a8cc4d3a55c4a4" + url: "https://pub.dev" + source: hosted + version: "3.12.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: cc074aace208760f1eee6aa4fae766b45d947df85bc831cde77009cdb4720098 + url: "https://pub.dev" + source: hosted + version: "0.1.3" platform: dependency: transitive description: @@ -227,6 +352,30 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + record: + dependency: "direct main" + description: + name: record + sha256: f5dfa28ba57a74dd37588bb51e3f8bb2f12d17cbc40aa6a89ccfb89049700214 + url: "https://pub.dev" + source: hosted + version: "3.0.4" + record_platform_interface: + dependency: transitive + description: + name: record_platform_interface + sha256: "2e3c496f6890e5de0f0bdfb0b384a13daa5dd6c59e1d23cf1118771b4dff19c3" + url: "https://pub.dev" + source: hosted + version: "0.2.0" + record_web: + dependency: transitive + description: + name: record_web + sha256: "8ab7b7b49ab43f8ba9b7ec18f904f3a894d0f0944769bb29aaee72764e58ddc1" + url: "https://pub.dev" + source: hosted + version: "0.2.1" sky_engine: dependency: transitive description: flutter @@ -240,6 +389,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" stack_trace: dependency: transitive description: @@ -264,6 +421,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" term_glyph: dependency: transitive description: @@ -288,6 +453,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: "814e9e88f21a176ae1359149021870e87f7cddaf633ab678a5d2b0bff7fd1ba8" + url: "https://pub.dev" + source: hosted + version: "4.4.0" vector_math: dependency: transitive description: @@ -304,6 +477,14 @@ packages: url: "https://pub.dev" source: hosted version: "14.2.1" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" win32: dependency: transitive description: diff --git a/obs_flutter/obs/obs_demo/pubspec.yaml b/obs_flutter/obs/obs_demo/pubspec.yaml index 58a9112..bb9dbbd 100644 --- a/obs_flutter/obs/obs_demo/pubspec.yaml +++ b/obs_flutter/obs/obs_demo/pubspec.yaml @@ -37,6 +37,9 @@ dependencies: http: ^0.13.3 path_provider: ^2.0.2 + record: ^3.0.0 + audioplayers: ^6.0.0 + permission_handler: ^10.2.0 dev_dependencies: flutter_test: diff --git a/obs_flutter/obs/obs_demo/windows/flutter/generated_plugin_registrant.cc b/obs_flutter/obs/obs_demo/windows/flutter/generated_plugin_registrant.cc index 8b6d468..3d58508 100644 --- a/obs_flutter/obs/obs_demo/windows/flutter/generated_plugin_registrant.cc +++ b/obs_flutter/obs/obs_demo/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,12 @@ #include "generated_plugin_registrant.h" +#include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + AudioplayersWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("AudioplayersWindowsPlugin")); + PermissionHandlerWindowsPluginRegisterWithRegistrar( + registry->GetRegistrarForPlugin("PermissionHandlerWindowsPlugin")); } diff --git a/obs_flutter/obs/obs_demo/windows/flutter/generated_plugins.cmake b/obs_flutter/obs/obs_demo/windows/flutter/generated_plugins.cmake index b93c4c3..c984fc8 100644 --- a/obs_flutter/obs/obs_demo/windows/flutter/generated_plugins.cmake +++ b/obs_flutter/obs/obs_demo/windows/flutter/generated_plugins.cmake @@ -3,6 +3,8 @@ # list(APPEND FLUTTER_PLUGIN_LIST + audioplayers_windows + permission_handler_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST