This repository was archived by the owner on Sep 11, 2024. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 811
Expand upon voice message event & include overall waveform #5888
Merged
Merged
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
6f794cc
Fill in some metadata for the sent event
turt2live 7d95621
Replace deprecated processor with a worklet
turt2live 61730f2
Populate waveform data on voice message event
turt2live 4f75e29
Appease the linter
turt2live b519d85
Update src/voice/RecorderWorklet.ts to use sanity
turt2live 14809df
Misc cleanup
turt2live File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| /* | ||
| Copyright 2021 The Matrix.org Foundation C.I.C. | ||
|
|
||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||
| you may not use this file except in compliance with the License. | ||
| You may obtain a copy of the License at | ||
|
|
||
| http://www.apache.org/licenses/LICENSE-2.0 | ||
|
|
||
| Unless required by applicable law or agreed to in writing, software | ||
| distributed under the License is distributed on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| See the License for the specific language governing permissions and | ||
| limitations under the License. | ||
| */ | ||
|
|
||
| import {IAmplitudePayload, ITimingPayload, PayloadEvent, WORKLET_NAME} from "./consts"; | ||
| import {percentageOf} from "../utils/numbers"; | ||
|
|
||
| // from AudioWorkletGlobalScope: https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletGlobalScope | ||
| declare const currentTime: number; | ||
| // declare const currentFrame: number; | ||
| // declare const sampleRate: number; | ||
|
|
||
| class MxVoiceWorklet extends AudioWorkletProcessor { | ||
| private nextAmplitudeSecond = 0; | ||
|
|
||
| process(inputs, outputs, parameters) { | ||
| // We only fire amplitude updates once a second to avoid flooding the recording instance | ||
| // with useless data. Much of the data would end up discarded, so we ratelimit ourselves | ||
| // here. | ||
| const currentSecond = Math.round(currentTime); | ||
| if (currentSecond === this.nextAmplitudeSecond) { | ||
| // We're expecting exactly one mono input source, so just grab the very first frame of | ||
| // samples for the analysis. | ||
| const monoChan = inputs[0][0]; | ||
|
|
||
| // The amplitude of the frame's samples is effectively the loudness of the frame. This | ||
| // translates into a bar which can be rendered as part of the whole recording clip's | ||
| // waveform. | ||
| // | ||
| // We translate the amplitude down to 0-1 for sanity's sake. | ||
| const minVal = Math.min(...monoChan); | ||
| const maxVal = Math.max(...monoChan); | ||
| const amplitude = percentageOf(maxVal, -1, 1) - percentageOf(minVal, -1, 1); | ||
|
|
||
| this.port.postMessage(<IAmplitudePayload>{ | ||
| ev: PayloadEvent.AmplitudeMark, | ||
| amplitude: amplitude, | ||
| forSecond: currentSecond, | ||
| }); | ||
| this.nextAmplitudeSecond++; | ||
| } | ||
|
|
||
| // We mostly use this worklet to fire regular clock updates through to components | ||
| this.port.postMessage(<ITimingPayload>{ev: PayloadEvent.Timekeep, timeSeconds: currentTime}); | ||
|
|
||
| // We're supposed to return false when we're "done" with the audio clip, but seeing as | ||
| // we are acting as a passive processor we are never truly "done". The browser will clean | ||
| // us up when it is done with us. | ||
| return true; | ||
| } | ||
| } | ||
|
|
||
| registerProcessor(WORKLET_NAME, MxVoiceWorklet); | ||
|
|
||
| export default null; // to appease module loaders (we never use the export) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,37 @@ | ||
| /* | ||
| Copyright 2021 The Matrix.org Foundation C.I.C. | ||
|
|
||
| Licensed under the Apache License, Version 2.0 (the "License"); | ||
| you may not use this file except in compliance with the License. | ||
| You may obtain a copy of the License at | ||
|
|
||
| http://www.apache.org/licenses/LICENSE-2.0 | ||
|
|
||
| Unless required by applicable law or agreed to in writing, software | ||
| distributed under the License is distributed on an "AS IS" BASIS, | ||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| See the License for the specific language governing permissions and | ||
| limitations under the License. | ||
| */ | ||
|
|
||
| export const WORKLET_NAME = "mx-voice-worklet"; | ||
|
|
||
| export enum PayloadEvent { | ||
| Timekeep = "timekeep", | ||
| AmplitudeMark = "amplitude_mark", | ||
| } | ||
|
|
||
| export interface IPayload { | ||
| ev: PayloadEvent; | ||
| } | ||
|
|
||
| export interface ITimingPayload extends IPayload { | ||
| ev: PayloadEvent.Timekeep; | ||
| timeSeconds: number; | ||
| } | ||
|
|
||
| export interface IAmplitudePayload extends IPayload { | ||
| ev: PayloadEvent.AmplitudeMark; | ||
| forSecond: number; | ||
| amplitude: number; | ||
| } |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems like the
AudioWorkletNodeis not supported by Safari whereas theScriptProcessorNodewas.Is there a fallback or progressive enhancement setup somewhere that I might not be aware of?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ugh, I'll make note of this and get it properly tested in Safari in a future PR. I'm not confident it works properly before this change anyways.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We'll definitely need some plan to support Safari before this can be enabled by default.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
plan is in progress, though is dependent on acquisition of a Mac (work in progress)