dualsense-ts 6.5.0 → 6.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +127 -15
  2. package/dist/audio.d.ts +56 -0
  3. package/dist/audio.d.ts.map +1 -0
  4. package/dist/audio.js +79 -0
  5. package/dist/audio.js.map +1 -0
  6. package/dist/dualsense.d.ts +12 -1
  7. package/dist/dualsense.d.ts.map +1 -1
  8. package/dist/dualsense.js +48 -1
  9. package/dist/dualsense.js.map +1 -1
  10. package/dist/elements/audio.d.ts +77 -0
  11. package/dist/elements/audio.d.ts.map +1 -0
  12. package/dist/elements/audio.js +146 -0
  13. package/dist/elements/audio.js.map +1 -0
  14. package/dist/elements/index.d.ts +1 -0
  15. package/dist/elements/index.d.ts.map +1 -1
  16. package/dist/elements/index.js +1 -0
  17. package/dist/elements/index.js.map +1 -1
  18. package/dist/elements/mute.d.ts +7 -0
  19. package/dist/elements/mute.d.ts.map +1 -1
  20. package/dist/elements/mute.js +8 -0
  21. package/dist/elements/mute.js.map +1 -1
  22. package/dist/hid/command.d.ts +71 -16
  23. package/dist/hid/command.d.ts.map +1 -1
  24. package/dist/hid/command.js +43 -1
  25. package/dist/hid/command.js.map +1 -1
  26. package/dist/hid/dsp.d.ts +130 -0
  27. package/dist/hid/dsp.d.ts.map +1 -0
  28. package/dist/hid/dsp.js +136 -0
  29. package/dist/hid/dsp.js.map +1 -0
  30. package/dist/hid/dualsense_hid.d.ts +50 -3
  31. package/dist/hid/dualsense_hid.d.ts.map +1 -1
  32. package/dist/hid/dualsense_hid.js +134 -3
  33. package/dist/hid/dualsense_hid.js.map +1 -1
  34. package/dist/hid/index.d.ts +1 -0
  35. package/dist/hid/index.d.ts.map +1 -1
  36. package/dist/hid/index.js +1 -0
  37. package/dist/hid/index.js.map +1 -1
  38. package/dist/hid/node_hid_provider.d.ts.map +1 -1
  39. package/dist/hid/node_hid_provider.js +22 -2
  40. package/dist/hid/node_hid_provider.js.map +1 -1
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -0
  44. package/dist/index.js.map +1 -1
  45. package/nodehid_example/dsp_explore.ts +288 -0
  46. package/nodehid_example/single.ts +25 -0
  47. package/nodehid_example/verify.ts +499 -0
  48. package/package.json +4 -2
  49. package/src/audio.ts +91 -0
  50. package/src/dualsense.ts +61 -1
  51. package/src/elements/audio.ts +163 -0
  52. package/src/elements/index.ts +1 -0
  53. package/src/elements/mute.ts +14 -0
  54. package/src/hid/command.ts +75 -14
  55. package/src/hid/dsp.ts +132 -0
  56. package/src/hid/dualsense_hid.ts +184 -4
  57. package/src/hid/index.ts +1 -0
  58. package/src/hid/node_hid_provider.ts +21 -2
  59. package/src/index.ts +1 -0
  60. package/webhid_example/build/asset-manifest.json +3 -3
  61. package/webhid_example/build/index.html +1 -1
  62. package/webhid_example/build/static/js/main.e64bfdb3.js +3 -0
  63. package/webhid_example/build/static/js/main.e64bfdb3.js.map +1 -0
  64. package/webhid_example/src/App.tsx +49 -24
  65. package/webhid_example/src/hud/AudioControls.tsx +787 -0
  66. package/webhid_example/src/hud/Debugger.tsx +6 -1
  67. package/webhid_example/src/hud/TouchpadVisualization.tsx +2 -2
  68. package/webhid_example/src/hud/UtilityButtons.tsx +30 -5
  69. package/webhid_example/src/hud/index.tsx +1 -0
  70. package/LINUX_HID.md +0 -85
  71. package/webhid_example/build/static/js/main.2ba4cfae.js +0 -3
  72. package/webhid_example/build/static/js/main.2ba4cfae.js.map +0 -1
  73. /package/webhid_example/build/static/js/{main.2ba4cfae.js.LICENSE.txt → main.e64bfdb3.js.LICENSE.txt} +0 -0
package/README.md CHANGED
@@ -10,11 +10,12 @@
10
10
  - **Bluetooth and USB** support in the browser or node.js
11
11
  - **Automatic connection and reconnection** even when connection type changes
12
12
  - **Multiplayer support**, allowing up to 31 connected controllers at a time
13
- - **Lighting control** - RGB light bars, player LEDs, and mute button
14
- - **Full haptics control** - independent left/right rumble plus complete trigger haptic configuration
13
+ - **Lighting control** covering RGB light bars, player LEDs, and mute button
14
+ - **Full haptics control** over independent left/right rumble plus complete trigger haptics
15
15
  - **Touchpad support** with full multi-touch handling
16
16
  - **Motion tracking** via gyroscope and accelerometer readings
17
17
  - **Battery status** including level and charging state
18
+ - **Audio controls** for speaker, headphone, and microphone volume, routing, and muting
18
19
  - **Peripheral status** for connected headphones and microphone
19
20
  - **Firmware info** checks providing controller color, hardware/software versions, and more
20
21
 
@@ -32,7 +33,7 @@
32
33
 
33
34
  #### In node.js
34
35
 
35
- `dualsense-ts` relies on `node-hid` as a peer dependency, so you'll need to add it to your project as well:
36
+ `dualsense-ts` relies on `node-hid` as a peer dependency. You'll need to add it to your project as well:
36
37
 
37
38
  - `npm add node-hid`
38
39
 
@@ -143,6 +144,39 @@ for await (const { pressure } of controller.left.trigger) {
143
144
 
144
145
  ### Other Supported Features
145
146
 
147
+ #### Touchpad
148
+
149
+ The touchpad supports two simultaneous touches, each modeled as an analog input with x/y axes ranging from -1 to 1 (center is 0,0). The physical touchpad button is a separate input:
150
+
151
+ ```typescript
152
+ // React to the first touch point (or single-finger touch)
153
+ controller.touchpad.left.on("change", (touch) => {
154
+ console.log(
155
+ `Touch: x=${touch.x.state.toFixed(2)}, y=${touch.y.state.toFixed(2)}`,
156
+ );
157
+ });
158
+
159
+ // Detect touch contact and release
160
+ controller.touchpad.left.contact.on("press", () => console.log("Finger down"));
161
+ controller.touchpad.left.contact.on("release", () => console.log("Finger up"));
162
+
163
+ // Second touch point for multi-touch
164
+ controller.touchpad.right.on("change", (touch) => {
165
+ if (touch.contact.active) {
166
+ console.log(
167
+ `Touch 2: x=${touch.x.state.toFixed(2)}, y=${touch.y.state.toFixed(2)}`,
168
+ );
169
+ }
170
+ });
171
+
172
+ // Physical click of the touchpad
173
+ controller.touchpad.button.on("press", () => console.log("Touchpad clicked"));
174
+ // And another way to detect a touch
175
+ controller.touchpad.on("press", () => console.log("Touchpad touched"));
176
+ ```
177
+
178
+ Each touch point also exposes a `tracker` ([Increment](src/elements/increment.ts)) that provides a touch ID, which increments each time a new finger is placed on the pad.
179
+
146
180
  #### Motion Control
147
181
 
148
182
  You can access raw gyroscope and accelerometer readings from the device:
@@ -277,7 +311,7 @@ Effect names are based on [Nielk1's DualSense trigger effect documentation](http
277
311
 
278
312
  #### Lights
279
313
 
280
- You can control the controller's lightbar as well as the player indicator LEDs:
314
+ You can control the controller's lightbar as well as the player indicator and mute LEDs:
281
315
 
282
316
  ```typescript
283
317
  import { PlayerID, Brightness } from "dualsense-ts";
@@ -299,15 +333,17 @@ controller.playerLeds.setLed(4, true);
299
333
  controller.playerLeds.clear(); // All off
300
334
  controller.playerLeds.setBrightness(Brightness.Medium); // High, Medium, or Low
301
335
 
302
- // Mute LED read-only, reflects controller firmware state
303
- controller.mute.status.on("change", ({ state }) => {
304
- console.log(`Mute: ${state ? "muted" : "unmuted"}`);
305
- });
336
+ // Override the mute LED with a software-controlled mode
337
+ import { MuteLedMode } from "dualsense-ts";
338
+ controller.mute.setLed(MuteLedMode.On); // Solid on
339
+ controller.mute.setLed(MuteLedMode.Pulse); // Slow pulse
340
+ controller.mute.setLed(MuteLedMode.Off); // Force off
341
+ controller.mute.resetLed(); // Return control to firmware
306
342
  ```
307
343
 
308
344
  The `{r, g, b}` format is compatible with popular color libraries. Pass the output of `colord().toRgb()`, `tinycolor().toRgb()`, or `Color().object()` straight to `lightbar.set()`.
309
345
 
310
- The mute LED cannot be controlled (the firmware toggles it on and off with the button) but you can read its current state. `controller.mute` allows you to read the button like a normal input, while `controller.mute.status` is a toggle input tied to the LED's state.
346
+ By default the mute LED is managed by the controller firmware (toggled by the physical button). Use `setLed()` to override with a specific mode, and `resetLed()` to hand control back. A physical button press will also return the LED to firmware control.
311
347
 
312
348
  #### Audio Peripherals
313
349
 
@@ -324,8 +360,71 @@ controller.microphone.on("change", ({ state }) => {
324
360
 
325
361
  controller.headphone.state; // true when headphones are plugged in
326
362
  controller.microphone.state; // true when a microphone is available
363
+
364
+ // `mute.status` is true when the user has muted the microphone
365
+ // Usually it's tied to the LED state, unless you've overridden the LED
366
+ controller.mute.status.on("change", ({ state }) => {
367
+ console.log(`Mute: ${state ? "muted" : "unmuted"}`);
368
+ });
327
369
  ```
328
370
 
371
+ #### Audio Control
372
+
373
+ The DualSense has a built-in speaker and microphone. Over USB, it registers as a standard audio device at the OS level. `dualsense-ts` provides volume, routing, and mute controls:
374
+
375
+ ```typescript
376
+ import { AudioOutput, MicSelect, MicMode } from "dualsense-ts";
377
+
378
+ // Volume control (0.0-1.0)
379
+ controller.audio.setSpeakerVolume(0.8);
380
+ controller.audio.setHeadphoneVolume(0.5);
381
+ controller.audio.setMicrophoneVolume(1.0);
382
+
383
+ // Audio output routing
384
+ controller.audio.setOutput(AudioOutput.Speaker); // Internal speaker only
385
+ controller.audio.setOutput(AudioOutput.Headphone); // Headphone only (default)
386
+ controller.audio.setOutput(AudioOutput.Split); // Left: headphone, right: speaker
387
+
388
+ // Per-output muting
389
+ controller.audio.muteSpeaker(true);
390
+ controller.audio.muteHeadphone(true);
391
+ controller.audio.muteMicrophone(true);
392
+ controller.audio.muteSpeaker(false); // Unmute
393
+
394
+ // Microphone source and processing
395
+ controller.audio.setMicSelect(MicSelect.Internal); // Built-in mic
396
+ controller.audio.setMicSelect(MicSelect.Headset); // Headset mic
397
+ controller.audio.setMicMode(MicMode.Chat); // Chat mode
398
+
399
+ // Speaker preamp gain (0–7) and beam forming
400
+ controller.audio.setPreamp(4);
401
+ controller.audio.setPreamp(2, true); // Enable beam forming
402
+ ```
403
+
404
+ These HID commands control volume and routing but do not stream audio data. To send audio to the controller's speaker or capture from its microphone, use the OS audio device (Web Audio API or a native audio library like PortAudio). The helper function `findDualsenseAudioDevices()` locates matching audio devices in the browser:
405
+
406
+ ```typescript
407
+ import { findDualsenseAudioDevices } from "dualsense-ts";
408
+
409
+ const { outputs, inputs } = await findDualsenseAudioDevices();
410
+
411
+ // Route audio to the controller's speaker
412
+ if (outputs.length > 0) {
413
+ const ctx = new AudioContext({ sinkId: outputs[0].deviceId });
414
+ }
415
+
416
+ // Capture from the controller's microphone
417
+ if (inputs.length > 0) {
418
+ const stream = await navigator.mediaDevices.getUserMedia({
419
+ audio: { deviceId: { exact: inputs[0].deviceId } },
420
+ });
421
+ }
422
+ ```
423
+
424
+ For Node.js, enumerate audio devices by USB vendor ID `0x054C` and product ID `0x0CE6` using your audio library of choice. These constants are exported as `DUALSENSE_AUDIO_VENDOR_ID` and `DUALSENSE_AUDIO_PRODUCT_ID`.
425
+
426
+ Unfortunately, multi-controller support is limited. We don't have a dependable way to link individual controllers to their device IDs across all connection types at this time - if you have any ideas, please submit a PR!
427
+
329
428
  #### Color and Serial Number
330
429
 
331
430
  `dualsense-ts` reads the controller's body color and serial number from factory info after connection:
@@ -360,7 +459,7 @@ The `firmwareInfo` property includes build date/time, firmware versions, hardwar
360
459
 
361
460
  ## Using `dualsense-ts` with React
362
461
 
363
- Check out [the example app](./webhid_example/) for more details.
462
+ Check out [the demo app](./webhid_example/) for reference implementations. All features supported by the controller are available in the app.
364
463
 
365
464
  ```typescript
366
465
  // DualsenseContext.tsx
@@ -473,7 +572,7 @@ for (const controller of manager) {
473
572
 
474
573
  ### Player LEDs
475
574
 
476
- The manager auto-assigns player LED patterns as controllers connect. The first four match the PS5 console convention; slots 531 use the remaining 5-bit LED combinations.
575
+ The manager auto-assigns player LED patterns as controllers connect. The first four match the PS5 console convention; slots 5-31 use the remaining 5-bit LED combinations.
477
576
 
478
577
  ```typescript
479
578
  import { DualsenseManager, PlayerID, Brightness } from "dualsense-ts";
@@ -515,13 +614,26 @@ Using `new Dualsense()` directly continues to work exactly as before, allowing y
515
614
 
516
615
  ## Known Issues
517
616
 
518
- ### Linux - can't use multiple controllers over Bluetooth
617
+ ### Audio streaming requires USB
519
618
 
520
- Identical Bluetooth devices are not given separate HID interfaces under some circumstances. You may still use multiple USB-connected controllers plus one Bluetooth controller.
619
+ The DualSense registers as a USB Audio Class device only over USB. Over Bluetooth, there is no audio transport. Audio controls (volume, routing, muting) work over both USB and Bluetooth, but they only affect audio playback over USB.
620
+
621
+ ### Linux - headphone audio plays in one ear only
622
+
623
+ PulseAudio defaults to the mono "Speaker" profile when the DualSense is connected. This sends a single audio channel, which the controller routes to the right side only. To get stereo headphone output, switch to the headphones profile:
521
624
 
522
- ### Linux - can't access factory info over Bluetooth connection in Node.js
625
+ ```bash
626
+ # Switch to stereo headphone profile
627
+ pactl set-card-profile alsa_card.usb-Sony_Interactive_Entertainment_Wireless_Controller-00 "HiFi (Headphones, Mic)"
523
628
 
524
- Factory info uses the HID SET_REPORT feature report protocol, which the Linux kernel's `hid_playstation` driver does not pass through over Bluetooth. This mainly limits your ability to check the controller's body color and serial number. Factory info is still available over USB or Bluetooth in the browser. See [LINUX_HID.md](LINUX_HID.md) for investigation details.
629
+ # Set it as the default output and adjust volume
630
+ pactl set-default-sink alsa_output.usb-Sony_Interactive_Entertainment_Wireless_Controller-00.HiFi__Headphones__sink
631
+ pactl set-sink-volume alsa_output.usb-Sony_Interactive_Entertainment_Wireless_Controller-00.HiFi__Headphones__sink 100%
632
+ ```
633
+
634
+ ### Linux - can't use multiple controllers over Bluetooth
635
+
636
+ Identical Bluetooth devices are not given separate HID interfaces under some circumstances. You may still use multiple USB-connected controllers plus one Bluetooth controller.
525
637
 
526
638
  ## Other Dualsense Variants
527
639
 
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Audio device matching utilities for the DualSense controller.
3
+ *
4
+ * The DualSense registers as a USB Audio Class device (speaker + microphone)
5
+ * when connected over USB. These utilities help locate the corresponding
6
+ * audio devices in the Web Audio API or native audio libraries.
7
+ *
8
+ * Note: Audio devices are only available over USB, not Bluetooth.
9
+ */
10
+ /** USB Vendor ID for Sony Interactive Entertainment */
11
+ export declare const DUALSENSE_AUDIO_VENDOR_ID = 1356;
12
+ /** USB Product ID for the DualSense controller */
13
+ export declare const DUALSENSE_AUDIO_PRODUCT_ID = 3302;
14
+ /**
15
+ * Known device label patterns for DualSense audio devices across platforms.
16
+ * Browser `enumerateDevices()` labels vary by OS:
17
+ * - Windows: "Wireless Controller"
18
+ * - macOS: "Wireless Controller"
19
+ * - Linux: "Wireless Controller" or "Sony Interactive Entertainment Wireless Controller"
20
+ */
21
+ export declare const DUALSENSE_AUDIO_LABELS: readonly ["Wireless Controller", "DualSense"];
22
+ /** Filtered result from audio device enumeration */
23
+ export interface DualsenseAudioDevices {
24
+ /** Audio output devices (speaker/headphone) */
25
+ outputs: MediaDeviceInfo[];
26
+ /** Audio input devices (microphone) */
27
+ inputs: MediaDeviceInfo[];
28
+ }
29
+ /**
30
+ * Find DualSense audio devices using the Web Audio API.
31
+ *
32
+ * Requires `navigator.mediaDevices` (browser only). Returns matching
33
+ * audio input and output devices based on known label patterns.
34
+ *
35
+ * Note: Device labels may be empty until the user grants microphone
36
+ * or camera permission via `getUserMedia()`.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * import { findDualsenseAudioDevices } from "dualsense-ts";
41
+ *
42
+ * const { outputs, inputs } = await findDualsenseAudioDevices();
43
+ * if (outputs.length > 0) {
44
+ * const ctx = new AudioContext({ sinkId: outputs[0].deviceId });
45
+ * // Route audio to the controller's speaker
46
+ * }
47
+ * if (inputs.length > 0) {
48
+ * const stream = await navigator.mediaDevices.getUserMedia({
49
+ * audio: { deviceId: { exact: inputs[0].deviceId } },
50
+ * });
51
+ * // Capture from the controller's microphone
52
+ * }
53
+ * ```
54
+ */
55
+ export declare function findDualsenseAudioDevices(): Promise<DualsenseAudioDevices>;
56
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uDAAuD;AACvD,eAAO,MAAM,yBAAyB,OAAS,CAAC;AAEhD,kDAAkD;AAClD,eAAO,MAAM,0BAA0B,OAAS,CAAC;AAEjD;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,+CAGzB,CAAC;AAUX,oDAAoD;AACpD,MAAM,WAAW,qBAAqB;IACpC,+CAA+C;IAC/C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,uCAAuC;IACvC,MAAM,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,qBAAqB,CAAC,CAoBhF"}
package/dist/audio.js ADDED
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * Audio device matching utilities for the DualSense controller.
4
+ *
5
+ * The DualSense registers as a USB Audio Class device (speaker + microphone)
6
+ * when connected over USB. These utilities help locate the corresponding
7
+ * audio devices in the Web Audio API or native audio libraries.
8
+ *
9
+ * Note: Audio devices are only available over USB, not Bluetooth.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.findDualsenseAudioDevices = exports.DUALSENSE_AUDIO_LABELS = exports.DUALSENSE_AUDIO_PRODUCT_ID = exports.DUALSENSE_AUDIO_VENDOR_ID = void 0;
13
+ /** USB Vendor ID for Sony Interactive Entertainment */
14
+ exports.DUALSENSE_AUDIO_VENDOR_ID = 0x054c;
15
+ /** USB Product ID for the DualSense controller */
16
+ exports.DUALSENSE_AUDIO_PRODUCT_ID = 0x0ce6;
17
+ /**
18
+ * Known device label patterns for DualSense audio devices across platforms.
19
+ * Browser `enumerateDevices()` labels vary by OS:
20
+ * - Windows: "Wireless Controller"
21
+ * - macOS: "Wireless Controller"
22
+ * - Linux: "Wireless Controller" or "Sony Interactive Entertainment Wireless Controller"
23
+ */
24
+ exports.DUALSENSE_AUDIO_LABELS = [
25
+ "Wireless Controller",
26
+ "DualSense",
27
+ ];
28
+ /** Matches a MediaDeviceInfo label against known DualSense patterns */
29
+ function matchesDualsenseLabel(label) {
30
+ const lower = label.toLowerCase();
31
+ return exports.DUALSENSE_AUDIO_LABELS.some((pattern) => lower.includes(pattern.toLowerCase()));
32
+ }
33
+ /**
34
+ * Find DualSense audio devices using the Web Audio API.
35
+ *
36
+ * Requires `navigator.mediaDevices` (browser only). Returns matching
37
+ * audio input and output devices based on known label patterns.
38
+ *
39
+ * Note: Device labels may be empty until the user grants microphone
40
+ * or camera permission via `getUserMedia()`.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * import { findDualsenseAudioDevices } from "dualsense-ts";
45
+ *
46
+ * const { outputs, inputs } = await findDualsenseAudioDevices();
47
+ * if (outputs.length > 0) {
48
+ * const ctx = new AudioContext({ sinkId: outputs[0].deviceId });
49
+ * // Route audio to the controller's speaker
50
+ * }
51
+ * if (inputs.length > 0) {
52
+ * const stream = await navigator.mediaDevices.getUserMedia({
53
+ * audio: { deviceId: { exact: inputs[0].deviceId } },
54
+ * });
55
+ * // Capture from the controller's microphone
56
+ * }
57
+ * ```
58
+ */
59
+ async function findDualsenseAudioDevices() {
60
+ if (typeof navigator === "undefined" ||
61
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
62
+ !navigator.mediaDevices?.enumerateDevices) {
63
+ return { outputs: [], inputs: [] };
64
+ }
65
+ const devices = await navigator.mediaDevices.enumerateDevices();
66
+ const outputs = [];
67
+ const inputs = [];
68
+ for (const device of devices) {
69
+ if (!matchesDualsenseLabel(device.label))
70
+ continue;
71
+ if (device.kind === "audiooutput")
72
+ outputs.push(device);
73
+ else if (device.kind === "audioinput")
74
+ inputs.push(device);
75
+ }
76
+ return { outputs, inputs };
77
+ }
78
+ exports.findDualsenseAudioDevices = findDualsenseAudioDevices;
79
+ //# sourceMappingURL=audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,uDAAuD;AAC1C,QAAA,yBAAyB,GAAG,MAAM,CAAC;AAEhD,kDAAkD;AACrC,QAAA,0BAA0B,GAAG,MAAM,CAAC;AAEjD;;;;;;GAMG;AACU,QAAA,sBAAsB,GAAG;IACpC,qBAAqB;IACrB,WAAW;CACH,CAAC;AAEX,uEAAuE;AACvE,SAAS,qBAAqB,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,8BAAsB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7C,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CACtC,CAAC;AACJ,CAAC;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACI,KAAK,UAAU,yBAAyB;IAC7C,IACE,OAAO,SAAS,KAAK,WAAW;QAChC,uEAAuE;QACvE,CAAC,SAAS,CAAC,YAAY,EAAE,gBAAgB,EACzC;QACA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;KACpC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,gBAAgB,EAAE,CAAC;IAChE,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,SAAS;QACnD,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACnD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC5D;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AApBD,8DAoBC"}
@@ -1,4 +1,4 @@
1
- import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad, Gyroscope, GyroscopeParams, Accelerometer, AccelerometerParams, Battery, BatteryParams, Lightbar, PlayerLeds } from "./elements";
1
+ import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad, Gyroscope, GyroscopeParams, Accelerometer, AccelerometerParams, Battery, BatteryParams, Lightbar, PlayerLeds, Audio } from "./elements";
2
2
  import { Input, InputParams } from "./input";
3
3
  import { DualsenseHID, FirmwareInfo, FactoryInfo, DualsenseColor } from "./hid";
4
4
  import { Intensity } from "./math";
@@ -78,6 +78,8 @@ export declare class Dualsense extends Input<Dualsense> {
78
78
  readonly lightbar: Lightbar;
79
79
  /** The 5 white player indicator LEDs */
80
80
  readonly playerLeds: PlayerLeds;
81
+ /** Audio volume, routing, and microphone controls */
82
+ readonly audio: Audio;
81
83
  /**
82
84
  * Buffered battery reading, sampled on a slow cadence
83
85
  * Battery readings are prone to flip-flopping, so we buffer them
@@ -111,6 +113,15 @@ export declare class Dualsense extends Input<Dualsense> {
111
113
  private get rumbleIntensity();
112
114
  /** Reset adaptive trigger feedback on both sides to the default linear feel */
113
115
  resetTriggerFeedback(): void;
116
+ /**
117
+ * Play a built-in test tone via the onboard DSP.
118
+ * Works over both USB and Bluetooth. Call `stopTestTone()` to stop.
119
+ * @param target Output destination — "speaker" (default) or "headphone"
120
+ * @param tone Which tone to play — "1khz" (default), "100hz", or "both"
121
+ */
122
+ startTestTone(target?: "speaker" | "headphone", tone?: "1khz" | "100hz" | "both"): Promise<void>;
123
+ /** Stop the DSP test tone */
124
+ stopTestTone(): Promise<void>;
114
125
  /** Check or adjust rumble intensity evenly across both sides of the controller */
115
126
  rumble(intensity?: Intensity): number;
116
127
  /** Distributes HID event values to the controller's public inputs. */
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
package/dist/dualsense.js CHANGED
@@ -47,6 +47,8 @@ class Dualsense extends input_1.Input {
47
47
  this.lightbar = new elements_1.Lightbar();
48
48
  /** The 5 white player indicator LEDs */
49
49
  this.playerLeds = new elements_1.PlayerLeds();
50
+ /** Audio volume, routing, and microphone controls */
51
+ this.audio = new elements_1.Audio();
50
52
  /**
51
53
  * Buffered battery reading, sampled on a slow cadence
52
54
  * Battery readings are prone to flip-flopping, so we buffer them
@@ -152,6 +154,12 @@ class Dualsense extends input_1.Input {
152
154
  const triggerFeedbackMemo = { left: "", right: "" };
153
155
  const lightbarMemo = { key: "" };
154
156
  const playerLedsMemo = { key: "" };
157
+ const muteLedMemo = { mode: undefined };
158
+ // Seed audio memo with the initial state so we don't override the
159
+ // controller's firmware-managed routing on connect. Audio commands
160
+ // are only sent once the user explicitly changes a setting.
161
+ const initialAudioKey = this.audio.toKey();
162
+ const audioMemo = { key: initialAudioKey, userChanged: false };
155
163
  // Mirror transport-level connect/disconnect into the connection Momentary,
156
164
  // and invalidate output memos on rising-edge connect so the output loop
157
165
  // re-pushes desired state to the new device.
@@ -162,6 +170,9 @@ class Dualsense extends input_1.Input {
162
170
  triggerFeedbackMemo.right = "";
163
171
  lightbarMemo.key = "";
164
172
  playerLedsMemo.key = "";
173
+ muteLedMemo.mode = undefined;
174
+ if (audioMemo.userChanged)
175
+ audioMemo.key = "";
165
176
  }
166
177
  });
167
178
  // Seed the initial state in case the provider was already attached.
@@ -191,7 +202,12 @@ class Dualsense extends input_1.Input {
191
202
  return;
192
203
  const leftRumble = this.left.rumble();
193
204
  const rightRumble = this.right.rumble();
194
- if (leftRumble !== rumbleMemo.left || rightRumble !== rumbleMemo.right) {
205
+ // Always resend when rumble is active. The controller has an internal
206
+ // keepalive timeout (~5s) that stops the motors if not refreshed.
207
+ if (leftRumble > 0 ||
208
+ rightRumble > 0 ||
209
+ leftRumble !== rumbleMemo.left ||
210
+ rightRumble !== rumbleMemo.right) {
195
211
  this.hid.setRumble(leftRumble * 255, rightRumble * 255);
196
212
  rumbleMemo.left = leftRumble;
197
213
  rumbleMemo.right = rightRumble;
@@ -231,6 +247,24 @@ class Dualsense extends input_1.Input {
231
247
  this.hid.setPlayerLeds(this.playerLeds.bitmask, this.playerLeds.brightness);
232
248
  playerLedsMemo.key = playerLedsKey;
233
249
  }
250
+ const muteLedMode = this.mute.ledMode;
251
+ if (muteLedMode !== muteLedMemo.mode) {
252
+ if (muteLedMode !== undefined) {
253
+ this.hid.setMicrophoneLED(muteLedMode);
254
+ }
255
+ muteLedMemo.mode = muteLedMode;
256
+ }
257
+ const audioKey = this.audio.toKey();
258
+ if (audioKey !== audioMemo.key) {
259
+ audioMemo.userChanged = true;
260
+ this.hid.setHeadphoneVolume(this.audio.headphoneVolumeRaw);
261
+ this.hid.setSpeakerVolume(this.audio.speakerVolumeRaw);
262
+ this.hid.setMicrophoneVolume(this.audio.microphoneVolumeRaw);
263
+ this.hid.setAudioFlags(this.audio.audioFlags);
264
+ this.hid.setPowerSave(this.audio.powerSaveFlags);
265
+ this.hid.setSpeakerPreamp(this.audio.preampGain, this.audio.beamForming);
266
+ audioMemo.key = audioKey;
267
+ }
234
268
  }, 1000 / 30);
235
269
  }
236
270
  /** Average rumble strength across both halves of the controller. */
@@ -242,6 +276,19 @@ class Dualsense extends input_1.Input {
242
276
  this.left.trigger.feedback.reset();
243
277
  this.right.trigger.feedback.reset();
244
278
  }
279
+ /**
280
+ * Play a built-in test tone via the onboard DSP.
281
+ * Works over both USB and Bluetooth. Call `stopTestTone()` to stop.
282
+ * @param target Output destination — "speaker" (default) or "headphone"
283
+ * @param tone Which tone to play — "1khz" (default), "100hz", or "both"
284
+ */
285
+ async startTestTone(target = "speaker", tone = "1khz") {
286
+ return this.hid.startTestTone(target, tone);
287
+ }
288
+ /** Stop the DSP test tone */
289
+ async stopTestTone() {
290
+ return this.hid.stopTestTone();
291
+ }
245
292
  /** Check or adjust rumble intensity evenly across both sides of the controller */
246
293
  rumble(intensity) {
247
294
  this.left.rumble(intensity);
@@ -1 +1 @@
1
- {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { AudioOutput, MicSelect, MicMode } from "../hid/command";
2
+ /** Audio control state for the DualSense controller */
3
+ export declare class Audio {
4
+ /** Headphone volume (0.0–1.0) */
5
+ private _headphoneVolume;
6
+ /** Speaker volume (0.0–1.0) */
7
+ private _speakerVolume;
8
+ /** Microphone volume (0.0–1.0) */
9
+ private _microphoneVolume;
10
+ /** Audio output routing */
11
+ private _output;
12
+ /** Microphone source selection */
13
+ private _micSelect?;
14
+ /** Microphone processing flags */
15
+ private _micFlags;
16
+ /** Microphone input mode */
17
+ private _micMode;
18
+ /** Speaker preamp gain (0–7) */
19
+ private _preampGain;
20
+ /** Beam forming enabled */
21
+ private _beamForming;
22
+ /** Per-subsystem mute flags */
23
+ private _muteMask;
24
+ /** Get headphone volume as a fraction (0.0–1.0) */
25
+ get headphoneVolume(): number;
26
+ /** Set headphone volume (0.0–1.0) */
27
+ setHeadphoneVolume(volume: number): void;
28
+ /** Get speaker volume as a fraction (0.0–1.0) */
29
+ get speakerVolume(): number;
30
+ /** Set speaker volume (0.0–1.0) */
31
+ setSpeakerVolume(volume: number): void;
32
+ /** Get microphone volume as a fraction (0.0–1.0) */
33
+ get microphoneVolume(): number;
34
+ /** Set microphone volume (0.0–1.0) */
35
+ setMicrophoneVolume(volume: number): void;
36
+ /** Get audio output routing */
37
+ get output(): AudioOutput;
38
+ /** Set audio output routing */
39
+ setOutput(output: AudioOutput): void;
40
+ /** Get speaker preamp gain (0–7) */
41
+ get preampGain(): number;
42
+ /** Set speaker preamp gain (0–7) and optional beam forming */
43
+ setPreamp(gain: number, beamForming?: boolean): void;
44
+ /** Whether beam forming is enabled */
45
+ get beamForming(): boolean;
46
+ /** Set microphone source */
47
+ setMicSelect(source: MicSelect): void;
48
+ /** Set microphone processing flags (echo cancellation, noise cancellation) */
49
+ setMicFlags(flags: number): void;
50
+ /** Set microphone input mode */
51
+ setMicMode(mode: MicMode): void;
52
+ /** Mute the speaker */
53
+ muteSpeaker(muted?: boolean): void;
54
+ /** Mute the headphone output */
55
+ muteHeadphone(muted?: boolean): void;
56
+ /** Mute the microphone */
57
+ muteMicrophone(muted?: boolean): void;
58
+ /** Whether the speaker is muted */
59
+ get speakerMuted(): boolean;
60
+ /** Whether headphone output is muted */
61
+ get headphoneMuted(): boolean;
62
+ /** Whether the microphone is muted */
63
+ get microphoneMuted(): boolean;
64
+ /** Raw headphone volume byte (0x00–0x7F) */
65
+ get headphoneVolumeRaw(): number;
66
+ /** Raw speaker volume byte (0x00–0x64) */
67
+ get speakerVolumeRaw(): number;
68
+ /** Raw microphone volume byte (0x00–0x40) */
69
+ get microphoneVolumeRaw(): number;
70
+ /** Composed audio flags byte */
71
+ get audioFlags(): number;
72
+ /** Power save mute mask */
73
+ get powerSaveFlags(): number;
74
+ /** Change-detection key for the output loop */
75
+ toKey(): string;
76
+ }
77
+ //# sourceMappingURL=audio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio.d.ts","sourceRoot":"","sources":["../../src/elements/audio.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAW,OAAO,EAAa,MAAM,gBAAgB,CAAC;AAErF,uDAAuD;AACvD,qBAAa,KAAK;IAChB,iCAAiC;IACjC,OAAO,CAAC,gBAAgB,CAAO;IAC/B,+BAA+B;IAC/B,OAAO,CAAC,cAAc,CAAO;IAC7B,kCAAkC;IAClC,OAAO,CAAC,iBAAiB,CAAO;IAChC,2BAA2B;IAC3B,OAAO,CAAC,OAAO,CAAyB;IACxC,kCAAkC;IAClC,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,kCAAkC;IAClC,OAAO,CAAC,SAAS,CAAK;IACtB,4BAA4B;IAC5B,OAAO,CAAC,QAAQ,CAAmB;IACnC,gCAAgC;IAChC,OAAO,CAAC,WAAW,CAAK;IACxB,2BAA2B;IAC3B,OAAO,CAAC,YAAY,CAAS;IAC7B,+BAA+B;IAC/B,OAAO,CAAC,SAAS,CAAK;IAEtB,mDAAmD;IACnD,IAAW,eAAe,IAAI,MAAM,CAEnC;IAED,qCAAqC;IAC9B,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI/C,iDAAiD;IACjD,IAAW,aAAa,IAAI,MAAM,CAEjC;IAED,mCAAmC;IAC5B,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAI7C,oDAAoD;IACpD,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,sCAAsC;IAC/B,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhD,+BAA+B;IAC/B,IAAW,MAAM,IAAI,WAAW,CAE/B;IAED,+BAA+B;IACxB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAI3C,oCAAoC;IACpC,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,8DAA8D;IACvD,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI;IAO3D,sCAAsC;IACtC,IAAW,WAAW,IAAI,OAAO,CAEhC;IAED,4BAA4B;IACrB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAI5C,8EAA8E;IACvE,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIvC,gCAAgC;IACzB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAItC,uBAAuB;IAChB,WAAW,CAAC,KAAK,UAAO,GAAG,IAAI;IAKtC,gCAAgC;IACzB,aAAa,CAAC,KAAK,UAAO,GAAG,IAAI;IAKxC,0BAA0B;IACnB,cAAc,CAAC,KAAK,UAAO,GAAG,IAAI;IAKzC,mCAAmC;IACnC,IAAW,YAAY,IAAI,OAAO,CAEjC;IAED,wCAAwC;IACxC,IAAW,cAAc,IAAI,OAAO,CAEnC;IAED,sCAAsC;IACtC,IAAW,eAAe,IAAI,OAAO,CAEpC;IAID,4CAA4C;IAC5C,IAAW,kBAAkB,IAAI,MAAM,CAEtC;IAED,0CAA0C;IAC1C,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,6CAA6C;IAC7C,IAAW,mBAAmB,IAAI,MAAM,CAEvC;IAED,gCAAgC;IAChC,IAAW,UAAU,IAAI,MAAM,CAE9B;IAED,2BAA2B;IAC3B,IAAW,cAAc,IAAI,MAAM,CAElC;IAED,+CAA+C;IACxC,KAAK,IAAI,MAAM;CAGvB"}