setAbLoop
Arms or clears the A-B loop: while armed, playback that reaches b jumps straight back to a and keeps going, which is how a phrase is practised and a scene is studied frame by frame. Independent of setLoop; while armed, the A-B loop owns the end of the region and the end of the media both.
With b null the loop runs from a to the end of the media and wraps back to a. Both null clears the loop. The armed points are published as PlayerSnapshot.abLoopA and PlayerSnapshot.abLoopB, and they belong to the player, not the media: like setSpeed they survive seeks and the next open.
Each turn of the section is opened at a in the background before the one that plays reaches b, and its first sample follows the last one before b in the device's ring, the way a gapless queue item follows the one before it: the phrase repeats in time, with no silence and no PlaybackStatus.Buffering between turns, and nothing from past b is heard or shown. Where that cannot happen, a turn jumps back by an ordinary precise seek, as docs/gapless-queue.md describes. Either way the loop needs a seekable source. Arming it while an unseekable one plays is refused, and the refusal is published as a PlaybackWarning.CommandRefused on events and the warning history, because this member does not wait for the engine. A loop armed earlier stays armed through the open of an unseekable item, does not run on it, and that open publishes the same warning.