Files
NX2navi/runtime/input_hd_pair.h
chrg6 b399d8f15c Keep a late HD rumble report from opening a Joy-Con pair again after the stop.
hd_tick picks a report under the locks and writes it to the pair after letting them go. When input_rumble_hd_stop
wrote the neutral value and closed the pair in between, that write opened the two devices again and left the
Joy-Con vibrating after the exit. The stop now ends the pair (hd_pair_end), and hd_pair_write checks that under the
lock it holds for the write, so nothing is written after the stop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-13 06:06:27 -05:00

24 lines
1.5 KiB
C

// HD rumble for a pair of Joy-Con (input_hd_pair.c): the rumble output report written to each Joy-Con's HID device,
// next to SDL, which reads the two as one gamepad and takes no rumble data for it. input.c calls it (hd_tick).
#pragma once
#include <stdint.h>
#include "rumble_hd.h"
// Looks for a left and a right Joy-Con among the HID devices and keeps their paths for hd_pair_write. 1 when both are
// there. Opens nothing. Any thread; takes the time of a HID device listing.
int hd_pair_find(void);
// Writes one rumble report to each Joy-Con: the left half of data to the left one, the right half to the right one.
// The first call after hd_pair_find opens the two devices. 0 when a device could not be opened or written (both are
// closed then, and SDL's error text says why), and after hd_pair_end. Blocks for as long as the writes take: the HD
// rumble thread only.
int hd_pair_write(const uint8_t data[RUMBLE_HD_DATA]);
// 1 while the two devices are open.
int hd_pair_is_open(void);
// Writes the neutral value to both Joy-Con, when neutral is set, and closes them. wait_ms: how long to wait for a
// write that is still running on another thread before giving up (the process is ending); 0 waits for it.
void hd_pair_close(int neutral, unsigned wait_ms);
// The process is ending (input.c input_rumble_hd_stop): hd_pair_close(1, wait_ms), and hd_pair_write writes nothing
// from here on, so a report the HD thread chose before the stop cannot open the two devices again after it.
void hd_pair_end(unsigned wait_ms);