From 8eaabdd0e50dfee8ec66d0464a304ae833728f90 Mon Sep 17 00:00:00 2001 From: Josh de Leeuw Date: Thu, 21 Oct 2021 09:57:58 -0400 Subject: [PATCH] add webcam and microphone detection --- examples/jspsych-browser-check.html | 2 ++ packages/plugin-browser-check/src/index.ts | 36 ++++++++++++++++++++++ 2 files changed, 38 insertions(+) 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); + } + }); + }); + }, }) );