diff options
author | Orangerot <purple@orangerot.dev> | 2024-12-23 03:18:39 +0100 |
---|---|---|
committer | Orangerot <purple@orangerot.dev> | 2024-12-23 03:18:39 +0100 |
commit | 1415f91fa5f32b53f69332c7f1ef1129a3d9f454 (patch) | |
tree | b8988e9a40fe01c38806aea422945b33f1a0424f | |
parent | d397b62b5b6f6db45a2cc0ae6ca4e03ff04c54b2 (diff) |
feat: play audio on entering level and pause button
-rw-r--r-- | lib/level.dart | 65 | ||||
-rw-r--r-- | lib/level_selection.dart | 16 | ||||
-rw-r--r-- | linux/flutter/generated_plugin_registrant.cc | 4 | ||||
-rw-r--r-- | linux/flutter/generated_plugins.cmake | 1 | ||||
-rw-r--r-- | pubspec.lock | 144 | ||||
-rw-r--r-- | pubspec.yaml | 1 |
6 files changed, 218 insertions, 13 deletions
diff --git a/lib/level.dart b/lib/level.dart index c92658b..e35325a 100644 --- a/lib/level.dart +++ b/lib/level.dart @@ -1,12 +1,49 @@ +import 'dart:io'; + import 'package:flutter/material.dart'; +import 'package:audioplayers/audioplayers.dart'; + +class Level extends StatefulWidget { + const Level({super.key, required this.stepmaniaFolderPath}); + final String stepmaniaFolderPath; + + @override + State<Level> createState() => _LevelState(); +} + +class _LevelState extends State<Level> { + final _player = AudioPlayer(); + bool _isPlaying = true; -class Level extends StatelessWidget { - const Level({super.key}); @override Widget build(BuildContext context) { + String audioPath = Directory(widget.stepmaniaFolderPath) + .listSync() + .firstWhere((entity) => entity.path.endsWith('.ogg'), + orElse: () => File('')) + .path; + _player.play(DeviceFileSource(audioPath)); return Scaffold( appBar: AppBar( - leading: Icon(Icons.pause), + leading: IconButton( + icon: Icon(_isPlaying ? Icons.pause : Icons.play_arrow), + onPressed: () => { + if (_isPlaying) + { + _player.pause(), + setState(() { + _isPlaying = false; + }) + } + else + { + _player.resume(), + setState(() { + _isPlaying = true; + }) + }, + }, + ), title: Text('Level 1'), actions: [ IconButton( @@ -15,10 +52,18 @@ class Level extends StatelessWidget { ], ), body: Stack(children: [ - Arrow( position: -100.0,), - Arrow( position: 00.0,), - Arrow( position: 100.0,), - Arrow( position: 200.0,), + Arrow( + position: -100.0, + ), + Arrow( + position: 00.0, + ), + Arrow( + position: 100.0, + ), + Arrow( + position: 200.0, + ), Positioned( top: 50, width: MediaQuery.of(context).size.width, @@ -43,6 +88,12 @@ class Level extends StatelessWidget { ), ])); } + + @override + void dispose() { + _player.dispose(); + super.dispose(); + } } class Arrow extends StatelessWidget { diff --git a/lib/level_selection.dart b/lib/level_selection.dart index cc79911..e2cdcbe 100644 --- a/lib/level_selection.dart +++ b/lib/level_selection.dart @@ -81,12 +81,13 @@ class _LevelSelectionState extends State<LevelSelection> { separatorBuilder: (BuildContext context, int index) => const Divider(), itemBuilder: (context, index) { - String thumbnailPath = - Directory(stepmaniaCoursesFolders[index].path) - .listSync() - .firstWhere((file) => file.path.toLowerCase().endsWith('banner.png'), + String thumbnailPath = Directory( + stepmaniaCoursesFolders[index].path) + .listSync() + .firstWhere( + (file) => file.path.toLowerCase().endsWith('banner.png'), orElse: () => File('')) - .path; + .path; return ListTile( leading: Image.file(File(thumbnailPath)), trailing: Icon(Icons.play_arrow), @@ -96,7 +97,10 @@ class _LevelSelectionState extends State<LevelSelection> { onTap: () => Navigator.push( context, MaterialPageRoute( - builder: (BuildContext context) => Level())), + builder: (BuildContext context) => Level( + stepmaniaFolderPath: + stepmaniaCoursesFolders[index].path, + ))), ); }, ); diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..1830e5c 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include <audioplayers_linux/audioplayers_linux_plugin.h> 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/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..e9abb91 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/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/pubspec.lock b/pubspec.lock index 2dcd104..553fa2e 100644 --- a/pubspec.lock +++ b/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: c346ba5a39dc208f1bab55fc239855f573d69b0e832402114bf0b793622adc4d + url: "https://pub.dev" + source: hosted + version: "6.1.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: "3609bdf0e05e66a3d9750ee40b1e37f2a622c4edb796cc600b53a90a30a2ace4" + url: "https://pub.dev" + source: hosted + version: "5.0.1" + 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: @@ -49,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.3.4+2" + crypto: + dependency: transitive + description: + name: crypto + sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + url: "https://pub.dev" + source: hosted + version: "3.0.6" cupertino_icons: dependency: "direct main" description: @@ -89,6 +153,14 @@ packages: url: "https://pub.dev" source: hosted version: "8.1.6" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be + url: "https://pub.dev" + source: hosted + version: "1.1.1" flutter: dependency: "direct main" description: flutter @@ -120,6 +192,22 @@ packages: description: flutter source: sdk version: "0.0.0" + http: + dependency: transitive + description: + name: http + sha256: b9c29a161230ee03d3ccf545097fccd9b87a5264228c5d348202e0f0c28f9010 + url: "https://pub.dev" + source: hosted + version: "1.2.2" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360" + url: "https://pub.dev" + source: hosted + version: "4.1.1" leak_tracker: dependency: transitive description: @@ -184,6 +272,30 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_provider: + dependency: transitive + description: + name: path_provider + sha256: "50c5dd5b6e1aaf6fb3a78b33f6aa3afca52bf903a8a5298f53101fdaee55bbcd" + url: "https://pub.dev" + source: hosted + version: "2.1.5" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + url: "https://pub.dev" + source: hosted + version: "2.2.15" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" + url: "https://pub.dev" + source: hosted + version: "2.4.1" path_provider_linux: dependency: transitive description: @@ -293,6 +405,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: @@ -317,6 +437,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "69fe30f3a8b04a0be0c15ae6490fc859a78ef4c43ae2dd5e8a623d45bfcf9225" + url: "https://pub.dev" + source: hosted + version: "3.3.0+3" term_glyph: dependency: transitive description: @@ -333,6 +461,22 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.3" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + uuid: + dependency: transitive + description: + name: uuid + sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + url: "https://pub.dev" + source: hosted + version: "4.5.1" vector_math: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b364c4c..c42d0a3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,6 +13,7 @@ dependencies: cupertino_icons: ^1.0.8 shared_preferences: ^2.3.4 file_picker: ^8.1.6 + audioplayers: ^6.1.0 dev_dependencies: flutter_test: |