You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
v0.3.0
New Features
Audio capture — Sunshine's Opus stream is decoded to 48 kHz float32 PCM and
exposed through client.audio() (iterator) and client.latest_audio()
(latest-chunk buffer), mirroring the video frame APIs. On by default via
record_audio=True on start_stream() / stream().
Audio in recordings — record() and start_recording() now include audio
automatically: a synced AAC track inside video files, or a companion audio.wav
next to image-directory captures. Pass with_audio=False to skip it for a
given recording.
New public types — AudioChunk (PCM + timing metadata), AudioDecoder
(PyAV/Opus, stereo and surround), and WavRecorder (16-bit PCM output).
VideoRecorder(audio=True) — Adds an AAC track to the same container, fed by
a thread-safe write_audio(), for direct use of the recorder classes.
version — The package now exposes its installed version.
Bug Fixes
Fixed stretched video timelines — Video PTS moved from a 1/fps time base to
90 kHz, and from the local clock to the host's capture timestamps. Frames
arriving in bursts are no longer pushed forward a full frame period each,
which previously stretched recordings past wall clock.
Audio loss no longer shifts the timeline — Audio is positioned at
frame_index × samples_per_frame rather than appended, so packets lost on the
network, dropped by a full queue, or corrupt leave a gap of silence instead of
pulling all later audio earlier.
No truncated audio tail — On stop, in-flight audio gets a bounded drain
window and any remaining deficit is padded with silence, so both tracks end
together.
Breaking Changes
VideoRecorder.write(frame, pts=) is now write(frame,
pts_us=). This only affects direct use of the recorder class;
the MoonlightClient API is unchanged.
Audio capture is enabled by default, so streams install audio callbacks and
run an Opus decode thread, and recordings gain an audio track. Pass
record_audio=False to start_stream() / stream() for the previous behavior.
Improvements
Audio loss diagnostics are logged (packets lost or dropped, silence
inserted, gaps bridged) — enable logging at INFO to see them.
CI: full-history checkouts so setuptools-scm resolves version tags, macOS
runner pinned to macos-15, and the wheel matrix no longer fails fast.