Releases: Sendspin/SendspinKit
v1.0.1
What's Changed
- fix(ci): add workflow permissions for PR coverage comments by @teancom in #9
- claude/investigate-ci-contributor-access-F0QXw by @balloob in #8
- doc: rewrite README for current API surface by @teancom in #10
- fix(discovery): strip interface scope from resolved IP addresses by @teancom in #11
- Examples suite and fixes by @teancom in #12
New Contributors
Full Changelog: v1.0.0...v1.0.1
v1.0.0
v0.3.3: Artwork URL Display Support
Features
- Artwork URL Display: CLIPlayer now displays artwork URLs received from the server in metadata events
- Support for artwork from Qobuz and other streaming services
- Clean display with dimmed styling in TUI mode
- Available in both TUI and non-TUI logging modes
Example Output
[METADATA] Track: Burning Down the House
[METADATA] Artist: Talking Heads
[METADATA] Album: Speaking in Tongues
[METADATA] Duration: 241s
[METADATA] Artwork URL: https://static.qobuz.com/images/covers/67/72/0603497147267_600.jpg
Technical Details
The Resonate Protocol already supported artwork URLs in both StreamMetadata and SessionMetadata messages. This release wires the artwork URL through to the CLIPlayer display layer, making it visible to users.
Changes:
- Added
trackArtworkUrlstate variable to StatusDisplay actor - Updated
updateMetadata()method to accept artwork URL parameter - Display artwork URL in TUI mode with dimmed text styling
- Print artwork URL in non-TUI logging mode
Full Changelog
- e7f9c65 feat: add artwork URL display to metadata
v0.3.2 - Hi-Res Audio Format Negotiation Fix
π§ Critical Hi-Res Fix
Fixed critical bug that blocked hi-res audio by hardcoding 48kHz/16-bit as the auto-start format.
The Bug
Before: Auto-start used .dropFirst(4).first which:
- Skipped formats 0-3: 192k/24, 176.4k/24, 96k/24, 88.2k/24
- Always used format 4: 48k/16 (hardcoded!)
- Server could never negotiate hi-res formats
After: Auto-start now uses .first which:
- Uses format 0: 192k/24 (highest priority)
- Server can negotiate down if needed
- Properly supports hi-res audio path
Format Priority Order
Auto-start now respects the advertised priority:
- 192 kHz / 24-bit PCM (hi-res)
- 176.4 kHz / 24-bit PCM (hi-res)
- 96 kHz / 24-bit PCM (hi-res)
- 88.2 kHz / 24-bit PCM (hi-res)
- 48 kHz / 16-bit PCM (fallback)
- 44.1 kHz / 16-bit PCM (fallback)
What's Fixed
- β Hi-res format negotiation now works
- β Auto-start uses highest advertised format
- β Server can properly negotiate 192k/176.4k/96k/88.2k @ 24-bit
- β 24-bit PCM unpacking already implemented and working
Impact
Audio Quality: Client can now receive and play true hi-res audio (up to 192kHz/24-bit) instead of being limited to 48kHz/16-bit.
Files Changed
Sources/ResonateKit/Client/ResonateClient.swift:671: Changed.dropFirst(4).firstβ.first
Credit
Issue identified through thorough audit feedback.
Related
- v0.3.1: FLAC decoder fix
- v0.3.0: Initial Opus/FLAC support
v0.3.1 - Critical FLAC Decoder Fix
π§ Critical Fix
Fixed critical bug where FLACDecoder returned 0 audio samples. The decoder now correctly processes both metadata blocks and audio frames.
What Was Fixed
Problem: FLAC decoder only processed STREAMINFO metadata and never reached audio frame data.
Root Cause: Stateful stream decoder requires multiple process_single() calls to advance through the FLAC stream structure. The implementation was resetting state incorrectly between iterations.
Solution:
- Preserve decoder position (
readOffset) across processing loops - Loop until audio samples are decoded
- Only remove consumed bytes after complete processing
Validation Results
β OpusDecoder: Tested with real Opus packets (60ms SILK frames)
- Input: 4-byte packet β Output: 5760 int32 samples
β FLACDecoder: Now working with real FLAC files
- Input: 9518-byte FLAC file β Output: 8820 int32 samples
- Correctly processes metadata + audio frames in single call
Changes
- Fixed: FLAC decoder audio frame processing
- Changed: Re-enabled Opus and FLAC format advertisement in CLIPlayer
- Validated: Both decoders tested and production-ready
Files Changed
Sources/ResonateKit/Audio/AudioDecoder.swift: FLAC decoder state management fixExamples/CLIPlayer/Sources/CLIPlayer/CLIPlayer.swift: Re-enabled Opus/FLAC formats
The Opus and FLAC decoders are now validated and production-ready!