@@ -5,6 +5,7 @@ import { getBitrates, getResolutionForQuality } from "./recorderConfig";
55import BunnyTusUploader from "./bunnyTusUploader" ;
66import localforage from "localforage" ;
77import { createVideoProject } from "./createVideoProject" ;
8+ import { getUserMediaWithFallback } from "../utils/mediaDeviceFallback" ;
89
910localforage . config ( {
1011 driver : localforage . INDEXEDDB ,
@@ -1847,12 +1848,41 @@ const CloudRecorder = () => {
18471848 } ;
18481849
18491850 const startAudioStream = async ( id ) => {
1851+ const useExact = id && id !== "none" ;
18501852 const audioStreamOptions = {
1851- audio : { deviceId : id ? { exact : id } : undefined } ,
1853+ audio : useExact ? { deviceId : { exact : id } } : true ,
18521854 } ;
18531855
18541856 try {
1855- return await navigator . mediaDevices . getUserMedia ( audioStreamOptions ) ;
1857+ const { defaultAudioInputLabel, audioinput } =
1858+ await chrome . storage . local . get ( [
1859+ "defaultAudioInputLabel" ,
1860+ "audioinput" ,
1861+ ] ) ;
1862+ const desiredLabel =
1863+ defaultAudioInputLabel ||
1864+ audioinput ?. find ( ( device ) => device . deviceId === id ) ?. label ||
1865+ "" ;
1866+
1867+ return await getUserMediaWithFallback ( {
1868+ constraints : audioStreamOptions ,
1869+ fallbacks :
1870+ useExact && desiredLabel
1871+ ? [
1872+ {
1873+ kind : "audioinput" ,
1874+ desiredDeviceId : id ,
1875+ desiredLabel,
1876+ onResolved : ( resolvedId ) => {
1877+ chrome . storage . local . set ( {
1878+ defaultAudioInput : resolvedId ,
1879+ defaultAudioInputLabel : desiredLabel ,
1880+ } ) ;
1881+ } ,
1882+ } ,
1883+ ]
1884+ : [ ] ,
1885+ } ) ;
18561886 } catch ( err ) {
18571887 console . warn (
18581888 "⚠️ Failed to access audio with deviceId, trying fallback:" ,
@@ -1878,6 +1908,41 @@ const CloudRecorder = () => {
18781908 }
18791909 } ;
18801910
1911+ const getVideoStreamWithFallback = async ( constraints , deviceId ) => {
1912+ if ( ! deviceId || deviceId === "none" ) {
1913+ return navigator . mediaDevices . getUserMedia ( constraints ) ;
1914+ }
1915+ const { defaultVideoInputLabel, videoinput } =
1916+ await chrome . storage . local . get ( [
1917+ "defaultVideoInputLabel" ,
1918+ "videoinput" ,
1919+ ] ) ;
1920+ const desiredLabel =
1921+ defaultVideoInputLabel ||
1922+ videoinput ?. find ( ( device ) => device . deviceId === deviceId ) ?. label ||
1923+ "" ;
1924+
1925+ return getUserMediaWithFallback ( {
1926+ constraints,
1927+ fallbacks :
1928+ deviceId && desiredLabel
1929+ ? [
1930+ {
1931+ kind : "videoinput" ,
1932+ desiredDeviceId : deviceId ,
1933+ desiredLabel,
1934+ onResolved : ( resolvedId ) => {
1935+ chrome . storage . local . set ( {
1936+ defaultVideoInput : resolvedId ,
1937+ defaultVideoInputLabel : desiredLabel ,
1938+ } ) ;
1939+ } ,
1940+ } ,
1941+ ]
1942+ : [ ] ,
1943+ } ) ;
1944+ } ;
1945+
18811946 const startStream = async ( data , id , permissions , permissions2 ) => {
18821947 // Defaulting quality for now
18831948 //const { qualityValue } = await chrome.storage.local.get(["qualityValue"]);
@@ -1963,8 +2028,9 @@ const CloudRecorder = () => {
19632028 } ;
19642029
19652030 try {
1966- cameraStream . current = await navigator . mediaDevices . getUserMedia (
1967- cameraConstraints
2031+ cameraStream . current = await getVideoStreamWithFallback (
2032+ cameraConstraints ,
2033+ defaultVideoInput
19682034 ) ;
19692035 } catch ( err ) {
19702036 console . warn (
@@ -2114,8 +2180,9 @@ const CloudRecorder = () => {
21142180 } ;
21152181
21162182 try {
2117- cameraStream . current = await navigator . mediaDevices . getUserMedia (
2118- cameraConstraints
2183+ cameraStream . current = await getVideoStreamWithFallback (
2184+ cameraConstraints ,
2185+ defaultVideoInput
21192186 ) ;
21202187 } catch ( err ) {
21212188 console . warn (
0 commit comments