4a401cf816
ML noise suppression produced loud static on real calls. RNNoise requires mono 48kHz float input; feeding it stereo or wrong-rate data is the classic cause of that static. Harden the shim: - request mono (channelCount:1) + 48kHz capture - run a 48kHz AudioContext and BAIL to the raw mic if the browser won't give a true 48kHz context (wrong-rate data -> static) - force the worklet node to explicit mono in/out - use the non-SIMD rnnoise.wasm (SIMD build artifacts on some GPUs) - share one AudioContext across captures Also fix the two CI-blocking eslint errors (unused vars in UrlPreviewCard and useLocalMessageSearch) and apply repo-wide prettier formatting so check:eslint and check:prettier pass. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
58 lines
1.2 KiB
TypeScript
58 lines
1.2 KiB
TypeScript
import React from 'react';
|
|
import { useAvatarDecoration } from '../../hooks/useAvatarDecoration';
|
|
import { decorationUrl } from '../../features/lotus/avatarDecorations';
|
|
|
|
const DEFAULT_INSET = 8;
|
|
|
|
type AvatarDecorationProps = {
|
|
userId: string;
|
|
children: React.ReactNode;
|
|
inset?: number;
|
|
};
|
|
|
|
export function AvatarDecoration({
|
|
userId,
|
|
children,
|
|
inset = DEFAULT_INSET,
|
|
}: AvatarDecorationProps) {
|
|
const slug = useAvatarDecoration(userId);
|
|
|
|
if (!slug) {
|
|
return <>{children}</>;
|
|
}
|
|
|
|
return (
|
|
<div
|
|
style={{
|
|
position: 'relative',
|
|
display: 'inline-flex',
|
|
flexShrink: 0,
|
|
}}
|
|
>
|
|
{children}
|
|
<img
|
|
src={decorationUrl(slug)}
|
|
style={{
|
|
position: 'absolute',
|
|
top: -inset,
|
|
left: -inset,
|
|
right: -inset,
|
|
bottom: -inset,
|
|
width: `calc(100% + ${inset * 2}px)`,
|
|
height: `calc(100% + ${inset * 2}px)`,
|
|
pointerEvents: 'none',
|
|
zIndex: 10,
|
|
objectFit: 'contain',
|
|
}}
|
|
alt=""
|
|
aria-hidden="true"
|
|
loading="lazy"
|
|
decoding="async"
|
|
onError={(e) => {
|
|
(e.currentTarget as HTMLImageElement).style.display = 'none';
|
|
}}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|