mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-09-07 15:07:17 +00:00
BeginStatusPoll/ApplySpeakerEvent/CompleteStatusPoll gated an entire poll's merge (NowPlaying/Volume/Presets/Sources/Bass/IsConnected) behind one shared speakerEventGeneration counter. Any unrelated push event during the poll's flight discarded the whole result -- not just the field that event touched. Sources has no push event at all, so it could go stale indefinitely under ordinary event traffic, defeating both call sites that depend on this poll (the 30s fallback poll and the post-reconnect refresh). Replace it with StatusField + BeginFieldPoll/CompleteFieldPoll/ ApplyFieldEvent: the same two-counter (issued/applied) pattern already used for Group, generalized to one instance per independently-racing field via a small fixed-size array. A poll or event for one field can now only ever supersede that same field, never a different one. This also removes the map-based generation bookkeeping the old mechanism needed (issue/lookup/prune per poll) and the unreachable "unknown generation" branch it required. applyGroupUpdatedEvent now shares the same queueBroadcastIfChanged helper as the other five event types, instead of duplicating the "broadcast if changed" check inline. Found in code review of PR #666 (findings #1, #2, #3, #4).