@phystack/hub-device 4.5.13-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 -9
- package/dist/sysinfo/node.js.map +1 -1
- package/package.json +4 -4
- package/src/sysinfo/node.ts +121 -143
|
@@ -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',
|
|
@@ -301,10 +306,7 @@ function createDeviceLabel(device, ports, isInput, formFactor, bus, isDefault, a
|
|
|
301
306
|
if (available !== undefined) {
|
|
302
307
|
statusParts.push(available ? 'Available' : 'Unavailable');
|
|
303
308
|
}
|
|
304
|
-
|
|
305
|
-
return `${baseLabel} (${statusParts.join(', ')})`;
|
|
306
|
-
}
|
|
307
|
-
return baseLabel;
|
|
309
|
+
return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
|
|
308
310
|
}
|
|
309
311
|
function discoverPulseAudioSocket() {
|
|
310
312
|
try {
|
|
@@ -488,7 +490,7 @@ function loadAlsaDevicesIntoPulseAudio() {
|
|
|
488
490
|
let outputDevices = [];
|
|
489
491
|
let inputDevices = [];
|
|
490
492
|
try {
|
|
491
|
-
const aplayOutput = (0, child_process_1.execSync)(
|
|
493
|
+
const aplayOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.APLAY_LIST, {
|
|
492
494
|
encoding: 'utf-8',
|
|
493
495
|
timeout: 3000,
|
|
494
496
|
});
|
|
@@ -499,7 +501,7 @@ function loadAlsaDevicesIntoPulseAudio() {
|
|
|
499
501
|
console.log(' No ALSA output devices found or aplay failed');
|
|
500
502
|
}
|
|
501
503
|
try {
|
|
502
|
-
const arecordOutput = (0, child_process_1.execSync)(
|
|
504
|
+
const arecordOutput = (0, child_process_1.execSync)(ALSA_COMMANDS.ARECORD_LIST, {
|
|
503
505
|
encoding: 'utf-8',
|
|
504
506
|
timeout: 3000,
|
|
505
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":"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"}
|
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,37 +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
|
|
268
|
+
// Card lookup failed, continue without card name
|
|
281
269
|
}
|
|
282
270
|
}
|
|
283
271
|
}
|
|
284
272
|
}
|
|
285
273
|
}
|
|
286
274
|
|
|
287
|
-
//
|
|
288
|
-
// 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
|
|
289
277
|
device.label = createDeviceLabel(
|
|
290
278
|
device,
|
|
291
279
|
ports,
|
|
292
280
|
isInput,
|
|
293
281
|
(device as any).formFactor,
|
|
294
282
|
(device as any).bus,
|
|
295
|
-
false,
|
|
283
|
+
false,
|
|
296
284
|
deviceAvailable,
|
|
297
285
|
(device as any).activePort
|
|
298
286
|
);
|
|
299
287
|
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
// 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
|
|
303
290
|
const cleanDevice: Partial<AudioDevice> = {
|
|
304
291
|
identifier: device.identifier,
|
|
305
292
|
volume: device.volume,
|
|
@@ -312,8 +299,18 @@ function parseAudioDevice(block: string, isInput: boolean): AudioDevice | null {
|
|
|
312
299
|
}
|
|
313
300
|
|
|
314
301
|
/**
|
|
315
|
-
*
|
|
316
|
-
* 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
|
|
317
314
|
*/
|
|
318
315
|
function createDeviceLabel(
|
|
319
316
|
device: Partial<AudioDevice>,
|
|
@@ -328,15 +325,12 @@ function createDeviceLabel(
|
|
|
328
325
|
const productName = (device as any).productName;
|
|
329
326
|
let baseLabel = '';
|
|
330
327
|
|
|
331
|
-
// Find the active port in the ports list
|
|
332
328
|
const activePortInfo = activePort ? ports.find(p => p.name === activePort) : undefined;
|
|
333
329
|
|
|
334
|
-
//
|
|
330
|
+
// Label generation priority: product name > active port > display name > identifier
|
|
335
331
|
if (productName) {
|
|
336
332
|
baseLabel = `${productName} (${isInput ? 'Microphone' : 'Speaker'})`;
|
|
337
|
-
}
|
|
338
|
-
// Priority 2: Use active port description if available
|
|
339
|
-
else if (activePortInfo && activePortInfo.description) {
|
|
333
|
+
} else if (activePortInfo && activePortInfo.description) {
|
|
340
334
|
const portDesc = activePortInfo.description;
|
|
341
335
|
|
|
342
336
|
// Map common port descriptions to user-friendly names
|
|
@@ -357,20 +351,15 @@ function createDeviceLabel(
|
|
|
357
351
|
} else if (portDesc.toLowerCase().includes('speaker')) {
|
|
358
352
|
baseLabel = 'Speakers';
|
|
359
353
|
} else {
|
|
360
|
-
// Use port description with device type
|
|
361
354
|
baseLabel = `${portDesc} (${isInput ? 'Input' : 'Output'})`;
|
|
362
355
|
}
|
|
363
|
-
}
|
|
364
|
-
// Priority 3: Use display name with device type
|
|
365
|
-
else if (device.displayName) {
|
|
356
|
+
} else if (device.displayName) {
|
|
366
357
|
baseLabel = `${device.displayName} (${isInput ? 'Input' : 'Output'})`;
|
|
367
|
-
}
|
|
368
|
-
// Fallback: Use identifier
|
|
369
|
-
else {
|
|
358
|
+
} else {
|
|
370
359
|
baseLabel = device.identifier || 'Unknown Audio Device';
|
|
371
360
|
}
|
|
372
361
|
|
|
373
|
-
//
|
|
362
|
+
// Append display name if not already included
|
|
374
363
|
if (
|
|
375
364
|
device.displayName &&
|
|
376
365
|
baseLabel !== device.displayName &&
|
|
@@ -379,45 +368,38 @@ function createDeviceLabel(
|
|
|
379
368
|
baseLabel = `${device.displayName} - ${baseLabel}`;
|
|
380
369
|
}
|
|
381
370
|
|
|
382
|
-
//
|
|
371
|
+
// Append form factor if external device
|
|
383
372
|
if (formFactor && formFactor !== 'internal' && !baseLabel.includes(formFactor)) {
|
|
384
373
|
baseLabel = `${baseLabel} (${formFactor.charAt(0).toUpperCase() + formFactor.slice(1)})`;
|
|
385
374
|
}
|
|
386
375
|
|
|
387
|
-
//
|
|
376
|
+
// Append bus type if non-PCI
|
|
388
377
|
if (bus && bus.toLowerCase() !== 'pci' && !baseLabel.includes(bus.toUpperCase())) {
|
|
389
378
|
baseLabel = `${baseLabel} (${bus.toUpperCase()})`;
|
|
390
379
|
}
|
|
391
380
|
|
|
392
|
-
//
|
|
381
|
+
// Append status indicators
|
|
393
382
|
const statusParts: string[] = [];
|
|
394
|
-
|
|
395
|
-
// Add default status
|
|
396
383
|
if (isDefault) {
|
|
397
384
|
statusParts.push('Default');
|
|
398
385
|
}
|
|
399
|
-
|
|
400
|
-
// Add availability status
|
|
401
386
|
if (available !== undefined) {
|
|
402
387
|
statusParts.push(available ? 'Available' : 'Unavailable');
|
|
403
388
|
}
|
|
404
389
|
|
|
405
|
-
|
|
406
|
-
if (statusParts.length > 0) {
|
|
407
|
-
return `${baseLabel} (${statusParts.join(', ')})`;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
return baseLabel;
|
|
390
|
+
return statusParts.length > 0 ? `${baseLabel} (${statusParts.join(', ')})` : baseLabel;
|
|
411
391
|
}
|
|
412
392
|
|
|
413
393
|
/**
|
|
414
|
-
*
|
|
394
|
+
* Discovers the PulseAudio socket path by locating the socket file
|
|
395
|
+
*
|
|
415
396
|
* @internal
|
|
416
|
-
* 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
|
|
417
400
|
*/
|
|
418
401
|
export function discoverPulseAudioSocket(): string | undefined {
|
|
419
402
|
try {
|
|
420
|
-
// Find PulseAudio socket directories in /tmp
|
|
421
403
|
const findOutput = execSync(
|
|
422
404
|
'find /tmp -maxdepth 2 -type d -name "pulse-*" 2>/dev/null | head -1',
|
|
423
405
|
{
|
|
@@ -429,7 +411,6 @@ export function discoverPulseAudioSocket(): string | undefined {
|
|
|
429
411
|
|
|
430
412
|
if (findOutput) {
|
|
431
413
|
const socketPath = `${findOutput}/native`;
|
|
432
|
-
// Verify the socket file exists
|
|
433
414
|
try {
|
|
434
415
|
execSync(`test -S "${socketPath}"`, { stdio: 'pipe' });
|
|
435
416
|
return socketPath;
|
|
@@ -438,18 +419,20 @@ export function discoverPulseAudioSocket(): string | undefined {
|
|
|
438
419
|
}
|
|
439
420
|
}
|
|
440
421
|
} catch (error) {
|
|
441
|
-
// Socket discovery failed
|
|
422
|
+
// Socket discovery failed
|
|
442
423
|
}
|
|
443
424
|
return undefined;
|
|
444
425
|
}
|
|
445
426
|
|
|
446
427
|
/**
|
|
447
|
-
*
|
|
428
|
+
* Retrieves environment variables for execSync calls, including PULSE_SERVER if socket is discovered
|
|
429
|
+
*
|
|
448
430
|
* @internal
|
|
449
|
-
* 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
|
|
450
434
|
*/
|
|
451
435
|
export function getPulseAudioEnv(): NodeJS.ProcessEnv {
|
|
452
|
-
// Try to discover socket if not already discovered
|
|
453
436
|
if (!pulseAudioServerPath) {
|
|
454
437
|
pulseAudioServerPath = discoverPulseAudioSocket();
|
|
455
438
|
if (pulseAudioServerPath) {
|
|
@@ -465,11 +448,12 @@ export function getPulseAudioEnv(): NodeJS.ProcessEnv {
|
|
|
465
448
|
}
|
|
466
449
|
|
|
467
450
|
/**
|
|
468
|
-
*
|
|
469
|
-
* 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
|
|
470
455
|
*/
|
|
471
456
|
function startPulseAudio(): boolean {
|
|
472
|
-
// If we don't have the socket path yet, try to discover it
|
|
473
457
|
if (!pulseAudioServerPath) {
|
|
474
458
|
pulseAudioServerPath = discoverPulseAudioSocket();
|
|
475
459
|
if (pulseAudioServerPath) {
|
|
@@ -477,7 +461,7 @@ function startPulseAudio(): boolean {
|
|
|
477
461
|
}
|
|
478
462
|
}
|
|
479
463
|
|
|
480
|
-
//
|
|
464
|
+
// Verify PulseAudio is running and accessible
|
|
481
465
|
try {
|
|
482
466
|
const env = getPulseAudioEnv();
|
|
483
467
|
execSync(PULSEAUDIO_COMMANDS.INFO, {
|
|
@@ -488,9 +472,7 @@ function startPulseAudio(): boolean {
|
|
|
488
472
|
});
|
|
489
473
|
console.log('PulseAudio is running and accessible');
|
|
490
474
|
|
|
491
|
-
// Ensure ALSA devices (especially inputs) are loaded
|
|
492
475
|
loadAlsaDevicesIntoPulseAudio();
|
|
493
|
-
|
|
494
476
|
return true;
|
|
495
477
|
} catch (error) {
|
|
496
478
|
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
@@ -498,27 +480,22 @@ function startPulseAudio(): boolean {
|
|
|
498
480
|
console.log('Attempting to start PulseAudio...');
|
|
499
481
|
}
|
|
500
482
|
|
|
501
|
-
//
|
|
483
|
+
// Start fresh PulseAudio instance as current user (root)
|
|
502
484
|
try {
|
|
503
|
-
// Kill existing instances
|
|
504
485
|
execSync(PULSEAUDIO_COMMANDS.KILL, {
|
|
505
486
|
timeout: PULSEAUDIO_TIMEOUTS.KILL,
|
|
506
487
|
stdio: 'pipe',
|
|
507
488
|
});
|
|
508
489
|
|
|
509
|
-
// Wait for cleanup
|
|
510
490
|
execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
|
|
511
491
|
|
|
512
|
-
// Start new daemon
|
|
513
492
|
execSync(PULSEAUDIO_COMMANDS.START_DAEMON, {
|
|
514
493
|
timeout: PULSEAUDIO_TIMEOUTS.START,
|
|
515
494
|
stdio: 'pipe',
|
|
516
495
|
});
|
|
517
496
|
|
|
518
|
-
// Wait for startup
|
|
519
497
|
execSync(PULSEAUDIO_COMMANDS.WAIT, { stdio: 'pipe' });
|
|
520
498
|
|
|
521
|
-
// Discover the socket path
|
|
522
499
|
pulseAudioServerPath = discoverPulseAudioSocket();
|
|
523
500
|
if (pulseAudioServerPath) {
|
|
524
501
|
console.log(`Discovered PulseAudio socket: ${pulseAudioServerPath}`);
|
|
@@ -526,7 +503,6 @@ function startPulseAudio(): boolean {
|
|
|
526
503
|
console.log('Warning: Could not discover PulseAudio socket path');
|
|
527
504
|
}
|
|
528
505
|
|
|
529
|
-
// Verify it's running
|
|
530
506
|
const env = getPulseAudioEnv();
|
|
531
507
|
execSync(PULSEAUDIO_COMMANDS.INFO, {
|
|
532
508
|
timeout: PULSEAUDIO_TIMEOUTS.INFO_CHECK,
|
|
@@ -536,7 +512,6 @@ function startPulseAudio(): boolean {
|
|
|
536
512
|
|
|
537
513
|
console.log('✓ PulseAudio started successfully');
|
|
538
514
|
|
|
539
|
-
// Load ALSA devices (including input sources)
|
|
540
515
|
loadAlsaDevicesIntoPulseAudio();
|
|
541
516
|
|
|
542
517
|
return true;
|
|
@@ -551,7 +526,7 @@ function startPulseAudio(): boolean {
|
|
|
551
526
|
}
|
|
552
527
|
|
|
553
528
|
/**
|
|
554
|
-
*
|
|
529
|
+
* ALSA hardware device information
|
|
555
530
|
*/
|
|
556
531
|
interface AlsaDevice {
|
|
557
532
|
card: number;
|
|
@@ -560,17 +535,23 @@ interface AlsaDevice {
|
|
|
560
535
|
hwString: string; // e.g., "hw:0,0"
|
|
561
536
|
}
|
|
562
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
|
+
*/
|
|
563
544
|
function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
|
|
564
545
|
const devices: AlsaDevice[] = [];
|
|
565
546
|
|
|
566
|
-
// Parse
|
|
547
|
+
// Parse format: "card 0: PCH [HDA Intel PCH], device 0: ALC662 rev3 Analog [ALC662 rev3 Analog]"
|
|
567
548
|
const regex = /card (\d+): ([^,]+), device (\d+): ([^\[]+)\[([^\]]+)\]/g;
|
|
568
549
|
let match;
|
|
569
550
|
|
|
570
551
|
while ((match = regex.exec(aplayOutput)) !== null) {
|
|
571
552
|
const card = parseInt(match[1], 10);
|
|
572
553
|
const device = parseInt(match[3], 10);
|
|
573
|
-
const name = match[5].trim();
|
|
554
|
+
const name = match[5].trim();
|
|
574
555
|
|
|
575
556
|
devices.push({
|
|
576
557
|
card,
|
|
@@ -584,7 +565,11 @@ function parseAlsaDevices(aplayOutput: string): AlsaDevice[] {
|
|
|
584
565
|
}
|
|
585
566
|
|
|
586
567
|
/**
|
|
587
|
-
*
|
|
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
|
|
588
573
|
*/
|
|
589
574
|
function checkExistingSink(hwString: string, isInput: boolean): boolean {
|
|
590
575
|
try {
|
|
@@ -596,15 +581,10 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
|
|
|
596
581
|
env,
|
|
597
582
|
});
|
|
598
583
|
|
|
599
|
-
// Check if any sink/source references this ALSA device
|
|
600
|
-
// Look for patterns like "alsa.device = "0"" and "alsa.card = "0""
|
|
601
584
|
const [card, device] = hwString.replace('hw:', '').split(',');
|
|
602
|
-
|
|
603
|
-
// Check for exact device match (most specific)
|
|
604
585
|
const devicePattern = new RegExp(`alsa\\.device\\s*=\\s*"${device}"`, 'i');
|
|
605
586
|
const cardPattern = new RegExp(`alsa\\.card\\s*=\\s*"${card}"`, 'i');
|
|
606
587
|
|
|
607
|
-
// Split into blocks and check if any block has both card and device match
|
|
608
588
|
const blocks = output.split(/^(Sink|Source) #/m);
|
|
609
589
|
for (const block of blocks) {
|
|
610
590
|
if (cardPattern.test(block) && devicePattern.test(block)) {
|
|
@@ -619,7 +599,11 @@ function checkExistingSink(hwString: string, isInput: boolean): boolean {
|
|
|
619
599
|
}
|
|
620
600
|
|
|
621
601
|
/**
|
|
622
|
-
*
|
|
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
|
|
623
607
|
*/
|
|
624
608
|
function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean {
|
|
625
609
|
try {
|
|
@@ -627,8 +611,7 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
|
|
|
627
611
|
? `alsa_input_${alsaDevice.card}_${alsaDevice.device}`
|
|
628
612
|
: `alsa_output_${alsaDevice.card}_${alsaDevice.device}`;
|
|
629
613
|
|
|
630
|
-
//
|
|
631
|
-
// Replace spaces and special chars with underscores
|
|
614
|
+
// Sanitize description to avoid quoting/escaping issues
|
|
632
615
|
const safeDescription = `${alsaDevice.name}_${alsaDevice.hwString}`.replace(
|
|
633
616
|
/[^a-zA-Z0-9_-]/g,
|
|
634
617
|
'_'
|
|
@@ -660,8 +643,9 @@ function createPulseAudioSink(alsaDevice: AlsaDevice, isInput: boolean): boolean
|
|
|
660
643
|
}
|
|
661
644
|
|
|
662
645
|
/**
|
|
663
|
-
*
|
|
664
|
-
*
|
|
646
|
+
* Ensures PulseAudio loads all ALSA devices (including input devices)
|
|
647
|
+
*
|
|
648
|
+
* Process:
|
|
665
649
|
* 1. Queries ALSA hardware to find all available devices
|
|
666
650
|
* 2. Checks what PulseAudio has already detected
|
|
667
651
|
* 3. Creates missing sinks/sources dynamically
|
|
@@ -671,7 +655,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
671
655
|
try {
|
|
672
656
|
console.log('Detecting ALSA hardware and ensuring PulseAudio coverage...');
|
|
673
657
|
|
|
674
|
-
//
|
|
658
|
+
// Load base ALSA card module for auto-detection
|
|
675
659
|
try {
|
|
676
660
|
const env = getPulseAudioEnv();
|
|
677
661
|
const modules = execSync(PULSEAUDIO_COMMANDS.LIST_MODULES, {
|
|
@@ -692,12 +676,12 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
692
676
|
console.log(' Note: Base ALSA module load failed (will create sinks manually)');
|
|
693
677
|
}
|
|
694
678
|
|
|
695
|
-
//
|
|
679
|
+
// Query ALSA for hardware devices
|
|
696
680
|
let outputDevices: AlsaDevice[] = [];
|
|
697
681
|
let inputDevices: AlsaDevice[] = [];
|
|
698
682
|
|
|
699
683
|
try {
|
|
700
|
-
const aplayOutput = execSync(
|
|
684
|
+
const aplayOutput = execSync(ALSA_COMMANDS.APLAY_LIST, {
|
|
701
685
|
encoding: 'utf-8',
|
|
702
686
|
timeout: 3000,
|
|
703
687
|
});
|
|
@@ -708,7 +692,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
708
692
|
}
|
|
709
693
|
|
|
710
694
|
try {
|
|
711
|
-
const arecordOutput = execSync(
|
|
695
|
+
const arecordOutput = execSync(ALSA_COMMANDS.ARECORD_LIST, {
|
|
712
696
|
encoding: 'utf-8',
|
|
713
697
|
timeout: 3000,
|
|
714
698
|
});
|
|
@@ -718,7 +702,7 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
718
702
|
console.log(' No ALSA input devices found or arecord failed');
|
|
719
703
|
}
|
|
720
704
|
|
|
721
|
-
//
|
|
705
|
+
// Create missing PulseAudio sinks/sources for each ALSA device
|
|
722
706
|
let createdCount = 0;
|
|
723
707
|
|
|
724
708
|
for (const device of outputDevices) {
|
|
@@ -755,7 +739,9 @@ function loadAlsaDevicesIntoPulseAudio(): void {
|
|
|
755
739
|
}
|
|
756
740
|
|
|
757
741
|
/**
|
|
758
|
-
*
|
|
742
|
+
* Retrieves the default sink and source identifiers from PulseAudio
|
|
743
|
+
*
|
|
744
|
+
* @returns Object containing defaultSink and defaultSource identifiers, or empty object on failure
|
|
759
745
|
*/
|
|
760
746
|
function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
|
|
761
747
|
try {
|
|
@@ -780,7 +766,9 @@ function getDefaultDevices(): { defaultSink?: string; defaultSource?: string } {
|
|
|
780
766
|
}
|
|
781
767
|
|
|
782
768
|
/**
|
|
783
|
-
*
|
|
769
|
+
* Retrieves available audio input and output devices using PulseAudio
|
|
770
|
+
*
|
|
771
|
+
* @returns AudioDevices object containing outputs and inputs arrays, or undefined on failure
|
|
784
772
|
*/
|
|
785
773
|
function getAudioDevices(): AudioDevices | undefined {
|
|
786
774
|
if (!startPulseAudio()) {
|
|
@@ -788,7 +776,6 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
788
776
|
return undefined;
|
|
789
777
|
}
|
|
790
778
|
|
|
791
|
-
// Get default devices first
|
|
792
779
|
const { defaultSink, defaultSource } = getDefaultDevices();
|
|
793
780
|
console.log(`Default sink: ${defaultSink}, Default source: ${defaultSource}`);
|
|
794
781
|
|
|
@@ -809,11 +796,9 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
809
796
|
.forEach(block => {
|
|
810
797
|
const device = parseAudioDevice(block, false);
|
|
811
798
|
if (device) {
|
|
812
|
-
// Check if this is the default sink and update label
|
|
813
799
|
const isDefault = device.identifier === defaultSink;
|
|
814
800
|
|
|
815
801
|
if (isDefault && device.label) {
|
|
816
|
-
// Update label to include Default status
|
|
817
802
|
if (!device.label.includes('Default')) {
|
|
818
803
|
if (device.label.includes('(')) {
|
|
819
804
|
device.label = device.label.replace(')', ', Default)');
|
|
@@ -848,11 +833,9 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
848
833
|
.forEach(block => {
|
|
849
834
|
const device = parseAudioDevice(block, true);
|
|
850
835
|
if (device) {
|
|
851
|
-
// Check if this is the default source and update label
|
|
852
836
|
const isDefault = device.identifier === defaultSource;
|
|
853
837
|
|
|
854
838
|
if (isDefault && device.label) {
|
|
855
|
-
// Update label to include Default status
|
|
856
839
|
if (!device.label.includes('Default')) {
|
|
857
840
|
if (device.label.includes('(')) {
|
|
858
841
|
device.label = device.label.replace(')', ', Default)');
|
|
@@ -873,7 +856,6 @@ function getAudioDevices(): AudioDevices | undefined {
|
|
|
873
856
|
);
|
|
874
857
|
}
|
|
875
858
|
|
|
876
|
-
// Return undefined if no devices found
|
|
877
859
|
if (outputs.length === 0 && inputs.length === 0) {
|
|
878
860
|
console.log('No audio devices detected');
|
|
879
861
|
return undefined;
|
|
@@ -916,17 +898,15 @@ export async function getSystemInformation() {
|
|
|
916
898
|
};
|
|
917
899
|
|
|
918
900
|
const info = await si.get(valueObject);
|
|
919
|
-
// console.log('getAllData3', {info});
|
|
920
901
|
|
|
921
|
-
//
|
|
902
|
+
// Retrieve network interfaces (includes disabled interfaces)
|
|
922
903
|
let netIfaces = await si.networkInterfaces();
|
|
923
904
|
|
|
924
|
-
// Ensure netIfaces is always an array
|
|
925
905
|
if (!Array.isArray(netIfaces)) {
|
|
926
906
|
netIfaces = [netIfaces];
|
|
927
907
|
}
|
|
928
908
|
|
|
929
|
-
//
|
|
909
|
+
// Assign type to interfaces missing type information
|
|
930
910
|
netIfaces = netIfaces.map((iface: any) => ({
|
|
931
911
|
...iface,
|
|
932
912
|
type:
|
|
@@ -936,16 +916,14 @@ export async function getSystemInformation() {
|
|
|
936
916
|
: 'unknown'),
|
|
937
917
|
}));
|
|
938
918
|
|
|
939
|
-
// Inject the full list of network interfaces into our system info.
|
|
940
919
|
info.networkInterfaces = netIfaces;
|
|
941
920
|
|
|
942
|
-
// Get audio devices using PulseAudio
|
|
943
921
|
const audioDevices = getAudioDevices();
|
|
944
922
|
if (audioDevices) {
|
|
945
923
|
info.audioDevices = audioDevices;
|
|
946
924
|
}
|
|
947
925
|
|
|
948
|
-
// TODO:
|
|
926
|
+
// TODO: Align structure with browser version output and create proper type definition
|
|
949
927
|
const systemInfo = JSON.parse(JSON.stringify(info));
|
|
950
928
|
|
|
951
929
|
return systemInfo;
|