Remove legacy Safari/Firefox/IE compatibility aids (#29010)
* Remove legacy Safari prefix compatibility for AudioContext Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Remove more legacy webkit/ms/moz support Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Fix tests Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve coverage, cull dead code Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Simplify Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve coverage Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> * Improve coverage Signed-off-by: Michael Telatynski <7t3chguy@gmail.com> --------- Signed-off-by: Michael Telatynski <7t3chguy@gmail.com>
This commit is contained in:
committed by
GitHub
parent
e235100dd0
commit
c84cf3c36c
@@ -163,36 +163,21 @@ export class Playback extends EventEmitter implements IDestroyable, PlaybackInte
|
||||
this.element.src = URL.createObjectURL(new Blob([this.buf]));
|
||||
await deferred.promise; // make sure the audio element is ready for us
|
||||
} else {
|
||||
// Safari compat: promise API not supported on this function
|
||||
this.audioBuf = await new Promise((resolve, reject) => {
|
||||
this.context.decodeAudioData(
|
||||
this.buf,
|
||||
(b) => resolve(b),
|
||||
async (e): Promise<void> => {
|
||||
try {
|
||||
// This error handler is largely for Safari as well, which doesn't support Opus/Ogg
|
||||
// very well.
|
||||
logger.error("Error decoding recording: ", e);
|
||||
logger.warn("Trying to re-encode to WAV instead...");
|
||||
try {
|
||||
this.audioBuf = await this.context.decodeAudioData(this.buf);
|
||||
} catch (e) {
|
||||
logger.error("Error decoding recording:", e);
|
||||
logger.warn("Trying to re-encode to WAV instead...");
|
||||
|
||||
const wav = await decodeOgg(this.buf);
|
||||
|
||||
// noinspection ES6MissingAwait - not needed when using callbacks
|
||||
this.context.decodeAudioData(
|
||||
wav,
|
||||
(b) => resolve(b),
|
||||
(e) => {
|
||||
logger.error("Still failed to decode recording: ", e);
|
||||
reject(e);
|
||||
},
|
||||
);
|
||||
} catch (e) {
|
||||
logger.error("Caught decoding error:", e);
|
||||
reject(e);
|
||||
}
|
||||
},
|
||||
);
|
||||
});
|
||||
try {
|
||||
// This error handler is largely for Safari, which doesn't support Opus/Ogg very well.
|
||||
const wav = await decodeOgg(this.buf);
|
||||
this.audioBuf = await this.context.decodeAudioData(wav);
|
||||
} catch (e) {
|
||||
logger.error("Error decoding recording:", e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
// Update the waveform to the real waveform once we have channel data to use. We don't
|
||||
// exactly trust the user-provided waveform to be accurate...
|
||||
|
||||
@@ -15,21 +15,15 @@ import { logger } from "matrix-js-sdk/src/logger";
|
||||
import { SAMPLE_RATE } from "./VoiceRecording";
|
||||
|
||||
export function createAudioContext(opts?: AudioContextOptions): AudioContext {
|
||||
let ctx: AudioContext;
|
||||
if (window.AudioContext) {
|
||||
ctx = new AudioContext(opts);
|
||||
} else if (window.webkitAudioContext) {
|
||||
// While the linter is correct that "a constructor name should not start with
|
||||
// a lowercase letter", it's also wrong to think that we have control over this.
|
||||
// eslint-disable-next-line new-cap
|
||||
ctx = new window.webkitAudioContext(opts);
|
||||
const ctx = new AudioContext(opts);
|
||||
// Initialize in suspended state, as Firefox starts using
|
||||
// CPU/battery right away, even if we don't play any sound yet.
|
||||
void ctx.suspend();
|
||||
return ctx;
|
||||
} else {
|
||||
throw new Error("Unsupported browser");
|
||||
}
|
||||
// Initialize in suspended state, as Firefox starts using
|
||||
// CPU/battery right away, even if we don't play any sound yet.
|
||||
void ctx.suspend();
|
||||
return ctx;
|
||||
}
|
||||
|
||||
export function decodeOgg(audioBuffer: ArrayBuffer): Promise<ArrayBuffer> {
|
||||
|
||||
Reference in New Issue
Block a user