From d639df7623be5157ad0de371e7f0bd85b42d50f4 Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Thu, 15 Jan 2026 00:44:38 +0800 Subject: [PATCH] :recycle: Optimize the sfx playing --- lib/main.dart | 3 +++ lib/pods/audio.dart | 42 ++++++++++++++++++++++++++++++ lib/services/notify.universal.dart | 12 +++------ lib/services/notify.windows.dart | 15 +++-------- 4 files changed, 52 insertions(+), 20 deletions(-) create mode 100644 lib/pods/audio.dart diff --git a/lib/main.dart b/lib/main.dart index 83732c70..f6ce10ca 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -16,6 +16,7 @@ import 'package:island/services/analytics_service.dart'; import 'package:island/talker.dart'; import 'package:island/firebase_options.dart'; import 'package:island/pods/config.dart'; +import 'package:island/pods/audio.dart'; import 'package:island/pods/network.dart'; import 'package:island/pods/theme.dart'; import 'package:island/pods/userinfo.dart'; @@ -339,6 +340,8 @@ class IslandApp extends HookConsumerWidget { final apiClient = ref.read(apiClientProvider); subscribePushNotification(apiClient); initializeLocalNotifications(); + ref.read(notificationSfxProvider); + ref.read(messageSfxProvider); final wsNotifier = ref.read(websocketStateProvider.notifier); wsNotifier.connect(); } diff --git a/lib/pods/audio.dart b/lib/pods/audio.dart new file mode 100644 index 00000000..3399323a --- /dev/null +++ b/lib/pods/audio.dart @@ -0,0 +1,42 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:just_audio/just_audio.dart'; +import 'package:island/pods/config.dart'; + +final sfxPlayerProvider = Provider((ref) { + final player = AudioPlayer(); + ref.onDispose(() { + player.dispose(); + }); + return player; +}); + +final notificationSfxProvider = FutureProvider((ref) async { + final player = ref.watch(sfxPlayerProvider); + await player.setVolume(0.75); + await player.setAudioSource( + AudioSource.asset('assets/audio/notification.mp3'), + preload: true, + ); +}); + +final messageSfxProvider = FutureProvider((ref) async { + final player = ref.watch(sfxPlayerProvider); + await player.setAudioSource( + AudioSource.asset('assets/audio/messages.mp3'), + preload: true, + ); +}); + +void playNotificationSfx(WidgetRef ref) { + final settings = ref.read(appSettingsProvider); + if (!settings.soundEffects) return; + final player = ref.read(sfxPlayerProvider); + player.play(); +} + +void playMessageSfx(WidgetRef ref) { + final settings = ref.read(appSettingsProvider); + if (!settings.soundEffects) return; + final player = ref.read(sfxPlayerProvider); + player.play(); +} diff --git a/lib/services/notify.universal.dart b/lib/services/notify.universal.dart index f51c273a..b6769942 100644 --- a/lib/services/notify.universal.dart +++ b/lib/services/notify.universal.dart @@ -1,6 +1,5 @@ import 'dart:async'; import 'dart:io'; -import 'package:just_audio/just_audio.dart'; import 'package:dio/dio.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; @@ -10,6 +9,7 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:island/main.dart'; +import 'package:island/pods/audio.dart'; import 'package:island/pods/config.dart'; import 'package:island/route.dart'; import 'package:island/models/account.dart'; @@ -105,13 +105,7 @@ StreamSubscription setupNotificationListener( if (settings.notifyWithHaptic) { HapticFeedback.heavyImpact(); } - if (settings.soundEffects) { - final player = AudioPlayer(); - await player.setVolume(0.75); - await player.setAudioSource(AudioSource.asset('assets/audio/notification.mp3')); - await player.play(); - player.dispose(); - } + playNotificationSfx(ref); showTopSnackBar( globalOverlay.currentState!, Center( @@ -228,4 +222,4 @@ Future _putTokenToRemote( "/ring/notifications/subscription", data: {"provider": provider, "device_token": token}, ); -} \ No newline at end of file +} diff --git a/lib/services/notify.windows.dart b/lib/services/notify.windows.dart index 373c3ef9..6a2ef121 100644 --- a/lib/services/notify.windows.dart +++ b/lib/services/notify.windows.dart @@ -1,6 +1,6 @@ import 'dart:async'; import 'dart:io'; -import 'package:just_audio/just_audio.dart'; +import 'package:dio/dio.dart'; import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; @@ -8,6 +8,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:island/main.dart'; +import 'package:island/pods/audio.dart'; import 'package:island/pods/config.dart'; import 'package:island/route.dart'; import 'package:island/models/account.dart'; @@ -20,8 +21,6 @@ import 'package:flutter_cache_manager/flutter_cache_manager.dart'; import 'package:windows_notification/windows_notification.dart' as winty; import 'package:windows_notification/notification_message.dart'; -import 'package:dio/dio.dart'; - // Windows notification instance winty.WindowsNotification? windowsNotification; @@ -68,13 +67,7 @@ StreamSubscription setupNotificationListener( if (settings.notifyWithHaptic) { HapticFeedback.heavyImpact(); } - if (settings.soundEffects) { - final player = AudioPlayer(); - await player.setVolume(0.75); - await player.setAudioSource(AudioSource.asset('assets/audio/notification.mp3')); - await player.play(); - player.dispose(); - } + playNotificationSfx(ref); showTopSnackBar( globalOverlay.currentState!, Center( @@ -221,4 +214,4 @@ Future _putTokenToRemote( "/ring/notifications/subscription", data: {"provider": provider, "device_token": token}, ); -} \ No newline at end of file +}