diff --git a/src/utils/audio.ts b/src/utils/audio.ts index ddca34ff..e90831d1 100644 --- a/src/utils/audio.ts +++ b/src/utils/audio.ts @@ -16,5 +16,9 @@ export const mayHaveAudio = (video: HTMLVideoElement & AudioProperties): boolean if (video.audioTracks !== undefined) { return Boolean(video.audioTracks?.length); } + // Check MediaStream audio tracks (reliable for WebRTC at load time) + if (typeof MediaStream !== 'undefined' && video.srcObject instanceof MediaStream) { + return video.srcObject.getAudioTracks().length > 0; + } return true; }; diff --git a/tests/utils/audio.test.ts b/tests/utils/audio.test.ts index c4901023..54ab1482 100644 --- a/tests/utils/audio.test.ts +++ b/tests/utils/audio.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from 'vitest'; +import { describe, expect, it, vi } from 'vitest'; import { AudioProperties, mayHaveAudio } from '../../src/utils/audio'; // @vitest-environment jsdom @@ -29,6 +29,36 @@ describe('mayHaveAudio', () => { expect(mayHaveAudio(element)).toBeFalsy(); }); + it('should detect audio when srcObject MediaStream has audio tracks', () => { + // Mock MediaStream for jsdom environment + const MockMediaStream = class MediaStream {}; + vi.stubGlobal('MediaStream', MockMediaStream); + + const element = {} as HTMLVideoElement & AudioProperties; + const mockStream = new MockMediaStream(); + (mockStream as unknown as { getAudioTracks: () => unknown[] }).getAudioTracks = + () => [{}]; + element.srcObject = mockStream as unknown as MediaStream; + expect(mayHaveAudio(element)).toBeTruthy(); + + vi.unstubAllGlobals(); + }); + + it('should not detect audio when srcObject MediaStream has no audio tracks', () => { + // Mock MediaStream for jsdom environment + const MockMediaStream = class MediaStream {}; + vi.stubGlobal('MediaStream', MockMediaStream); + + const element = {} as HTMLVideoElement & AudioProperties; + const mockStream = new MockMediaStream(); + (mockStream as unknown as { getAudioTracks: () => unknown[] }).getAudioTracks = + () => []; + element.srcObject = mockStream as unknown as MediaStream; + expect(mayHaveAudio(element)).toBeFalsy(); + + vi.unstubAllGlobals(); + }); + it('should detect audio when no evidence to the contrary', () => { const element = {} as HTMLVideoElement & AudioProperties; expect(mayHaveAudio(element)).toBeTruthy();