From a5a60acb17f0d61066d78d0e7cb4a9201b2cabd2 Mon Sep 17 00:00:00 2001 From: Nicolas Echezarreta Date: Thu, 11 Apr 2024 11:53:38 -0300 Subject: [PATCH] fix comments --- browser-interface/package-lock.json | 28 ++++---- browser-interface/package.json | 4 +- .../packages/shared/world/runtime-7/engine.ts | 37 ++++++++++ .../packages/unity-interface/audioStream.ts | 70 ++++++------------- 4 files changed, 76 insertions(+), 63 deletions(-) diff --git a/browser-interface/package-lock.json b/browser-interface/package-lock.json index 45455160cd..ebdf0165c9 100644 --- a/browser-interface/package-lock.json +++ b/browser-interface/package-lock.json @@ -10,14 +10,14 @@ "license": "Apache-2.0", "dependencies": { "@dcl/crypto": "^3.3.1", - "@dcl/ecs": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/sdk7-audio-stream-audio-event-component/@dcl/ecs/dcl-ecs-7.4.14-8544623185.commit-305d325.tgz", + "@dcl/ecs": "^7.4.16", "@dcl/ecs-math": "^1.0.3", "@dcl/ecs-quests": "^1.3.1", "@dcl/feature-flags": "^1.1.0", "@dcl/hashing": "^1.1.3", "@dcl/kernel-interface": "^2.0.0-20230512115658.commit-b582e05", "@dcl/legacy-ecs": "^6.11.11", - "@dcl/protocol": "https://sdk-team-cdn.decentraland.org/@dcl/protocol/branch//dcl-protocol-1.0.0-8544517864.commit-0416b65.tgz", + "@dcl/protocol": "^1.0.0-8691799990.commit-4ba546c", "@dcl/rpc": "^1.1.1", "@dcl/scene-runtime": "7.0.6-20240220184109.commit-cf1e4e2", "@dcl/schemas": "^9.1.1", @@ -516,10 +516,9 @@ } }, "node_modules/@dcl/ecs": { - "version": "7.4.14-8544623185.commit-305d325", - "resolved": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/sdk7-audio-stream-audio-event-component/@dcl/ecs/dcl-ecs-7.4.14-8544623185.commit-305d325.tgz", - "integrity": "sha512-Fb3uuVzmSnPOwwrskdkh5d9DPu1aJiuZf0n9jTLVJ0kTfThvr66+aZdeqDapbvJdtkpUzO8g4DgJDHtERwX+pQ==", - "license": "Apache-2.0" + "version": "7.4.16", + "resolved": "https://registry.npmjs.org/@dcl/ecs/-/ecs-7.4.16.tgz", + "integrity": "sha512-u81+93tuTsOLv2tuJcPa8kTWmrmNs4S2DUQ9V2dNSdeM/6tigHWUiJEhwfLv4fx6Jehh2fESUlYybIbaYMswnA==" }, "node_modules/@dcl/ecs-math": { "version": "1.0.3", @@ -594,10 +593,9 @@ "integrity": "sha512-Z0zpNr2HAxn2cLWUadWGlzaG48Z+N3hg2bI20UH+OT8NJtvCJnAwVBshAG83iAn4BTC+CsUsk4A394jrlv2ZIQ==" }, "node_modules/@dcl/protocol": { - "version": "1.0.0-8544517864.commit-0416b65", - "resolved": "https://sdk-team-cdn.decentraland.org/@dcl/protocol/branch//dcl-protocol-1.0.0-8544517864.commit-0416b65.tgz", - "integrity": "sha512-xbSPoyrAl2kxTkbNczayEHDJpm9g2Q3ETXUkErL2OsqtE5SRas4GakdHwOzGfu8YRCF/u2L7WmaJychP0oEz7w==", - "license": "Apache-2.0", + "version": "1.0.0-8691799990.commit-4ba546c", + "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8691799990.commit-4ba546c.tgz", + "integrity": "sha512-hU/8zZXdjgRSUvfi1QRL6YAMF/8QDS/hhh8cs4bE2dw9obXTziyekiR7IEwAOmF60wt/u6+s7JLIacHd35G+HQ==", "dependencies": { "@dcl/ts-proto": "1.154.0" } @@ -10406,8 +10404,9 @@ } }, "@dcl/ecs": { - "version": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/sdk7-audio-stream-audio-event-component/@dcl/ecs/dcl-ecs-7.4.14-8544623185.commit-305d325.tgz", - "integrity": "sha512-Fb3uuVzmSnPOwwrskdkh5d9DPu1aJiuZf0n9jTLVJ0kTfThvr66+aZdeqDapbvJdtkpUzO8g4DgJDHtERwX+pQ==" + "version": "7.4.16", + "resolved": "https://registry.npmjs.org/@dcl/ecs/-/ecs-7.4.16.tgz", + "integrity": "sha512-u81+93tuTsOLv2tuJcPa8kTWmrmNs4S2DUQ9V2dNSdeM/6tigHWUiJEhwfLv4fx6Jehh2fESUlYybIbaYMswnA==" }, "@dcl/ecs-math": { "version": "1.0.3", @@ -10482,8 +10481,9 @@ "integrity": "sha512-Z0zpNr2HAxn2cLWUadWGlzaG48Z+N3hg2bI20UH+OT8NJtvCJnAwVBshAG83iAn4BTC+CsUsk4A394jrlv2ZIQ==" }, "@dcl/protocol": { - "version": "https://sdk-team-cdn.decentraland.org/@dcl/protocol/branch//dcl-protocol-1.0.0-8544517864.commit-0416b65.tgz", - "integrity": "sha512-xbSPoyrAl2kxTkbNczayEHDJpm9g2Q3ETXUkErL2OsqtE5SRas4GakdHwOzGfu8YRCF/u2L7WmaJychP0oEz7w==", + "version": "1.0.0-8691799990.commit-4ba546c", + "resolved": "https://registry.npmjs.org/@dcl/protocol/-/protocol-1.0.0-8691799990.commit-4ba546c.tgz", + "integrity": "sha512-hU/8zZXdjgRSUvfi1QRL6YAMF/8QDS/hhh8cs4bE2dw9obXTziyekiR7IEwAOmF60wt/u6+s7JLIacHd35G+HQ==", "requires": { "@dcl/ts-proto": "1.154.0" } diff --git a/browser-interface/package.json b/browser-interface/package.json index 214cc5d0dc..7f9b6aa7a8 100644 --- a/browser-interface/package.json +++ b/browser-interface/package.json @@ -56,14 +56,14 @@ }, "dependencies": { "@dcl/crypto": "^3.3.1", - "@dcl/ecs": "https://sdk-team-cdn.decentraland.org/@dcl/js-sdk-toolchain/branch/feat/sdk7-audio-stream-audio-event-component/@dcl/ecs/dcl-ecs-7.4.14-8544623185.commit-305d325.tgz", + "@dcl/ecs": "7.4.16", "@dcl/ecs-math": "^1.0.3", "@dcl/ecs-quests": "^1.3.1", "@dcl/feature-flags": "^1.1.0", "@dcl/hashing": "^1.1.3", "@dcl/kernel-interface": "^2.0.0-20230512115658.commit-b582e05", "@dcl/legacy-ecs": "^6.11.11", - "@dcl/protocol": "https://sdk-team-cdn.decentraland.org/@dcl/protocol/branch//dcl-protocol-1.0.0-8544517864.commit-0416b65.tgz", + "@dcl/protocol": "1.0.0-8691799990.commit-4ba546c", "@dcl/rpc": "^1.1.1", "@dcl/scene-runtime": "7.0.6-20240220184109.commit-cf1e4e2", "@dcl/schemas": "^9.1.1", diff --git a/browser-interface/packages/shared/world/runtime-7/engine.ts b/browser-interface/packages/shared/world/runtime-7/engine.ts index e81a64be12..429b3650a2 100644 --- a/browser-interface/packages/shared/world/runtime-7/engine.ts +++ b/browser-interface/packages/shared/world/runtime-7/engine.ts @@ -1,5 +1,7 @@ import { Engine, IEngine, Transport } from '@dcl/ecs/dist-cjs' import { + MediaState, + AudioEvent as defineAudioEvent, Transform as defineTransform, PlayerIdentityData as definePlayerIdentityData, AvatarBase as defineAvatarBase, @@ -20,6 +22,8 @@ import { Avatar } from '@dcl/schemas' import { prepareAvatar } from '../../../lib/decentraland/profiles/transformations/profileToRendererFormat' import { deepEqual } from '../../../lib/javascript/deepEqual' import { positionObservable } from '../positionThings' +import { getSceneWorkerBySceneID, getSceneWorkerBySceneNumber } from '../parcelSceneManager' +import { SceneWorker } from '../SceneWorker' export type IInternalEngine = { engine: IEngine @@ -37,6 +41,16 @@ type LocalProfileChange = { triggerEmote: EmoteData } +type State = { + sceneId: string | number + entityId: Entity + state: MediaState +} + +type AudioStreamChange = { + changeState: State +} + function getUserData(userId: string) { const dataFromStore = getProfileFromStore(store.getState(), userId) if (!dataFromStore) return undefined @@ -47,7 +61,30 @@ function getUserData(userId: string) { } } +function getScene(id: string | number): SceneWorker | undefined { + if (typeof id === 'string') return getSceneWorkerBySceneID(id) + if (typeof id === 'number') return getSceneWorkerBySceneNumber(id) + return undefined +} + +function getEngineFromScene(scene?: SceneWorker): IEngine | undefined { + return scene?.rpcContext.internalEngine?.engine +} + export const localProfileChanged = mitt() +export const audioStreamEmitter = mitt() + +// AudioStream updates +audioStreamEmitter.on('changeState', ({ entityId, sceneId, state }) => { + const scene = getScene(sceneId) + const engine = getEngineFromScene(scene) + + if (!engine) return + + const AudioEvent = defineAudioEvent(engine) + AudioEvent.addValue(entityId, { state, timestamp: Date.now() }) +}) +// end of AudioStream updates /** * We used this engine as an internal engine to add information to the worker. diff --git a/browser-interface/packages/unity-interface/audioStream.ts b/browser-interface/packages/unity-interface/audioStream.ts index 2371c35e47..67676a7940 100644 --- a/browser-interface/packages/unity-interface/audioStream.ts +++ b/browser-interface/packages/unity-interface/audioStream.ts @@ -1,20 +1,20 @@ /////////////////////////////////// AUDIO STREAMING /////////////////////////////////// -import { Entity, IEngine } from '@dcl/ecs/dist-cjs' -import { AudioEvent as defineAudioEvent, AudioState } from '@dcl/ecs/dist-cjs/components' -import { SceneWorker } from '../shared/world/SceneWorker' -import { getSceneWorkerBySceneID, getSceneWorkerBySceneNumber } from '../shared/world/parcelSceneManager' +import { Entity } from '@dcl/ecs/dist-cjs' +import { MediaState } from '@dcl/ecs/dist-cjs/components' + +import { audioStreamEmitter } from '../shared/world/runtime-7/engine' type AudioEvents = HTMLMediaElementEventMap type GlobalProps = { playToken: number - entityId: Entity | undefined - engine: IEngine | undefined + entityId?: Entity + sceneId?: string | number } let globalProps: GlobalProps = { playToken: 0, - entityId: undefined, - engine: undefined + sceneId: undefined, + entityId: undefined } function setGlobalProps(props: GlobalProps) { @@ -36,48 +36,36 @@ const audioStreamSource = new Audio() AUDIO_EVENTS.forEach(($) => audioStreamSource.addEventListener($, listen)) function listen(ev: AudioEvents[keyof AudioEvents]) { - const { entityId, engine } = globalProps + const { entityId, sceneId } = globalProps - if (!entityId || !engine) return + if (!entityId || !sceneId) return - const AudioEvent = defineAudioEvent(engine) const state = getAudioEvent(ev.type) - const timestamp = Date.now() - AudioEvent.addValue(entityId, { state, timestamp }) + audioStreamEmitter.emit('changeState', { entityId, state, sceneId }) } -function getAudioEvent(type: string): AudioState { +function getAudioEvent(type: string): MediaState { switch (type) { case 'loadeddata': - return AudioState.AS_READY + return MediaState.MS_READY case 'error': - return AudioState.AS_ERROR + return MediaState.MS_ERROR case 'seeking': - return AudioState.AS_SEEKING + return MediaState.MS_SEEKING case 'loadstart': - return AudioState.AS_LOADING + return MediaState.MS_LOADING case 'waiting': - return AudioState.AS_BUFFERING + return MediaState.MS_BUFFERING case 'playing': - return AudioState.AS_PLAYING + return MediaState.MS_PLAYING case 'pause': - return AudioState.AS_PAUSED + return MediaState.MS_PAUSED default: - return AudioState.AS_NONE + return MediaState.MS_NONE } } -function getScene(id: string | number): SceneWorker | undefined { - if (typeof id === 'string') return getSceneWorkerBySceneID(id) - if (typeof id === 'number') return getSceneWorkerBySceneNumber(id) - return undefined -} - -function getEngineFromScene(scene?: SceneWorker): IEngine | undefined { - return scene?.rpcContext.internalEngine?.engine -} - export async function setAudioStream(url: string, play: boolean, volume: number) { const isSameSrc = audioStreamSource.src.length > 1 && (encodeURI(url) === audioStreamSource.src || url === audioStreamSource.src) @@ -104,26 +92,14 @@ export async function setAudioStreamForEntity( sceneId: string | number, entityId: Entity ) { + setGlobalProps({ ...globalProps, sceneId, entityId }) void setAudioStream(url, play, volume) - - const scene = getScene(sceneId) - const engine = getEngineFromScene(scene) - - setGlobalProps({ ...globalProps, engine, entityId }) } export async function killAudioStream(sceneId: number, entityId: Entity) { + setGlobalProps({ ...globalProps, sceneId: undefined, entityId: undefined }) void setAudioStream(audioStreamSource.src, false, audioStreamSource.volume) - - const scene = getScene(sceneId) - const engine = getEngineFromScene(scene) - - if (engine) { - const AudioEvent = defineAudioEvent(engine) - AudioEvent.addValue(entityId, { state: AudioState.AS_NONE, timestamp: Date.now() }) - } - - setGlobalProps({ ...globalProps, engine: undefined, entityId: undefined }) + audioStreamEmitter.emit('changeState', { entityId, state: MediaState.MS_NONE, sceneId }) } // audioStreamSource play might be requested without user interaction