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.
- package/README.md +127 -15
- package/dist/audio.d.ts +56 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +79 -0
- package/dist/audio.js.map +1 -0
- package/dist/dualsense.d.ts +12 -1
- package/dist/dualsense.d.ts.map +1 -1
- package/dist/dualsense.js +48 -1
- package/dist/dualsense.js.map +1 -1
- package/dist/elements/audio.d.ts +77 -0
- package/dist/elements/audio.d.ts.map +1 -0
- package/dist/elements/audio.js +146 -0
- package/dist/elements/audio.js.map +1 -0
- package/dist/elements/index.d.ts +1 -0
- package/dist/elements/index.d.ts.map +1 -1
- package/dist/elements/index.js +1 -0
- package/dist/elements/index.js.map +1 -1
- package/dist/elements/mute.d.ts +7 -0
- package/dist/elements/mute.d.ts.map +1 -1
- package/dist/elements/mute.js +8 -0
- package/dist/elements/mute.js.map +1 -1
- package/dist/hid/command.d.ts +71 -16
- package/dist/hid/command.d.ts.map +1 -1
- package/dist/hid/command.js +43 -1
- package/dist/hid/command.js.map +1 -1
- package/dist/hid/dsp.d.ts +130 -0
- package/dist/hid/dsp.d.ts.map +1 -0
- package/dist/hid/dsp.js +136 -0
- package/dist/hid/dsp.js.map +1 -0
- package/dist/hid/dualsense_hid.d.ts +50 -3
- package/dist/hid/dualsense_hid.d.ts.map +1 -1
- package/dist/hid/dualsense_hid.js +134 -3
- package/dist/hid/dualsense_hid.js.map +1 -1
- package/dist/hid/index.d.ts +1 -0
- package/dist/hid/index.d.ts.map +1 -1
- package/dist/hid/index.js +1 -0
- package/dist/hid/index.js.map +1 -1
- package/dist/hid/node_hid_provider.d.ts.map +1 -1
- package/dist/hid/node_hid_provider.js +22 -2
- package/dist/hid/node_hid_provider.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/nodehid_example/dsp_explore.ts +288 -0
- package/nodehid_example/single.ts +25 -0
- package/nodehid_example/verify.ts +499 -0
- package/package.json +4 -2
- package/src/audio.ts +91 -0
- package/src/dualsense.ts +61 -1
- package/src/elements/audio.ts +163 -0
- package/src/elements/index.ts +1 -0
- package/src/elements/mute.ts +14 -0
- package/src/hid/command.ts +75 -14
- package/src/hid/dsp.ts +132 -0
- package/src/hid/dualsense_hid.ts +184 -4
- package/src/hid/index.ts +1 -0
- package/src/hid/node_hid_provider.ts +21 -2
- package/src/index.ts +1 -0
- package/webhid_example/build/asset-manifest.json +3 -3
- package/webhid_example/build/index.html +1 -1
- package/webhid_example/build/static/js/main.e64bfdb3.js +3 -0
- package/webhid_example/build/static/js/main.e64bfdb3.js.map +1 -0
- package/webhid_example/src/App.tsx +49 -24
- package/webhid_example/src/hud/AudioControls.tsx +787 -0
- package/webhid_example/src/hud/Debugger.tsx +6 -1
- package/webhid_example/src/hud/TouchpadVisualization.tsx +2 -2
- package/webhid_example/src/hud/UtilityButtons.tsx +30 -5
- package/webhid_example/src/hud/index.tsx +1 -0
- package/LINUX_HID.md +0 -85
- package/webhid_example/build/static/js/main.2ba4cfae.js +0 -3
- package/webhid_example/build/static/js/main.2ba4cfae.js.map +0 -1
- /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**
|
|
14
|
-
- **Full haptics control**
|
|
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
|
|
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
|
-
//
|
|
303
|
-
|
|
304
|
-
|
|
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
|
-
|
|
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
|
|
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 5
|
|
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
|
-
###
|
|
617
|
+
### Audio streaming requires USB
|
|
519
618
|
|
|
520
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
package/dist/audio.d.ts
ADDED
|
@@ -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"}
|
package/dist/dualsense.d.ts
CHANGED
|
@@ -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. */
|
package/dist/dualsense.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,UAAU,
|
|
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
|
-
|
|
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);
|
package/dist/dualsense.js.map
CHANGED
|
@@ -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"}
|