Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: chrisuthe/windowsSpin
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v1.8.0
Choose a base ref
...
head repository: chrisuthe/windowsSpin
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v1.10.0
Choose a head ref
  • 11 commits
  • 12 files changed
  • 2 contributors

Commits on Jan 26, 2026

  1. Add per-player logging and simplify ACK handling

    - Add [PlayerName] prefix to all server message log lines
      (group/update, server/state, server/command) for multi-player
      diagnostics
    - Log group ID and name changes in HandleGroupUpdate to help
      diagnose grouping issues
    - Simplify SendPlayerStateAckAsync: remove redundant try/catch
      wrapper (exceptions already handled by SafeFireAndForget)
    - Clean up comments to match actual protocol behavior
    scyto committed Jan 26, 2026
    Configuration menu
    Copy the full SHA
    dd666f3 View commit details
    Browse the repository at this point in the history

Commits on Jan 27, 2026

  1. Fix connection loss detection and improve reconnection handling

    Trigger HandleConnectionLostAsync from failed sends when WebSocket is
    closed but receive loop hasn't detected it yet. This fixes players
    getting stuck in Connected state after server disappears.
    
    Also: extract handshake into reusable SendHandshakeAsync, add
    re-handshake on reconnection, stop time sync on Reconnecting state,
    and fix ConnectInternalAsync to not transition through Disconnected
    during AutoReconnect retries.
    scyto committed Jan 27, 2026
    Configuration menu
    Copy the full SHA
    45d1498 View commit details
    Browse the repository at this point in the history

Commits on Jan 29, 2026

  1. Fix race conditions in connection handling and improve thread safety

    This commit addresses critical thread-safety issues identified during code review
    that could cause duplicate reconnection attempts and unpredictable behavior,
    especially in multi-player scenarios like multiSendSpin.
    
    Race condition fixes:
    
    - Remove _isReconnecting field and use e.OldState instead
      The _isReconnecting field was accessed without synchronization from multiple
      threads (receive loop, main thread, reconnect loop). Now we check
      e.OldState == ConnectionState.Reconnecting directly in the event args,
      which is immutable and thread-safe.
    
    - Add Interlocked guard to HandleConnectionLostAsync
      Both send failure detection and the receive loop could trigger
      HandleConnectionLostAsync simultaneously when a connection dies.
      The atomic guard ensures only the first caller proceeds, preventing
      duplicate reconnection attempts and state machine corruption.
    
    Additional improvements:
    
    - Add CancellationToken support to PerformReconnectHandshakeAsync
      Allows graceful cancellation of reconnection handshakes during shutdown.
    
    - Remove duplicate _clockSynchronizer.Reset() call
      HandleServerHello already resets the clock synchronizer when handshake
      completes, making the reset in PerformReconnectHandshakeAsync redundant.
    
    - Revert routine group/update log level to Debug
      Keep routine state logs at Debug level per CLAUDE.md guidelines.
      Only actual state changes (group ID/name changes) remain at Information.
    
    - Use SafeFireAndForget for TimeSyncLoopAsync
      Ensures any exceptions from the time sync loop are properly logged
      instead of being silently discarded with a bare discard assignment.
    chrisuthe committed Jan 29, 2026
    Configuration menu
    Copy the full SHA
    57e6de6 View commit details
    Browse the repository at this point in the history
  2. Merge pull request #7 from scyto/fix/per-player-logging-and-ack-cleanup

    Add per-player logging and fix connection loss detection
    chrisuthe authored Jan 29, 2026
    Configuration menu
    Copy the full SHA
    651b41c View commit details
    Browse the repository at this point in the history
  3. Fix track end state not clearing progress display (SDK 6.1.0, App 1.9.0)

    Bug fix: When a track finished playing, the UI showed stuck at final position
    (e.g., 4:21/4:21 with pause button) instead of updating properly.
    
    Root cause: The metadata merge used null-coalescing (meta.Progress ?? existing)
    which couldn't distinguish "field absent" (partial update) from "field is null"
    (track ended). JSON has three states but C# nullable has only two.
    
    Solution: Added Optional<T> type that tracks whether a JSON field was present,
    matching the CLI's UndefinedField pattern in Python.
    
    SDK changes:
    - Add Optional<T> struct and OptionalJsonConverterFactory
    - ServerMetadata.Progress now uses Optional<PlaybackProgress?>
    - HandleServerState uses IsPresent check instead of null-coalescing
    
    App changes:
    - MainViewModel handles cleared progress by stopping interpolation
    - Keep final position visible; PlaybackState change updates play/pause button
    chrisuthe committed Jan 29, 2026
    Configuration menu
    Copy the full SHA
    c1a6e68 View commit details
    Browse the repository at this point in the history
  4. Configuration menu
    Copy the full SHA
    7464caf View commit details
    Browse the repository at this point in the history
  5. Change clock sync telemetry log level to Debug

    Clock sync offset/drift measurements are internal implementation details
    useful for debugging timing issues, not routine operational info. Reduces
    log noise in production environments.
    chrisuthe committed Jan 29, 2026
    Configuration menu
    Copy the full SHA
    c60c9a3 View commit details
    Browse the repository at this point in the history
  6. Bump versions: SDK 6.1.1, App 1.9.1

    SDK 6.1.1:
    - Changed clock sync telemetry from Information to Debug log level
    - Reduces log noise in production environments
    chrisuthe committed Jan 29, 2026
    Configuration menu
    Copy the full SHA
    17636d1 View commit details
    Browse the repository at this point in the history

Commits on Feb 3, 2026

  1. Add MonotonicTimer for VM-resilient timing

    In VMs, wall clock timers (Stopwatch/QPC) can jump erratically due to
    hypervisor scheduling, causing fake sync errors and unnecessary audio
    corrections. This adds a MonotonicTimer wrapper that:
    
    - Enforces monotonicity (never returns decreasing values)
    - Clamps forward jumps to 50ms max per callback
    - Filters timer noise while preserving real DAC drift detection
    
    The wrapper is enabled by default in AudioPipeline, making all SDK
    consumers automatically VM-resilient without code changes.
    chrisuthe committed Feb 3, 2026
    Configuration menu
    Copy the full SHA
    e31f6ec View commit details
    Browse the repository at this point in the history
  2. Merge pull request #8 from chrisuthe/Monotonic

    Add MonotonicTimer for VM-resilient timing
    chrisuthe authored Feb 3, 2026
    Configuration menu
    Copy the full SHA
    8a7fc4e View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    e28fd27 View commit details
    Browse the repository at this point in the history
Loading