Plugins for jspsych@6.1
This commit is contained in:
87
plugins/jspsych-audio-safari-init.js
Normal file
87
plugins/jspsych-audio-safari-init.js
Normal file
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* jspsych-audio-safari-init
|
||||
* Etienne Gaudrain - 2021-02-01
|
||||
*
|
||||
* Safari is the new Internet Explorer and does everything differently from others
|
||||
* for better, and mostly for worse. Here is a plugin to display a screen for the user to click on
|
||||
* before starting the experiment to unlock the audio context, if we are dealing with Safari.
|
||||
*
|
||||
* See https://github.com/jspsych/jsPsych/issues/1445.
|
||||
*
|
||||
* NOTE: When not using the WebAudio API (jsPsych initialised with `use_webaudio=false`),
|
||||
* jspsych.js needs to be modifed to expose the list of preloaded sounds (or, it seems,
|
||||
* at least the first one). In the code below, this is done within
|
||||
* `jsPsych.pluginAPI.preloaded_audio_IDs()`.
|
||||
*
|
||||
**/
|
||||
|
||||
jsPsych.plugins["audio-safari-init"] = (function() {
|
||||
|
||||
var plugin = {};
|
||||
|
||||
//jsPsych.pluginAPI.registerPreload('audio-safari-init', 'stimulus', 'audio');
|
||||
|
||||
plugin.info = {
|
||||
name: 'audio-safari-init',
|
||||
description: '',
|
||||
parameters: {
|
||||
prompt: {
|
||||
type: jsPsych.plugins.parameterType.STRING,
|
||||
pretty_name: 'Prompt',
|
||||
default: "Click on the screen to start the experiment",
|
||||
description: 'The prompt asking the user to click on the screen.'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
plugin.trial = function(display_element, trial) {
|
||||
|
||||
// Ideally, we would want to be able to detect this on feature basis rather than using userAgents,
|
||||
// but Safari just doesn't count clicks not directly aimed at starting sounds, while other browsers do.
|
||||
const is_Safari = /Version\/.*Safari\//.test(navigator.userAgent) && !window.MSStream;
|
||||
if(is_Safari){
|
||||
display_element.innerHTML = trial.prompt;
|
||||
document.addEventListener('touchstart', init_audio);
|
||||
document.addEventListener('click', init_audio);
|
||||
} else {
|
||||
jsPsych.finishTrial();
|
||||
}
|
||||
|
||||
function init_audio(){
|
||||
var context = jsPsych.pluginAPI.audioContext();
|
||||
if(context==null){
|
||||
// This requires the hacked version of jspsych 6.1.0_eg2021-02-21
|
||||
jsPsych.pluginAPI.preloaded_audio_IDs().slice(0,1).forEach(function(a){
|
||||
var b = jsPsych.pluginAPI.getAudioBuffer(a);
|
||||
b.play();
|
||||
b.pause();
|
||||
b.currentTime = 0;
|
||||
});
|
||||
}
|
||||
end_trial();
|
||||
}
|
||||
|
||||
// function to end trial when it is time
|
||||
function end_trial() {
|
||||
|
||||
document.removeEventListener('touchstart', init_audio);
|
||||
document.removeEventListener('click', init_audio);
|
||||
|
||||
// kill any remaining setTimeout handlers
|
||||
jsPsych.pluginAPI.clearAllTimeouts();
|
||||
|
||||
// kill keyboard listeners
|
||||
jsPsych.pluginAPI.cancelAllKeyboardResponses();
|
||||
|
||||
// clear the display
|
||||
display_element.innerHTML = '';
|
||||
|
||||
// move on to the next trial
|
||||
jsPsych.finishTrial();
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
return plugin;
|
||||
})();
|
||||
Reference in New Issue
Block a user