SoundMeterWidget no longer instantiate new SoundMeter
This commit is contained in:
parent
40aae25e11
commit
a4cd626c41
@ -5,6 +5,7 @@
|
|||||||
audioConstraintStore,
|
audioConstraintStore,
|
||||||
cameraListStore,
|
cameraListStore,
|
||||||
localStreamStore,
|
localStreamStore,
|
||||||
|
localVolumeStore,
|
||||||
microphoneListStore,
|
microphoneListStore,
|
||||||
videoConstraintStore,
|
videoConstraintStore,
|
||||||
} from "../../Stores/MediaStore";
|
} from "../../Stores/MediaStore";
|
||||||
@ -18,6 +19,7 @@
|
|||||||
export let game: Game;
|
export let game: Game;
|
||||||
let selectedCamera: string | undefined = undefined;
|
let selectedCamera: string | undefined = undefined;
|
||||||
let selectedMicrophone: string | undefined = undefined;
|
let selectedMicrophone: string | undefined = undefined;
|
||||||
|
let volume = 0;
|
||||||
|
|
||||||
const enableCameraScene = game.scene.getScene(EnableCameraSceneName) as EnableCameraScene;
|
const enableCameraScene = game.scene.getScene(EnableCameraSceneName) as EnableCameraScene;
|
||||||
|
|
||||||
@ -38,7 +40,7 @@
|
|||||||
|
|
||||||
let stream: MediaStream | null;
|
let stream: MediaStream | null;
|
||||||
|
|
||||||
const unsubscribe = localStreamStore.subscribe((value) => {
|
const unsubscribeLocalStreamStore = localStreamStore.subscribe((value) => {
|
||||||
if (value.type === "success") {
|
if (value.type === "success") {
|
||||||
stream = value.stream;
|
stream = value.stream;
|
||||||
|
|
||||||
@ -59,7 +61,14 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
onDestroy(unsubscribe);
|
const unsubscribeLocalVolumeStore = localVolumeStore.subscribe((value) => {
|
||||||
|
volume = value ?? 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
unsubscribeLocalVolumeStore();
|
||||||
|
unsubscribeLocalStreamStore();
|
||||||
|
});
|
||||||
|
|
||||||
function normalizeDeviceName(label: string): string {
|
function normalizeDeviceName(label: string): string {
|
||||||
// remove IDs (that can appear in Chrome, like: "HD Pro Webcam (4df7:4eda)"
|
// remove IDs (that can appear in Chrome, like: "HD Pro Webcam (4df7:4eda)"
|
||||||
@ -86,7 +95,7 @@
|
|||||||
<img class="background-img" src={cinemaCloseImg} alt="" />
|
<img class="background-img" src={cinemaCloseImg} alt="" />
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
<HorizontalSoundMeterWidget {stream} />
|
<HorizontalSoundMeterWidget {volume} />
|
||||||
|
|
||||||
<section class="selectWebcamForm">
|
<section class="selectWebcamForm">
|
||||||
{#if $cameraListStore.length > 1}
|
{#if $cameraListStore.length > 1}
|
||||||
|
@ -1,50 +1,9 @@
|
|||||||
<script lang="typescript">
|
<script lang="typescript">
|
||||||
import { AudioContext } from "standardized-audio-context";
|
|
||||||
import { SoundMeter } from "../../Phaser/Components/SoundMeter";
|
|
||||||
import { onDestroy } from "svelte";
|
|
||||||
|
|
||||||
export let stream: MediaStream | null;
|
export let volume = 0;
|
||||||
let volume = 0;
|
|
||||||
|
|
||||||
const NB_BARS = 20;
|
const NB_BARS = 20;
|
||||||
|
|
||||||
let timeout: ReturnType<typeof setTimeout>;
|
|
||||||
const soundMeter = new SoundMeter();
|
|
||||||
let display = false;
|
|
||||||
let error = false;
|
|
||||||
|
|
||||||
$: {
|
|
||||||
if (stream && stream.getAudioTracks().length > 0) {
|
|
||||||
display = true;
|
|
||||||
soundMeter.connectToSource(stream, new AudioContext());
|
|
||||||
|
|
||||||
if (timeout) {
|
|
||||||
clearInterval(timeout);
|
|
||||||
error = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeout = setInterval(() => {
|
|
||||||
try {
|
|
||||||
volume = parseInt(((soundMeter.getVolume() / 100) * NB_BARS).toFixed(0));
|
|
||||||
} catch (err) {
|
|
||||||
if (!error) {
|
|
||||||
console.error(err);
|
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 100);
|
|
||||||
} else {
|
|
||||||
display = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onDestroy(() => {
|
|
||||||
soundMeter.stop();
|
|
||||||
if (timeout) {
|
|
||||||
clearInterval(timeout);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function color(i: number, volume: number) {
|
function color(i: number, volume: number) {
|
||||||
const red = (255 * i) / NB_BARS;
|
const red = (255 * i) / NB_BARS;
|
||||||
const green = 255 * (1 - i / NB_BARS);
|
const green = 255 * (1 - i / NB_BARS);
|
||||||
@ -58,7 +17,7 @@
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="horizontal-sound-meter" class:active={display}>
|
<div class="horizontal-sound-meter" class:active={volume !== undefined}>
|
||||||
{#each [...Array(NB_BARS).keys()] as i (i)}
|
{#each [...Array(NB_BARS).keys()] as i (i)}
|
||||||
<div style={color(i, volume)} />
|
<div style={color(i, volume)} />
|
||||||
{/each}
|
{/each}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<script lang="typescript">
|
<script lang="typescript">
|
||||||
import { obtainedMediaConstraintStore } from "../Stores/MediaStore";
|
import { localVolumeStore, obtainedMediaConstraintStore } from "../Stores/MediaStore";
|
||||||
import { localStreamStore, isSilentStore } from "../Stores/MediaStore";
|
import { localStreamStore, isSilentStore } from "../Stores/MediaStore";
|
||||||
import SoundMeterWidget from "./SoundMeterWidget.svelte";
|
import SoundMeterWidget from "./SoundMeterWidget.svelte";
|
||||||
import { onDestroy, onMount } from "svelte";
|
import { onDestroy, onMount } from "svelte";
|
||||||
@ -7,8 +7,9 @@
|
|||||||
import LL from "../i18n/i18n-svelte";
|
import LL from "../i18n/i18n-svelte";
|
||||||
|
|
||||||
let stream: MediaStream | null;
|
let stream: MediaStream | null;
|
||||||
|
let volume = 0;
|
||||||
|
|
||||||
const unsubscribe = localStreamStore.subscribe((value) => {
|
const unsubscribeLocalStreamStore = localStreamStore.subscribe((value) => {
|
||||||
if (value.type === "success") {
|
if (value.type === "success") {
|
||||||
stream = value.stream;
|
stream = value.stream;
|
||||||
} else {
|
} else {
|
||||||
@ -16,7 +17,14 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
onDestroy(unsubscribe);
|
const unsubscribeLocalVolumeStore = localVolumeStore.subscribe((value) => {
|
||||||
|
volume = value ?? 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
unsubscribeLocalStreamStore();
|
||||||
|
unsubscribeLocalVolumeStore();
|
||||||
|
});
|
||||||
|
|
||||||
let isSilent: boolean;
|
let isSilent: boolean;
|
||||||
const unsubscribeIsSilent = isSilentStore.subscribe((value) => {
|
const unsubscribeIsSilent = isSilentStore.subscribe((value) => {
|
||||||
@ -51,7 +59,7 @@
|
|||||||
<div class="is-silent">{$LL.camera.my.silentZone()}</div>
|
<div class="is-silent">{$LL.camera.my.silentZone()}</div>
|
||||||
{:else if $localStreamStore.type === "success" && $localStreamStore.stream}
|
{:else if $localStreamStore.type === "success" && $localStreamStore.stream}
|
||||||
<video class="my-cam-video" use:srcObject={stream} autoplay muted playsinline />
|
<video class="my-cam-video" use:srcObject={stream} autoplay muted playsinline />
|
||||||
<SoundMeterWidget {stream} />
|
<SoundMeterWidget {volume} />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -1,47 +1,6 @@
|
|||||||
<script lang="typescript">
|
<script lang="typescript">
|
||||||
import { AudioContext } from "standardized-audio-context";
|
export let volume = 0;
|
||||||
import { SoundMeter } from "../Phaser/Components/SoundMeter";
|
let display = true;
|
||||||
import { onDestroy } from "svelte";
|
|
||||||
|
|
||||||
export let stream: MediaStream | null;
|
|
||||||
let volume = 0;
|
|
||||||
|
|
||||||
let timeout: ReturnType<typeof setTimeout>;
|
|
||||||
const soundMeter = new SoundMeter();
|
|
||||||
let display = false;
|
|
||||||
let error = false;
|
|
||||||
|
|
||||||
$: {
|
|
||||||
if (stream && stream.getAudioTracks().length > 0) {
|
|
||||||
display = true;
|
|
||||||
soundMeter.connectToSource(stream, new AudioContext());
|
|
||||||
|
|
||||||
if (timeout) {
|
|
||||||
clearInterval(timeout);
|
|
||||||
error = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
timeout = setInterval(() => {
|
|
||||||
try {
|
|
||||||
volume = soundMeter.getVolume();
|
|
||||||
} catch (err) {
|
|
||||||
if (!error) {
|
|
||||||
console.error(err);
|
|
||||||
error = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 100);
|
|
||||||
} else {
|
|
||||||
display = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onDestroy(() => {
|
|
||||||
soundMeter.stop();
|
|
||||||
if (timeout) {
|
|
||||||
clearInterval(timeout);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div class="sound-progress" class:active={display}>
|
<div class="sound-progress" class:active={display}>
|
||||||
|
@ -11,13 +11,14 @@
|
|||||||
import type { Streamable } from "../../Stores/StreamableCollectionStore";
|
import type { Streamable } from "../../Stores/StreamableCollectionStore";
|
||||||
|
|
||||||
import Woka from "../Woka/Woka.svelte";
|
import Woka from "../Woka/Woka.svelte";
|
||||||
import { onMount } from "svelte";
|
import { onDestroy, onMount } from "svelte";
|
||||||
import { isMediaBreakpointOnly } from "../../Utils/BreakpointsUtils";
|
import { isMediaBreakpointOnly } from "../../Utils/BreakpointsUtils";
|
||||||
|
|
||||||
export let clickable = false;
|
export let clickable = false;
|
||||||
|
|
||||||
export let peer: VideoPeer;
|
export let peer: VideoPeer;
|
||||||
let streamStore = peer.streamStore;
|
let streamStore = peer.streamStore;
|
||||||
|
let volumeStore = peer.volumeStore;
|
||||||
let name = peer.userName;
|
let name = peer.userName;
|
||||||
let statusStore = peer.statusStore;
|
let statusStore = peer.statusStore;
|
||||||
let constraintStore = peer.constraintsStore;
|
let constraintStore = peer.constraintsStore;
|
||||||
@ -29,6 +30,11 @@
|
|||||||
let embedScreen: EmbedScreen;
|
let embedScreen: EmbedScreen;
|
||||||
let videoContainer: HTMLDivElement;
|
let videoContainer: HTMLDivElement;
|
||||||
let minimized = isMediaBreakpointOnly("md");
|
let minimized = isMediaBreakpointOnly("md");
|
||||||
|
let volume = 0;
|
||||||
|
|
||||||
|
const unsubscribe = volumeStore.subscribe((value) => {
|
||||||
|
volume = value ?? 0;
|
||||||
|
});
|
||||||
|
|
||||||
if (peer) {
|
if (peer) {
|
||||||
embedScreen = {
|
embedScreen = {
|
||||||
@ -48,6 +54,10 @@
|
|||||||
onMount(() => {
|
onMount(() => {
|
||||||
resizeObserver.observe(videoContainer);
|
resizeObserver.observe(videoContainer);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onDestroy(() => {
|
||||||
|
unsubscribe();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
@ -93,7 +103,7 @@
|
|||||||
/>
|
/>
|
||||||
<img src={blockSignImg} draggable="false" on:dragstart|preventDefault={noDrag} class="block-logo" alt="Block" />
|
<img src={blockSignImg} draggable="false" on:dragstart|preventDefault={noDrag} class="block-logo" alt="Block" />
|
||||||
{#if $constraintStore && $constraintStore.audio !== false}
|
{#if $constraintStore && $constraintStore.audio !== false}
|
||||||
<SoundMeterWidget stream={$streamStore} />
|
<SoundMeterWidget {volume} />
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user