SfxChannel class

SfxChannel — Sound Effects Manager (pooled)

Handles ultra-snappy SFX playback with simple grouping and throttling. Adds pooled playback for instant retrigger/overlap across assets, device files, or URLs while preserving the channel's audio context.

Key Features

  • Sound groups (e.g., click, hover, hit) with randomized pick
  • Cooldown per group to prevent spam
  • Low-latency playback mode (best for short clips)
  • Pooling (opt-in, enabled by default): instant retrigger of same file
  • Persistent volume and active state via AudioStorage

Usage

// Bootstrap once
SfxChannel.initialize(AudioStorage.instance, audioContext);
SfxChannel.instance.enablePooling(enabled: true, poolSizePerSound: 4);

// Register sounds
SfxChannel.instance.registerGroup('click', [
  'assets/sfx/click1.wav',
  'assets/sfx/click2.wav',
]);

// Play randomized click (pooled)
await SfxChannel.instance.playGroup('click');

// Play a specific sfx (pooled; asset/file/url supported)
await SfxChannel.instance.playSfx('assets/sfx/button_tap.wav');

Notes

  • Uses the channel’s current source builder via resolveSource(path), so changeSource((p) => DeviceFileSource(p)) works seamlessly.
  • For long or streamed audio, use a non-lowLatency channel instead.

─────────────────────────────────────────────────────────────────────────────

Inheritance
Mixed-in types

Properties

currentAudioContext → AudioContext?
Current audio context getter (nullable if never set).
no setterinherited
hashCode → int
The hash code for this object.
no setterinherited
hasMultipleConcurrentPlayers → bool
Report concurrency to the base so wait-helpers throw automatically.
no setterinherited
isActive → bool
Active Flag
no setterinherited
isMuted → bool
Muted Flag
no setterinherited
isPlaying → bool
Current Status
no setterinherited
isPoolingEnabled → bool
Whether pooling is currently enabled.
no setterinherited
minPlayersPerSound → int
Pre-warmed players per sound key.
no setterinherited
onDurationChanged → Stream<Duration>
Duration Stream
no setterinherited
onIsPlayingChanged → Stream<bool>
Reactive isPlaying Stream
no setterinherited
onPlayerComplete → Stream<void>
Completion Event
no setterinherited
onPositionChanged → Stream<Duration>
Position Stream
no setterinherited
playerId → String
Stable Identifier
finalinherited
playerMode → PlayerMode
Mode: Low Latency
no setteroverride
poolSizePerSound → int
Maximum concurrent players per sound key.
no setterinherited
releaseMode → ReleaseMode
Release: Stop
no setteroverride
runtimeType → Type
A representation of the runtime type of the object.
no setterinherited
volume → double
Current Volume (0.0 → 1.0)
no setterinherited

Methods

activate() → void
Activate
inherited
changeSource(AudioSourceBuilder builder) → void
Swap Loader
inherited
deactivate() → void
Deactivate
inherited
disableLifecycle() → void
Disable lifecycle handling for this channel.
inherited
dispose() → Future<void>
Dispose
override
disposePools() → Future<void>
Dispose all pools.
inherited
enableLifecycle([ChannelLifecycleConfig? cfg]) → void
Enable per-channel lifecycle handling
inherited
enablePooling({bool enabled = true, int poolSizePerSound = 4, int minPlayersPerSound = 1}) → void
Enable/disable pooling and configure pool sizes.
inherited
ensureWaitSupported(String methodName) → void
Throws if waiting semantics are unsupported for this channel.
inherited
fadeIn({Duration duration = const Duration(seconds: 2), Curve curve = Curves.easeInOut}) → Future<void>
Fade In
inherited
fadeInVolume(FadePreset preset) → Future<void>
Helper: Fade In via FadePreset
inherited
fadeOut({Duration duration = const Duration(seconds: 2), Curve curve = Curves.easeOut}) → Future<void>
Fade Out
inherited
fadeOutVolume(FadePreset preset) → Future<void>
Helper: Fade Out via FadePreset
inherited
fadeTo(double targetVolume, {Duration duration = const Duration(seconds: 2), Curve curve = Curves.linear}) → Future<void>
Fade To Target Volume
inherited
getDuration() → Future<Duration?>
Current Media Duration
inherited
mute() → Future<void>
Mute (Persistent)
override
noSuchMethod(Invocation invocation) → dynamic
Invoked when a nonexistent method or property is accessed.
inherited
onStateChanged(PlayerState state) → void
Subclass Hook: Player State Changed
inherited
pause() → Future<void>
Pause
inherited
play(String path) → Future<void>
Play a Specific SFX Path (pooled)
override
playAndWait(String path, {Duration startTimeout = const Duration(seconds: 3), Duration timeout = const Duration(minutes: 2), bool forceStopOnTimeout = true}) → Future<bool>
Convenience: play a path and wait for completion/stop
inherited
playFromSource(Source source) → Future<void>
Play from Source
inherited
playFromSourceAndWait(Source source, {Duration startTimeout = const Duration(seconds: 3), Duration timeout = const Duration(minutes: 2), bool forceStopOnTimeout = true}) → Future<bool>
Convenience: play a Source and wait for completion/stop
inherited
playGroup(String name) → Future<void>
Play a Random Sound from a Group
playPooled(String key, Source source, {double? volume}) → Future<StopFunction?>
Play using a pooled player (or fallback to the single channel player).
inherited
playPooledPath(String path, {String? key, double? volume}) → Future<StopFunction?>
Play a path using pooling, resolving the path with the channel’s current loader (respects changeSource(...)).
inherited
playSfxSource(Source source, {String? cacheKey}) → Future<void>
Play from an explicit Source (pooled)
refreshPoolsAudioContext() → Future<void>
Rebuild all pools so they inherit the channel’s current AudioContext. Useful after calling setAudioContext(...) at runtime.
inherited
registerGroup(String name, List<String> paths) → void
Register a Group
resolveSource(String path) → Source
Resolve a path into a Source using the current builder (assets/files/urls). Override via changeSource to switch the strategy at runtime.
inherited
resume() → Future<void>
Resume
inherited
seek(Duration position) → Future<void>
Seek
inherited
setAudioContext(AudioContext audioContext) → Future<void>
Apply Platform Audio Context
inherited
setVolume(double volume) → Future<void>
Set Volume (Persistent)
override
stop() → Future<void>
Stop
inherited
toggleActive() → void
Toggle Active (Persistent)
override
toString() → String
A string representation of this object.
inherited
unmute() → Future<void>
Unmute (Persistent)
override
waitUntilStarted({Duration timeout = const Duration(seconds: 3)}) → Future<bool>
Wait until playback starts (first true)
inherited
waitUntilStopped({Duration startTimeout = const Duration(seconds: 3), Duration timeout = const Duration(minutes: 2), bool forceStopOnTimeout = true}) → Future<bool>
Wait until playback stops/completes
inherited
withFade(Future<void> action(), {FadePreset? fadeOut, FadePreset? fadeIn}) → Future<void>
withFade
inherited

Operators

operator ==(Object other) → bool
The equality operator.
inherited

Static Properties

instance ↔ SfxChannel
Singleton Instance
latefinal

Static Methods

initialize(AudioStorage storage, [AudioContext? audioContext]) → void
Initialize