feat: Enhance audio management by implementing shutdown procedures on exit
Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
@@ -143,6 +143,7 @@ class _GameScreenState extends State<GameScreen> {
|
|||||||
DefaultRendererSettingsPersistence();
|
DefaultRendererSettingsPersistence();
|
||||||
final DefaultSaveGamePersistence _savePersistence =
|
final DefaultSaveGamePersistence _savePersistence =
|
||||||
DefaultSaveGamePersistence();
|
DefaultSaveGamePersistence();
|
||||||
|
Future<void>? _audioShutdownFuture;
|
||||||
|
|
||||||
/// Mirrors [WolfRendererSettings.mode] into the Flutter renderer enum.
|
/// Mirrors [WolfRendererSettings.mode] into the Flutter renderer enum.
|
||||||
RendererMode _rendererMode = RendererMode.hardware;
|
RendererMode _rendererMode = RendererMode.hardware;
|
||||||
@@ -180,7 +181,7 @@ class _GameScreenState extends State<GameScreen> {
|
|||||||
Navigator.of(context).pop();
|
Navigator.of(context).pop();
|
||||||
},
|
},
|
||||||
onQuit: () {
|
onQuit: () {
|
||||||
SystemNavigator.pop();
|
unawaited(_quitApplication());
|
||||||
},
|
},
|
||||||
saveGamePersistence: _savePersistence,
|
saveGamePersistence: _savePersistence,
|
||||||
);
|
);
|
||||||
@@ -210,6 +211,31 @@ class _GameScreenState extends State<GameScreen> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void dispose() {
|
||||||
|
unawaited(_shutdownAudioForExit());
|
||||||
|
super.dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _quitApplication() async {
|
||||||
|
await _shutdownAudioForExit();
|
||||||
|
await SystemNavigator.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _shutdownAudioForExit() {
|
||||||
|
final existing = _audioShutdownFuture;
|
||||||
|
if (existing != null) {
|
||||||
|
return existing;
|
||||||
|
}
|
||||||
|
|
||||||
|
final shutdown = () async {
|
||||||
|
await widget.wolf3d.audio.stopAllAudio();
|
||||||
|
widget.wolf3d.audio.dispose();
|
||||||
|
}();
|
||||||
|
_audioShutdownFuture = shutdown;
|
||||||
|
return shutdown;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return PopScope(
|
return PopScope(
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ class NativeSubprocessAudio implements EngineAudio, DebugMusicPlayer {
|
|||||||
|
|
||||||
bool _initialized = false;
|
bool _initialized = false;
|
||||||
bool _isSupported = false;
|
bool _isSupported = false;
|
||||||
|
bool _disposed = false;
|
||||||
_AudioBackend _backend = _AudioBackend.none;
|
_AudioBackend _backend = _AudioBackend.none;
|
||||||
String _windowsShellCommand = 'powershell';
|
String _windowsShellCommand = 'powershell';
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ class NativeSubprocessAudio implements EngineAudio, DebugMusicPlayer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> init() async {
|
Future<void> init() async {
|
||||||
if (_initialized) {
|
if (_initialized || _disposed) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,7 +50,25 @@ class NativeSubprocessAudio implements EngineAudio, DebugMusicPlayer {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void dispose() {
|
void dispose() {
|
||||||
unawaited(stopAllAudio());
|
if (_disposed) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_disposed = true;
|
||||||
|
|
||||||
|
_musicLoopToken++;
|
||||||
|
_musicProcess?.kill();
|
||||||
|
_musicProcess = null;
|
||||||
|
|
||||||
|
for (final process in List<Process>.from(_sfxProcesses)) {
|
||||||
|
process.kill();
|
||||||
|
}
|
||||||
|
_sfxProcesses.clear();
|
||||||
|
|
||||||
|
final path = _musicTempFilePath;
|
||||||
|
_musicTempFilePath = null;
|
||||||
|
if (path != null) {
|
||||||
|
unawaited(_cleanupTempWav(path));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
Reference in New Issue
Block a user