- PlaybackDone now carries the finished *mpv.MpvTrack instead of a
bare bool, so trackSwitcherGoroutine can detect and drop stale
finish signals raised for a track that Skip/Clear/Set already
replaced. Previously a stale signal could cause the goroutine to
tear down and advance past the newly-started track.
- getStatus() snapshots ActiveTrack/index/gain under the lock, then
performs the blocking mpv IPC calls (Position/IsPlaying) after
releasing it, so Status/Get polling no longer holds the device
mutex during a socket round-trip to mpv.
- Add/Set now resolve media file IDs (DB queries) before acquiring
the lock, only holding it to mutate the queue.
Co-Authored-By: Claude <noreply@anthropic.com>