@phystack/hub-device 4.5.12-dev → 4.5.14-dev
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/dist/sysinfo/node.d.ts.map +1 -1
- package/dist/sysinfo/node.js +11 -61
- package/dist/sysinfo/node.js.map +1 -1
- package/package.json +4 -4
- package/src/sysinfo/node.ts +121 -218
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":"AAgZA,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAwB7D;AAUD,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,UAAU,CAapD;AAmaD,wBAAsB,oBAAoB,iBA+DzC;AAaD,eAAe,oBAAoB,CAAC"}
|
package/dist/sysinfo/node.js
CHANGED
|
@@ -18,9 +18,14 @@ const PULSEAUDIO_COMMANDS = {
|
|
|
18
18
|
LIST_SINKS: 'pactl list sinks',
|
|
19
19
|
LIST_SOURCES: 'pactl list sources',
|
|
20
20
|
LIST_CARDS: 'pactl list cards',
|
|
21
|
+
LIST_CARDS_SHORT: 'pactl list cards short',
|
|
21
22
|
LOAD_ALSA_SINK: (hwDevice, sinkName, description) => `pactl load-module module-alsa-sink device=${hwDevice} sink_name=${sinkName} sink_properties="device.description=${description}"`,
|
|
22
23
|
LOAD_ALSA_SOURCE: (hwDevice, sourceName, description) => `pactl load-module module-alsa-source device=${hwDevice} source_name=${sourceName} source_properties="device.description=${description}"`,
|
|
23
24
|
};
|
|
25
|
+
const ALSA_COMMANDS = {
|
|
26
|
+
APLAY_LIST: 'aplay -l 2>/dev/null',
|
|
27
|
+
ARECORD_LIST: 'arecord -l 2>/dev/null',
|
|
28
|
+
};
|
|
24
29
|
const PULSEAUDIO_TIMEOUTS = {
|
|
25
30
|
INFO_CHECK: 2000,
|
|
26
31
|
KILL: 2000,
|
|
@@ -154,7 +159,7 @@ function parseAudioDevice(block, isInput) {
|
|
|
154
159
|
else {
|
|
155
160
|
try {
|
|
156
161
|
const env = getPulseAudioEnv();
|
|
157
|
-
const cardsOutput = (0, child_process_1.execSync)(
|
|
162
|
+
const cardsOutput = (0, child_process_1.execSync)(PULSEAUDIO_COMMANDS.LIST_CARDS, {
|
|
158
163
|
encoding: 'utf-8',
|
|
159
164
|
timeout: 2000,
|
|
160
165
|
stdio: 'pipe',
|
|
@@ -193,7 +198,7 @@ function parseAudioDevice(block, isInput) {
|
|
|
193
198
|
const cardNumber = altMatch[3];
|
|
194
199
|
try {
|
|
195
200
|
const env = getPulseAudioEnv();
|
|
196
|
-
const cardsOutput = (0, child_process_1.execSync)(
|
|
201
|
+
const cardsOutput = (0, child_process_1.execSync)(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
|
|
197
202
|
encoding: 'utf-8',
|
|
198
203
|
timeout: 2000,
|
|
199
204
|
stdio: 'pipe',
|
|
@@ -215,7 +220,7 @@ function parseAudioDevice(block, isInput) {
|
|
|
215
220
|
if (cardNumber !== undefined) {
|
|
216
221
|
try {
|
|
217
222
|
const env = getPulseAudioEnv();
|
|
218
|
-
const cardsOutput = (0, child_process_1.execSync)(
|
|
223
|
+
const cardsOutput = (0, child_process_1.execSync)(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
|
|
219
224
|
encoding: 'utf-8',
|
|
220
225
|
timeout: 2000,
|
|
221
226
|
stdio: 'pipe',
|
|
@@ -237,58 +242,6 @@ function parseAudioDevice(block, isInput) {
|
|
|
237
242
|
}
|
|
238
243
|
}
|
|
239
244
|
}
|
|
240
|
-
if (device.identifier && device.cardName) {
|
|
241
|
-
const cardName = device.cardName;
|
|
242
|
-
const hasProfile = device.identifier.match(/\.(hdmi-|analog-|stereo|mono|surround|a2dp|sco)/);
|
|
243
|
-
if (!hasProfile) {
|
|
244
|
-
try {
|
|
245
|
-
const env = getPulseAudioEnv();
|
|
246
|
-
const cardInfo = (0, child_process_1.execSync)(`pactl list cards | grep -A 100 "Name: ${cardName}"`, {
|
|
247
|
-
encoding: 'utf-8',
|
|
248
|
-
timeout: 2000,
|
|
249
|
-
stdio: 'pipe',
|
|
250
|
-
env,
|
|
251
|
-
});
|
|
252
|
-
const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
|
|
253
|
-
if (cardIdMatch) {
|
|
254
|
-
const cardId = cardIdMatch[1];
|
|
255
|
-
const isInputDevice = isInput || device.identifier.includes('input') || device.identifier.includes('source');
|
|
256
|
-
const profileType = isInputDevice ? 'input' : 'output';
|
|
257
|
-
const activeProfileMatch = cardInfo.match(new RegExp(`^\\s+(${profileType}:[^:]+):[^\\n]*\\*[^\\n]*$`, 'm'));
|
|
258
|
-
if (activeProfileMatch) {
|
|
259
|
-
const profile = activeProfileMatch[1];
|
|
260
|
-
const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), '');
|
|
261
|
-
const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
|
|
262
|
-
if (prefixMatch) {
|
|
263
|
-
const prefix = prefixMatch[1];
|
|
264
|
-
const type = prefixMatch[2];
|
|
265
|
-
device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
else {
|
|
269
|
-
const anyProfileMatch = cardInfo.match(new RegExp(`^\\s+(${profileType}:[^:]+):`, 'm'));
|
|
270
|
-
if (anyProfileMatch) {
|
|
271
|
-
const profile = anyProfileMatch[1];
|
|
272
|
-
const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), '');
|
|
273
|
-
const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
|
|
274
|
-
if (prefixMatch) {
|
|
275
|
-
const prefix = prefixMatch[1];
|
|
276
|
-
const type = prefixMatch[2];
|
|
277
|
-
const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
|
|
278
|
-
if (cardIdMatch) {
|
|
279
|
-
const cardId = cardIdMatch[1];
|
|
280
|
-
device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
catch (error) {
|
|
288
|
-
console.log(`[Audio] Failed to convert identifier to flat format: ${error}`);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
245
|
device.label = createDeviceLabel(device, ports, isInput, device.formFactor, device.bus, false, deviceAvailable, device.activePort);
|
|
293
246
|
const cleanDevice = {
|
|
294
247
|
identifier: device.identifier,
|
|
@@ -353,10 +306,7 @@ function createDeviceLabel(device, ports, isInput, formFactor, bus, isDefault, a
|
|
|
353
306
|
if (available !== undefined) {
|
|
354
307
|
statusParts.push(available ? 'Available' : 'Unavailable');
|
|
355
308
|
}
|
|
356
|
-
|
|
357
|
-
return `${baseLabel} (${statusParts.join(', ')})`;
|
|
358
|
-
}
|
|
359
|
-
return baseLabel;
|
|
309
|
+
return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
|
|
360
310
|
}
|
|
361
311
|
function discoverPulseAudioSocket() {
|
|
362
312
|
try {
|
|
@@ -540,7 +490,7 @@ function loadAlsaDevicesIntoPulseAudio() {
|
|
|
540
490
|
let outputDevices = [];
|
|
541
491
|
let inputDevices = [];
|
|
542
492
|
try {
|
|
543
|
-
const aplayOutput = (0, child_process_1.execSync)(
|
|
493
|
+
const aplayOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.APLAY_LIST, {
|
|
544
494
|
encoding: 'utf-8',
|
|
545
495
|
timeout: 3000,
|
|
546
496
|
});
|
|
@@ -551,7 +501,7 @@ function loadAlsaDevicesIntoPulseAudio() {
|
|
|
551
501
|
console.log(' No ALSA output devices found or aplay failed');
|
|
552
502
|
}
|
|
553
503
|
try {
|
|
554
|
-
const arecordOutput = (0, child_process_1.execSync)(
|
|
504
|
+
const arecordOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.ARECORD_LIST, {
|
|
555
505
|
encoding: 'utf-8',
|
|
556
506
|
timeout: 3000,
|
|
557
507
|
});
|
package/dist/sysinfo/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/sysinfo/node.ts"],"names":[],"mappings":";;;;;AAgZA,4DAwBC;AAUD,4CAaC;AAmaD,oDA+DC;AAj6BD,0EAAmC;AACnC,iDAAyC;AAMzC,MAAM,mBAAmB,GAAG;IAC1B,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,mCAAmC;IACzC,YAAY,EAAE,2DAA2D;IACzE,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,0BAA0B;IACxC,gBAAgB,EAAE,oCAAoC;IACtD,UAAU,EAAE,kBAAkB;IAC9B,YAAY,EAAE,oBAAoB;IAClC,UAAU,EAAE,kBAAkB;IAC9B,gBAAgB,EAAE,wBAAwB;IAC1C,cAAc,EAAE,CAAC,QAAgB,EAAE,QAAgB,EAAE,WAAmB,EAAE,EAAE,CAC1E,6CAA6C,QAAQ,cAAc,QAAQ,wCAAwC,WAAW,GAAG;IACnI,gBAAgB,EAAE,CAAC,QAAgB,EAAE,UAAkB,EAAE,WAAmB,EAAE,EAAE,CAC9E,+CAA+C,QAAQ,gBAAgB,UAAU,0CAA0C,WAAW,GAAG;CACnI,CAAC;AAEX,MAAM,aAAa,GAAG;IACpB,UAAU,EAAE,sBAAsB;IAClC,YAAY,EAAE,wBAAwB;CAC9B,CAAC;AAEX,MAAM,mBAAmB,GAAG;IAC1B,UAAU,EAAE,IAAI;IAChB,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,YAAY,EAAE,IAAI;IAClB,WAAW,EAAE,IAAI;IACjB,YAAY,EAAE,IAAI;CACV,CAAC;AAGX,IAAI,oBAAwC,CAAC;AAS7C,SAAS,gBAAgB,CAAC,KAAa,EAAE,OAAgB;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAE5B,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC5D,IAAI,SAAS,EAAE,CAAC;gBACb,MAAc,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAChD,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACvE,IAAI,aAAa,EAAE,CAAC;gBACjB,MAAc,CAAC,WAAW,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACtC,IAAI,KAAK;gBAAE,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpD,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7C,MAAc,CAAC,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,8BAA+B,MAAc,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,cAAc,GAAG,IAAI,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAE1B,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,cAAc,GAAG,KAAK,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,wCAAwC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;YAC5E,CAAC;iBAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAEtD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBACtE,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACrC,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAC5C,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;oBAEjC,MAAM,IAAI,GAAc;wBACtB,IAAI,EAAE,QAAQ;wBACd,WAAW,EAAE,eAAe;qBAC7B,CAAC;oBAGF,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;wBACvD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;wBAC7D,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CACtC,gEAAgE,CACjE,CAAC;wBAEF,IAAI,SAAS;4BAAE,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBAC/C,IAAI,aAAa;4BAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAGlE,IAAI,cAAc,EAAE,CAAC;4BACnB,MAAM,QAAQ,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;4BACjD,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;gCACpF,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;4BACzB,CAAC;iCAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gCAC9C,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;4BACzB,CAAC;iCAAM,CAAC;gCACN,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;4BACxB,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,MAAM,eAAe,EAAE,CAAC,CAAC;oBACrE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;YACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACT,MAAc,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,KAAK;gBAAG,MAAc,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACzC,IAAI,KAAK;gBAAG,MAAc,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAGD,IAAI,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAEpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC;QAC9B,OAAO,CAAC,GAAG,CACT,kBAAkB,MAAM,CAAC,UAAU,QAAQ,KAAK,CAAC,MAAM,mBAAoB,MAAc,CAAC,UAAU,EAAE,CACvG,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,MAAM,CAAC,UAAU,wBAAwB,CAAC,CAAC;IAC3E,CAAC;IAKD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,IAAI,CAAC,CAAC;IAC/D,IAAI,eAAe,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IAGhD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAClD,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;iBAAM,CAAC;gBAEN,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;oBAC/B,MAAM,WAAW,GAAG,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,UAAU,EAAE;wBAC3D,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,MAAM;wBACb,GAAG;qBACJ,CAAC,CAAC;oBAEH,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;oBAClE,IAAI,WAAW,EAAE,CAAC;wBAChB,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;wBAEjC,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CACjC,IAAI,MAAM,CACR,eAAe,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,kBAAkB,EAClH,GAAG,CACJ,CACF,CAAC;wBACF,IAAI,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;4BACzD,eAAe,GAAG,IAAI,CAAC;wBACzB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;gBAEjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IASD,IAAI,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,CACtC,iEAAiE,CAClE,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAc,CAAC,QAAQ,GAAG,GAAG,MAAM,SAAS,MAAM,EAAE,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACnF,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAc,CAAC,QAAQ,GAAG,GAAG,MAAM,SAAS,MAAM,EAAE,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,kDAAkD,CAAC,CAAC;YAC9F,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;oBAC/B,MAAM,WAAW,GAAG,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,gBAAgB,EAAE;wBACjE,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,MAAM;wBACb,GAAG;qBACJ,CAAC,CAAC;oBACH,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC;oBAC1F,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;wBAC/D,IAAI,aAAa,EAAE,CAAC;4BACjB,MAAc,CAAC,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;wBAC9C,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;gBAEjB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAI,MAAc,CAAC,UAAU,CAAC;gBAC9C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;wBAC/B,MAAM,WAAW,GAAG,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,gBAAgB,EAAE;4BACjE,QAAQ,EAAE,OAAO;4BACjB,OAAO,EAAE,IAAI;4BACb,KAAK,EAAE,MAAM;4BACb,GAAG;yBACJ,CAAC,CAAC;wBACH,MAAM,QAAQ,GAAG,WAAW;6BACzB,KAAK,CAAC,IAAI,CAAC;6BACX,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,UAAU,EAAE,CAAC,CAAC,CAAC;wBACpD,IAAI,QAAQ,EAAE,CAAC;4BACb,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;4BAC/D,IAAI,aAAa,EAAE,CAAC;gCACjB,MAAc,CAAC,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;4BAC9C,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;oBAEjB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAID,MAAM,CAAC,KAAK,GAAG,iBAAiB,CAC9B,MAAM,EACN,KAAK,EACL,OAAO,EACN,MAAc,CAAC,UAAU,EACzB,MAAc,CAAC,GAAG,EACnB,KAAK,EACL,eAAe,EACd,MAAc,CAAC,UAAU,CAC3B,CAAC;IAIF,MAAM,WAAW,GAAyB;QACxC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC;IAEF,OAAO,WAA0B,CAAC;AACpC,CAAC;AAgBD,SAAS,iBAAiB,CACxB,MAA4B,EAC5B,KAAkB,EAClB,OAAgB,EAChB,UAAmB,EACnB,GAAY,EACZ,SAAmB,EACnB,SAAmB,EACnB,UAAmB;IAEnB,MAAM,WAAW,GAAI,MAAc,CAAC,WAAW,CAAC;IAChD,IAAI,SAAS,GAAG,EAAE,CAAC;IAEnB,MAAM,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAGvF,IAAI,WAAW,EAAE,CAAC;QAChB,SAAS,GAAG,GAAG,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC;IACvE,CAAC;SAAM,IAAI,cAAc,IAAI,cAAc,CAAC,WAAW,EAAE,CAAC;QACxD,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC;QAG5C,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YAClD,SAAS,GAAG,YAAY,CAAC;QAC3B,CAAC;aAAM,IACL,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;YACvC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC9C,CAAC;YACD,SAAS,GAAG,cAAc,CAAC;QAC7B,CAAC;aAAM,IACL,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC;YAC7C,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,EACtC,CAAC;YACD,SAAS,GAAG,YAAY,CAAC;QAC3B,CAAC;aAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,SAAS,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC/C,CAAC;aAAM,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACtD,SAAS,GAAG,UAAU,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC;QAC9D,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QAC9B,SAAS,GAAG,GAAG,MAAM,CAAC,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,CAAC,UAAU,IAAI,sBAAsB,CAAC;IAC1D,CAAC;IAGD,IACE,MAAM,CAAC,WAAW;QAClB,SAAS,KAAK,MAAM,CAAC,WAAW;QAChC,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EACvC,CAAC;QACD,SAAS,GAAG,GAAG,MAAM,CAAC,WAAW,MAAM,SAAS,EAAE,CAAC;IACrD,CAAC;IAGD,IAAI,UAAU,IAAI,UAAU,KAAK,UAAU,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/E,SAAS,GAAG,GAAG,SAAS,KAAK,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3F,CAAC;IAGD,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACjF,SAAS,GAAG,GAAG,SAAS,KAAK,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;IACpD,CAAC;IAGD,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,SAAS,EAAE,CAAC;QACd,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACzF,CAAC;AAUD,SAAgB,wBAAwB;IACtC,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAA,wBAAQ,EACzB,qEAAqE,EACrE;YACE,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,MAAM;SACd,CACF,CAAC,IAAI,EAAE,CAAC;QAET,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,GAAG,UAAU,SAAS,CAAC;YAC1C,IAAI,CAAC;gBACH,IAAA,wBAAQ,EAAC,YAAY,UAAU,GAAG,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;gBACvD,OAAO,UAAU,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;IAEjB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAUD,SAAgB,gBAAgB;IAC9B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,oBAAoB,GAAG,wBAAwB,EAAE,CAAC;QAClD,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,iCAAiC,oBAAoB,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,oBAAoB,EAAE,CAAC;QACzB,GAAG,CAAC,YAAY,GAAG,QAAQ,oBAAoB,EAAE,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAQD,SAAS,eAAe;IACtB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC1B,oBAAoB,GAAG,wBAAwB,EAAE,CAAC;QAClD,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,0CAA0C,oBAAoB,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAGD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,IAAI,EAAE;YACjC,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,mBAAmB,CAAC,UAAU;YACvC,KAAK,EAAE,MAAM;YACb,GAAG;SACJ,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;QAEpD,6BAA6B,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxE,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAGD,IAAI,CAAC;QACH,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,IAAI,EAAE;YACjC,OAAO,EAAE,mBAAmB,CAAC,IAAI;YACjC,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtD,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,YAAY,EAAE;YACzC,OAAO,EAAE,mBAAmB,CAAC,KAAK;YAClC,KAAK,EAAE,MAAM;SACd,CAAC,CAAC;QAEH,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAEtD,oBAAoB,GAAG,wBAAwB,EAAE,CAAC;QAClD,IAAI,oBAAoB,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,iCAAiC,oBAAoB,EAAE,CAAC,CAAC;QACvE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,IAAI,EAAE;YACjC,OAAO,EAAE,mBAAmB,CAAC,UAAU;YACvC,KAAK,EAAE,MAAM;YACb,GAAG;SACJ,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAEjD,6BAA6B,EAAE,CAAC;QAEhC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,+BAA+B,EAC/B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,CAAC,KAAK,CAAC,gFAAgF,CAAC,CAAC;QAChG,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAkBD,SAAS,gBAAgB,CAAC,WAAmB;IAC3C,MAAM,OAAO,GAAiB,EAAE,CAAC;IAGjC,MAAM,KAAK,GAAG,0DAA0D,CAAC;IACzE,IAAI,KAAK,CAAC;IAEV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE7B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,MAAM;YACN,IAAI;YACJ,QAAQ,EAAE,MAAM,IAAI,IAAI,MAAM,EAAE;SACjC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AASD,SAAS,iBAAiB,CAAC,QAAgB,EAAE,OAAgB;IAC3D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,UAAU,CAAC;QAC5F,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,OAAO,EAAE;YAC/B,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,IAAI;YACb,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,IAAI,MAAM,CAAC,0BAA0B,MAAM,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,wBAAwB,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;QAErE,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACjD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AASD,SAAS,oBAAoB,CAAC,UAAsB,EAAE,OAAgB;IACpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO;YACtB,CAAC,CAAC,cAAc,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE;YACtD,CAAC,CAAC,eAAe,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QAG1D,MAAM,eAAe,GAAG,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC,OAAO,CACzE,iBAAiB,EACjB,GAAG,CACJ,CAAC;QAEF,MAAM,OAAO,GAAG,OAAO;YACrB,CAAC,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC;YACtF,CAAC,CAAC,mBAAmB,CAAC,cAAc,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QAEvF,OAAO,CAAC,GAAG,CACT,cAAc,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,UAAU,CAAC,QAAQ,KAAK,UAAU,CAAC,IAAI,EAAE,CAC3F,CAAC;QAEF,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,IAAA,wBAAQ,EAAC,OAAO,EAAE;YAChB,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,MAAM;YACb,GAAG;SACJ,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CACT,sBAAsB,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,QAAQ,UAAU,CAAC,QAAQ,GAAG,EAC/E,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAWD,SAAS,6BAA6B;IACpC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAG3E,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,YAAY,EAAE;gBACzD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,mBAAmB,CAAC,YAAY;gBACzC,GAAG;aACJ,CAAC,CAAC;YAEH,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;gBAChE,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,gBAAgB,EAAE;oBAC7C,OAAO,EAAE,mBAAmB,CAAC,WAAW;oBACxC,KAAK,EAAE,MAAM;oBACb,GAAG;iBACJ,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACnF,CAAC;QAGD,IAAI,aAAa,GAAiB,EAAE,CAAC;QACrC,IAAI,YAAY,GAAiB,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,wBAAQ,EAAC,aAAa,CAAC,UAAU,EAAE;gBACrD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,aAAa,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,CAAC,MAAM,wBAAwB,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,IAAA,wBAAQ,EAAC,aAAa,CAAC,YAAY,EAAE;gBACzD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;YACH,YAAY,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,YAAY,CAAC,MAAM,uBAAuB,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QACjE,CAAC;QAGD,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC;gBAC/C,IAAI,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;oBACxC,YAAY,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,+BAA+B,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;QAED,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;YAClC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC9C,IAAI,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;oBACvC,YAAY,EAAE,CAAC;gBACjB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;QAED,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,aAAa,YAAY,oDAAoD,CAAC,CAAC;QAC7F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,wEAAwE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CACT,+CAA+C,EAC/C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;AACH,CAAC;AAOD,SAAS,iBAAiB;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAG,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,IAAI,EAAE;YACpD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,mBAAmB,CAAC,UAAU;YACvC,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,gBAAgB,GAAG,UAAU,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAChE,MAAM,kBAAkB,GAAG,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAEpE,OAAO;YACL,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;YAC1C,aAAa,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;SAC/C,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;QACvD,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAOD,SAAS,eAAe;IACtB,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;QAChE,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,iBAAiB,EAAE,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,WAAW,qBAAqB,aAAa,EAAE,CAAC,CAAC;IAE9E,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,MAAM,GAAkB,EAAE,CAAC;IAGjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,UAAU,EAAE;YAC3D,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,mBAAmB,CAAC,YAAY;YACzC,GAAG;SACJ,CAAC,CAAC;QACH,WAAW;aACR,KAAK,CAAC,UAAU,CAAC;aACjB,KAAK,CAAC,CAAC,CAAC;aACR,OAAO,CAAC,KAAK,CAAC,EAAE;YACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC9C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,KAAK,WAAW,CAAC;gBAEpD,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACtC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC/B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;wBACzD,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,YAAY,CAAC;wBAC7C,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,MAAM,wCAAwC,CAAC,CAAC;IAClF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,iCAAiC,EACjC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;IAGD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,gBAAgB,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAA,wBAAQ,EAAC,mBAAmB,CAAC,YAAY,EAAE;YAC/D,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,mBAAmB,CAAC,YAAY;YACzC,GAAG;SACJ,CAAC,CAAC;QACH,aAAa;aACV,KAAK,CAAC,YAAY,CAAC;aACnB,KAAK,CAAC,CAAC,CAAC;aACR,OAAO,CAAC,KAAK,CAAC,EAAE;YACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7C,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,MAAM,CAAC,UAAU,KAAK,aAAa,CAAC;gBAEtD,IAAI,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;wBACtC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;4BAC/B,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;wBACzD,CAAC;6BAAM,CAAC;4BACN,MAAM,CAAC,KAAK,GAAG,GAAG,MAAM,CAAC,KAAK,YAAY,CAAC;wBAC7C,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,uCAAuC,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,gCAAgC,EAChC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACvD,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QACzC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAEM,KAAK,UAAU,oBAAoB;IAMxC,MAAM,WAAW,GAAG;QAClB,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,GAAG;QACb,OAAO,EAAE,GAAG;QACZ,IAAI,EAAE,GAAG;QACT,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,GAAG;QACR,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,GAAG;QACpB,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,YAAY,EAAE,GAAG;QACjB,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,GAAG;QACZ,EAAE,EAAE,GAAG;QACP,IAAI,EAAE,GAAG;QACT,YAAY,EAAE,GAAG;QACjB,eAAe,EAAE,GAAG;QACpB,IAAI,EAAE,GAAG;QACT,IAAI,EAAE,GAAG;QACT,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,GAAG;KACZ,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,2BAAE,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAGvC,IAAI,SAAS,GAAG,MAAM,2BAAE,CAAC,iBAAiB,EAAE,CAAC;IAE7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAGD,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,CAAC;QACzC,GAAG,KAAK;QACR,IAAI,EACF,KAAK,CAAC,IAAI;YACV,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;gBACzF,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,SAAS,CAAC;KACjB,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IAEnC,MAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACvC,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAGD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpD,OAAO,UAAU,CAAC;AACpB,CAAC;AAaD,kBAAe,oBAAoB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phystack/hub-device",
|
|
3
|
-
"version": "4.5.
|
|
3
|
+
"version": "4.5.14-dev",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
"format:check": "prettier --check \"src/**/*.{ts,js,json,md}\""
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@phystack/axios-proxy": "4.5.
|
|
16
|
-
"@phystack/socket.io-proxy": "4.5.
|
|
15
|
+
"@phystack/axios-proxy": "4.5.14-dev",
|
|
16
|
+
"@phystack/socket.io-proxy": "4.5.14-dev",
|
|
17
17
|
"async-mutex": "^0.5.0",
|
|
18
18
|
"axios-retry": "^4.4.1",
|
|
19
19
|
"bufferutil": "^4.0.8",
|
|
@@ -35,5 +35,5 @@
|
|
|
35
35
|
},
|
|
36
36
|
"test": "react-scripts test",
|
|
37
37
|
"test:coverage": "npm run test -- --coverage --watchAll=false",
|
|
38
|
-
"gitHead": "
|
|
38
|
+
"gitHead": "f96a9182afec6ff6f12db80313dcb663b44feee0"
|
|
39
39
|
}
|
package/src/sysinfo/node.ts
CHANGED
|
@@ -2,9 +2,9 @@ import si from 'systeminformation';
|
|
|
2
2
|
import { execSync } from 'child_process';
|
|
3
3
|
import { AudioDevice, AudioDevices, AudioPort } from '../types/twin.types';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
/**
|
|
6
|
+
* PulseAudio commands
|
|
7
|
+
*/
|
|
8
8
|
const PULSEAUDIO_COMMANDS = {
|
|
9
9
|
INFO: 'pactl info',
|
|
10
10
|
KILL: 'pulseaudio -k 2>/dev/null || true',
|
|
@@ -15,12 +15,18 @@ const PULSEAUDIO_COMMANDS = {
|
|
|
15
15
|
LIST_SINKS: 'pactl list sinks',
|
|
16
16
|
LIST_SOURCES: 'pactl list sources',
|
|
17
17
|
LIST_CARDS: 'pactl list cards',
|
|
18
|
+
LIST_CARDS_SHORT: 'pactl list cards short',
|
|
18
19
|
LOAD_ALSA_SINK: (hwDevice: string, sinkName: string, description: string) =>
|
|
19
20
|
`pactl load-module module-alsa-sink device=${hwDevice} sink_name=${sinkName} sink_properties="device.description=${description}"`,
|
|
20
21
|
LOAD_ALSA_SOURCE: (hwDevice: string, sourceName: string, description: string) =>
|
|
21
22
|
`pactl load-module module-alsa-source device=${hwDevice} source_name=${sourceName} source_properties="device.description=${description}"`,
|
|
22
23
|
} as const;
|
|
23
24
|
|
|
25
|
+
const ALSA_COMMANDS = {
|
|
26
|
+
APLAY_LIST: 'aplay -l 2>/dev/null',
|
|
27
|
+
ARECORD_LIST: 'arecord -l 2>/dev/null',
|
|
28
|
+
} as const;
|
|
29
|
+
|
|
24
30
|
const PULSEAUDIO_TIMEOUTS = {
|
|
25
31
|
INFO_CHECK: 2000,
|
|
26
32
|
KILL: 2000,
|
|
@@ -30,11 +36,15 @@ const PULSEAUDIO_TIMEOUTS = {
|
|
|
30
36
|
LIST_DEVICES: 5000,
|
|
31
37
|
} as const;
|
|
32
38
|
|
|
33
|
-
|
|
39
|
+
/** Cached PulseAudio server socket path discovered at runtime */
|
|
34
40
|
let pulseAudioServerPath: string | undefined;
|
|
35
41
|
|
|
36
42
|
/**
|
|
37
|
-
*
|
|
43
|
+
* Parses a PulseAudio device block and extracts device metadata
|
|
44
|
+
*
|
|
45
|
+
* @param block - Raw PulseAudio device block text from `pactl list sinks` or `pactl list sources`
|
|
46
|
+
* @param isInput - Whether this is an input device (source) or output device (sink)
|
|
47
|
+
* @returns Parsed AudioDevice object or null if device should be skipped
|
|
38
48
|
*/
|
|
39
49
|
function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
40
50
|
const lines = block.split('\n');
|
|
@@ -51,13 +61,11 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
51
61
|
} else if (trimmed.startsWith('Description:')) {
|
|
52
62
|
device.displayName = trimmed.split('Description:')[1].trim();
|
|
53
63
|
} else if (trimmed.includes('alsa.card =')) {
|
|
54
|
-
// Extract card number for later card name construction
|
|
55
64
|
const cardMatch = trimmed.match(/alsa\.card\s*=\s*"(\d+)"/);
|
|
56
65
|
if (cardMatch) {
|
|
57
66
|
(device as any).cardNumber = cardMatch[1];
|
|
58
67
|
}
|
|
59
68
|
} else if (trimmed.includes('alsa.card_name =')) {
|
|
60
|
-
// Extract card name
|
|
61
69
|
const cardNameMatch = trimmed.match(/alsa\.card_name\s*=\s*"([^"]+)"/);
|
|
62
70
|
if (cardNameMatch) {
|
|
63
71
|
(device as any).cardNameRaw = cardNameMatch[1];
|
|
@@ -74,13 +82,12 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
74
82
|
inPortsSection = true;
|
|
75
83
|
console.log(`[Audio] Entering ports section for device`);
|
|
76
84
|
} else if (inPortsSection) {
|
|
77
|
-
//
|
|
85
|
+
// Detect section boundary: next section starts with capital letter and no indentation
|
|
78
86
|
if (trimmed.match(/^[A-Z][a-z]+:/) && !line.match(/^\s/)) {
|
|
79
87
|
inPortsSection = false;
|
|
80
88
|
console.log(`[Audio] Exiting ports section, found ${ports.length} ports`);
|
|
81
89
|
} else if (trimmed.length > 0 && line.match(/^\s+\S/)) {
|
|
82
|
-
//
|
|
83
|
-
// Parse port line: "analog-output-headphones: Headphones (type: Headphones, priority: 9900, availability unknown)"
|
|
90
|
+
// Parse port line format: "analog-output-headphones: Headphones (type: Headphones, priority: 9900, availability unknown)"
|
|
84
91
|
const portMatch = trimmed.match(/^([^:]+):\s*(.+?)(?:\s*\((.+)\))?$/);
|
|
85
92
|
if (portMatch) {
|
|
86
93
|
const portName = portMatch[1].trim();
|
|
@@ -92,11 +99,10 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
92
99
|
description: portDescription,
|
|
93
100
|
};
|
|
94
101
|
|
|
95
|
-
// Parse
|
|
102
|
+
// Parse optional port metadata: type, priority, and availability
|
|
96
103
|
if (portDetails) {
|
|
97
104
|
const typeMatch = portDetails.match(/type:\s*([^,]+)/);
|
|
98
105
|
const priorityMatch = portDetails.match(/priority:\s*(\d+)/);
|
|
99
|
-
// Parse availability: "available", "available: yes", "not available", "availability unknown"
|
|
100
106
|
const availableMatch = portDetails.match(
|
|
101
107
|
/available(?::\s*(yes|no))?|not available|availability unknown/i
|
|
102
108
|
);
|
|
@@ -104,7 +110,7 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
104
110
|
if (typeMatch) port.type = typeMatch[1].trim();
|
|
105
111
|
if (priorityMatch) port.priority = parseInt(priorityMatch[1], 10);
|
|
106
112
|
|
|
107
|
-
//
|
|
113
|
+
// Parse availability: true for "available" or "available: yes", false otherwise
|
|
108
114
|
if (availableMatch) {
|
|
109
115
|
const availStr = availableMatch[0].toLowerCase();
|
|
110
116
|
if (availStr.includes('not available') || availStr.includes('availability unknown')) {
|
|
@@ -112,7 +118,7 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
112
118
|
} else if (availStr.includes('available: no')) {
|
|
113
119
|
port.available = false;
|
|
114
120
|
} else {
|
|
115
|
-
port.available = true;
|
|
121
|
+
port.available = true;
|
|
116
122
|
}
|
|
117
123
|
}
|
|
118
124
|
}
|
|
@@ -122,7 +128,6 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
122
128
|
}
|
|
123
129
|
}
|
|
124
130
|
} else if (trimmed.includes('device.product.name =')) {
|
|
125
|
-
// Extract product name (e.g., "LG ULTRAFINE" for HDMI displays)
|
|
126
131
|
const match = trimmed.match(/"([^"]+)"/);
|
|
127
132
|
if (match) {
|
|
128
133
|
(device as any).productName = match[1];
|
|
@@ -136,14 +141,13 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
136
141
|
}
|
|
137
142
|
}
|
|
138
143
|
|
|
139
|
-
//
|
|
144
|
+
// Filter out monitor sources (virtual recording outputs)
|
|
140
145
|
if (isInput && device.identifier?.includes('.monitor')) {
|
|
141
146
|
return null;
|
|
142
147
|
}
|
|
143
148
|
|
|
144
149
|
if (!device.identifier) return null;
|
|
145
150
|
|
|
146
|
-
// Add ports if any were found
|
|
147
151
|
if (ports.length > 0) {
|
|
148
152
|
device.availablePorts = ports;
|
|
149
153
|
console.log(
|
|
@@ -153,13 +157,13 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
153
157
|
console.log(`[Audio] Device ${device.identifier} has NO ports detected`);
|
|
154
158
|
}
|
|
155
159
|
|
|
156
|
-
// Determine
|
|
157
|
-
//
|
|
158
|
-
//
|
|
160
|
+
// Determine device availability using priority-based detection:
|
|
161
|
+
// 1. Check if any ports are available
|
|
162
|
+
// 2. If no ports, check sink/source state (RUNNING = available) or card port availability
|
|
159
163
|
const availablePorts = ports.filter(p => p.available === true);
|
|
160
164
|
let deviceAvailable = availablePorts.length > 0;
|
|
161
165
|
|
|
162
|
-
//
|
|
166
|
+
// Fallback: determine availability from sink/source state or card ports when no ports detected
|
|
163
167
|
if (ports.length === 0 && device.identifier) {
|
|
164
168
|
const stateMatch = block.match(/State:\s*(\w+)/i);
|
|
165
169
|
if (stateMatch) {
|
|
@@ -170,18 +174,17 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
170
174
|
// Check card port availability using pactl list cards
|
|
171
175
|
try {
|
|
172
176
|
const env = getPulseAudioEnv();
|
|
173
|
-
const cardsOutput = execSync(
|
|
177
|
+
const cardsOutput = execSync(PULSEAUDIO_COMMANDS.LIST_CARDS, {
|
|
174
178
|
encoding: 'utf-8',
|
|
175
179
|
timeout: 2000,
|
|
176
180
|
stdio: 'pipe',
|
|
177
181
|
env,
|
|
178
182
|
});
|
|
179
183
|
|
|
180
|
-
// Extract device number from identifier (e.g., "alsa_output_0_9" -> device 9)
|
|
181
184
|
const deviceMatch = device.identifier.match(/[^_]+_(\d+)_(\d+)$/);
|
|
182
185
|
if (deviceMatch) {
|
|
183
186
|
const deviceNum = deviceMatch[2];
|
|
184
|
-
//
|
|
187
|
+
// Map device number to HDMI port index (e.g., device 9 -> hdmi-output-2)
|
|
185
188
|
const portMatch = cardsOutput.match(
|
|
186
189
|
new RegExp(
|
|
187
190
|
`hdmi-output-${deviceNum === '9' ? '2' : deviceNum === '8' ? '1' : deviceNum === '7' ? '1' : '0'}[^\\n]*available`,
|
|
@@ -193,48 +196,39 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
193
196
|
}
|
|
194
197
|
}
|
|
195
198
|
} catch (error) {
|
|
196
|
-
// Card check failed,
|
|
199
|
+
// Card availability check failed, device remains unavailable
|
|
197
200
|
}
|
|
198
201
|
}
|
|
199
202
|
}
|
|
200
203
|
}
|
|
201
204
|
|
|
202
|
-
// Extract card
|
|
203
|
-
// Format 1:
|
|
204
|
-
// Format 2:
|
|
205
|
-
// Format 3:
|
|
206
|
-
// Format 4:
|
|
207
|
-
//
|
|
205
|
+
// Extract card name from device identifier using multiple format patterns:
|
|
206
|
+
// Format 1: alsa_output.pci-0000_00_1f.3.analog-stereo (standard PulseAudio ALSA format)
|
|
207
|
+
// Format 2: bluez_sink.XX_XX_XX_XX_XX_XX (Bluetooth - no profile suffix)
|
|
208
|
+
// Format 3: alsa_output.usb-046d_08d9-01.analog-stereo (USB audio)
|
|
209
|
+
// Format 4: alsa_output_0_3 (manually created sinks)
|
|
208
210
|
// Generic pattern: {prefix}_{type}.{card_id}[.{profile}] or {prefix}_{type}_{card}_{device}
|
|
209
|
-
// Where prefix can be: alsa, bluez, or other PulseAudio modules
|
|
210
|
-
// Note: Some devices (like Bluetooth) may not have a profile suffix
|
|
211
211
|
|
|
212
|
-
// Try standard format with profile: {prefix}_{type}.{card_id}.{profile}
|
|
213
212
|
let cardMatch = device.identifier?.match(
|
|
214
213
|
/^([^_]+)_(output|input|sink|source)\.([^.]+(?:\.[^.]+)*)\.(.+)$/
|
|
215
214
|
);
|
|
216
215
|
if (cardMatch) {
|
|
217
|
-
const prefix = cardMatch[1];
|
|
218
|
-
const cardId = cardMatch[3];
|
|
219
|
-
// Card name is extracted but not stored (used internally for label generation)
|
|
216
|
+
const prefix = cardMatch[1];
|
|
217
|
+
const cardId = cardMatch[3];
|
|
220
218
|
(device as any).cardName = `${prefix}_card.${cardId}`;
|
|
221
219
|
} else {
|
|
222
|
-
// Try format without profile: {prefix}_{type}.{card_id} (e.g., Bluetooth)
|
|
223
220
|
cardMatch = device.identifier?.match(/^([^_]+)_(output|input|sink|source)\.(.+)$/);
|
|
224
221
|
if (cardMatch) {
|
|
225
|
-
const prefix = cardMatch[1];
|
|
226
|
-
const cardId = cardMatch[3];
|
|
227
|
-
// Card name is extracted but not stored (used internally for label generation)
|
|
222
|
+
const prefix = cardMatch[1];
|
|
223
|
+
const cardId = cardMatch[3];
|
|
228
224
|
(device as any).cardName = `${prefix}_card.${cardId}`;
|
|
229
225
|
} else {
|
|
230
|
-
// Fallback: Try to extract card number from identifier format "alsa_output_0_3"
|
|
231
226
|
const altMatch = device.identifier?.match(/^([^_]+)_(output|input|sink|source)_(\d+)_(\d+)$/);
|
|
232
227
|
if (altMatch) {
|
|
233
228
|
const cardNumber = altMatch[3];
|
|
234
|
-
// Try to find card name from pactl list cards (supports any card type)
|
|
235
229
|
try {
|
|
236
230
|
const env = getPulseAudioEnv();
|
|
237
|
-
const cardsOutput = execSync(
|
|
231
|
+
const cardsOutput = execSync(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
|
|
238
232
|
encoding: 'utf-8',
|
|
239
233
|
timeout: 2000,
|
|
240
234
|
stdio: 'pipe',
|
|
@@ -242,24 +236,20 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
242
236
|
});
|
|
243
237
|
const cardLine = cardsOutput.split('\n').find(line => line.includes(`card${cardNumber}`));
|
|
244
238
|
if (cardLine) {
|
|
245
|
-
// Match any card name format: {prefix}_card.{identifier}
|
|
246
|
-
// e.g., "alsa_card.pci-0000_00_1f.3", "bluez_card.XX_XX_XX_XX_XX_XX"
|
|
247
239
|
const cardNameMatch = cardLine.match(/([^_\s]+_card\.[^\s]+)/);
|
|
248
240
|
if (cardNameMatch) {
|
|
249
|
-
// Card name is extracted but not stored (used internally for label generation)
|
|
250
241
|
(device as any).cardName = cardNameMatch[1];
|
|
251
242
|
}
|
|
252
243
|
}
|
|
253
244
|
} catch (error) {
|
|
254
|
-
// Card lookup failed, continue without
|
|
245
|
+
// Card lookup failed, continue without card name
|
|
255
246
|
}
|
|
256
247
|
} else {
|
|
257
|
-
// Final fallback: use card number from device properties
|
|
258
248
|
const cardNumber = (device as any).cardNumber;
|
|
259
249
|
if (cardNumber !== undefined) {
|
|
260
250
|
try {
|
|
261
251
|
const env = getPulseAudioEnv();
|
|
262
|
-
const cardsOutput = execSync(
|
|
252
|
+
const cardsOutput = execSync(PULSEAUDIO_COMMANDS.LIST_CARDS_SHORT, {
|
|
263
253
|
encoding: 'utf-8',
|
|
264
254
|
timeout: 2000,
|
|
265
255
|
stdio: 'pipe',
|
|
@@ -269,112 +259,34 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
269
259
|
.split('\n')
|
|
270
260
|
.find(line => line.includes(`card${cardNumber}`));
|
|
271
261
|
if (cardLine) {
|
|
272
|
-
// Match any card name format: {prefix}_card.{identifier}
|
|
273
262
|
const cardNameMatch = cardLine.match(/([^_\s]+_card\.[^\s]+)/);
|
|
274
263
|
if (cardNameMatch) {
|
|
275
|
-
// Card name is extracted but not stored (used internally for label generation)
|
|
276
264
|
(device as any).cardName = cardNameMatch[1];
|
|
277
265
|
}
|
|
278
266
|
}
|
|
279
267
|
} catch (error) {
|
|
280
|
-
// Card lookup failed, continue without
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
|
|
287
|
-
// Convert simple identifier to flat identifier with profile (if needed)
|
|
288
|
-
// If identifier already has profile (e.g., alsa_output.pci-0000_00_1f.3.hdmi-stereo), use as-is
|
|
289
|
-
// If identifier is simple (e.g., alsa_output_0_3), convert to flat format with active profile
|
|
290
|
-
if (device.identifier && (device as any).cardName) {
|
|
291
|
-
const cardName = (device as any).cardName;
|
|
292
|
-
|
|
293
|
-
// Check if identifier already has profile suffix
|
|
294
|
-
const hasProfile = device.identifier.match(/\.(hdmi-|analog-|stereo|mono|surround|a2dp|sco)/);
|
|
295
|
-
|
|
296
|
-
if (!hasProfile) {
|
|
297
|
-
// Simple identifier format - need to get active profile and convert to flat format
|
|
298
|
-
try {
|
|
299
|
-
const env = getPulseAudioEnv();
|
|
300
|
-
const cardInfo = execSync(`pactl list cards | grep -A 100 "Name: ${cardName}"`, {
|
|
301
|
-
encoding: 'utf-8',
|
|
302
|
-
timeout: 2000,
|
|
303
|
-
stdio: 'pipe',
|
|
304
|
-
env,
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
// Extract card ID from card name (e.g., "pci-0000_00_1f.3" from "alsa_card.pci-0000_00_1f.3")
|
|
308
|
-
const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
|
|
309
|
-
if (cardIdMatch) {
|
|
310
|
-
const cardId = cardIdMatch[1];
|
|
311
|
-
|
|
312
|
-
// Determine profile type (output or input) from identifier
|
|
313
|
-
const isInputDevice =
|
|
314
|
-
isInput || device.identifier.includes('input') || device.identifier.includes('source');
|
|
315
|
-
const profileType = isInputDevice ? 'input' : 'output';
|
|
316
|
-
|
|
317
|
-
// Find active profile (marked with *)
|
|
318
|
-
// Format: " output:hdmi-stereo: Digital Stereo (HDMI) Output (sinks: 1, sources: 0, priority: 5400, available: yes) *"
|
|
319
|
-
const activeProfileMatch = cardInfo.match(
|
|
320
|
-
new RegExp(`^\\s+(${profileType}:[^:]+):[^\\n]*\\*[^\\n]*$`, 'm')
|
|
321
|
-
);
|
|
322
|
-
if (activeProfileMatch) {
|
|
323
|
-
const profile = activeProfileMatch[1]; // e.g., "output:hdmi-stereo" or "input:analog-stereo"
|
|
324
|
-
const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), ''); // e.g., "hdmi-stereo"
|
|
325
|
-
|
|
326
|
-
// Extract prefix and type from original identifier
|
|
327
|
-
const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
|
|
328
|
-
if (prefixMatch) {
|
|
329
|
-
const prefix = prefixMatch[1]; // e.g., "alsa"
|
|
330
|
-
const type = prefixMatch[2]; // e.g., "output" or "input"
|
|
331
|
-
|
|
332
|
-
// Construct flat identifier: {prefix}_{type}.{cardId}.{profileSuffix}
|
|
333
|
-
device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
|
|
334
|
-
}
|
|
335
|
-
} else {
|
|
336
|
-
// No active profile found, try to find any profile of the correct type
|
|
337
|
-
const anyProfileMatch = cardInfo.match(new RegExp(`^\\s+(${profileType}:[^:]+):`, 'm'));
|
|
338
|
-
if (anyProfileMatch) {
|
|
339
|
-
const profile = anyProfileMatch[1];
|
|
340
|
-
const profileSuffix = profile.replace(new RegExp(`^${profileType}:`), '');
|
|
341
|
-
|
|
342
|
-
const prefixMatch = device.identifier.match(/^([^_]+)_(output|input|sink|source)/);
|
|
343
|
-
if (prefixMatch) {
|
|
344
|
-
const prefix = prefixMatch[1];
|
|
345
|
-
const type = prefixMatch[2];
|
|
346
|
-
const cardIdMatch = cardName.match(/^[^_]+_card\.(.+)$/);
|
|
347
|
-
if (cardIdMatch) {
|
|
348
|
-
const cardId = cardIdMatch[1];
|
|
349
|
-
device.identifier = `${prefix}_${type}.${cardId}.${profileSuffix}`;
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
}
|
|
268
|
+
// Card lookup failed, continue without card name
|
|
353
269
|
}
|
|
354
270
|
}
|
|
355
|
-
} catch (error) {
|
|
356
|
-
// Profile lookup failed, keep original identifier
|
|
357
|
-
console.log(`[Audio] Failed to convert identifier to flat format: ${error}`);
|
|
358
271
|
}
|
|
359
272
|
}
|
|
360
273
|
}
|
|
361
274
|
|
|
362
|
-
//
|
|
363
|
-
// Note: isDefault will be set later when
|
|
275
|
+
// Generate human-readable label incorporating device metadata
|
|
276
|
+
// Note: isDefault status will be set later when default devices are known
|
|
364
277
|
device.label = createDeviceLabel(
|
|
365
278
|
device,
|
|
366
279
|
ports,
|
|
367
280
|
isInput,
|
|
368
281
|
(device as any).formFactor,
|
|
369
282
|
(device as any).bus,
|
|
370
|
-
false,
|
|
283
|
+
false,
|
|
371
284
|
deviceAvailable,
|
|
372
285
|
(device as any).activePort
|
|
373
286
|
);
|
|
374
287
|
|
|
375
|
-
//
|
|
376
|
-
//
|
|
377
|
-
// All info is consolidated in the label field
|
|
288
|
+
// Remove temporary fields used only for label generation
|
|
289
|
+
// All metadata is consolidated in the label field
|
|
378
290
|
const cleanDevice: Partial<AudioDevice> = {
|
|
379
291
|
identifier: device.identifier,
|
|
380
292
|
volume: device.volume,
|
|
@@ -387,8 +299,18 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
387
299
|
}
|
|
388
300
|
|
|
389
301
|
/**
|
|
390
|
-
*
|
|
391
|
-
* Incorporates: formFactor, bus, isDefault, available, activePort
|
|
302
|
+
* Generates a human-readable label for an audio device
|
|
303
|
+
* Incorporates device metadata: formFactor, bus, isDefault, available, and activePort
|
|
304
|
+
*
|
|
305
|
+
* @param device - Partial AudioDevice object containing device properties
|
|
306
|
+
* @param ports - Array of available audio ports for this device
|
|
307
|
+
* @param isInput - Whether this is an input device (source) or output device (sink)
|
|
308
|
+
* @param formFactor - Device form factor (e.g., "internal", "external")
|
|
309
|
+
* @param bus - Device bus type (e.g., "pci", "usb")
|
|
310
|
+
* @param isDefault - Whether this device is the default device
|
|
311
|
+
* @param available - Whether the device is currently available
|
|
312
|
+
* @param activePort - The currently active port identifier
|
|
313
|
+
* @returns Human-readable label string
|
|
392
314
|
*/
|
|
393
315
|
function createDeviceLabel(
|
|
394
316
|
device: Partial<AudioDevice>,
|
|
@@ -403,15 +325,12 @@ function createDeviceLabel(
|
|
|
403
325
|
const productName = (device as any).productName;
|
|
404
326
|
let baseLabel = '';
|
|
405
327
|
|
|
406
|
-
// Find the active port in the ports list
|
|
407
328
|
const activePortInfo = activePort ? ports.find(p => p.name === activePort) : undefined;
|
|
408
329
|
|
|
409
|
-
//
|
|
330
|
+
// Label generation priority: product name > active port > display name > identifier
|
|
410
331
|
if (productName) {
|
|
411
332
|
baseLabel = `${productName} (${isInput ? 'Microphone' : 'Speaker'})`;
|
|
412
|
-
}
|
|
413
|
-
// Priority 2: Use active port description if available
|
|
414
|
-
else if (activePortInfo && activePortInfo.description) {
|
|
333
|
+
} else if (activePortInfo && activePortInfo.description) {
|
|
415
334
|
const portDesc = activePortInfo.description;
|
|
416
335
|
|
|
417
336
|
// Map common port descriptions to user-friendly names
|
|
@@ -432,20 +351,15 @@ function createDeviceLabel(
|
|
|
432
351
|
} else if (portDesc.toLowerCase().includes('speaker')) {
|
|
433
352
|
baseLabel = 'Speakers';
|
|
434
353
|
} else {
|
|
435
|
-
// Use port description with device type
|
|
436
354
|
baseLabel = `${portDesc} (${isInput ? 'Input' : 'Output'})`;
|
|
437
355
|
}
|
|
438
|
-
}
|
|
439
|
-
// Priority 3: Use display name with device type
|
|
440
|
-
else if (device.displayName) {
|
|
356
|
+
} else if (device.displayName) {
|
|
441
357
|
baseLabel = `${device.displayName} (${isInput ? 'Input' : 'Output'})`;
|
|
442
|
-
}
|
|
443
|
-
// Fallback: Use identifier
|
|
444
|
-
else {
|
|
358
|
+
} else {
|
|
445
359
|
baseLabel = device.identifier || 'Unknown Audio Device';
|
|
446
360
|
}
|
|
447
361
|
|
|
448
|
-
//
|
|
362
|
+
// Append display name if not already included
|
|
449
363
|
if (
|
|
450
364
|
device.displayName &&
|
|
451
365
|
baseLabel !== device.displayName &&
|
|
@@ -454,45 +368,38 @@ function createDeviceLabel(
|
|
|
454
368
|
baseLabel = `${device.displayName} - ${baseLabel}`;
|
|
455
369
|
}
|
|
456
370
|
|
|
457
|
-
//
|
|
371
|
+
// Append form factor if external device
|
|
458
372
|
if (formFactor && formFactor !== 'internal' && !baseLabel.includes(formFactor)) {
|
|
459
373
|
baseLabel = `${baseLabel} (${formFactor.charAt(0).toUpperCase() + formFactor.slice(1)})`;
|
|
460
374
|
}
|
|
461
375
|
|
|
462
|
-
//
|
|
376
|
+
// Append bus type if non-PCI
|
|
463
377
|
if (bus && bus.toLowerCase() !== 'pci' && !baseLabel.includes(bus.toUpperCase())) {
|
|
464
378
|
baseLabel = `${baseLabel} (${bus.toUpperCase()})`;
|
|
465
379
|
}
|
|
466
380
|
|
|
467
|
-
//
|
|
381
|
+
// Append status indicators
|
|
468
382
|
const statusParts: string[] = [];
|
|
469
|
-
|
|
470
|
-
// Add default status
|
|
471
383
|
if (isDefault) {
|
|
472
384
|
statusParts.push('Default');
|
|
473
385
|
}
|
|
474
|
-
|
|
475
|
-
// Add availability status
|
|
476
386
|
if (available !== undefined) {
|
|
477
387
|
statusParts.push(available ? 'Available' : 'Unavailable');
|
|
478
388
|
}
|
|
479
389
|
|
|
480
|
-
|
|
481
|
-
if (statusParts.length > 0) {
|
|
482
|
-
return `${baseLabel} (${statusParts.join(', ')})`;
|
|
483
|
-
}
|
|
484
|
-
|
|
485
|
-
return baseLabel;
|
|
390
|
+
return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
|
|
486
391
|
}
|
|
487
392
|
|
|
488
393
|
/**
|
|
489
|
-
*
|
|
394
|
+
* Discovers the PulseAudio socket path by locating the socket file
|
|
395
|
+
*
|
|
490
396
|
* @internal
|
|
491
|
-
* Exported for use in device-phyos audio control
|
|
397
|
+
* Exported for use in device-phyos audio control module
|
|
398
|
+
*
|
|
399
|
+
* @returns The socket path if found, undefined otherwise
|
|
492
400
|
*/
|
|
493
401
|
export function discoverPulseAudioSocket(): string | undefined {
|
|
494
402
|
try {
|
|
495
|
-
// Find PulseAudio socket directories in /tmp
|
|
496
403
|
const findOutput = execSync(
|
|
497
404
|
'find /tmp -maxdepth 2 -type d -name "pulse-*" 2>/dev/null | head -1',
|
|
498
405
|
{
|
|
@@ -504,7 +411,6 @@ export function discoverPulseAudioSocket(): string | undefined {
|
|
|
504
411
|
|
|
505
412
|
if (findOutput) {
|
|
506
413
|
const socketPath = `${findOutput}/native`;
|
|
507
|
-
// Verify the socket file exists
|
|
508
414
|
try {
|
|
509
415
|
execSync(`test -S "${socketPath}"`, { stdio: 'pipe' });
|
|
510
416
|
return socketPath;
|
|
@@ -513,18 +419,20 @@ export function discoverPulseAudioSocket(): string | undefined {
|
|
|
513
419
|
}
|
|
514
420
|
}
|
|
515
421
|
} catch (error) {
|
|
516
|
-
// Socket discovery failed
|
|
422
|
+
// Socket discovery failed
|
|
517
423
|
}
|
|
518
424
|
return undefined;
|
|
519
425
|
}
|
|
520
426
|
|
|
521
427
|
/**
|
|
522
|
-
*
|
|
428
|
+
* Retrieves environment variables for execSync calls, including PULSE_SERVER if socket is discovered
|
|
429
|
+
*
|
|
523
430
|
* @internal
|
|
524
|
-
* Exported for use in device-phyos audio control
|
|
431
|
+
* Exported for use in device-phyos audio control module
|
|
432
|
+
*
|
|
433
|
+
* @returns Process environment with PULSE_SERVER set if socket was discovered
|
|
525
434
|
*/
|
|
526
435
|
export function getPulseAudioEnv(): NodeJS.ProcessEnv {
|
|
527
|
-
// Try to discover socket if not already discovered
|
|
528
436
|
if (!pulseAudioServerPath) {
|
|
529
437
|
pulseAudioServerPath = discoverPulseAudioSocket();
|
|
530
438
|
if (pulseAudioServerPath) {
|
|
@@ -540,11 +448,12 @@ export function getPulseAudioEnv(): NodeJS.ProcessEnv {
|
|
|
540
448
|
}
|
|
541
449
|
|
|
542
450
|
/**
|
|
543
|
-
*
|
|
544
|
-
* Service runs as root,
|
|
451
|
+
* Starts the PulseAudio daemon if not already running
|
|
452
|
+
* Service runs as root, providing full hardware access in user mode
|
|
453
|
+
*
|
|
454
|
+
* @returns true if PulseAudio is running and accessible, false otherwise
|
|
545
455
|
*/
|
|
546
456
|
function startPulseAudio(): boolean {
|
|
547
|
-
// If we don't have the socket path yet, try to discover it
|
|
548
457
|
if (!pulseAudioServerPath) {
|
|
549
458
|
pulseAudioServerPath = discoverPulseAudioSocket();
|
|
550
459
|
if (pulseAudioServerPath) {
|
|
@@ -552,7 +461,7 @@ function startPulseAudio(): boolean {
|
|
|
552
461
|
}
|
|
553
462
|
}
|
|
554
463
|
|
|
555
|
-
//
|
|
464
|
+
// Verify PulseAudio is running and accessible
|
|
556
465
|
try {
|
|
557
466
|
const env = getPulseAudioEnv();
|
|
558
467
|
execSync(PULSEAUDIO_COMMANDS.INFO, {
|
|
@@ -563,9 +472,7 @@ function startPulseAudio(): boolean {
|
|
|
563
472
|
});
|
|
564
473
|
console.log('PulseAudio is running and accessible');
|
|
565
474
|
|
|
566
|
-
// Ensure ALSA devices (especially inputs) are loaded
|
|
567
475
|
loadAlsaDevicesIntoPulseAudio();
|
|
568
|
-
|
|
569
476
|
return true;
|
|
570
477
|
} catch (error) {
|
|
571
478
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
@@ -573,27 +480,22 @@ function startPulseAudio(): boolean {
|
|
|
573
480
|
console.log('Attempting to start PulseAudio...');
|
|
574
481
|
}
|
|
575
482
|
|
|
576
|
-
//
|
|
483
|
+
// Start fresh PulseAudio instance as current user (root)
|
|
577
484
|
try {
|
|
578
|
-
// Kill existing instances
|
|
579
485
|
execSync(PULSEAUDIO_COMMANDS.KILL, {
|
|
580
486
|
timeout: PULSEAUDIO_TIMEOUTS.KILL,
|
|
581
487
|
stdio: 'pipe',
|
|
582
488
|
});
|
|
583
489
|
|
|
584
|
-
// Wait for cleanup
|
|
585
490
|
execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
|
|
586
491
|
|
|
587
|
-
// Start new daemon
|
|
588
492
|
execSync(PULSEAUDIO_COMMANDS.START_DAEMON, {
|
|
589
493
|
timeout: PULSEAUDIO_TIMEOUTS.START,
|
|
590
494
|
stdio: 'pipe',
|
|
591
495
|
});
|
|
592
496
|
|
|
593
|
-
// Wait for startup
|
|
594
497
|
execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
|
|
595
498
|
|
|
596
|
-
// Discover the socket path
|
|
597
499
|
pulseAudioServerPath = discoverPulseAudioSocket();
|
|
598
500
|
if (pulseAudioServerPath) {
|
|
599
501
|
console.log(`Discovered PulseAudio socket: ${pulseAudioServerPath}`);
|
|
@@ -601,7 +503,6 @@ function startPulseAudio(): boolean {
|
|
|
601
503
|
console.log('Warning: Could not discover PulseAudio socket path');
|
|
602
504
|
}
|
|
603
505
|
|
|
604
|
-
// Verify it's running
|
|
605
506
|
const env = getPulseAudioEnv();
|
|
606
507
|
execSync(PULSEAUDIO_COMMANDS.INFO, {
|
|
607
508
|
timeout: PULSEAUDIO_TIMEOUTS.INFO_CHECK,
|
|
@@ -611,7 +512,6 @@ function startPulseAudio(): boolean {
|
|
|
611
512
|
|
|
612
513
|
console.log('✓ PulseAudio started successfully');
|
|
613
514
|
|
|
614
|
-
// Load ALSA devices (including input sources)
|
|
615
515
|
loadAlsaDevicesIntoPulseAudio();
|
|
616
516
|
|
|
617
517
|
return true;
|
|
@@ -626,7 +526,7 @@ function startPulseAudio(): boolean {
|
|
|
626
526
|
}
|
|
627
527
|
|
|
628
528
|
/**
|
|
629
|
-
*
|
|
529
|
+
* ALSA hardware device information
|
|
630
530
|
*/
|
|
631
531
|
interface AlsaDevice {
|
|
632
532
|
card: number;
|
|
@@ -635,17 +535,23 @@ interface AlsaDevice {
|
|
|
635
535
|
hwString: string; // e.g., "hw:0,0"
|
|
636
536
|
}
|
|
637
537
|
|
|
538
|
+
/**
|
|
539
|
+
* Parses ALSA device list output and extracts hardware device information
|
|
540
|
+
*
|
|
541
|
+
* @param aplayOutput - Raw output from `aplay -l` or `arecord -l` command
|
|
542
|
+
* @returns Array of parsed ALSA device objects
|
|
543
|
+
*/
|
|
638
544
|
function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
|
|
639
545
|
const devices: AlsaDevice[] = [];
|
|
640
546
|
|
|
641
|
-
// Parse
|
|
547
|
+
// Parse format: "card 0: PCH [HDA Intel PCH], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]"
|
|
642
548
|
const regex = /card (\d+): ([^,]+), device (\d+): ([^\[]+)\[([^\]]+)\]/g;
|
|
643
549
|
let match;
|
|
644
550
|
|
|
645
551
|
while ((match = regex.exec(aplayOutput)) !== null) {
|
|
646
552
|
const card = parseInt(match[1], 10);
|
|
647
553
|
const device = parseInt(match[3], 10);
|
|
648
|
-
const name = match[5].trim();
|
|
554
|
+
const name = match[5].trim();
|
|
649
555
|
|
|
650
556
|
devices.push({
|
|
651
557
|
card,
|
|
@@ -659,7 +565,11 @@ function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
|
|
|
659
565
|
}
|
|
660
566
|
|
|
661
567
|
/**
|
|
662
|
-
*
|
|
568
|
+
* Checks if a PulseAudio sink/source already exists for the specified ALSA device
|
|
569
|
+
*
|
|
570
|
+
* @param hwString - ALSA hardware string (e.g., "hw:0,0")
|
|
571
|
+
* @param isInput - Whether to check for source (input) or sink (output)
|
|
572
|
+
* @returns true if a matching sink/source exists, false otherwise
|
|
663
573
|
*/
|
|
664
574
|
function checkExistingSink(hwString: string, isInput: boolean): boolean {
|
|
665
575
|
try {
|
|
@@ -671,15 +581,10 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
|
|
|
671
581
|
env,
|
|
672
582
|
});
|
|
673
583
|
|
|
674
|
-
// Check if any sink/source references this ALSA device
|
|
675
|
-
// Look for patterns like "alsa.device = "0"" and "alsa.card = "0""
|
|
676
584
|
const [card, device] = hwString.replace('hw:', '').split(',');
|
|
677
|
-
|
|
678
|
-
// Check for exact device match (most specific)
|
|
679
585
|
const devicePattern = new RegExp(`alsa\\.device\\s*=\\s*"${device}"`, 'i');
|
|
680
586
|
const cardPattern = new RegExp(`alsa\\.card\\s*=\\s*"${card}"`, 'i');
|
|
681
587
|
|
|
682
|
-
// Split into blocks and check if any block has both card and device match
|
|
683
588
|
const blocks = output.split(/^(Sink|Source) #/m);
|
|
684
589
|
for (const block of blocks) {
|
|
685
590
|
if (cardPattern.test(block) && devicePattern.test(block)) {
|
|
@@ -694,7 +599,11 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
|
|
|
694
599
|
}
|
|
695
600
|
|
|
696
601
|
/**
|
|
697
|
-
*
|
|
602
|
+
* Creates a PulseAudio sink or source for the specified ALSA device
|
|
603
|
+
*
|
|
604
|
+
* @param alsaDevice - ALSA device information
|
|
605
|
+
* @param isInput - Whether to create a source (input) or sink (output)
|
|
606
|
+
* @returns true if creation succeeded, false otherwise
|
|
698
607
|
*/
|
|
699
608
|
function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean {
|
|
700
609
|
try {
|
|
@@ -702,8 +611,7 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
|
|
|
702
611
|
? `alsa_input_${alsaDevice.card}_${alsaDevice.device}`
|
|
703
612
|
: `alsa_output_${alsaDevice.card}_${alsaDevice.device}`;
|
|
704
613
|
|
|
705
|
-
//
|
|
706
|
-
// Replace spaces and special chars with underscores
|
|
614
|
+
// Sanitize description to avoid quoting/escaping issues
|
|
707
615
|
const safeDescription = `${alsaDevice.name}_${alsaDevice.hwString}`.replace(
|
|
708
616
|
/[^a-zA-Z0-9_-]/g,
|
|
709
617
|
'_'
|
|
@@ -735,8 +643,9 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
|
|
|
735
643
|
}
|
|
736
644
|
|
|
737
645
|
/**
|
|
738
|
-
*
|
|
739
|
-
*
|
|
646
|
+
* Ensures PulseAudio loads all ALSA devices (including input devices)
|
|
647
|
+
*
|
|
648
|
+
* Process:
|
|
740
649
|
* 1. Queries ALSA hardware to find all available devices
|
|
741
650
|
* 2. Checks what PulseAudio has already detected
|
|
742
651
|
* 3. Creates missing sinks/sources dynamically
|
|
@@ -746,7 +655,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
746
655
|
try {
|
|
747
656
|
console.log('Detecting ALSA hardware and ensuring PulseAudio coverage...');
|
|
748
657
|
|
|
749
|
-
//
|
|
658
|
+
// Load base ALSA card module for auto-detection
|
|
750
659
|
try {
|
|
751
660
|
const env = getPulseAudioEnv();
|
|
752
661
|
const modules = execSync(PULSEAUDIO_COMMANDS.LIST_MODULES, {
|
|
@@ -767,12 +676,12 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
767
676
|
console.log(' Note: Base ALSA module load failed (will create sinks manually)');
|
|
768
677
|
}
|
|
769
678
|
|
|
770
|
-
//
|
|
679
|
+
// Query ALSA for hardware devices
|
|
771
680
|
let outputDevices: AlsaDevice[] = [];
|
|
772
681
|
let inputDevices: AlsaDevice[] = [];
|
|
773
682
|
|
|
774
683
|
try {
|
|
775
|
-
const aplayOutput = execSync(
|
|
684
|
+
const aplayOutput = execSync(ALSA_COMMANDS.APLAY_LIST, {
|
|
776
685
|
encoding: 'utf-8',
|
|
777
686
|
timeout: 3000,
|
|
778
687
|
});
|
|
@@ -783,7 +692,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
783
692
|
}
|
|
784
693
|
|
|
785
694
|
try {
|
|
786
|
-
const arecordOutput = execSync(
|
|
695
|
+
const arecordOutput = execSync(ALSA_COMMANDS.ARECORD_LIST, {
|
|
787
696
|
encoding: 'utf-8',
|
|
788
697
|
timeout: 3000,
|
|
789
698
|
});
|
|
@@ -793,7 +702,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
793
702
|
console.log(' No ALSA input devices found or arecord failed');
|
|
794
703
|
}
|
|
795
704
|
|
|
796
|
-
//
|
|
705
|
+
// Create missing PulseAudio sinks/sources for each ALSA device
|
|
797
706
|
let createdCount = 0;
|
|
798
707
|
|
|
799
708
|
for (const device of outputDevices) {
|
|
@@ -830,7 +739,9 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
830
739
|
}
|
|
831
740
|
|
|
832
741
|
/**
|
|
833
|
-
*
|
|
742
|
+
* Retrieves the default sink and source identifiers from PulseAudio
|
|
743
|
+
*
|
|
744
|
+
* @returns Object containing defaultSink and defaultSource identifiers, or empty object on failure
|
|
834
745
|
*/
|
|
835
746
|
function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
|
|
836
747
|
try {
|
|
@@ -855,7 +766,9 @@ function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
|
|
|
855
766
|
}
|
|
856
767
|
|
|
857
768
|
/**
|
|
858
|
-
*
|
|
769
|
+
* Retrieves available audio input and output devices using PulseAudio
|
|
770
|
+
*
|
|
771
|
+
* @returns AudioDevices object containing outputs and inputs arrays, or undefined on failure
|
|
859
772
|
*/
|
|
860
773
|
function getAudioDevices(): AudioDevices | undefined {
|
|
861
774
|
if (!startPulseAudio()) {
|
|
@@ -863,7 +776,6 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
863
776
|
return undefined;
|
|
864
777
|
}
|
|
865
778
|
|
|
866
|
-
// Get default devices first
|
|
867
779
|
const { defaultSink, defaultSource } = getDefaultDevices();
|
|
868
780
|
console.log(`Default sink: ${defaultSink}, Default source: ${defaultSource}`);
|
|
869
781
|
|
|
@@ -884,11 +796,9 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
884
796
|
.forEach(block => {
|
|
885
797
|
const device = parseAudioDevice(block, false);
|
|
886
798
|
if (device) {
|
|
887
|
-
// Check if this is the default sink and update label
|
|
888
799
|
const isDefault = device.identifier === defaultSink;
|
|
889
800
|
|
|
890
801
|
if (isDefault && device.label) {
|
|
891
|
-
// Update label to include Default status
|
|
892
802
|
if (!device.label.includes('Default')) {
|
|
893
803
|
if (device.label.includes('(')) {
|
|
894
804
|
device.label = device.label.replace(')', ', Default)');
|
|
@@ -923,11 +833,9 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
923
833
|
.forEach(block => {
|
|
924
834
|
const device = parseAudioDevice(block, true);
|
|
925
835
|
if (device) {
|
|
926
|
-
// Check if this is the default source and update label
|
|
927
836
|
const isDefault = device.identifier === defaultSource;
|
|
928
837
|
|
|
929
838
|
if (isDefault && device.label) {
|
|
930
|
-
// Update label to include Default status
|
|
931
839
|
if (!device.label.includes('Default')) {
|
|
932
840
|
if (device.label.includes('(')) {
|
|
933
841
|
device.label = device.label.replace(')', ', Default)');
|
|
@@ -948,7 +856,6 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
948
856
|
);
|
|
949
857
|
}
|
|
950
858
|
|
|
951
|
-
// Return undefined if no devices found
|
|
952
859
|
if (outputs.length === 0 && inputs.length === 0) {
|
|
953
860
|
console.log('No audio devices detected');
|
|
954
861
|
return undefined;
|
|
@@ -991,17 +898,15 @@ export async function getSystemInformation() {
|
|
|
991
898
|
};
|
|
992
899
|
|
|
993
900
|
const info = await si.get(valueObject);
|
|
994
|
-
// console.log('getAllData3', {info});
|
|
995
901
|
|
|
996
|
-
//
|
|
902
|
+
// Retrieve network interfaces (includes disabled interfaces)
|
|
997
903
|
let netIfaces = await si.networkInterfaces();
|
|
998
904
|
|
|
999
|
-
// Ensure netIfaces is always an array
|
|
1000
905
|
if (!Array.isArray(netIfaces)) {
|
|
1001
906
|
netIfaces = [netIfaces];
|
|
1002
907
|
}
|
|
1003
908
|
|
|
1004
|
-
//
|
|
909
|
+
// Assign type to interfaces missing type information
|
|
1005
910
|
netIfaces = netIfaces.map((iface: any) => ({
|
|
1006
911
|
...iface,
|
|
1007
912
|
type:
|
|
@@ -1011,16 +916,14 @@ export async function getSystemInformation() {
|
|
|
1011
916
|
: 'unknown'),
|
|
1012
917
|
}));
|
|
1013
918
|
|
|
1014
|
-
// Inject the full list of network interfaces into our system info.
|
|
1015
919
|
info.networkInterfaces = netIfaces;
|
|
1016
920
|
|
|
1017
|
-
// Get audio devices using PulseAudio
|
|
1018
921
|
const audioDevices = getAudioDevices();
|
|
1019
922
|
if (audioDevices) {
|
|
1020
923
|
info.audioDevices = audioDevices;
|
|
1021
924
|
}
|
|
1022
925
|
|
|
1023
|
-
// TODO:
|
|
926
|
+
// TODO: Align structure with browser version output and create proper type definition
|
|
1024
927
|
const systemInfo = JSON.parse(JSON.stringify(info));
|
|
1025
928
|
|
|
1026
929
|
return systemInfo;
|