Skip to content

Clarify buffer handling on stream/start messages during an active stream - #283

Merged
chrisuthe merged 1 commit into
mainfrom
clarify-in-place-format-change
Sep 16, 2026
Merged

chrisuthe merged 1 commit into
mainfrom
clarify-in-place-format-change

Conversation

@kahrendt

Copy link
Copy Markdown
Contributor

stream/start on an active stream let the client clear buffers "unless its
implementation requires it", leaving the transition timeline ambiguous when
the player format changes. The player role already assumes the timeline
continues, so state that explicitly.

  • messaging.md: an in-place stream/start updates the configuration without
    ending the stream. Each role defines how previously received data is
    handled, since artwork discards its pending image while the player keeps
    its chunks.
  • roles/player/v1.md: the format changes at a chunk boundary. Servers MUST
    continue the timeline without resending audio. Clients MUST decode each
    buffered chunk in the format in effect when it arrived. A player that
    cannot switch formats gaplessly SHOULD list a single sample_rate and
    channels and let the server resample.

Fixes #276

Breaking changes

  • aiosendspin server (since #336), sendspin-python-cli, SendspinDroid: flush on an in-place stream/start. Must continue the timeline instead.
  • sendspin-go, sendspin-rs example, aiosendspin client: swap the decoder immediately, misdecoding queued old-format chunks. Must apply the new format per chunk.

sendspin-js, SendspinKit, and sendspin-cpp already conform. The conformance suite needs a scenario for a format change with chunks in flight.

…at change

`stream/start` on an active stream let the client clear buffers "unless its
implementation requires it", leaving the transition timeline ambiguous when
the player format changes. The player role already assumes the timeline
continues, so state it explicitly and drop the escape hatch.

- messaging.md: an in-place `stream/start` updates the configuration without
  ending the stream. Each role defines how previously received data is
  handled, since artwork discards its pending image while the player keeps
  its chunks.
- roles/player/v1.md: the format changes at a chunk boundary. Servers MUST
  continue the timeline without resending audio. Clients MUST decode each
  buffered chunk in the format in effect when it arrived. A player that
  cannot switch formats gaplessly SHOULD list a single `sample_rate` and
  `channels` and let the server resample.

Fixes #276
@chrisuthe

Copy link
Copy Markdown
Member

Perfect, this is a good clarification.

@chrisuthe
chrisuthe merged commit f7960f5 into main Sep 16, 2026
1 check passed
@chrisuthe
chrisuthe deleted the clarify-in-place-format-change branch September 16, 2026 12:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Clarify buffer handling when an in-place stream/start changes the player codec or sample rate

2 participants