flutter_soloud
A low-level audio plugin for Flutter, mainly meant for games and immersive apps. Based on the SoLoud (C++) audio engine.
4.1.7
88K downloads/mo
#1177 most downloaded on pub.dev
alnitak/flutter_soloud
What this package is like to depend on
Last release 16 days ago
08 Aug 2026
Ships fairly regularly
a new release about every 9 days
Nearly every release is documented
notes for 90 of 92 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
105 releases · first in 2023
52 releases in the last 12 months
see the full history below
Release timeline
105 releases · Jul 2023 to Aug 2026Releases
latest 60 of 105-
4.1.708 Aug 2026Release notes
Open source →- fix: a device change that still fails now reports
SoLoudAudioDeviceFailedToStartCppExceptioninstead of hanging. Thanks to @Colton127 #533 - fix:
changeDevice()now selects the system default device when called without an argument and reports device-change failures instead of silently succeeding. Thanks to @Colton127 #533 - fix:
init()no longer blocks the UI thread while the audio device starts. On Android a slow or busy audio HAL could stall the platform thread long enough for the app to be reported as not responding; engine startup and teardown now run on a short-lived worker isolate. Thanks to @Colton127 #533 - added
deinitAsync(), a non-blocking counterpart todeinit().deinit()is unchanged and still supported, but it can stall the UI thread when it lands whileinit()is still starting the device — preferdeinitAsync()in new code. Thanks to @Colton127 #533
- fix: a device change that still fails now reports
-
4.1.603 Aug 2026Release notes
Open source →- fix: iOS/macOS SPM build fails with error: unknown argument: '-Wl,-undefined,dynamic_lookup' #530
- web: dropped
-pthread/SharedArrayBufferfrom the WASM build. The requirement for COOP/COEP headers (cross-origin isolation) is gone and the plugin now works on hosts that cannot set them (e.g. game portals like CrazyGames/Poki). Moving the use of threads for a future release #523
-
4.1.503 Aug 2026Release notes
Open source →- fix web: crash with
--optimization-level=0due to HEAPU8.buffer declared as JSArrayBuffer #526 - fix: missing guard for NO_XIPH_LIBS that prevents building when using it #528
- fix: playback errors are no longer silently ignored.
play(and its variants),pauseSwitch,setPauseandstopnow report failures instead of returning success with an unusable handle. Note: these methods can now throw where they previously failed silently. Thanks to @Colton127 #527- added
PlayerErrors.audioDeviceFailedToStartandPlayerErrors.failedToStartPlayback(with matching exceptions), so you can catch device/playback startup failures specifically.
- added
- fix: wrong exceptions for
loadFile/loadMem/seek. Out-of-memory and not-implemented errors were mapped to unrelated exceptions (e.g. "DLL not found" for low memory); they now throw the correct ones. Thanks to @Colton127 #527 - fix: a failed load no longer also raises an uncatchable async error — the future you
awaitis the only error channel now. Thanks to @Colton127 #527
- fix web: crash with
-
4.1.431 Jul 2026Release notes
Open source →- fix: the voice-ended callback is no longer invoked while SoLoud's audio mutex is held. The symptom was a wedged engine: handles and sources still looked valid, no audio was produced, and
deinit()never completed. Ended voices are now queued and dispatched once the mutex is released. Thanks to @Colton127 #518 - fix: on macOS/iOS, the first CocoaPods build after a clean no longer fails with "Build input file cannot be found: libflutter_soloud_plugin.a"
- fix: deactivate a sound filter couldn't be activate again #525
- fix: the voice-ended callback is no longer invoked while SoLoud's audio mutex is held. The symptom was a wedged engine: handles and sources still looked valid, no audio was produced, and
-
4.1.329 Jul 2026Release notes
Open source →- another SPM fix: add wav_stream_decoder.cpp to SPM unity build (crash on Apple platforms)
-
4.1.229 Jul 2026Release notes
Open source →- now when passing a
time<= 0 tofadeFilterParameteror tooscillateFilterParameterthe value is set. Before was a no-op #519 - added tests to check set, get, fade parameters for all the filters.
- now when passing a
-
4.1.128 Jul 2026 -
4.1.028 Jul 2026Release notes
Open source →What's Changed
- get rid of stb_vorbis c file in favor of the Xiph OGG libraries by @alnitak in #491
- feat: capture the master mixer output as a
Stream<Uint8List>by @alnitak in #495 - feat: add an isolate-safe singleton for running mixer output capture by @alnitak in #497
- feat: add native loop end points by @Kunstderfug in #499
- Add SUMOJI game to the list of apps by @3vmartinet in #506
- feat: pull buffer streaming support by @alnitak in #503
- feat: add playClocked/play3dClocked with sample-accurate scheduling by @alnitak in #505
- feat: add
getEngineTime,playScheduled,stopScheduledandfadeScheduled(extends #505) by @alnitak in #509 - fix: stop() can throw uncaught "Bad state: Future already completed" when the native voiceEnded event races the internal 300 ms timeout by @alnitak in #510
- Output a warning when NO_OPUS_OGG_LIBS is set by @filiph in #511
- version 4.1.0 by @alnitak in #512
New Contributors
- @3vmartinet made their first contribution in #506
Full Changelog: v4.0.13...v4.1.0
Release notes
Open source →- added pull-buffer streaming API (
setPullBufferStream,addPullBufferDataStream,getPullBufferTimeRange) with support for MP3, WAV, FLAC, Ogg Opus, Ogg Vorbis, and Ogg FLAC. - get rid of stb_vorbis c file in favor of the Xiph OGG libraries for Opus, Vorbis, and FLAC.
- buffer stream now supports FLAC and WAV formats besides Ogg with Opus, Vorbis, and FLAC containers.
- reduced initial buffer data from 32 to 4 KB to let the buffer to start playing faster.
- now the auto-pause when the buffer needs more audio works as expected and respect the player pause state (it doesn't automatically unpause when there is enough data in the buffer if the player was paused).
- websocket example: added play/pause and touch to seek to the buffer visual widget.
- added
autoDisposeparameter tosetBufferStreamto automatically dispose the sound when it is finished. This eliminates the need to manually call disposeSource. - added mixer output capture: capture the master mixer output as a
Stream<Uint8List>in PCM (F32LE, S8, S16LE, S32LE) or compressed formats (Opus, Vorbis, FLAC, WAV). SeeSoLoud.startMixerOutputStream/stopMixerOutputStream/isMixerOutputStreamRunning. - added
mixer_captureexample (example/lib/mixer_capture/mixer_capture.dart) that shows how to capture the master mix and save it to a file. - web note: the web build requires
--wasm(or any server that sendsCross-Origin-Opener-Policy: same-originandCross-Origin-Embedder-Policy: require-corpheaders) because the WASM module usesSharedArrayBufferfor the audio thread. Running withflutter run -d chromewithout--wasmis not supported by the default dev server. Please see the doc here. - added
SoLoudIsolate, an isolate-safe singleton for running mixer output capture (and other safe operations, for now onlyreadSamplesFrom*) from a non-main isolate without touching the main isolate's loader, filters, or event callbacks. - added
example/lib/mixer_capture/isolate_capture_test.dartto demostrate mixer output capture from a separate isolate. - added native loop end points through
loopingEndAtand the livegetLoopEndPoint/setLoopEndPointAPIs, allowing half-open[start, end)loop regions #499. Thanks to @Kunstderfug - added
playClockedandplay3dClocked(plusBus.playClocked/Bus.play3dClocked) for sample-accurate scheduled playback, along with the relatedsetDelaySamples,getStreamTimeandresetStreamTime(re-anchor the clocked-play clock) APIs. The sounds are spaced with sub-millisecond accuracy regardless of the engine buffer size instead of clumping at buffer boundaries. - added a "use playClocked" checkbox to the metronome example to show the difference between
playandplayClocked. - added
getEngineTime,playScheduled,stopScheduledandfadeScheduled(plusBus.playScheduled) for score/manifest-style scheduling pinned to the engine's own clock: readgetEngineTimeonce and schedule a batch of sounds at absolute engine times, with sample accuracy and no ~2 s window limit likeplayClocked.playScheduledaccepts an optionaldurationto stop the sound automatically, andfadeScheduledathenStopflag to stop the sound when the fade ends. Scheduled stops are sample-accurate (not quantized to output buffer boundaries likescheduleStop). - fix shutdown crash "Callback invoked after it has been deleted":
deinit()now stops the engine (joining the audio thread) before closing the DartNativeCallabletrampolines, so voices ending from the mixing thread can no longer call into deleted callbacks while tearing down. - fix: stop() can throw uncaught "Bad state: Future already completed" when the native voiceEnded event races the internal 300 ms timeout #510
- output a warning when NO_OPUS_OGG_LIBS is set #511. Thanks to @filiph
-
4.0.1320 Jul 2026Release notes
Open source →- fix: Waveform audio sources do not match engine sample rate #501. Thanks to @Colton127
-
4.0.1230 Jun 2026Release notes
Open source →- add
lowLatencyinit option to allow recordable Android output #492. Thanks to @MjnMixael - added WAV to Buffer streams supported formats. Fixes loading wav files from web #494
- add
-
4.0.1122 Jun 2026Release notes
Open source →- fix web: don't spawn the deferred-pause std::thread on web (Aborted() in initEngine) #488. Thanks to @felixmin
-
4.0.1020 Jun 2026 -
4.0.913 Jun 2026Release notes
Open source →- Windows: prevent the compiler from complaining about
minandmaxmacros. Fixes #483
- Windows: prevent the compiler from complaining about
-
4.0.810 Jun 2026Release notes
Open source →- fix released buffer stream size reporting #480. Thanks to @Kunstderfug
- load Ogg Opus/flac files through buffer stream fallback #479. Thanks to @Kunstderfug
-
4.0.731 May 2026Release notes
Open source →- add look-ahead brickwall limiter and fix planar DSP indexing #468. Thanks to @Kunstderfug
- fix iOS CocoaPods wrapper double compile #467. Thanks to @DavidPluxia
- fix Apple: added linker settings to not strip symbols when building the ipa using SPM #472
- Android fix: fix audio crackling using
BufferingType.releasedon some Android devices #476 - Android fix: quick play & stop causes glitches and probably UI jank #478
- fix: the
wetparameter of parametric eq was not evaluated #477
-
4.0.617 May 2026 -
4.0.513 May 2026Release notes
Open source →- fix sample count calculations in BufferStreamInstance and BufferStream #462
- fix Apple: removed hardcoded
-fltocompile arg in Package.swift #463 - prevent header name collision build error when the app uses other native plugins like
flutter_zxingwhich uses the common.h source file name too #464
-
4.0.404 May 2026Release notes
Open source →- fix Apple: build forcing to add c++ std lib #456
- fix reading Opus with non-standard samplerate #457
-
4.0.324 Apr 2026Release notes
Open source →- fix: rebind Dart callbacks after hot restart #444. Thanks to @skylartaylor
- fix: retain BufferStream callbacks until disposal #445. Thanks to @skylartaylor
- fix: removed the asserts in the init method #453
- web fix: small sound bleed after stop and play #446
- web fix: new way to load audio from memory (loadAssets and loadMem) on web to solve UI freeze when loading
-
4.0.210 Apr 2026 -
4.0.109 Apr 2026Release notes
Open source →- fixed get eq params other than bands values
- added frequency getter to parametric equalizer (ie:
soloud.filters.parametricEqFilter.bandFrequency(index)) - removed some warnings from native build
- warn mac users to install cmake if not already installed
-
4.0.003 Apr 2026Release notes
Open source →- fix: some OGG audio files don't trigger
SoundEventType.handleIsNoMoreValid - fix: setBufferStream fails to decode small MP3 files under 32 KB #434. Thanks to @chaudharydeepanshu
- fix web:
createVoiceGroupreturn was interpreted as a signed int instead of an unsigned because it always has the sign bit flag - fixed switching output devices on macOS and maybe on other platforms, didn't initialize the new one correctly
- added some more tests
- removed deprecated
equalizerFilterin favor ofparametricEqFilter
- fix: some OGG audio files don't trigger
-
4.0.0-pre.329 Mar 2026 pre-releaseRelease notes
Open source →- fix: FFI symbol stripping causing "symbol not found" errors in iOS/macOS when uploading to App Store #431
- fix decreasing volume when adding a bus to another
-
4.0.0-pre.228 Mar 2026 pre-releaseRelease notes
Open source →- macOS/iOS fix: check for cmake in the path while building
- iOS simulator: fix libs linking
-
4.0.0-pre.126 Mar 2026 pre-release -
4.0.0-pre.024 Mar 2026 pre-releaseRelease notes
Open source →- added Mixing Bus feature and example https://docs.page/alnitak/flutter_soloud_docs/advanced/mixing_bus
- added
getApproximateVolumeto get the approximate volume of a channel of the player - added
autoDisposeparameter toload*methods to automatically dispose the sound when it is finished. This eliminates the need to manually call disposeSource - added
playSourceto play a source from assets, URLs, or a file and automatically dispose of itsAudioSourcewhen it is finished - added
filters/parametric_eq.dartexample - added parametric equalizer with 1 to 64 bands and FFT window size from 32 to 4096 for quality and performance
- added Swift Package Manager support
- improved quality and performance of the pitchshift filter #313
- CocoaPods now uses cmake to compile the plugin always in release mode for macOS and iOS
- conditional import of
jsandwasmonly on web (no more included on other platforms) - win fix: UTF8 file name conversion was causing crash or file not found #427
- fixed a possible crash during app shutdown
- possible fix for #333 which caused an ANR on Android when stopping/deinit or closing the app
- Linux feat: choose to link ogg, opus, vorbis, and flac libraries from the system with
TRY_SYSTEM_LIBS_FIRST=1environment variable #421. Useful for Raspberry Pi because the precompiled libs are available only for x86_64. - Android fix: elevate audio thread priority on Android #396. Thanks to @djkingCanada
- Android: build optimizations
breaking changes
- bump Flutter version to 3.41.0 and Dart to 3.11.0
- play, play3d, speechText, are now sync
- renamed
NO_OPUS_OGG_LIBSenvironment variable toNO_XIPH_LIBS - renamed
SoLoudOpusOggVorbisLibsNotAvailableExceptiontoSoLoudXiphLibsNotAvailableException - renamed
areOpusOggLibsAvailabletoareXiphLibsAvailable
-
3.5.422 Mar 2026 -
3.5.321 Mar 2026 -
3.5.218 Mar 2026Release notes
Open source →- fix: wire miniaudio backend pause/resume to stop AudioUnit on iOS #406. Thanks to @sbauly
- updated audio_context example to demostrate how to integrate with
audio_sessionandaudio_service
-
3.5.114 Mar 2026Release notes
Open source →getStreamTimeConsumedreturns the wrong time for s16le and s8 #419- win fix: hang on app exit #413
- win fix: prevent Windows message pump from going unresponsive with plugins like
desktop_dropand maybe others #401 - fix: only unpause when buffer covers playback position #393. Thanks to @nukes
- wasm fix: runtimeType error when voice ended #414
-
3.5.001 Mar 2026Release notes
Open source →- Harden loader temp directory logic #404. Thanks to @filiph
- updated audio_context example
-
3.5.0-pre.126 Jan 2026 pre-releaseNothing published for this version
-
3.5.0-pre.021 Jan 2026 pre-releaseNothing published for this version
-
3.4.1002 Feb 2026 -
3.4.921 Jan 2026Release notes
Open source →- fix crash when seeking with a negative value #386
- Linux fix: don't use -msse on arm64 builds #395. Thanks to @adil192
- Android fix: enable AAudio with runtime API level check for safe fallback #397. Thanks to @djkingCanada
-
3.4.829 Dec 2025 -
3.4.718 Dec 2025 -
3.4.604 Dec 2025Release notes
Open source →- win fix: loadMem/loadAsset futures never finish when run in parallel with the same file #376
-
3.4.522 Nov 2025Release notes
Open source →- fixed
Bad state: Future already completederror during integration tests. Thanks to @Taormina #373 - win: don't copy pdb file when in profile mode avoiding build error. Fixes #372
- fixed
-
3.4.417 Nov 2025 -
3.4.313 Nov 2025Release notes
Open source →- fix Android: crashes after opus stream playback #365
- fix: Compressor seems to introduce "choppy" sound #367
-
3.4.208 Nov 2025Release notes
Open source →- fix Android: NO_OPUS_OGG_LIBS for Android build used in
gradle.propertiesnot always worked #358. And Thanks to @mingjunsiek #361 #354 - fix: memory leak in FlutterSoLoudFfi.addAudioDataStream #359. Thanks to @DarthRainbows
- fix Android: NO_OPUS_OGG_LIBS for Android build used in
-
3.4.130 Oct 2025Release notes
Open source →- crash when adding data as PCM data on v3.4.0 #348
- builds failing for macOS with NO_OPUS_OGG_LIBS=1 #350
- using AudioData.getAudioData, when wave data is zero, also the FFT data should be zero #349
-
3.4.028 Oct 2025Release notes
Open source →- added support for OGG FLAC and its metadata to BufferStream #294
- fix Opus BufferStream end clicks on short sounds #344. Thanks to @eddyleelin
- fix a crash on old Windows PCs with CPUs that don't support AVX2 extensions (using now SSE2) #340
- fixed
Player::findByHandlecrash in some circumstancies #342
-
3.3.921 Oct 2025Release notes
Open source →- iOS: revert the fix for #330
- removed experimental tag for
allInstancesFinished
-
3.3.813 Oct 2025Release notes
Open source →- fix: audio stream with released mode failed to consume BufferStream #335 #318
- iOS fix: maybe fixed no sound probably in older iOS devices without AirPods #330
- fix: incorrect seek position on multi-channel audio streams #328
-
3.3.725 Sep 2025Release notes
Open source →- iOS fix: update build_iOS.sh to make fat libraries #315. Thanks to @kumamotone
- fix: stop() takes too much time #312
-
3.3.611 Sep 2025 -
3.3.511 Sep 2025 -
3.3.410 Sep 2025Release notes
Open source →- use of dr_mp3.h instead of minimp3 for streaming MP3
- fix crash when calling addAudioDataStream before play #306
-
3.3.304 Sep 2025Release notes
Open source →- fix seek a buffer stream actually seeks at half the wanted position #296
-
3.3.203 Sep 2025Release notes
Open source →- fixed stuttering with MP3 streams #301
- fixed a Web bug when compiling with WASM in release mode.
-
3.3.127 Aug 2025 -
3.3.025 Aug 2025Release notes
Open source →- Added support for mp3 streams
- Added support for Vorbis streams
- Added
web_radio.dartexample to demonstrate how to receive an audio stream (ie, an icecast stream) and then add the audio chunks to BufferStream - Add
BufferType.autoto auto detect ogg/opus/vorbis/mp3 streams - Deprecate
BufferType.opusin favor ofBufferType.auto - Get TAGs info also while streaming and not only by sending chunks of an audio file. For MP3s, the TAGs are obtained from ID3V2 or passing
icy-metaint(obtained from the header of the online stream) before adding audio chunks to the BufferStream. New metadata is notified by theonMetadatacallback ofsetBufferStream
-
3.2.718 Aug 2025Release notes
Open source →- feat: allow to specify NO_OPUS_OGG_LIBS in Android build config #282. Thanks to @ekuleshov
- fix: 16KB memory page size for Android because of Play Console warning #283
- fix pub points
-
3.2.618 Aug 2025Nothing published for this version
-
3.2.510 Aug 2025Release notes
Open source →- macos fix:
abseilnot found when using this plugin with some other native plugins like firebase #280. Thanks to @jochy.
- macos fix:
-
3.2.405 Aug 2025Release notes
Open source →- ios fix:
abseilnot found when using this plugin with some other native plugins like firebase #271
- ios fix:
-
3.2.303 Aug 2025Release notes
Open source →- fix 16 KB native library alignment on Android #248
- fix build issue on iOS and macOS #265 #266
- fix: the
seekmethod was causing inconsistent behavior when usingBufferStreaminBufferingType.releasedmode. It is now supported inBufferingType.preservedmode.
-
3.2.216 Jul 2025Release notes
Open source →- OGG is now also supported using
readSamplesFrom*methods. - fix getPosition and buffering for released buffer.
- OGG is now also supported using