From 02f3f1b71a16e14cda9ea2a18d5e936bc7b97414 Mon Sep 17 00:00:00 2001
From: Timo <16718859+toger5@users.noreply.github.com>
Date: Tue, 10 Jun 2025 15:00:21 +0200
Subject: [PATCH] Improvements to audio renderer codebase. (#3308)
* Improvements to audio renderer codebase.
* review
---
src/livekit/MatrixAudioRenderer.test.tsx | 9 ++++++---
src/livekit/MatrixAudioRenderer.tsx | 13 ++++++++++++-
2 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/src/livekit/MatrixAudioRenderer.test.tsx b/src/livekit/MatrixAudioRenderer.test.tsx
index 637e02ed..e2fa4e87 100644
--- a/src/livekit/MatrixAudioRenderer.test.tsx
+++ b/src/livekit/MatrixAudioRenderer.test.tsx
@@ -58,11 +58,13 @@ it("should render for member", () => {
expect(container).toBeTruthy();
expect(queryAllByTestId("audio")).toHaveLength(1);
});
+
it("should not render without member", () => {
+ const memberships = [
+ { sender: "othermember", deviceId: "123" },
+ ] as CallMembership[];
const { container, queryAllByTestId } = render(
- ,
+ ,
);
expect(container).toBeTruthy();
expect(queryAllByTestId("audio")).toHaveLength(0);
@@ -84,6 +86,7 @@ it("should not setup audioContext gain and pan if there is no need to.", () => {
expect(testAudioContext.gain.gain.value).toEqual(1);
expect(testAudioContext.pan.pan.value).toEqual(0);
});
+
it("should setup audioContext gain and pan", () => {
vi.spyOn(MediaDevicesContext, "useEarpieceAudioConfig").mockReturnValue({
pan: 1,
diff --git a/src/livekit/MatrixAudioRenderer.tsx b/src/livekit/MatrixAudioRenderer.tsx
index 3e7a3e89..ee4062c4 100644
--- a/src/livekit/MatrixAudioRenderer.tsx
+++ b/src/livekit/MatrixAudioRenderer.tsx
@@ -14,11 +14,13 @@ import {
type AudioTrackProps,
} from "@livekit/components-react";
import { type CallMembership } from "matrix-js-sdk/lib/matrixrtc";
-import { logger } from "matrix-js-sdk/lib/logger";
+import { logger as rootLogger } from "matrix-js-sdk/lib/logger";
import { useEarpieceAudioConfig } from "./MediaDevicesContext";
import { useReactiveState } from "../useReactiveState";
import * as controls from "../controls";
+
+const logger = rootLogger.getChild("[MatrixAudioRenderer]");
export interface MatrixAudioRendererProps {
/**
* The list of participants to render audio for.
@@ -59,6 +61,7 @@ export function MatrixAudioRenderer({
);
const loggedInvalidIdentities = useRef(new Set());
+
/**
* Log an invalid livekit track identity.
* A invalid identity is one that does not match any of the matrix rtc members.
@@ -96,6 +99,14 @@ export function MatrixAudioRenderer({
isValid
);
});
+ useEffect(() => {
+ if (!tracks.some((t) => !validIdentities.has(t.participant.identity))) {
+ logger.debug(
+ `All audio tracks have a matching matrix call member identity.`,
+ );
+ loggedInvalidIdentities.current.clear();
+ }
+ }, [tracks, validIdentities]);
// This component is also (in addition to the "only play audio for connected members" logic above)
// responsible for mimicking earpiece audio on iPhones.