♻️ Optimize the sfx playing

This commit is contained in:
2026-01-15 00:44:38 +08:00
parent e1fc5311d2
commit d639df7623
4 changed files with 52 additions and 20 deletions

View File

@@ -16,6 +16,7 @@ import 'package:island/services/analytics_service.dart';
import 'package:island/talker.dart'; import 'package:island/talker.dart';
import 'package:island/firebase_options.dart'; import 'package:island/firebase_options.dart';
import 'package:island/pods/config.dart'; import 'package:island/pods/config.dart';
import 'package:island/pods/audio.dart';
import 'package:island/pods/network.dart'; import 'package:island/pods/network.dart';
import 'package:island/pods/theme.dart'; import 'package:island/pods/theme.dart';
import 'package:island/pods/userinfo.dart'; import 'package:island/pods/userinfo.dart';
@@ -339,6 +340,8 @@ class IslandApp extends HookConsumerWidget {
final apiClient = ref.read(apiClientProvider); final apiClient = ref.read(apiClientProvider);
subscribePushNotification(apiClient); subscribePushNotification(apiClient);
initializeLocalNotifications(); initializeLocalNotifications();
ref.read(notificationSfxProvider);
ref.read(messageSfxProvider);
final wsNotifier = ref.read(websocketStateProvider.notifier); final wsNotifier = ref.read(websocketStateProvider.notifier);
wsNotifier.connect(); wsNotifier.connect();
} }

42
lib/pods/audio.dart Normal file
View File

@@ -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<AudioPlayer>((ref) {
final player = AudioPlayer();
ref.onDispose(() {
player.dispose();
});
return player;
});
final notificationSfxProvider = FutureProvider<void>((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<void>((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();
}

View File

@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:just_audio/just_audio.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.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:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:island/main.dart'; import 'package:island/main.dart';
import 'package:island/pods/audio.dart';
import 'package:island/pods/config.dart'; import 'package:island/pods/config.dart';
import 'package:island/route.dart'; import 'package:island/route.dart';
import 'package:island/models/account.dart'; import 'package:island/models/account.dart';
@@ -105,13 +105,7 @@ StreamSubscription<WebSocketPacket> setupNotificationListener(
if (settings.notifyWithHaptic) { if (settings.notifyWithHaptic) {
HapticFeedback.heavyImpact(); HapticFeedback.heavyImpact();
} }
if (settings.soundEffects) { playNotificationSfx(ref);
final player = AudioPlayer();
await player.setVolume(0.75);
await player.setAudioSource(AudioSource.asset('assets/audio/notification.mp3'));
await player.play();
player.dispose();
}
showTopSnackBar( showTopSnackBar(
globalOverlay.currentState!, globalOverlay.currentState!,
Center( Center(
@@ -228,4 +222,4 @@ Future<void> _putTokenToRemote(
"/ring/notifications/subscription", "/ring/notifications/subscription",
data: {"provider": provider, "device_token": token}, data: {"provider": provider, "device_token": token},
); );
} }

View File

@@ -1,6 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:just_audio/just_audio.dart'; import 'package:dio/dio.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@@ -8,6 +8,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:island/main.dart'; import 'package:island/main.dart';
import 'package:island/pods/audio.dart';
import 'package:island/pods/config.dart'; import 'package:island/pods/config.dart';
import 'package:island/route.dart'; import 'package:island/route.dart';
import 'package:island/models/account.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/windows_notification.dart' as winty;
import 'package:windows_notification/notification_message.dart'; import 'package:windows_notification/notification_message.dart';
import 'package:dio/dio.dart';
// Windows notification instance // Windows notification instance
winty.WindowsNotification? windowsNotification; winty.WindowsNotification? windowsNotification;
@@ -68,13 +67,7 @@ StreamSubscription<WebSocketPacket> setupNotificationListener(
if (settings.notifyWithHaptic) { if (settings.notifyWithHaptic) {
HapticFeedback.heavyImpact(); HapticFeedback.heavyImpact();
} }
if (settings.soundEffects) { playNotificationSfx(ref);
final player = AudioPlayer();
await player.setVolume(0.75);
await player.setAudioSource(AudioSource.asset('assets/audio/notification.mp3'));
await player.play();
player.dispose();
}
showTopSnackBar( showTopSnackBar(
globalOverlay.currentState!, globalOverlay.currentState!,
Center( Center(
@@ -221,4 +214,4 @@ Future<void> _putTokenToRemote(
"/ring/notifications/subscription", "/ring/notifications/subscription",
data: {"provider": provider, "device_token": token}, data: {"provider": provider, "device_token": token},
); );
} }