Skip to content

Releases: Sendspin/SendspinKit

v1.0.1

16 Apr 11:13
55267a8

Choose a tag to compare

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

15 Apr 20:13
850fb78

Choose a tag to compare

What's Changed

  • Sendspin compliance update by @teancom in #6
  • fix(ci): use JSON coverage export instead of fragile text parsing by @teancom in #7

New Contributors

Full Changelog: v0.3.4...v1.0.0

v0.3.3: Artwork URL Display Support

26 Oct 21:46

Choose a tag to compare

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 trackArtworkUrl state 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

26 Oct 19:59

Choose a tag to compare

πŸ”§ 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:

  1. 192 kHz / 24-bit PCM (hi-res)
  2. 176.4 kHz / 24-bit PCM (hi-res)
  3. 96 kHz / 24-bit PCM (hi-res)
  4. 88.2 kHz / 24-bit PCM (hi-res)
  5. 48 kHz / 16-bit PCM (fallback)
  6. 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

26 Oct 19:54

Choose a tag to compare

πŸ”§ 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 fix
  • Examples/CLIPlayer/Sources/CLIPlayer/CLIPlayer.swift: Re-enabled Opus/FLAC formats

The Opus and FLAC decoders are now validated and production-ready!