flutter_gapless_loop 0.0.3
flutter_gapless_loop: ^0.0.3 copied to clipboard
True sample-accurate gapless audio looping on iOS (AVAudioEngine) and Android (AudioTrack). Zero-gap, zero-click loop playback for music production apps.
0.0.4 #
New features #
LoopAudioMaster. A new static group-bus controller for all liveLoopAudioPlayerinstances.setVolumescales every instance multiplicatively (effectiveVolume = localVolume × masterVolume);setPanshifts every instance additively (effectivePan = clamp(localPan + masterPan, −1, 1)).reset()restores defaults and re-applies. Per-instance relative levels are preserved at the Dart layer — native engines receive only the final effective float.MetronomeMaster. Same group-bus pattern for all liveMetronomePlayerinstances.MetronomePlayer.setVolume/setPan. New per-instance volume and pan control onMetronomePlayer. Effective values are computed multiplicatively withMetronomeMasterbefore being sent to native. iOS:AVAudioEngine.mainMixerNode.volume/.pan, re-applied after everysetupAndPlayrebuild. Android:AudioTrack.setStereoVolumeviapanToGains, re-applied after everyplayBarBufferrebuild.
Breaking changes #
LoopAudioPlayer.setVolumepreviously threwArgumentErrorfor values outside[0.0, 1.0]; it now silently clamps to be consistent withsetPanand the new master API.
0.0.3 #
New features #
- Multi-instance support. Any number of
LoopAudioPlayerandMetronomePlayerinstances can run concurrently without cross-talk. Each instance receives a uniqueplayerId('loop_N'/'metro_N') injected into every method channel call. Events are tagged with the same ID so the Dart layer filters them per-instance using a shared broadcast stream. MetronomePlayer. A new class that drives a sample-accurate click track independent ofLoopAudioPlayer. Pre-generates a single-bar PCM buffer (accent on beat 0, regular clicks on beats 1…N-1) and loops it via the native hardware scheduler. Beat-tick events emitted per beat for UI synchronisation. API:start,stop,setBpm,setBeatsPerBar,beatStream,dispose.loadFromUrl(Uri). Downloads and loads audio from an HTTP/HTTPS URL using the native networking stack (URLSessionon iOS,HttpURLConnectionon Android) — no third-party packages required.loadFromBytes(Uint8List). Loads audio from in-memory bytes by writing to a temporary file, loading it, and cleaning up immediately.- Automatic time signature detection.
BpmResultnow includesbeatsPerBar(int) andbars(List<double>) in addition tobpm,confidence, andbeats. - Pitch-preserving playback rate (
setPlaybackRate) — time-stretch from 0.25× to 4×.
Native engine changes #
- iOS:
MetronomeEngineuses its ownAVAudioEngine+AVAudioPlayerNode. Bar buffer is built withbuildBarBuffer(bpm:beatsPerBar:)and looped viascheduleBuffer(.loops). Beat ticks fire viaDispatchSourceTimeron.main. Plugin bridge now holds[String: LoopAudioEngine]and[String: MetronomeEngine]registries. - Android:
MetronomeEngineusesAudioTrack MODE_STATIC+setLoopPointsfor hardware-level looping. Bar buffer is built viabuildBarBuffer()(companion object — unit-testable). Beat ticks fire viaHandler. Plugin bridge now holdsHashMap<String, LoopAudioEngine>andHashMap<String, MetronomeEngine>registries.
Breaking changes #
loadFromUrlno longer accepts anhttpClientparameter (native networking is used instead).- All method channel payloads now include a
playerIdkey. Custom native-side integrations must be updated to extract and route by this key.
Dependencies #
- Removed
http: ^1.2.0(no longer needed).
0.0.2 #
loadFromUrlnow downloads via the platform networking stack (URLSessionon iOS,HttpURLConnectionon Android) instead of Dart's HTTP client. No third-party packages required.- URL scheme is validated natively (
http/httpsonly); invalid schemes returnPlatformException(INVALID_ARGS). - Temp files for URL downloads use UUID names and are always cleaned up, including on coroutine cancellation (Android) and write failure (iOS).
0.0.1 #
- Initial release.
- Sample-accurate gapless looping on iOS (AVAudioEngine) and Android (AudioTrack).
- Configurable loop region (start/end in seconds).
- Optional equal-power crossfade between loop iterations.
- Volume control and seek support.
- Stereo pan control (
setPan). - Pitch-preserving playback rate / time-stretching (
setPlaybackRate). - Automatic BPM/tempo detection after every load (
bpmStream,BpmResult). stateStream,errorStream,routeChangeStream, andbpmStreamfor reactive UI.- Audio route change events (e.g. headphones unplugged).