|
@@ -1,9 +1,14 @@
|
1
|
1
|
import { getLogger } from '@jitsi/logger';
|
2
|
2
|
|
3
|
3
|
import * as JitsiTrackEvents from '../../JitsiTrackEvents';
|
|
4
|
+import JitsiLocalTrack from '../RTC/JitsiLocalTrack';
|
4
|
5
|
import RTC from '../RTC/RTC';
|
5
|
6
|
import Statistics from '../statistics/statistics';
|
6
|
7
|
|
|
8
|
+export interface IActiveDeviceInfo {
|
|
9
|
+ deviceId: string;
|
|
10
|
+ deviceLabel: string;
|
|
11
|
+}
|
7
|
12
|
|
8
|
13
|
const logger = getLogger('modules/detection/ActiveDeviceDetector');
|
9
|
14
|
|
|
@@ -15,19 +20,21 @@ const DETECTION_TIMEOUT = 3000;
|
15
|
20
|
/**
|
16
|
21
|
* Go through all audio devices on the system and return one that is active, i.e. has audio signal.
|
17
|
22
|
*
|
18
|
|
- * @returns Promise<Object> - Object containing information about the found device.
|
|
23
|
+ * @returns Promise<IActiveDeviceInfo> - Object containing information about the found device.
|
19
|
24
|
*/
|
20
|
|
-export default function getActiveAudioDevice() {
|
|
25
|
+export default function getActiveAudioDevice(): Promise<IActiveDeviceInfo> {
|
21
|
26
|
|
22
|
27
|
return new Promise(resolve => {
|
23
|
|
- RTC.enumerateDevices(devices => {
|
|
28
|
+ RTC.enumerateDevices((devices: MediaDeviceInfo[]) => {
|
24
|
29
|
const audioDevices = devices.filter(device => device.kind === 'audioinput');
|
25
|
|
- const devicePromiseArray = [];
|
|
30
|
+ const devicePromiseArray: Promise<JitsiLocalTrack>[] = [];
|
26
|
31
|
|
27
|
32
|
|
28
|
33
|
for (const micDevice of audioDevices) {
|
29
|
|
- const devicePromise = RTC.obtainAudioAndVideoPermissions({ devices: [ 'audio' ],
|
30
|
|
- micDeviceId: micDevice.deviceId }).then(tracks => {
|
|
34
|
+ const devicePromise = RTC.obtainAudioAndVideoPermissions({
|
|
35
|
+ devices: [ 'audio' ],
|
|
36
|
+ micDeviceId: micDevice.deviceId
|
|
37
|
+ }).then((tracks: JitsiLocalTrack[]) => {
|
31
|
38
|
|
32
|
39
|
// We expect a single device to be available when obtained from obtainAudioAndVideoPermissions
|
33
|
40
|
// that's why only take p.value[0].
|
|
@@ -46,8 +53,8 @@ export default function getActiveAudioDevice() {
|
46
|
53
|
const rejectedPromises = outcomeArray.filter(p => p.status === 'rejected');
|
47
|
54
|
|
48
|
55
|
|
49
|
|
- const availableDevices = successfulPromises.map(p => p.value);
|
50
|
|
- const rejectReasons = rejectedPromises.map(p => p.value);
|
|
56
|
+ const availableDevices = successfulPromises.map(p => (p as PromiseFulfilledResult<JitsiLocalTrack>).value);
|
|
57
|
+ const rejectReasons = rejectedPromises.map(p => (p as any).value);
|
51
|
58
|
|
52
|
59
|
for (const reason of rejectReasons) {
|
53
|
60
|
logger.error('Failed to acquire audio device with error: ', reason);
|
|
@@ -62,8 +69,10 @@ export default function getActiveAudioDevice() {
|
62
|
69
|
// no input.
|
63
|
70
|
if (audioLevel > 0.008) {
|
64
|
71
|
stopActiveDevices(availableDevices);
|
65
|
|
- resolve({ deviceId: device.deviceId,
|
66
|
|
- deviceLabel: device.track.label });
|
|
72
|
+ resolve({
|
|
73
|
+ deviceId: device.deviceId,
|
|
74
|
+ deviceLabel: device.track.label
|
|
75
|
+ });
|
67
|
76
|
}
|
68
|
77
|
});
|
69
|
78
|
}
|
|
@@ -73,8 +82,8 @@ export default function getActiveAudioDevice() {
|
73
|
82
|
stopActiveDevices(availableDevices);
|
74
|
83
|
resolve({
|
75
|
84
|
deviceId: '',
|
76
|
|
- deviceLabel: '' }
|
77
|
|
- );
|
|
85
|
+ deviceLabel: ''
|
|
86
|
+ });
|
78
|
87
|
}, DETECTION_TIMEOUT);
|
79
|
88
|
|
80
|
89
|
});
|
|
@@ -89,7 +98,7 @@ export default function getActiveAudioDevice() {
|
89
|
98
|
* @param {Array<JitsiLocalTrack>} deviceList - Array of JitsiLocalTracks to stop.
|
90
|
99
|
* @returns {void}
|
91
|
100
|
*/
|
92
|
|
-function stopActiveDevices(deviceList) {
|
|
101
|
+function stopActiveDevices(deviceList: JitsiLocalTrack[]): void {
|
93
|
102
|
for (const device of deviceList) {
|
94
|
103
|
device.stopStream();
|
95
|
104
|
}
|