diff --git a/examples/jspsych-browser-check.html b/examples/jspsych-browser-check.html
index 74b07fdd..729896c8 100644
--- a/examples/jspsych-browser-check.html
+++ b/examples/jspsych-browser-check.html
@@ -43,6 +43,8 @@
Frame rate: ${browser_check_data.vsync_rate}
WebAudio API support: ${browser_check_data.webaudio}
Fullscreen API support: ${browser_check_data.fullscreen}
+ Webcam support: ${browser_check_data.webcam}
+ Microphone support: ${browser_check_data.microphone}
`
return html;
},
diff --git a/packages/plugin-browser-check/src/index.ts b/packages/plugin-browser-check/src/index.ts
index 09b7c8d6..16088a49 100644
--- a/packages/plugin-browser-check/src/index.ts
+++ b/packages/plugin-browser-check/src/index.ts
@@ -20,6 +20,8 @@ const info = {
"os",
"fullscreen",
"vsync_rate",
+ "webcam",
+ "microphone",
],
},
/**
@@ -209,6 +211,40 @@ class BrowserCheckPlugin implements JsPsychPlugin {
requestAnimationFrame(start);
});
},
+ webcam: () => {
+ return new Promise((resolve, reject) => {
+ if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
+ resolve(false);
+ }
+ navigator.mediaDevices.enumerateDevices().then((devices) => {
+ const webcams = devices.filter((d) => {
+ return d.kind == "videoinput";
+ });
+ if (webcams.length > 0) {
+ resolve(true);
+ } else {
+ resolve(false);
+ }
+ });
+ });
+ },
+ microphone: () => {
+ return new Promise((resolve, reject) => {
+ if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) {
+ resolve(false);
+ }
+ navigator.mediaDevices.enumerateDevices().then((devices) => {
+ const microphones = devices.filter((d) => {
+ return d.kind == "audioinput";
+ });
+ if (microphones.length > 0) {
+ resolve(true);
+ } else {
+ resolve(false);
+ }
+ });
+ });
+ },
})
);