init method
Preloads all audio assets. Does NOT play anything. Safe to call multiple times (idempotent).
Implementation
Future<void> init() async {
if (_isInitialized) return;
try {
for (int i = 0; i < _poolSize; i++) {
final player = AudioPlayer();
await player.setAsset('packages/split_flap_display/assets/audio/flap_single.mp3', preload: true);
_clickPool.add(player);
}
await _rainPlayer.setAsset('packages/split_flap_display/assets/audio/flap_rain_loop.mp3', preload: true);
await _rainPlayer.setLoopMode(LoopMode.one);
await _rainPlayer.setVolume(0);
// Start the click accumulator pulse (20Hz loop for clicks)
_clickPulseTimer = Timer.periodic(const Duration(milliseconds: 50), (_) {
if (_clickRequested && _isInitialized) {
_clickRequested = false;
_dispatchRealClick();
}
});
_isInitialized = true;
} catch (_) {
// Audio non-critical
}
}