mirror of
https://github.com/scratchfoundation/scratch-vm.git
synced 2024-12-24 06:52:40 -05:00
Fix speech extension in Safari (#1202) by calling getUserMedia for every listen and wait block rather than trying to reuse it. Also get rid of some code that was not actually doing anything. (#1467)
This commit is contained in:
parent
168d11bcdb
commit
b9a757ea08
1 changed files with 9 additions and 14 deletions
|
@ -512,12 +512,7 @@ class Scratch3SpeechBlocks {
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_startListening () {
|
_startListening () {
|
||||||
// If we've already setup the context, we can resume instead of doing all the setup again.
|
|
||||||
if (this._context) {
|
|
||||||
this._resumeListening();
|
|
||||||
} else {
|
|
||||||
this._initListening();
|
this._initListening();
|
||||||
}
|
|
||||||
// Force the block to timeout if we don't get any results back/the user didn't say anything.
|
// Force the block to timeout if we don't get any results back/the user didn't say anything.
|
||||||
this._speechTimeoutId = setTimeout(this._stopTranscription, listenAndWaitBlockTimeoutMs);
|
this._speechTimeoutId = setTimeout(this._stopTranscription, listenAndWaitBlockTimeoutMs);
|
||||||
}
|
}
|
||||||
|
@ -547,18 +542,18 @@ class Scratch3SpeechBlocks {
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
_initializeMicrophone () {
|
_initializeMicrophone () {
|
||||||
|
// Don't make a new context if we already made one.
|
||||||
|
if (!this._context) {
|
||||||
// Safari still needs a webkit prefix for audio context
|
// Safari still needs a webkit prefix for audio context
|
||||||
this._context = new (window.AudioContext || window.webkitAudioContext)();
|
this._context = new (window.AudioContext || window.webkitAudioContext)();
|
||||||
|
}
|
||||||
|
// In safari we have to call getUserMedia every time we want to listen. Other browsers allow
|
||||||
|
// you to reuse the mediaStream. See #1202 for more context.
|
||||||
this._audioPromise = navigator.mediaDevices.getUserMedia({
|
this._audioPromise = navigator.mediaDevices.getUserMedia({
|
||||||
audio: true
|
audio: true
|
||||||
});
|
});
|
||||||
|
|
||||||
const tempContext = this._context;
|
this._audioPromise.then().catch(e => {
|
||||||
this._audioPromise.then(micStream => {
|
|
||||||
const microphone = tempContext.createMediaStreamSource(micStream);
|
|
||||||
const analyser = tempContext.createAnalyser();
|
|
||||||
microphone.connect(analyser);
|
|
||||||
}).catch(e => {
|
|
||||||
log.error(`Problem connecting to microphone: ${e}`);
|
log.error(`Problem connecting to microphone: ${e}`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue