fix: Improve audio channel detection for WebRTC (#2280)
- Related: #2191
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user