mirror of
https://github.com/element-hq/element-web
synced 2024-11-23 17:56:01 +03:00
Ensure we capture an absolute maximum amount of audio samples
We say the limit is 2 minutes, not 1m59s, so let's give the user that last frame.
This commit is contained in:
parent
617d74f9cd
commit
f0ff2fc38d
1 changed files with 14 additions and 3 deletions
|
@ -217,8 +217,19 @@ export class VoiceRecording extends EventEmitter implements IDestroyable {
|
|||
|
||||
// Now that we've updated the data/waveform, let's do a time check. We don't want to
|
||||
// go horribly over the limit. We also emit a warning state if needed.
|
||||
const secondsLeft = TARGET_MAX_LENGTH - timeSeconds;
|
||||
if (secondsLeft <= 0) {
|
||||
//
|
||||
// We use the recorder's perspective of time to make sure we don't cut off the last
|
||||
// frame of audio, otherwise we end up with a 1:59 clip (119.68 seconds). This extra
|
||||
// safety can allow us to overshoot the target a bit, but at least when we say 2min
|
||||
// maximum we actually mean it.
|
||||
//
|
||||
// In testing, recorder time and worker time lag by about 400ms, which is roughly the
|
||||
// time needed to encode a sample/frame.
|
||||
//
|
||||
// Ref for recorderSeconds: https://github.com/chris-rudmin/opus-recorder#instance-fields
|
||||
const recorderSeconds = this.recorder.encodedSamplePosition / 48000;
|
||||
const secondsLeft = TARGET_MAX_LENGTH - recorderSeconds;
|
||||
if (secondsLeft < 0) { // go over to make sure we definitely capture that last frame
|
||||
// noinspection JSIgnoredPromiseFromCall - we aren't concerned with it overlapping
|
||||
this.stop();
|
||||
} else if (secondsLeft <= TARGET_WARN_TIME_LEFT) {
|
||||
|
@ -253,9 +264,9 @@ export class VoiceRecording extends EventEmitter implements IDestroyable {
|
|||
}
|
||||
|
||||
// Disconnect the source early to start shutting down resources
|
||||
await this.recorder.stop(); // stop first to flush the last frame
|
||||
this.recorderSource.disconnect();
|
||||
this.recorderWorklet.disconnect();
|
||||
await this.recorder.stop();
|
||||
|
||||
// close the context after the recorder so the recorder doesn't try to
|
||||
// connect anything to the context (this would generate a warning)
|
||||
|
|
Loading…
Reference in a new issue