Skip to content

Commit 7fcdd8b

Browse files
committed
Hide invisible audio sources from mixer
1 parent f83d124 commit 7fcdd8b

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

app/components-react/editor/elements/Mixer.tsx

+23-5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,31 @@ import { Services } from 'components-react/service-provider';
99
import { Menu } from 'util/menus/Menu';
1010
import { $t } from 'services/i18n';
1111
import { useRealmObject } from 'components-react/hooks/realm';
12+
import { getDefined } from 'util/properties-type-guards';
1213

1314
const mins = { x: 150, y: 120 };
1415

16+
export function getVisibleAudioSourcesIds() {
17+
const { ScenesService, AudioService } = Services;
18+
const activeScene = getDefined(ScenesService.views.activeScene);
19+
20+
// Get sources ids for visible scene items
21+
// using the Set to avoid duplicates and improve performance
22+
const visibleSourcesIds = new Set(
23+
activeScene.items.filter(item => item.visible).map(item => item.sourceId),
24+
);
25+
26+
return AudioService.views.sourcesForCurrentScene
27+
.filter(source => {
28+
return (
29+
!source.mixerHidden &&
30+
source.isControlledViaObs &&
31+
(visibleSourcesIds.has(source.sourceId) || source.isGlobal())
32+
);
33+
})
34+
.map(source => source.sourceId);
35+
}
36+
1537
export function Mixer() {
1638
const { EditorCommandsService, AudioService, CustomizationService } = Services;
1739

@@ -26,11 +48,7 @@ export function Mixer() {
2648
}, []);
2749

2850
const performanceMode = useRealmObject(CustomizationService.state).performanceMode;
29-
const { audioSourceIds } = useVuex(() => ({
30-
audioSourceIds: AudioService.views.sourcesForCurrentScene
31-
.filter(source => !source.mixerHidden && source.isControlledViaObs)
32-
.map(source => source.sourceId),
33-
}));
51+
const audioSourceIds = useVuex(getVisibleAudioSourcesIds);
3452

3553
function showAdvancedSettings() {
3654
AudioService.actions.showAdvancedSettings();

app/components-react/editor/elements/mixer/GLVolmeters.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import vShaderSrc from 'util/webgl/shaders/volmeter.vert';
77
import fShaderSrc from 'util/webgl/shaders/volmeter.frag';
88
import { Services } from 'components-react/service-provider';
99
import { assertIsDefined, getDefined } from 'util/properties-type-guards';
10+
import { getVisibleAudioSourcesIds } from '../Mixer';
1011

1112
// Configuration
1213
const CHANNEL_HEIGHT = 3;
@@ -133,9 +134,10 @@ class GLVolmetersController {
133134

134135
// TODO: refactor into a single source of truth between Mixer and Volmeters
135136
get audioSources() {
136-
return this.audioService.views.sourcesForCurrentScene.filter(source => {
137-
return !source.mixerHidden && source.isControlledViaObs;
138-
});
137+
const vidibleSourceIds = getVisibleAudioSourcesIds();
138+
return this.audioService.views.sourcesForCurrentScene.filter(source =>
139+
vidibleSourceIds.includes(source.sourceId),
140+
);
139141
}
140142

141143
/**

app/services/audio/audio.ts

+4
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,10 @@ export class AudioSource implements IAudioSourceApi {
388388
return { ...this.source.state, ...this.audioSourceState };
389389
}
390390

391+
isGlobal() {
392+
return this.source.channel !== void 0;
393+
}
394+
391395
get monitoringOptions() {
392396
return [
393397
{ value: obs.EMonitoringType.None, label: $t('Monitor Off') },

0 commit comments

Comments
 (0)