/** * Shared per-channel frame-queue stepping mechanics: index/loop/deactivate * bookkeeping for a queue that gets consumed one 25ms slot at a time. * * Extracted from `BaseCoyoteProtocolAdapter.advanceWaveStep` (the logic was * originally inline there, operating directly on `ChannelWaveState`) so * `OpossumVibrateAdapter`'s vibration-pattern cursor can reuse the identical * indexing/looping/deactivation mechanics — both device families step a * per-channel frame queue at the same 25ms grid, they just clamp/transform * each raw frame differently (Coyote: `[freq,int]` tuple → clamped * `WaveStep`; Opossum: a plain 0-100 number, transform is just clamping). * * Deliberately does NOT own quad-assembly (bundling 4 steps into one 100ms * B0 write) — Coyote's `advanceWavePacket` has protocol-specific "channel * disable" sentinel behavior on a short/empty queue that doesn't generalize, * so quad-assembly stays in each caller. */ export interface WaveCursorState { frames: TFrame[] | null; index: number; loop: boolean; active: boolean; } export declare function createEmptyWaveCursorState(): WaveCursorState; export declare class WaveCursor { private readonly transform; constructor(transform: (frame: TFrame) => TStep); /** * Returns the current frame (transformed) and advances the index, or * `null` once the queue is exhausted (marking `state.active = false` for * a non-looping queue, or immediately for an empty/inactive one). */ advanceStep(state: WaveCursorState): TStep | null; } //# sourceMappingURL=wave-cursor.d.ts.map